Piano Free

API del database alimentare

Un'unica fonte per 6,1 milioni di alimenti. Recupera un record di prodotto completo tramite ID — nome, marca, ingredienti, allergeni, Nutri-Score, gruppo NOVA, immagini e altro.

200 OK
GET /v1/foods/{id}
curl -H "X-API-Key: food_•••" \
  "https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd"

{
  "id": "62ea12b8-b260-c288-5c38-3a4906f5d6dd",
  "name_default": "Original Taste",
  "brand": "Coca-Cola",
  "category": "...,Carbonated drinks,Sodas,Colas",
  "ingredients_default": "carbonated water, sugar, ...",
  "allergens": null,
  "nutriscore": "e",
  "nova_group": 4,
  "image_url": "https://images..."
}

Preferisci cliccare? Prova l'esploratore di prodotti o l'area di prova foto.

Cosa ottieni

Identità

id, barcode, source, name, brand, category.

Ingredienti

Testo completo degli ingredienti più allergeni e tracce strutturati.

Punteggi

Nutri-Score, gruppo NOVA ed Eco-Score, quando disponibili.

Media e lingue

URL dell'immagine del prodotto e nomi multilingue.

Uno schema unico

Ogni prodotto normalizzato in un'unica forma coerente.

Incluso nel piano gratuito — 100 richieste/giorno, nessuna carta di credito richiesta. 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?lang=fr" \
  -H "X-API-Key: YOUR_API_KEY"
            

Come funziona

Cosa fa una singola richiesta

GET /v1/foods/{id} prende l'UUID ottenuto da una ricerca o da una ricerca per codice a barre e restituisce l'intero record normalizzato. Non c'è selezione dei campi né paginazione: il record per 62ea12b8-b260-c288-5c38-3a4906f5d6dd (codice a barre 5449000000996, source openfoodfacts) torna con ogni chiave dello schema 200, e tutto ciò che manca alla fonte è null, non omesso.

Autenticati con l'header X-API-Key. L'unico input facoltativo è ?lang=, uno tra en, fr, es, de, it o bg. Aggiunge category_localized, category_segments_localized e allergens_localized e lascia intatte tutte le altre chiavi, quindi aggiungere lang più avanti non rompe mai un parser esistente. Ogni risposta porta anche un header X-Request-Id da citare nelle richieste di supporto.

Nomi, ingredienti e voce principale

name e ingredients sono array di {lang, text}. La prima voce ha lang main e rispecchia name_default e ingredients_default; product_lang ti dice quale lingua reale sia. Nel record Coca-Cola il nome principale è Original Taste, la voce fr dice Coca-Cola en canette e la voce bg dice Кока-Кола. Scegli la voce che corrisponde alla lingua della tua UI e ripiega su name_default.

Aspettati che ingredients sia più lungo del numero di lingue: Open Food Facts memorizza il testo degli ingredienti per variante di confezione, quindi la stessa lang può comparire più di una volta in un record, spesso con testo identico, come qui. Deduplica per lang e tieni la prima occorrenza. Il testo è inserito dai contributori e restituito così com'è; la voce ar qui contiene frammenti d'etichetta che non sono ingredienti, quindi convalida prima di trasformarla in strutture.

Categoria, tag, allergeni e lang

category è un'unica stringa unita da virgole, dal generale allo specifico: Beverages and beverages preparations,Beverages,Carbonated drinks,Sodas,Colas,pt:bebidas cafeína. Dividi sulla virgola; l'ultimo livello è il più specifico. categories_tags contiene gli stessi livelli come tag leggibili da macchina (en:beverages, en:carbonated-drinks, en:colas) ed è il valore stabile su cui filtrare o raggruppare, perché la stringa di visualizzazione cambia quando i contributori modificano il prodotto.

allergens e traces usano gli stessi tag in stile en:milk, così come countries (en:albania, en:austria, en:belgium) e labels. null significa che la fonte non ha dichiarato nulla, non che il prodotto sia privo di allergeni; questo record ha allergens: null e traces: null, quindi un avviso allergeni dovrebbe dire sconosciuto, non nessuno.

Con ?lang=bg l'API aggiunge category_localized come singola stringa tradotta, category_segments_localized con una voce per livello della gerarchia, e allergens_localized parallelo a allergens. Un livello o un tag senza voce nel dizionario è null dentro l'array, quindi mantieni l'indice allineato con categories_tags o allergens e ripiega sul tag inglese per gli slot null.

Punteggi, dimensione della porzione e nutrienti di riepilogo

nutriscore è una lettera minuscola (e qui), nova_group un numero (4) ed ecoscore_grade una stringa che può essere una lettera o un valore sentinella come not-applicable, che è ciò che restituisce questa bevanda. Tratta tutti e tre come nullable e non associare not-applicable a una fascia di colore.

serving_size_raw e quantity sono testo libero copiato dall'etichetta. serving_size_raw dice 1 can (330 ml) e va bene per la visualizzazione; quantity dice 0kg in questo record, un errore di un contributore, quindi non calcolare mai il peso della confezione da esso senza un controllo di coerenza.

nutrition_summary fornisce sei valori per 100 g: energy_kcal, proteins_g, carbs_g, fat_g, sugars_g e fiber_g. Ognuno può essere null da solo e l'oggetto può essere null quando la fonte non ha una tabella nutrizionale. Copre una riga di elenco o un confronto rapido; i 40+ nutrienti completi sono nella Nutrition API su /v1/foods/{id}/nutrients con lo stesso id.

Id stabili, cache e flusso abituale

