KI-Lebensmittelanalyse API
Ein Aufruf macht aus den Rohdaten eines Produkts etwas, das du einem Nutzer zeigen kannst: eine Zusammenfassung in zwei Sätzen, Pluspunkte und Warnhinweise, die mit veröffentlichten Schwellenwerten aus den Nährwertdaten berechnet werden, die deklarierten Allergene, Diät-Verträglichkeit mit Angabe, woher jede Antwort stammt, und den Verarbeitungsgrad — in sechs Sprachen, streng auf den Etikettendaten des Produkts gegründet.
curl -X POST -H "X-API-Key: food_•••" \
-H "Content-Type: application/json" \
-d '{"barcode":"3017620422003","lang":"en"}' \
"https://foodbase.dev/v1/analyze/product"
{
"analysis": {
"summary": "Nutella is a hazelnut and cocoa
chocolate spread from Ferrero...",
"highlights": ["Low salt (0.11 g per 100 g)"],
"warnings": [
"High in fat (30.9 g per 100 g)",
"High in saturated fat (10.6 g per 100 g)",
"High in sugars (56.3 g per 100 g)",
"Contains palm oil"
],
"allergens": {
"contains": ["soy", "milk", "nuts"],
"text": "Contains: soy, milk, nuts."
},
"diets_detail": {
"vegan": { "value": "no", "basis": "allergen_tag" },
"gluten_free": { "value": "yes", "basis": "label_claim" }
},
"processing_level": "ultra_processed",
"processing_basis": "nova"
},
"cached": false
} Lieber klicken? Probier den Produkt-Explorer oder die Foto-Spielwiese aus.
Was du zurückbekommst
summary
Ein oder zwei einfache Sätze dazu, was das Produkt ist und wie es nährwerttechnisch einzuordnen ist.
highlights / warnings
Pluspunkte (Bedingungen der EU-Nährwertangaben) und Warnhinweise (UK-FSA-Werte für „hoch“, Koffein, Süßungsmittel, Alkohol, Palmöl). Ein Thema steht nie in beiden.
allergens
Die auf dem Etikett deklarierten EU-14-Allergene, aufgeteilt in contains und may contain, mit einem lokalisierten Satz.
diets_detail
vegan / vegetarian / gluten_free / lactose_free mit der Grundlage: Etikettenangabe, deklariertes Allergen oder Zutaten.
nutrient_levels
Fett, gesättigte Fette, Zucker und Salz als niedrig, mittel oder hoch, pro 100 g/ml oder pro Portion.
processing_level
Aus der NOVA-Gruppe des Produkts; nur dann aus den Zutaten beurteilt, wenn der Datensatz keine hat.
In jedem Tarif über monatliche KI-Credits nutzbar — jeder Aufruf hat einen festen Credit-Preis, und jeder Tarif (auch Free) enthält ein Credit-Kontingent. 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/analyze/product" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"barcode":"3017620422003","lang":"en"}'
const res = await fetch("https://foodbase.dev/v1/analyze/product", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"barcode": "3017620422003",
"lang": "en"
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
import requests
res = requests.post(
"https://foodbase.dev/v1/analyze/product",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"barcode": "3017620422003",
"lang": "en"
},
timeout=30,
)
res.raise_for_status()
data = res.json()
So funktioniert's
Das Produkt adressieren, die Sprache wählen
POST /v1/analyze/product nimmt einen JSON-Body mit genau einem von food_id oder barcode (8 bis 14 Ziffern; GTIN-Varianten mit führenden Nullen werden aufgelöst) plus einem optionalen lang. Sendest du beide oder keines, bekommst du ein 422 mit „Provide exactly one of food_id or barcode“ und erstatteten Credits. Leere Strings gelten als weggelassen.
lang ist standardmäßig en und akzeptiert auch fr, es, de, it und bg. Es legt die Sprache des Textes fest, nicht die Urteile: Jedes Urteil wird nach festen Regeln aus dem Datensatz berechnet und aus einem Formulierungswörterbuch in jeder Sprache ausgedrückt, und die Beurteilungen des Modells werden einmal pro Produkt getroffen und von allen Sprachen geteilt — ein Produkt kann also nicht auf Englisch vegan und auf Deutsch nicht vegan sein. Die Regeln lesen Nährstoffe, Labels, Allergen- und Spuren-Tags und die NOVA-Gruppe des Datensatzes, dieselben Daten, die die Lebensmittel-Datenbank-API und die Nährwert-API liefern. Aus einem Bild bekommst du die food_id zuerst über die Lebensmittel-Bilderkennung-API.
Die Analyse lesen, Feld für Feld
Das Beispiel ist die echte Antwort für Nutella (Barcode 3017620422003, lang en). highlights sind nur Pluspunkte: Ein Produkt bekommt einen, wenn es die Bedingung einer Nährwertangabe nach EU-Verordnung 1924/2006 erfüllt, etwa wenig Salz (höchstens 0,3 g pro 100 g), Eiweißquelle (mindestens 12 % der Energie) oder hoher Ballaststoffgehalt (mindestens 6 g). warnings sind nur Warnhinweise: ein Nährstoff über dem „hoch“-Schwellenwert der UK-FSA-Frontkennzeichnung (Zucker über 22,5 g pro 100 g, oder über 11,25 g pro 100 ml bei Getränken), eine große Portion, die das FSA-Limit pro Portion überschreitet, oder Koffein, Süßungsmittel, Alkohol oder Palmöl in den Zutaten. Ein Thema ist nie beides, und jede Zahl ist der eigene Wert des Datensatzes.
nutrient_levels liefert dieselben Urteile als Daten: Fett, gesättigte Fette, Zucker und Salz, jeweils low, medium oder high, mit basis per_100 oder per_portion. Eine Cola mit 330 ml und 10,6 g Zucker pro 100 ml ist pro 100 ml medium, aber pro Dose high, sodass ihr Warnhinweis „High in sugars (35 g per serving)“ lautet. allergens listet die deklarierten EU-14-Allergene als contains und may_contain, mit status „not_stated“, wenn der Datensatz keine Allergendaten hat — das heißt, prüfe die Verpackung, nicht „keine“.
diets_detail beantwortet vegan, vegetarian, gluten_free und lactose_free mit value und basis. Eine Etikettenangabe (vegan, glutenfrei, laktosefrei, Zertifizierungslogos) entscheidet zuerst; ein deklariertes Allergen oder Fleisch-Tag schließt eine Diät als Nächstes aus; sonst stammt die Antwort aus der Zutatenliste. Glutenfrei und laktosefrei sind nur mit einer Etikettenangabe „yes“: Eine Zutatenliste ohne Glutenquelle ergibt „no_known_source“, weil ein nicht zertifiziertes Produkt dennoch kontaminiert sein kann. diets behält die ältere Form yes/no/unknown, wobei no_known_source als unknown gemeldet wird.
processing_level ist die NOVA-Gruppe als Label — unprocessed (1), culinary_ingredient (2: Öle, Butter, Zucker), processed (3), ultra_processed (4) — aus der NOVA-Gruppe des Datensatzes (processing_basis „nova“); nur wenn der Datensatz keine hat, wird sie aus den Zutaten beurteilt („model“). per_serving wird aus der Portionsgröße des Datensatzes berechnet, oder ist null, wenn keine hinterlegt ist. disclaimer ist ein fester String; zeige ihn an, denn der Text ist generiert und beschreibt den Katalogdatensatz, nicht die Packung in der Hand der Nutzerin.
Credits, Caching und Rückerstattungen
Jeder Aufruf kostet 4 KI-Credits aus einem monatlichen Kontingent, das alle Schlüssel des Kontos teilen (20 Free, 500 Starter, 1.300 Pro, 3.000 Enterprise; Reset am Ersten des Monats UTC), danach aus einmaligen Aufladungs-Credits, sobald das Kontingent einen Aufruf nicht mehr deckt. Die Abbuchung erfolgt vor der Inferenz, und jede Antwort trägt X-Credits-Limit, X-Credits-Remaining (monatlich plus Aufladung), X-Credits-Topup-Remaining und X-Credits-Reset.
Analysen werden pro Produkt, Sprache und Analyseversion gecacht, gebunden an das updated_at des Datensatzes, sodass ein neu importiertes oder korrigiertes Produkt frisch analysiert wird. Das source_updated_at der Antwort nennt die Datenversion, aus der sie erstellt wurde; das updated_at des Lebensmitteldatensatzes sagt dir, ob sie noch aktuell ist. Ein Treffer liefert cached: true und wird dennoch mit 4 Credits berechnet: Bei den analyze-Endpunkten gibt es keine Rückerstattungen für Cache-Treffer. Cache die Antwort selbst, mit food_id und lang als Schlüssel, wenn du dasselbe Produkt häufig zeigst.
Rückerstattungen gibt es nur, wenn nichts erzeugt wurde: 404, 422, 502 (die Meldung endet auf „You were not charged.“) und 503. Ein 401 oder 429 berührt nie die Credits.
Deine eigenen Produktdaten: /analyze/custom
POST /v1/analyze/custom liefert dasselbe Analyse-Objekt für ein Produkt, das du selbst beschreibst: einen Eigenmarken-Artikel, eine Neueinführung, ein Etikett, das du gerade extrahiert hast. Der Body trägt name (2 bis 150 Zeichen) plus optional brand, category, quantity, ingredients (bis zu 3.000 Zeichen), ein nutrients-Objekt mit Werten pro 100 g und lang. Es gibt keine Freitext-Frage- oder Profilfelder und keine Etikettenangaben oder Allergen-Tags, sodass Diäten aus den Zutaten stammen und glutenfrei oder laktosefrei höchstens no_known_source ist.
Ein name allein ist ein 422: Sende ingredients, mindestens einen Nährwert oder beides, denn das Modell darf keine Nährwertangaben erfinden. nutrients ist strikt, mit neunzehn Schlüsseln, die wie die Katalogspalten heißen (energy_kcal, sugars_g, sodium_mg, calcium_mg und so weiter); ein unbekannter Schlüssel ist ein 422, und Werte außerhalb des Bereichs werden abgelehnt statt begrenzt.
Die Antwort hat input_hash statt food_id, einen SHA-256 der kanonisierten Eingabe, sodass identische Daten und lang ein Cache-Treffer sind, der wie jeder andere berechnet wird. Ein optionaler barcode wird nicht analysiert; er markiert das Produkt nur als eines, das du im Katalog haben möchtest.
Eine Sprache ergänzen: /translate/product
POST /v1/translate/product nimmt food_id oder barcode und ein Pflichtfeld lang, übersetzt Namen und Zutatentext des Produkts und schreibt das Ergebnis als Overlay in den Katalog, das Reimporte übersteht und für jeden Aufrufer als neuer {lang, text}-Eintrag in den name- und ingredients-Arrays des Datensatzes sowie über name_localized in der Suche sichtbar ist. Etikettendaten, die schon in dieser Sprache vorliegen, werden nie überschrieben.
cached: true bedeutet hier, dass die Sprache schon existierte und deine 4 Credits erstattet werden. force: true erzeugt eine Übersetzung neu, die du für schlecht hältst, aber nur Text aus einem früheren KI-Lauf; stammt der Text der Sprache vom Etikett oder aus einer manuellen Korrektur, bekommst du ein 422 mit erstatteten Credits. Ausgabe mit niedriger Confidence oder unsichere Ausgabe wird nie gespeichert: Der Aufruf liefert 502, und dir wird nichts berechnet.
Defekten Etikettentext reparieren: /correct/product
Etikettentext in der eigenen Sprache des Produkts ist an der Quelle manchmal defekt: OCR-Fehler, fehlende Leerzeichen nach Kommas, Zutatenlisten in Großbuchstaben, kaputte Zeichen wie „crème“ statt „crème“ oder eine doppelt wiederholte Passage. POST /v1/correct/product repariert ihn für alle, für 4 Credits. Die Reparatur darf nur die Form ändern: Code prüft, dass keine Zutat, Zahl, kein Prozentwert und keine E-Nummer hinzugefügt oder entfernt wurde, dass Kommas und Klammern an ihrer Stelle blieben und dass jedes Allergen samt Hervorhebung erhalten blieb. Eine fehlgeschlagene Reparatur wird weder gespeichert noch berechnet.
Ist der Inhalt selbst falsch, nimmt POST /v1/correct/product/photo ein Foto des Etiketts und nutzt die daraus gelesene Zutatenliste als Beleg, für 4 Credits. Das Lesen des Fotos ist der teure Teil: Ein Foto, das gelesen, aber nicht verwendet werden kann (keine Zutatenliste sichtbar, der Barcode nicht vollständig lesbar, ein anderes Produkt oder eine zu unsichere Lesung), antwortet mit 422 und wird wie /vision/label berechnet. Jede Korrektur behält den vorherigen Text zum Zurücksetzen, wird nach Reimporten nur so lange neu angewendet, wie die Upstream-Quelle noch den korrigierten Text ausliefert, und sorgt dafür, dass sich die KI-Übersetzungen des alten Textes bei ihrer nächsten Anfrage neu erzeugen. Auch die Analyse des Produkts wird neu erzeugt, weil sich der Datensatz geändert hat.
Was du damit baust
Produktdetail-Bildschirme
Zeige Käufern neben den Rohwerten ein sofortiges, lesbares Urteil.
Diätfilter, die sich selbst erklären
Vegan- oder glutenfrei-Hinweise, die sagen, ob eine Etikettenangabe oder die Zutatenliste sie stützt.
Gesundheits- & Coaching-Apps
Mach aus Scans beratungsreifen Text, ohne eine eigene LLM-Pipeline zu bauen.
Limits pro Tarif
| Free | 20 KI-Credits/Monat, über Schlüssel geteilt (5 Analysen zu je 4 Credits); 1 KI-Anfrage/s pro Schlüssel |
|---|---|
| Starter | 500 KI-Credits/Monat; 1 KI-Anfrage/s pro Schlüssel |
| Pro | 1.300 KI-Credits/Monat; 2 KI-Anfragen/s pro Schlüssel |
| Enterprise | 3.000 KI-Credits/Monat; 5 KI-Anfragen/s pro Schlüssel |
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
402 — Monatliche KI-Credits und Aufladungs-Credits sind aufgebraucht; X-Credits-Remaining ist 0, die Meldung nennt das Reset-Datum, und der Body hat eine top_up_url.
Pausiere KI-Aufrufe bis X-Credits-Reset oder wechsle den Tarif. Daten-Endpunkte funktionieren weiter.
404 — Kein Produkt passt zur food_id oder zum barcode. Erstattet.
Löse per Suche oder Barcode neu auf; IDs sind stabil, ein 404 ist also nicht vorübergehend. Außerhalb des Katalogs nutze /analyze/custom.
422 — Beide oder keines von food_id und barcode; ein custom-name ohne Zutaten oder Nährwerte; ein ungültiger Nährstoff-Schlüssel oder -Wert; force auf Text, der nicht KI-generiert ist. Erstattet, außer bei einem /correct/product/photo, dessen Foto gelesen, aber nicht verwendet werden konnte, das berechnet wird.
Lies details[].field und details[].message, korrigiere die Anfrage, wiederhole sie nicht unverändert.
429 — Das KI-Limit pro Schlüssel (1/s Free und Starter, 2/s Pro, 5/s Enterprise) oder die Kontoobergrenze von dem Dreifachen davon. Es wird kein Credit abgebucht.
Warte die Sekunde aus Retry-After ab und serialisiere KI-Aufrufe pro Schlüssel.
502 — Der Modellaufruf ist fehlgeschlagen, oder eine Übersetzung lag unter der Confidence-Schwelle. Die Meldung endet auf „You were not charged.“
Versuche es nach einer kurzen Pause erneut; ein späterer Erfolg wird normal gecacht.
503 — KI ist nicht aktiviert, oder der Credit- oder Rate-Limit-Speicher ist nicht erreichbar. Erstattet.
Mit Backoff wiederholen und in der Zwischenzeit den Rohdatensatz aus der Lebensmittel-Datenbank-API zeigen.
Im Vergleich zu anderen APIs
Eine allgemeine LLM-API fasst ein Produkt zusammen, wenn du das Etikett einfügst; dann gehören dir der Prompt, die Grounding-Regeln, das Ausgabeschema, das Caching und die Konsistenz zwischen den Sprachen. FoodBase macht das einmal pro Produkt: Die Urteile werden mit veröffentlichten Schwellenwerten (EU-Nährwertangaben, UK-FSA-Ampel) aus dem hinterlegten Datensatz berechnet, das Modell schreibt nur die Zusammenfassung und die zutatenbasierten Beurteilungen, alles wird gegen ein festes Schema validiert und pro Produkt und Sprache gecacht, sodass ein Urteil zwischen Sprachen nicht abweichen kann. Der Kompromiss: Es ist nur so gut wie der Datensatz — keine Zutaten hinterlegt heißt unbekannte Diäten, und nichts wird geschätzt, um die Lücke zu füllen, wobei sich defekter Etikettentext mit /correct/product reparieren lässt. Brauchst du Zahlen statt Prosa, ist die Nährwert-API der günstigere Aufruf.
Häufige Fragen
Werde ich berechnet, wenn cached true ist? +
Bei /analyze/product und /analyze/custom ja: Ein Cache-Treffer kostet dieselben 4 Credits wie eine frische Analyse, ohne Rückerstattung. Bei /translate/product nein: cached: true heißt, die Sprache existierte schon, und deine 4 Credits werden erstattet.
Was bedeuten „unknown“ und „no_known_source“ in diets? +
unknown: Der Datensatz hat weder eine Etikettenangabe noch ein Allergen-Tag noch eine Zutatenliste, die es klärt — eine Aussage über den Datensatz, kein weiches „nein“. no_known_source (nur glutenfrei und laktosefrei): Die Zutatenliste nennt keine Quelle, aber das Etikett macht keine Angabe, das Produkt ist also nicht zertifiziert. Menschen mit Zöliakie oder Laktoseintoleranz sollten nur „yes“ mit basis label_claim als sicher behandeln.
Kann ich eine eigene Frage stellen, etwa ob ein Produkt zu einer natriumarmen Diät passt? +
Nicht über diese Endpunkte: Die Analyse hat eine feste Form, und /analyze/custom nimmt Produktdaten, keine Fragen. Lies sodium_mg oder salt_g aus der Nährwert-API und wende deinen eigenen Schwellenwert an, statt den warnings-Text zu parsen.
Woher kommen die Pluspunkte und Warnhinweise? +
Aus festen Regeln, nicht vom Modell: Pluspunkte nutzen die Bedingungen der EU-Nährwertangaben (Verordnung 1924/2006), Warnhinweise die „hoch“-Schwellenwerte der UK-FSA-Frontkennzeichnung, einschließlich der Limits pro Portion für Portionen über 100 g oder 150 ml. Dasselbe Produkt bekommt daher jedes Mal und in jeder Sprache dieselben Punkte, und nutrient_levels liefert sie als Daten, nach denen du filtern kannst.
Was passiert mit der gecachten Analyse, wenn sich der Produktdatensatz ändert? +
Der Cache-Eintrag ist an das updated_at des Datensatzes gebunden; nach einem Reimport oder einer Korrektur erzeugt der nächste Aufruf eine neue Analyse aus den neuen Daten und berechnet 4 Credits. Bis dahin wird die gecachte Antwort ausgeliefert.
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-Datenbank API
Eine einzige Quelle für 6,1 Millionen Lebensmittel. Hole einen vollständigen Produktdatensatz per ID — Name, Marke, Zutaten, Allergene, Nutri-Score, NOVA-Gruppe, Bilder und mehr.
Mehr erfahren →Leg jetzt los mit der KI-Lebensmittelanalyse API
Kostenlos starten. Keine Kreditkarte nötig.
API-Schlüssel holen Zum Dashboard