Barcode-Abfrage API
Barcode scannen oder eintippen, Produkt erhalten. Löse jeden EAN-13- oder UPC-Code in einer einzigen Anfrage zu einem Lebensmitteldatensatz auf — mit Marke, Kategorie, Nutri-Score und Nährwert-Zusammenfassung. Gebaut für Apps mit Scanner.
curl -H "X-API-Key: food_•••" \
"https://foodbase.dev/v1/foods/barcode/5449000000996"
{
"name_default": "Original Taste",
"brand": "Coca-Cola",
"barcode": "5449000000996",
"nutriscore": "e",
"nutrition_summary": {
"energy_kcal": 42,
"sugars_g": 10.6,
"proteins_g": 0,
"fat_g": 0
}
} Lieber klicken? Probier den Produkt-Explorer oder die Foto-Spielwiese aus.
Was du zurückbekommst
name_default / brand
Produktname und Marke zum gescannten Code.
name / lang
Vollständiger mehrsprachiger Namenssatz, wenn das Etikett mehrere Sprachen trägt; hänge ?lang= (en, fr, es, de, it, bg) an für lokalisierte Kategorie- und Allergenfelder.
barcode
Der Barcode, wie er im Katalog gespeichert ist — Varianten desselben Codes mit führenden Nullen (UPC-12, EAN-13, GTIN-14) lösen alle zu ihm auf.
nutriscore
Nutri-Score-Note (a–e), sofern verfügbar.
nutrition_summary
Die wichtigsten Makros: Energie, Zucker, Eiweiß, Fett.
image_url
Produktbild, sofern verfügbar.
Im kostenlosen Tarif enthalten — 100 Anfragen/Tag, keine Kreditkarte nötig. Tarife ansehen →
Codebeispiele
Dieselbe Anfrage in curl, JavaScript und Python. Ersetze YOUR_API_KEY durch einen Schlüssel aus deinem Dashboard.
curl "https://foodbase.dev/v1/foods/barcode/5449000000996" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch("https://foodbase.dev/v1/foods/barcode/5449000000996", {
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/barcode/5449000000996",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=30,
)
res.raise_for_status()
data = res.json()
So funktioniert's
Was eine Abfrage macht
Sende GET /v1/foods/barcode/{code} mit deinem Schlüssel im X-API-Key-Header. Der Code ist GTIN-8 bis GTIN-14, höchstens 20 Zeichen. FoodBase versucht zuerst eine exakte Übereinstimmung mit dem gespeicherten Barcode, dann die Äquivalente derselben Nummer mit führenden Nullen, sodass ein 12-stelliger UPC-A den Datensatz findet, der als 13-stellige EAN gespeichert ist.
Für 5449000000996 kommt der Datensatz mit barcode 5449000000996 und id 62ea12b8-b260-c288-5c38-3a4906f5d6dd zurück. Diese id bleibt über Reimporte hinweg stabil, speichere sie also als Fremdschlüssel statt des Barcode-Strings.
Tragen mehrere Katalogzeilen denselben Barcode, gewinnt die beliebteste Zeile, und die Wahl ist deterministisch: Derselbe Code liefert bei jedem Aufruf dasselbe Produkt.
- Der zurückgegebene barcode ist die gespeicherte Form, nicht unbedingt die Form, die du gesendet hast.
Den Datensatz lesen
Der 200-Body ist derselbe vollständige Lebensmitteldatensatz, den die Lebensmittel-Datenbank-API per id liefert — parse ihn also einmal und verwende den Parser weiter. Für 5449000000996 bedeutet das: source openfoodfacts, name_default Original Taste mit bg- und fr-Einträgen im name-Array, nutriscore e, nova_group 4 und ecoscore_grade not-applicable. Etikettentext wie serving_size_raw (1 can (330 ml)) und quantity (0kg bei diesem Datensatz, ein Fehler der Mitwirkenden) kommt so zurück, wie er auf der Verpackung getippt wurde — behandle ihn also als Hinweis, nicht als Zahl.
- categories_tags ist die maschinenlesbare Taxonomie (en:colas); category ist derselbe Pfad als kommagetrennter Anzeige-String.
- allergens und traces sind null, wenn die Quelle keine nennt — das ist nicht dasselbe wie allergenfrei.
- image_url zeigt auf images.openfoodfacts.org und kann sich ändern, wenn Mitwirkende das Produkt aktualisieren.
Lokalisierung und Nährwerte
Hänge ?lang=bg (oder en, fr, es, de, it) an, um category_localized, category_segments_localized und allergens_localized aus den Übersetzungswörterbüchern zu füllen. Wo es keine Übersetzung gibt, ist das Feld null statt eines englischen Fallbacks — halte category und allergens also in deiner Fallback-Kette. lang betrifft weder name noch ingredients.
nutrition_summary hat sechs Schlüssel: energy_kcal, proteins_g, carbs_g, fat_g, sugars_g, fiber_g. Jeder kann null sein, und das ganze Objekt ist null, wenn die Quelle keine Nährwerte erfasst hat. Für die vollständige Tabelle pro 100 g, 40+ Nährstoffe, wo die Quelle sie hat, rufe die Nährwert-API mit der soeben erhaltenen id auf.
Scanner-Ablauf, Caching und Fehlschläge
Bei 200 rendere die Karte aus name_default, brand, image_url und nutrition_summary und behalte die id. Bei 404 ist der Code nicht im Katalog: Weiche auf die Lebensmittel-Bilderkennung-API mit einem Foto der Packungsvorderseite aus, oder biete eine Textsuche an. Wiederhole kein 404; es ändert sich nicht, bis der Katalog aktualisiert wird.
200-Antworten tragen Cache-Control: public, max-age=300, und 404er sind 60 Sekunden cachebar. Halte dich in jedem Cache zwischen deinen Nutzern und FoodBase daran. Jede Antwort trägt außerdem X-RateLimit-Second-Remaining und die Header für das Tageskontingent; drossle anhand davon, bevor du ein 429 siehst.
Die Abdeckung ist bei europäischen und US-Handelsprodukten am besten, weil der Katalog aus Open Food Facts und USDA FoodData Central aufgebaut ist, ergänzt um GS1 Bulgarien und Metro Bulgarien. Eigenmarken und ganz neue Produkte sind die häufigsten Fehlschläge.
Was du damit baust
Barcode-Scanner
Mach aus einem Kamera-Scan sofort Produkt- und Nährwertdaten.
Vorrats- & Einkaufs-Apps
Lass Nutzer Artikel hinzufügen, indem sie den Barcode der Verpackung scannen.
Handel & Kasse
Reichere einen Warenkorb mit Lebensmittelattributen an, über den Barcode als Schlüssel.
Limits pro Tarif
| Free | 100 Anfragen/Tag, geteilt über alle Endpunkte und Schlüssel, 1 Anfrage/s mit Burst 5. |
|---|---|
| Starter | 5.000 Anfragen/Tag, 5/s mit Burst 25. |
| Pro | 25.000 Anfragen/Tag, 20/s mit Burst 100. |
| Enterprise | 100.000 Anfragen/Tag, 50/s mit Burst 250. |
Jede Antwort enthält Header X-RateLimit-* mit dem verbleibenden Budget; jede 429 enthält Retry-After . Tarife vergleichen →
Fehler und wie du sie behandelst
404 — Keine Katalogzeile passt zum Code oder zu einer Variante mit führenden Nullen. Body: {"error":"Not found","message":"No food with this barcode"}.
Biete Foto-Erkennung oder eine Textsuche an; cache den Fehlschlag für die erlaubten 60 s.
401 — Der X-API-Key-Header fehlt oder der Schlüssel ist ungültig.
Prüfe den Header-Namen und den Schlüssel in deinem Dashboard; leite den Aufruf über dein Backend, statt den Schlüssel in einer Mobile-App auszuliefern.
429 — Sekunden-Burst für diesen Schlüssel überschritten oder das Tageskontingent des Kontos ist verbraucht.
Warte die in Retry-After genannten Sekunden ab und versuche es dann einmal erneut.
Im Vergleich zu anderen APIs
Die meisten Barcode-APIs antworten mit Name, Marke und vielleicht einem Bild; FoodBase antwortet mit dem vollständigen Lebensmitteldatensatz, sodass ein Scan dir Zutaten, Allergene, Nutri-Score und eine Nährwert-Zusammenfassung ohne zweiten Aufruf liefert. Der Katalog besteht aus Open Food Facts plus USDA FoodData Central plus GS1 und Metro Bulgarien, was ihn bei europäischen und US-Lebensmitteln stark und außerhalb dieser Märkte schwächer macht. Die GTIN-Auffüllung mit Nullen übernimmt der Server, du brauchst also keine Normalisierungsschicht. Es gibt keine Garantie, dass jeder Code existiert; plane den 404-Pfad ein.
Häufige Fragen
Muss ich einen UPC-A-Code vor dem Aufruf in EAN-13 umwandeln? +
Nein. Sende die Ziffern, die dein Scanner geliefert hat. FoodBase versucht zuerst den exakten String und dann die Äquivalente mit führenden Nullen, sodass ein 12-stelliger UPC-A die 13-stellige EAN-13-Form findet und 0000080042556 das als 80042556 gespeicherte Produkt. Das Feld barcode in der Antwort zeigt die gespeicherte Form.
Was passiert, wenn zwei Produkte denselben Barcode haben? +
Die beliebteste Katalogzeile gewinnt und die Wahl ist deterministisch, wiederholte Abfragen liefern also dasselbe Produkt. Brauchst du die Alternativen, suche stattdessen per Name mit der Lebensmittel-Suche-API.
Ist die Antwort dieselbe wie beim Abruf des Produkts per id? +
Ja. Es ist der Datensatz, den die Lebensmittel-Datenbank-API für GET /v1/foods/{id} liefert, einschließlich nutrition_summary, categories_tags und der mehrsprachigen name- und ingredients-Arrays.
Wie zeige ich den Produktnamen in der Sprache der Nutzerin an? +
Lies das name-Array und wähle den Eintrag, dessen lang passt; das Beispiel trägt bg (Кока-Кола), fr (Coca-Cola en canette), de, it, es und weitere. Falle auf name_default zurück, den Haupteintrag von lang. Der Parameter ?lang= lokalisiert nur Kategorie und Allergene.
Kann ich Barcode-Ergebnisse auf meiner Seite cachen? +
Ja, und das solltest du. Treffer kommen mit Cache-Control: public, max-age=300, und Fehlschläge sind 60 Sekunden cachebar. Ein gemeinsamer Cache vor deinem Backend sorgt dafür, dass wiederholte Scans desselben Codes dein Tageskontingent nicht berühren.
Warum liefert ein echtes Produkt ein 404? +
Die Abdeckung folgt den Quellen: Open Food Facts, USDA FoodData Central, GS1 Bulgarien und Metro Bulgarien, daher sind europäische und US-Handelsprodukte am besten abgedeckt. Eigenmarken und frisch eingeführte Produkte sind die üblichen Lücken; weiche auf die Lebensmittel-Bilderkennung-API oder eine Textsuche aus.
Weitere Endpoints entdecken
Lebensmittel-Bilderkennung API
Mach aus einem Foto Lebensmitteldaten. Vier Vision-Endpunkte decken den ganzen Kamera-Ablauf ab: einen Barcode dekodieren, ein Produkt anhand der Vorderseite erkennen, Nährwerttabelle und Zutaten lesen oder einen Teller mit Portionsschätzungen analysieren — abgeglichen mit 6,1 Mio. Produkten, in sechs Sprachen einschließlich Kyrillisch.
Mehr erfahren →Nährwert-API
Geh über die Makro-Eckdaten hinaus. Hole eine detaillierte Aufschlüsselung von 40+ Nährstoffen pro Produkt — Energie, Eiweiß, Kohlenhydrate, Fette, Zucker, Ballaststoffe, Natrium, Vitamine und Mineralstoffe — alles pro 100 g, für jedes Lebensmittel per ID.
Mehr erfahren →Lebensmittel-Suche API
Volltextsuche über 6,1 Millionen Lebensmittelprodukte nach Name, Marke oder Kategorie — nach Relevanz sortiert, paginiert und schnell. Suche in jeder Sprache, in der das Etikett gedruckt wurde (auch kyrillisch), und übergib lang=en|fr|es|de|it|bg für lokalisierte Namen, Kategorien und Allergene. Eine GET-Anfrage liefert sauberes JSON, das deine App sofort darstellen kann.
Mehr erfahren →Leg jetzt los mit der Barcode-Abfrage API
Kostenlos starten. Keine Kreditkarte nötig.
API-Schlüssel holen Zum Dashboard