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.
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"
const res = await fetch("https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd?lang=fr", {
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?lang=fr",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=30,
)
res.raise_for_status()
data = res.json()
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.
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.
Scopri altri endpoint
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 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.
Scopri di più →API delle categorie alimentari
Sfoglia ogni categoria alimentare con il suo numero di prodotti — la base per filtri, faccette e navigazione. JSON paginato sull'intero catalogo, servito da una vista precalcolata per restare veloce.
Scopri di più →Inizia subito con API del database alimentare
Gratis per iniziare. Nessuna carta di credito richiesta.
Ottieni la chiave API Vai alla dashboard