API nutrizionali
Vai oltre i macronutrienti principali. Ottieni il dettaglio di oltre 40 nutrienti per prodotto — energia, proteine, carboidrati, grassi, zuccheri, fibre, sodio, vitamine e minerali — tutti per 100 g, per qualsiasi alimento tramite ID.
curl -H "X-API-Key: food_•••" \
"https://foodbase.dev/v1/foods/62ea12b8.../nutrients"
{
"food_id": "62ea12b8...",
"macros": {
"energy_kcal": 42,
"proteins_g": 0,
"carbs_g": 10.6,
"sugars_g": 10.6,
"fat_g": 0,
"fiber_g": null
},
"fats": { "saturated_fat_g": 0 },
"minerals": { "sodium_mg": 0, "salt_g": 0 },
"other": { "added_sugars_g": 5.3 }
} Preferisci cliccare? Prova l'esploratore di prodotti o l'area di prova foto.
Cosa ottieni
Macronutrienti
Energia, proteine, carboidrati, zuccheri, grassi, grassi saturi, fibre.
Minerali
Sodio, calcio, ferro, potassio, magnesio, zinco e altri.
Vitamine
A, C, D, E e le vitamine del gruppo B, dove riportate.
Per 100 g
Base uniforme, così puoi scalare a qualsiasi porzione.
Oltre 40 campi
Un solo oggetto con ogni nutriente fornito dai dati di origine.
Incluso nel piano gratuito — 25 dettagli nutrizionali al giorno, nessuna carta di credito richiesta; illimitati dallo Starter. Vedi i piani →
Esempi di codice
La stessa richiesta in curl, JavaScript e Python. Sostituisci YOUR_API_KEY con una chiave della tua dashboard.
curl "https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd/nutrients" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch("https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd/nutrients", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
import requests
res = requests.get(
"https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd/nutrients",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=30,
)
res.raise_for_status()
data = res.json()
Come funziona
Una richiesta, cinque gruppi, per 100 g
GET /v1/foods/{id}/nutrients prende l'UUID dell'alimento nel percorso e nient'altro: nessun parametro di query, nessun corpo, nessuna lang. L'id è lo stesso che restituisce ogni altro endpoint, quindi un risultato della Food Search API o della Barcode Lookup API diventa un dettaglio completo con una chiamata in più. Gli id sono deterministici tra le reimportazioni, quindi puoi salvarli e continuare a chiamare questo URL.
La risposta è un oggetto piatto con food_id più cinque gruppi fissi: macros, fats, minerals, vitamins e other. Ogni chiave è sempre presente e ogni valore è un numero oppure null. Contando le chiavi dello schema attuale si arriva a 41 campi nutrizionali, da cui il “40+”. Le unità sono nel nome della chiave (energy_kcal, sodium_mg, selenium_mcg, vitamin_a_iu), quindi non devi portarti dietro una tabella di unità separata.
Tutti i valori sono per 100 g di prodotto così come venduto. Per mostrare una porzione, moltiplica per i grammi divisi per 100. Il serving_size_raw del record alimentare è testo d'etichetta (per il record Coca-Cola dell'esempio è “1 can (330 ml)”), quindi la conversione da quel testo ai grammi spetta a te.
- macros (10 chiavi) copre energia in kcal e kJ, proteine, carboidrati, grassi, zuccheri, fibre, alcol, amido e polioli; fats (7) aggiunge saturi, trans, mono e polinsaturi, omega3, omega6 e cholesterol_mg
- minerals (12) va da sodium_mg e salt_g a selenium_mcg e iodine_mcg; vitamins (11) riporta A e D in IU, B9 e B12 in mcg, le altre in mg; other contiene added_sugars_g
Leggere correttamente null e zeri
La risposta di esempio per l'alimento 62ea12b8-b260-c288-5c38-3a4906f5d6dd mostra il tipico schema di Open Food Facts: energy_kcal 42, energy_kj 180.2, carbs_g 10.6, sugars_g 10.6, added_sugars_g 5.3, zeri espliciti per proteins_g, fat_g, saturated_fat_g, sodium_mg e salt_g, e null per tutto il resto, da fiber_g all'intero gruppo vitamins.
Tratta i due stati in modo diverso. Uno 0 è un valore riportato dalla fonte; un null significa che il nutriente non è in etichetta o non è nella fonte. Non convertire mai null in 0 prima di sommare l'assunzione di una giornata, altrimenti un pasto composto da prodotti etichettati solo in parte sottostimerà in silenzio vitamine e minerali. Mostra un trattino o “non riportato”.
La copertura segue la provenienza. Le righe con source usda_foundation o usda_sr_legacy sono analisi di laboratorio USDA e popolano i gruppi vitamine e minerali, quindi la maggior parte delle chiavi ha un numero. Le righe con source usda (USDA Branded Foods) e quelle di Open Food Facts sono trascritte dalla confezione, quindi sono affidabili per i nutrienti obbligatori in etichetta e spesso null oltre quelli. Il campo source del record alimentare ti dice in quale caso sei prima di mostrare la tabella.
- Mostra null come sconosciuto, non come zero; aggrega solo le chiavi non null in ogni elemento del pasto.
- sodium_mg e salt_g esistono entrambi perché le etichette cambiano da regione a regione; usa quello che si aspetta il tuo pubblico e ripiega sull'altro.
Quando ti serve davvero questa chiamata
Ogni record alimentare della Food Database API e ogni corrispondenza per codice a barre include già nutrition_summary con sei valori principali: energy_kcal, proteins_g, carbs_g, fat_g, sugars_g e fiber_g. Le righe di ricerca sono più leggere e non lo hanno. Per il risultato di una scansione, una scheda di dettaglio o un rapido registro delle calorie, quell'oggetto di solito basta e non consuma alcun dettaglio nutrizionale.
Riserva /nutrients alla schermata di dettaglio o al momento in cui l'utente chiede di sodio, grassi saturi, colesterolo o di una vitamina specifica. Cerca o scansiona, mostra il riepilogo, recupera il dettaglio al tocco. Nel piano Free è anche ciò che ti tiene entro il limite di 25 al giorno mentre sviluppi.
Gli header di risposta catturati non hanno Cache-Control, quindi la cache spetta a te. Gli id sono stabili e i valori cambiano solo quando un prodotto viene reimportato, quindi una cache con chiave food_id e conservata per ore o giorni è sicura.
Il limite del piano Free, header per header
Nel piano Free ogni dettaglio riuscito scala un contatore giornaliero separato di 25, riportato in ogni risposta come X-RateLimit-Nutrients-Limit, X-RateLimit-Nutrients-Remaining e X-RateLimit-Nutrients-Reset. Leggi Remaining prima di una raffica di richieste di dettaglio e potrai ripiegare su nutrition_summary invece di sbattere contro il muro a metà sessione.
A zero l'endpoint restituisce 429 con error “Nutrients daily allowance exceeded”, un upgrade_url nel corpo e Retry-After con i secondi fino alla mezzanotte UTC. Una chiamata rifiutata non consuma né un dettaglio né una richiesta giornaliera, e non sposta il reset. I piani a pagamento non hanno questo contatore; le loro chiamate ai nutrienti sono limitate solo dalla quota giornaliera di richieste del piano (condivisa tra tutte le chiavi dell'account) e dal limite al secondo per chiave.
Se sei su Starter o superiore e stai lavorando su un grande catalogo, recupera prima i record di base con la Bulk Food Lookup API e chiama /nutrients solo per gli id il cui riepilogo non basta.
Cosa puoi costruire
Tracker di calorie e macro
Registra la nutrizione accurata per porzione con una sola ricerca.
Pianificazione dei pasti e diete
Crea piani che raggiungono gli obiettivi di macro e micronutrienti.
Strumenti per la salute e cliniche
Mostra profili nutrizionali dettagliati a supporto della consulenza dietetica.
Limiti per piano
| Free | 25 dettagli nutrizionali/giorno (header X-RateLimit-Nutrients-*), entro 100 richieste/giorno; 1 rich./s, burst 5 |
|---|---|
| Starter | Dettagli illimitati entro 5.000 richieste/giorno; 5 rich./s, burst 25 |
| Pro | Dettagli illimitati entro 25.000 richieste/giorno; 20 rich./s, burst 100 |
| Enterprise | Dettagli illimitati entro 100.000 richieste/giorno; 50 rich./s, burst 250 |
Ogni risposta include gli header X-RateLimit-* con il budget residuo; ogni 429 include Retry-After . Confronta i piani →
Errori e come gestirli
404 — Non esiste una riga di nutrienti per quell'id: l'alimento potrebbe non esistere, oppure esiste senza dati nutrizionali (il suo nutrition_summary è null). Il corpo riporta “No nutrient data for this food”.
Non riprovare. Mostra l'alimento senza dettaglio; se l'id veniva da una vecchia cache, risolvilo di nuovo tramite codice a barre o ricerca, perché qui un 404 non è transitorio.
422 — L'id nel percorso non è un UUID, ad esempio un codice a barre o un id troncato copiato da un esempio.
Passa il campo id di un risultato di ricerca, di un codice a barre o di un record alimentare; risolvi prima i codici a barre con la Barcode Lookup API.
429 — Solo piano Free: il corpo riporta error “Nutrients daily allowance exceeded” e X-RateLimit-Nutrients-Remaining è 0. Nessun dettaglio è stato consumato.
Rispetta Retry-After (secondi fino alla mezzanotte UTC), ripiega su nutrition_summary per il resto della giornata e mostra l'upgrade_url del corpo se l'utente ha bisogno subito dei dettagli completi.
429 — Qualsiasi piano: il limite al secondo per chiave o la quota giornaliera di richieste dell'intero account è esaurita; X-RateLimit-Second-Remaining e X-RateLimit-Daily-Remaining ti dicono quale.
Attendi i secondi di Retry-After. Metti in coda le richieste di dettaglio invece di lanciarle in parallelo; se è la quota giornaliera, fermati fino a X-RateLimit-Daily-Reset.
Confronto con altre API
La maggior parte delle API nutrizionali restituisce una tabella per porzione che non puoi riportare a una base comune, oppure distribuisce i nutrienti in righe nome/valore/unità che devi normalizzare tu. FoodBase restituisce un oggetto fisso e tipizzato per 100 g con l'unità in ogni chiave, così un client scritto una volta sullo schema va bene per ogni prodotto. Il compromesso è l'onestà sulle lacune: una riga di Open Food Facts derivata dall'etichetta ha dei null dove una riga USDA ha dei numeri, e l'API lo riporta invece di riempire con stime. Se ti servono solo i macronutrienti principali, il record alimentare li contiene già e questo endpoint è facoltativo.
Domande frequenti
I valori sono per porzione o per 100 g? +
Sempre per 100 g, per ogni piano e ogni fonte. Il serving_size_raw del record alimentare è testo d'etichetta come “1 can (330 ml)”, quindi convertirlo in grammi e scalare avviene nel tuo codice. Così due prodotti restano confrontabili senza sapere come ogni marca definisce una porzione.
Cosa significa un valore null e in cosa differisce da 0? +
Null significa che il nutriente non è in etichetta o non è nella fonte; 0 significa che la fonte ha riportato zero. Nella risposta di esempio per la Coca-Cola, fat_g è 0 mentre fiber_g è null. Non trattare mai i due allo stesso modo quando totalizzi un pasto.
Perché un alimento USDA ha le vitamine compilate mentre un prodotto da supermercato no? +
Le righe USDA Foundation e SR Legacy (source usda_foundation, usda_sr_legacy) derivano da analisi di laboratorio e di norma popolano i gruppi vitamine e minerali. Le righe USDA Branded (source usda) e quelle di Open Food Facts sono trascritte dalla confezione, che nella maggior parte delle regioni impone solo i nutrienti principali. Controlla il campo source del record alimentare per sapere che tipo di riga hai.
Mi serve questo endpoint se ho già nutrition_summary? +
Spesso no. nutrition_summary nel record alimentare ti dà già energy_kcal, proteins_g, carbs_g, fat_g, sugars_g e fiber_g. Chiama /nutrients quando ti serve il resto, come grassi saturi, sodio, colesterolo o qualsiasi vitamina o minerale, cosa che di solito serve solo in una schermata di dettaglio.
Come si rapporta il limite Free di 25 dettagli alle 100 richieste al giorno? +
I 25 sono un contatore separato, riportato negli header X-RateLimit-Nutrients-* e azzerato a mezzanotte UTC; le 100 sono la quota di richieste dell'intero account. Un dettaglio riuscito consuma entrambi. Un 429 per il limite dei nutrienti non ne consuma nessuno, ma continua a fallire fino al reset, quindi smetti di chiamare fino ad allora.
Quale endpoint mi dà l'id da passare qui? +
Uno qualsiasi. La Food Search API restituisce gli id per le query testuali e la Barcode Lookup API risolve un GTIN in un record. Il food_id di esempio 62ea12b8-b260-c288-5c38-3a4906f5d6dd è il record dietro il codice a barre 5449000000996.
Scopri altri endpoint
API di analisi alimentare IA
Una sola chiamata trasforma i dati grezzi di un prodotto in qualcosa che puoi mostrare a un utente: un riepilogo di due frasi, punti di forza e avvertenze calcolati dai dati nutrizionali con soglie pubblicate, gli allergeni dichiarati, la compatibilità con le diete che indica da dove viene ogni risposta e il livello di lavorazione — in sei lingue, basato rigorosamente sui dati d'etichetta del prodotto.
Scopri di più →API di ricerca alimenti
Ricerca full-text su 6,1 milioni di prodotti alimentari per nome, marca o categoria — ordinata per rilevanza, paginata e veloce. Cerca in qualsiasi lingua in cui sia stampata l'etichetta (cirillico incluso) e passa lang=en|fr|es|de|it|bg per nomi, categorie e allergeni localizzati. Una sola richiesta GET restituisce JSON pulito, pronto da mostrare nella tua app.
Scopri di più →API di ricerca per codici a barre
Scansiona o digita un codice a barre, ottieni il prodotto. Risolvi qualsiasi codice EAN-13 o UPC in un record alimentare — marca, categoria, Nutri-Score e riepilogo nutrizionale — con una sola richiesta. Pensata per le app basate su scanner.
Scopri di più →Inizia subito con API nutrizionali
Gratis per iniziare. Nessuna carta di credito richiesta.
Ottieni la chiave API Vai alla dashboard