Free-Tarif

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.

200 OK
GET /v1/foods/{id}/nutrients
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"
            

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.

Zum vollständigen Vergleich der Lebensmitteldaten-APIs →

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.

Leg jetzt los mit der Nährwert-API

Kostenlos starten. Keine Kreditkarte nötig.

API-Schlüssel holen Zum Dashboard