Piano Free

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.

200 OK
GET /v1/foods/{id}/nutrients
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"
            

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.

Vedi il confronto completo delle API di dati alimentari →

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.

Inizia subito con API nutrizionali

Gratis per iniziare. Nessuna carta di credito richiesta.

Ottieni la chiave API Vai alla dashboard