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.
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 }
} Lieber klicken? Probier den Produkt-Explorer oder die Foto-Spielwiese aus.
Was du zurückbekommst
Makros
Energie, Eiweiß, Kohlenhydrate, Zucker, Fett, gesättigte Fette, Ballaststoffe.
Mineralstoffe
Natrium, Calcium, Eisen, Kalium, Magnesium, Zink und mehr.
Vitamine
A, C, D, E und die B-Vitamine, sofern angegeben.
Pro 100 g
Einheitliche Basis, damit du auf jede Portionsgröße umrechnen kannst.
40+ Felder
Ein Objekt mit jedem Nährstoff, den die Quelldaten liefern.
Im kostenlosen Tarif enthalten — 25 Nährwert-Aufschlüsselungen/Tag, keine Kreditkarte nötig; ab Starter unbegrenzt. 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/62ea12b8-b260-c288-5c38-3a4906f5d6dd/nutrients" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch("https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd/nutrients", {
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/nutrients",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=30,
)
res.raise_for_status()
data = res.json()
So funktioniert's
Eine Anfrage, fünf Gruppen, pro 100 g
GET /v1/foods/{id}/nutrients nimmt die UUID des Lebensmittels im Pfad und sonst nichts: keine Query-Parameter, keinen Body, kein lang. Die id ist dieselbe, die jeder andere Endpunkt liefert, sodass ein Treffer aus der Lebensmittel-Suche-API oder der Barcode-Abfrage-API mit einem weiteren Aufruf zur vollständigen Aufschlüsselung wird. IDs sind über Reimporte hinweg deterministisch, du kannst sie also speichern und diese URL weiter aufrufen.
Die Antwort ist ein flaches Objekt mit food_id und fünf festen Gruppen: macros, fats, minerals, vitamins und other. Jeder Schlüssel ist immer vorhanden, und jeder Wert ist entweder eine Zahl oder null. Zählt man die Schlüssel im aktuellen Schema, ergeben sich 41 Nährstofffelder — daher die Angabe 40+. Einheiten stehen im Schlüsselnamen (energy_kcal, sodium_mg, selenium_mcg, vitamin_a_iu), du brauchst also keine separate Einheitentabelle.
Alle Werte beziehen sich auf 100 g des Produkts, wie es verkauft wird. Für eine Portion multipliziere mit Gramm geteilt durch 100. Das serving_size_raw des Lebensmitteldatensatzes ist Etikettentext (beim Beispiel-Datensatz von Coca-Cola ist es „1 can (330 ml)“), die Umrechnung dieses Textes in Gramm ist also deine Aufgabe.
- macros (10 Schlüssel) umfasst Energie in kcal und kJ, Eiweiß, Kohlenhydrate, Fett, Zucker, Ballaststoffe, Alkohol, Stärke und Polyole; fats (7) ergänzt gesättigte, Trans-, einfach und mehrfach ungesättigte Fette, omega3, omega6 und cholesterol_mg
- minerals (12) reicht von sodium_mg und salt_g bis selenium_mcg und iodine_mcg; vitamins (11) gibt A und D in IU an, B9 und B12 in mcg, den Rest in mg; other enthält added_sugars_g
Nullwerte und Nullen richtig lesen
Die Beispielantwort für das Lebensmittel 62ea12b8-b260-c288-5c38-3a4906f5d6dd zeigt das typische Open-Food-Facts-Muster: energy_kcal 42, energy_kj 180.2, carbs_g 10.6, sugars_g 10.6, added_sugars_g 5.3, explizite Nullen für proteins_g, fat_g, saturated_fat_g, sodium_mg und salt_g, und null für alles andere, von fiber_g bis zur gesamten vitamins-Gruppe.
Behandle die beiden Zustände unterschiedlich. Eine 0 ist ein Wert, den die Quelle gemeldet hat; null heißt, dass der Nährstoff nicht auf dem Etikett oder nicht in der Quelle steht. Wandle null nie in 0 um, bevor du die Tagesaufnahme addierst, sonst weist eine Mahlzeit aus teilweise gekennzeichneten Produkten stillschweigend zu wenig Vitamine und Mineralstoffe aus. Zeige stattdessen einen Strich oder „nicht angegeben“.
Die Abdeckung folgt der Herkunft. Zeilen mit source usda_foundation oder usda_sr_legacy sind Laboranalysen der USDA und füllen die Vitamin- und Mineralstoffgruppen, sodass die meisten Schlüssel Zahlen sind. Zeilen mit source usda (USDA Branded Foods) und Zeilen aus Open Food Facts sind von der Verpackung abgetippt; sie sind für die verpflichtenden Etikettennährwerte zuverlässig und darüber hinaus oft null. Das source-Feld des Lebensmitteldatensatzes sagt dir, in welchem Fall du bist, bevor du die Tabelle renderst.
- Rendere null als unbekannt, nicht als null; aggregiere nur Schlüssel, die über jedes Element der Mahlzeit hinweg nicht null sind.
- sodium_mg und salt_g existieren beide, weil sich Etiketten je nach Region unterscheiden; nimm das, was deine Zielgruppe erwartet, und falle auf das andere zurück.
Wann du diesen Aufruf wirklich brauchst
Jeder Lebensmitteldatensatz aus der Lebensmittel-Datenbank-API und jeder Barcode-Treffer enthält bereits nutrition_summary mit sechs Eckwerten: energy_kcal, proteins_g, carbs_g, fat_g, sugars_g und fiber_g. Suchtreffer sind schlankere Zeilen ohne dieses Objekt. Für ein Scan-Ergebnis, eine Detailkarte oder ein schnelles Kalorienprotokoll genügt dieses Objekt meist und kostet keine Nährwert-Aufschlüsselung.
Spare dir /nutrients für den Detailbildschirm oder den Moment, in dem jemand nach Natrium, gesättigten Fetten, Cholesterin oder einem bestimmten Vitamin fragt. Suchen oder scannen, die Zusammenfassung zeigen, die Aufschlüsselung beim Antippen holen. Im Free-Tarif hält dich das während der Entwicklung auch innerhalb des Limits von 25 pro Tag.
Die aufgezeichneten Antwort-Header tragen kein Cache-Control, das Caching ist also deine Aufgabe. IDs sind stabil und Werte ändern sich nur, wenn ein Produkt neu importiert wird, sodass ein Cache mit food_id als Schlüssel und einer Haltedauer von Stunden oder Tagen sicher ist.
Das Free-Kontingent, Header für Header
Im Free-Tarif zieht jede erfolgreiche Aufschlüsselung von einem separaten Tageszähler mit 25 ab, der in jeder Antwort als X-RateLimit-Nutrients-Limit, X-RateLimit-Nutrients-Remaining und X-RateLimit-Nutrients-Reset gemeldet wird. Lies Remaining vor einer Serie von Detailabrufen, dann kannst du auf nutrition_summary ausweichen, statt mitten in der Sitzung gegen die Wand zu laufen.
Bei null liefert der Endpunkt 429 mit dem Fehler „Nutrients daily allowance exceeded“, einer upgrade_url im Body und Retry-After mit den Sekunden bis Mitternacht UTC. Ein abgelehnter Aufruf verbraucht weder eine Aufschlüsselung noch eine Tagesanfrage und verschiebt den Reset nicht. Bezahlte Tarife haben keinen solchen Zähler; ihre Nährwert-Aufrufe sind nur durch das tägliche Anfragekontingent des Tarifs (geteilt über alle Schlüssel des Kontos) und das Sekundenlimit pro Schlüssel begrenzt.
Bist du bei Starter oder darüber und arbeitest einen großen Katalog ab, hole zuerst die Basisdatensätze über die Bulk-Lebensmittelabfrage-API und rufe /nutrients nur für die IDs auf, bei denen die Zusammenfassung nicht reicht.
Was du damit baust
Kalorien- & Makro-Tracker
Erfasse genaue Nährwerte pro Portion aus einer einzigen Abfrage.
Mahlzeitenplanung & Diäten
Baue Pläne, die Makro- und Mikronährstoffziele treffen.
Gesundheits- & klinische Tools
Zeige detaillierte Nährstoffprofile für Ernährungsempfehlungen.
Limits pro Tarif
| Free | 25 Nährwert-Aufschlüsselungen/Tag (X-RateLimit-Nutrients-*-Header), innerhalb von 100 Anfragen/Tag; 1 Anfr./s, Burst 5 |
|---|---|
| Starter | Unbegrenzte Aufschlüsselungen innerhalb von 5.000 Anfragen/Tag; 5 Anfr./s, Burst 25 |
| Pro | Unbegrenzte Aufschlüsselungen innerhalb von 25.000 Anfragen/Tag; 20 Anfr./s, Burst 100 |
| Enterprise | Unbegrenzte Aufschlüsselungen innerhalb von 100.000 Anfragen/Tag; 50 Anfr./s, 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 — Zu dieser id gibt es keine Nährwertzeile: Das Lebensmittel existiert womöglich nicht, oder es existiert ohne Nährwertdaten (sein nutrition_summary ist null). Der Body lautet „No nutrient data for this food“.
Nicht wiederholen. Zeige das Lebensmittel ohne Aufschlüsselung; stammt die id aus einem alten Cache, löse sie per Barcode oder Suche neu auf, denn ein 404 ist hier nicht vorübergehend.
422 — Die id im Pfad ist keine UUID, etwa ein Barcode oder eine aus einem Beispiel kopierte gekürzte id.
Übergib das id-Feld aus einer Suche, einem Barcode oder einem Lebensmitteldatensatz; löse Barcodes zuerst über die Barcode-Abfrage-API auf.
429 — Nur Free-Tarif: Der Body enthält den Fehler „Nutrients daily allowance exceeded“ und X-RateLimit-Nutrients-Remaining ist 0. Es wurde keine Aufschlüsselung verbraucht.
Beachte Retry-After (Sekunden bis Mitternacht UTC), weiche für den Rest des Tages auf nutrition_summary aus und zeige die upgrade_url aus dem Body an, wenn die Nutzerin sofort vollständige Aufschlüsselungen braucht.
429 — Jeder Tarif: Das Sekundenlimit pro Schlüssel oder das kontoweite Tagesanfragekontingent ist erschöpft; X-RateLimit-Second-Remaining und X-RateLimit-Daily-Remaining zeigen, welches.
Warte die Sekunden aus Retry-After ab. Reihe Detailabrufe ein, statt sie parallel abzufeuern; bei einem Tageslimit pausiere bis X-RateLimit-Daily-Reset.
Im Vergleich zu anderen APIs
Die meisten Nährwert-APIs liefern entweder eine Tabelle pro Portion, die du nicht umrechnen kannst, oder verteilen Nährstoffe auf Name/Wert/Einheit-Zeilen, die du selbst normalisieren musst. FoodBase liefert ein festes, typisiertes Objekt pro 100 g mit der Einheit in jedem Schlüssel, sodass ein einmal gegen das Schema geschriebener Client zu jedem Produkt passt. Der Kompromiss ist Ehrlichkeit bei Lücken: Eine von Etiketten abgeleitete Open-Food-Facts-Zeile hat Nullwerte, wo eine USDA-Zeile Zahlen hat, und die API meldet das, statt Schätzungen einzutragen. Brauchst du nur die Makro-Eckwerte, trägt sie der Lebensmitteldatensatz bereits, und dieser Endpunkt ist optional.
Häufige Fragen
Gelten die Werte pro Portion oder pro 100 g? +
Immer pro 100 g, für jeden Tarif und jede Quelle. Das serving_size_raw des Lebensmitteldatensatzes ist Etikettentext wie „1 can (330 ml)“, die Umrechnung in Gramm und Skalierung passiert also in deinem Code. So bleiben zwei Produkte vergleichbar, ohne zu wissen, wie jede Marke eine Portion definiert.
Was bedeutet ein null-Wert, und wie unterscheidet er sich von 0? +
null heißt, dass der Nährstoff nicht auf dem Etikett oder nicht in der Quelle steht; 0 heißt, die Quelle hat null gemeldet. In der Beispielantwort für Coca-Cola ist fat_g 0, während fiber_g null ist. Behandle die beiden beim Summieren einer Mahlzeit nie gleich.
Warum hat ein USDA-Lebensmittel Vitamine, ein Supermarktprodukt aber nicht? +
USDA-Foundation- und SR-Legacy-Zeilen (source usda_foundation, usda_sr_legacy) stammen aus Laboranalysen und füllen typischerweise die Vitamin- und Mineralstoffgruppen. USDA-Branded-Zeilen (source usda) und Open-Food-Facts-Zeilen sind von der Verpackung abgetippt, die in den meisten Regionen nur die Eckwerte vorschreibt. Prüfe das source-Feld im Lebensmitteldatensatz, um zu wissen, welche Art Zeile du hast.
Brauche ich diesen Endpunkt, wenn ich schon nutrition_summary habe? +
Oft nicht. nutrition_summary im Lebensmitteldatensatz liefert bereits energy_kcal, proteins_g, carbs_g, fat_g, sugars_g und fiber_g. Rufe /nutrients auf, wenn du den Rest brauchst, etwa gesättigte Fette, Natrium, Cholesterin oder ein Vitamin oder einen Mineralstoff, was meist nur auf einem Detailbildschirm der Fall ist.
Wie hängt das Free-Limit von 25 Aufschlüsselungen mit den 100 Anfragen pro Tag zusammen? +
Die 25 sind ein separater Zähler, der in den X-RateLimit-Nutrients-*-Headern gemeldet und um Mitternacht UTC zurückgesetzt wird; die 100 sind das kontoweite Anfragekontingent. Eine erfolgreiche Aufschlüsselung zählt bei beiden. Ein 429 wegen des Nährwert-Kontingents verbraucht keines von beiden, schlägt aber bis zum Reset weiter fehl — hör also bis dahin auf zu rufen.
Welcher Endpunkt liefert mir die id, die ich hier übergebe? +
Jeder von ihnen. Die Lebensmittel-Suche-API liefert IDs für Textanfragen, und die Barcode-Abfrage-API löst eine GTIN zu einem Datensatz auf. Die food_id 62ea12b8-b260-c288-5c38-3a4906f5d6dd aus dem Beispiel ist der Datensatz hinter dem Barcode 5449000000996.
Weitere Endpoints entdecken
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.
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 →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.
Mehr erfahren →Leg jetzt los mit der Nährwert-API
Kostenlos starten. Keine Kreditkarte nötig.
API-Schlüssel holen Zum Dashboard