L'id è deterministico, derivato dalla fonte e dall'id di prodotto della fonte stessa, quindi lo stesso prodotto ottiene lo stesso UUID a ogni reimportazione. Salva gli id nelle tue tabelle e recuperali di nuovo mesi dopo senza alcun passaggio di rimappatura. barcode può essere null nello schema, quindi preferisci l'id al codice a barre come chiave di join.

Un 200 porta Cache-Control: public, max-age=300 e un 404 porta max-age=60, quindi una CDN o una cache HTTP davanti al tuo servizio li rispetta senza configurazione. Se metti in cache nel tuo database, usa come chiave id più lang, perché le chiavi localizzate cambiano da lingua a lingua.

Il flusso abituale: ottieni un id dalla Food Search API o dalla Barcode Lookup API, salvalo e chiama questo endpoint quando una vista di dettaglio ha bisogno del record completo. Per aggiornare molti id salvati in una volta, la Bulk Food Lookup API accetta un elenco in una richiesta dallo Starter in su. Le immagini sono foto dei contributori di Open Food Facts ospitate su images.openfoodfacts.org e i record di altre fonti potrebbero non averne, quindi mostra un segnaposto ogni volta che image_url è null.

Cosa puoi costruire

Pagine di dettaglio prodotto

Crea una ricca scheda alimentare a partire da un unico record canonico.

Pipeline di arricchimento dei dati

Idrata il tuo catalogo con ingredienti, allergeni e punteggi.

Ricerca e analisi

Lavora con una vista pulita e normalizzata su due dataset pubblici.

Limiti per piano

Free 100 richieste/giorno, 1/s costante, burst 5
Starter 5.000 richieste/giorno, 5/s costanti, burst 25
Pro 25.000 richieste/giorno, 20/s costanti, burst 100
Enterprise 100.000 richieste/giorno, 50/s costanti, 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

401 — L'header X-API-Key manca o la chiave non è valida.

Invia una chiave attiva dalla tua dashboard; il corpo è {error, message} come ogni altro errore.

404 — L'id è un UUID ben formato ma nessun prodotto lo ha.

Rimuovi l'id dal tuo archivio; il 404 è memorizzabile per 60 secondi, quindi non riprovare in un ciclo.

422 — L'id nel percorso non è un UUID (ad esempio un codice a barre o uno slug).

Risolvi i codici a barre con la Barcode Lookup API e passa qui solo UUID.

429 — La chiave ha superato il burst al secondo oppure l'account ha esaurito la quota giornaliera.

Attendi i secondi indicati in Retry-After, poi riprendi; tieni d'occhio X-RateLimit-Second-Remaining e X-RateLimit-Daily-Remaining per rallentare prima.

Confronto con altre API

La maggior parte delle API di dati alimentari ti consegna o un dump grezzo di Open Food Facts o un record solo USDA, ciascuno con la propria forma. FoodBase restituisce entrambe le fonti con un unico schema, quindi un prodotto openfoodfacts e uno USDA condividono le stesse chiavi e le stesse regole di nullabilità e scrivi un solo parser. Gli id sono deterministici e non numeri di riga, quindi sopravvivono alle reimportazioni, e il record include già tag di categoria, tag di allergeni e sei nutrienti di riepilogo. Il compromesso è che è una vista normalizzata, non l'editor originale: gli errori dei contributori, come una quantity di 0kg, arrivano così come sono, e la tabella nutrizionale completa si trova nella Nutrition API e non in questa risposta.

Vedi il confronto completo delle API di dati alimentari →

Domande frequenti

Dove ottengo un id da passare a questo endpoint? +

Ogni risultato della Food Search API e ogni record della Barcode Lookup API include l'id. È derivato dalla fonte e dal suo identificativo di prodotto, quindi salvalo una volta e riutilizzalo tra le importazioni.

Perché name è un array e cos'è lang main? +

I prodotti hanno nomi in più lingue, quindi name elenca coppie {lang, text}. La voce con lang main rispecchia name_default ed è il testo principale della fonte; scegli la voce che corrisponde alla lingua della tua UI e ripiega su name_default.

Cosa cambia ?lang=? +

Aggiunge category_localized, category_segments_localized e allergens_localized per en, fr, es, de, it o bg. Nient'altro nel record cambia, e qualsiasi tag senza traduzione è null in quei campi.

allergens: null significa che il prodotto non ha allergeni? +

No. null significa che la fonte non ha registrato alcun dato sugli allergeni, quindi mostra uno stato sconosciuto invece di un'etichetta di sicurezza. Solo un array non vuoto è un'informazione positiva, e anche allora riflette ciò che i contributori hanno trascritto dalla confezione.

I nutrienti in questa risposta sono la tabella completa? +

No. nutrition_summary contiene energy_kcal, proteins_g, carbs_g, fat_g, sugars_g e fiber_g per 100 g; l'insieme completo di oltre 40 nutrienti è servito dalla Nutrition API su /v1/foods/{id}/nutrients con lo stesso id.

Posso mettere in cache il record dal mio lato? +

Sì. Un 200 è marcato Cache-Control: public, max-age=300 e un 404 max-age=60, quindi qualsiasi cache HTTP o CDN può conservarli; per una conservazione più lunga, usa come chiave id e lang e aggiorna con la tua pianificazione.

Questo endpoint ha una quota propria? +

No. Attinge alla normale quota di richieste del piano, condivisa da tutte le chiavi dell'account, mentre il limite al secondo si applica per chiave. Solo la Nutrition API ha un limite giornaliero separato nel piano Free.

Inizia subito con API del database alimentare

Gratis per iniziare. Nessuna carta di credito richiesta.

Ottieni la chiave API Vai alla dashboard