Lebensmittel-Kategorien API
Durchstöbere jede Lebensmittelkategorie mit ihrer Produktzahl — das Rückgrat für Filter, Facetten und Navigation. Paginiertes JSON über den gesamten Katalog, ausgeliefert aus einer vorberechneten Ansicht, damit es schnell bleibt.
curl -H "X-API-Key: food_•••" \
"https://foodbase.dev/v1/categories"
{
"data": [
{ "category": "Popcorn, Peanuts, Seeds & Related Snacks", "product_count": 95496 },
{ "category": "Candy", "product_count": 92693 },
{ "category": "Cheese", "product_count": 85564 }
],
"total": 306779
} Lieber klicken? Probier den Produkt-Explorer oder die Foto-Spielwiese aus.
Was du zurückbekommst
category
Der Kategoriename.
product_count
Wie viele Produkte darunter fallen.
total
Anzahl der unterschiedlichen Kategorien.
Filterbereit
Kombiniere sie mit der Suche, um Ergebnisse nach Kategorie einzugrenzen.
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/categories?q=chocolate&limit=10" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch("https://foodbase.dev/v1/categories?q=chocolate&limit=10", {
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/categories?q=chocolate&limit=10",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=30,
)
res.raise_for_status()
data = res.json()
So funktioniert's
Was eine Anfrage liefert
GET /v1/categories liest eine vorberechnete Tabelle mit jedem unterschiedlichen Kategorie-String im Katalog samt der Zahl der Produkte, die ihn tragen; Produkte ohne Kategorie sind ausgeschlossen. Die Zeilen sind nach product_count absteigend sortiert, ohne zweite Sortierung — verlass dich also nicht auf die Reihenfolge von Zeilen mit gleicher Zahl.
q ist ein Teilstring-Filter ohne Beachtung der Groß-/Kleinschreibung, kein Präfix: q=chocolate trifft „Chocolate“, „en:chocolates“ und „Beverages, Dairies, Dairy drinks, Flavoured milks, Chocolate milks“ gleichermaßen und engt die aufgezeichnete Antwort auf ein total von 11303 unterschiedlichen Strings ein. Leerraum wird getrimmt, % und _ sind wörtlich, und q ist auf 200 Zeichen begrenzt.
limit reicht von 1–100 (Standard 20) und offset von 0–10000, sodass du mit limit=100 höchstens die ersten 10.100 Zeilen erreichst; grenze lieber mit q ein, statt tiefer zu blättern. Antworten tragen Cache-Control: public, max-age=600, der Server cacht eine Stunde, und die Tabelle wird nur bei einem Bulk-Reimport neu aufgebaut — hole sie also einmal beim Start oder in einem Build-Schritt und speichere das Ergebnis.
Zwei Formen von Kategorie-Strings
Open-Food-Facts-Produkte tragen eine kommagetrennte Hierarchie, von allgemein bis spezifisch: „Snacks, Sweet snacks, Cocoa and its products, Chocolates, Dark chocolates“. Segmente können rohe Taxonomie-Tags mit einem zweistelligen Sprachpräfix sein („en:chocolate-candies“), in der Sprache des Etiketts stehen („Botanas, Snacks dulces, Cacao y sus productos, Chocolates, Chocolates negros“) und enden oft in einem Sammelbegriff wie en:groceries, der nicht die spezifischste Ebene ist.
USDA-Produkte tragen eine flache Handelskategorie, deren Name selbst Kommas enthalten kann („Chips, Pretzels & Snacks“); trenne sie nie. Zeilen enthalten hier keine source — brauchst du sie, hole mit der Lebensmittel-Datenbank-API ein Produkt aus der Kategorie und lies source neben category und categories_tags.
Eine Hierarchie kann als mehrere Zeilen erscheinen: Die aufgezeichnete Antwort listet „Snacks, Sweet snacks, Cocoa and its products, Chocolates, Dark chocolates“ (497 Produkte) und denselben Pfad ohne Leerzeichen nach den Kommas (339) getrennt. Führe über bereinigte Segmente zusammen, nicht über den rohen String.
Einen Browse-Baum oder eine Filter-UI bauen
Wende die Bereinigung an, die die Website nutzt: am Komma trennen, trimmen, ein führendes xx:-Tag entfernen, Bindestriche durch Leerzeichen ersetzen, den ersten Buchstaben großschreiben und wiederholte Segmente ohne Beachtung der Groß-/Kleinschreibung verwerfen. Das erste bereinigte Segment ist die Wurzel; das letzte, das kein Sammelbegriff ist (groceries, food, foods, products, unknown, none), ist das Blatt. Die Zahl eines Knotens ist die Summe von product_count über alle rohen Strings, die auf ihn abgebildet werden.
- Wurzelknoten: nach erstem bereinigten Segment gruppieren („Snacks“, „Beverages“, „Botanas“).
- Blatt-Chips: das letzte Segment, das kein Sammelbegriff ist („Dark chocolates“, „Chocolate milks“).
- Flache USDA-Namen: der ganze String ist zugleich Wurzel und Blatt.
- Sprache: Hierarchien in verschiedenen Sprachen bleiben getrennte Knoten; für Übersetzungen pro Produkt übergib lang= an die Lebensmittel-Suche-API und lies category_localized und category_segments_localized.
- Der Browse-Baum der Website unter /categories/ wendet dieselben Bereinigungsregeln auf diese Daten an (und behält nur die größeren Blätter); nutze ihn, um deine Ausgabe zu prüfen.
Von einer Kategorie zu ihren Produkten
Die Suche hat keinen Kategorie-Parameter. Die Lebensmittel-Suche-API gleicht zuerst Produktnamen und Marken ab und gleicht erst dann, wenn das nichts findet, die Wörter deiner Anfrage mit Kategorie-Strings ab. Sende ein vollständiges bereinigtes Segment, das selbst kein Produktname ist, als q, etwa „Seeds & Related Snacks“, und du erhältst die Produkte dieser Kategorie nach Beliebtheit sortiert.
Der Fallback arbeitet wortbasiert, sodass „Seeds & Related Snacks“ jeden Kategorie-String trifft, der diese Wörter in irgendeiner Sprache enthält, und ein Segment, das zugleich ein gängiges Produktwort ist („Chocolate“ oder „Dark chocolates“), ihn nie erreicht, weil Produktnamen zuerst treffen. Für eine strikte Auflistung filtere jedes Ergebnis nach seinem category-Feld, dem rohen String, den dieser Endpunkt zurückgegeben hat.
Was du damit baust
Filter & Facetten
Rendere Kategorienavigation mit aktuellen Produktzahlen.
Katalogübersichten
Zeige Nutzern die Form des Datenbestands, bevor sie suchen.
Analytics-Dashboards
Stelle grafisch dar, wie sich Produkte auf Kategorien verteilen.
Limits pro Tarif
| Free | 100 Anfragen/Tag, geteilt über alle Endpunkte, 1/s (Burst 5); genug, um einen gecachten Baum ein paar Mal am Tag zu aktualisieren. |
|---|---|
| Starter | 5.000 Anfragen/Tag, 5/s (Burst 25). |
| Pro | 25.000 Anfragen/Tag, 20/s (Burst 100). |
| Enterprise | 100.000 Anfragen/Tag, 50/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
401 — X-API-Key fehlt, ist ungültig oder widerrufen.
Sende einen Schlüssel aus dem Dashboard; das error-Feld im Body sagt, welcher Fall vorliegt.
422 — limit außerhalb von 1–100, offset außerhalb von 0–10000 oder q über 200 Zeichen.
Begrenze Werte auf dem Client; die Validierung liefert hier 422, nicht 400.
429 — Das Sekundenlimit des Schlüssels oder das Tageskontingent des Kontos ist erschöpft.
Warte auf Retry-After und liefere in der Zwischenzeit deine gecachte Kopie aus.
Im Vergleich zu anderen APIs
Dies ist eine Auflistung von Kategorie-Strings, wie sie gespeichert sind, mit Zahlen — keine kuratierte Taxonomie. Open-Food-Facts-Mitwirkende und der USDA-Import liefern jeweils ihre eigene Form, Schreibweise, Sprache und Tags, und der Endpunkt führt sie nicht zusammen; die oben beschriebenen Bereinigungsregeln wendest du selbst an. Dafür stimmen die Zahlen exakt mit dem Katalog überein, und jeder String lässt sich direkt zurück in die Suche geben oder mit dem category-Feld eines Produkts vergleichen. Baue aus dieser Liste einen normalisierten Baum und cache ihn, denn die Daten ändern sich nur bei einem Reimport.
Häufige Fragen
Ist q ein Präfix- oder ein Teilstring-Abgleich? +
Teilstring, ohne Beachtung der Groß-/Kleinschreibung, an beliebiger Stelle im String; q=chocolate liefert „Beverages, Dairies, Dairy drinks, Flavoured milks, Chocolate milks“ ebenso wie „Chocolate“. Man kann ihn nicht am Anfang verankern.
Warum sehe ich dieselbe Hierarchie mehrfach? +
Die gespeicherten Strings unterscheiden sich in Abständen, Tagging („en:chocolates“ gegenüber „Chocolates“) oder Sprache, und der Endpunkt zählt pro rohem String. Führe über bereinigte Segmente zusammen, um sie zu vereinen.
Kann ich nur USDA- oder nur Open-Food-Facts-Kategorien auflisten? +
Nein: Es gibt keinen source-Filter, und Zeilen tragen keine source. Hole ein Produkt aus der Kategorie mit der Lebensmittel-Datenbank-API und lies sein source-Feld.
Kann ich die Suche nach Kategorie filtern? +
Nicht per Parameter. Sende das Segment als q an die Lebensmittel-Suche-API, die nur auf Kategorie-Abgleich zurückfällt, wenn kein Produktname oder keine Marke passt; filtere für eine exakte Übereinstimmung nach dem category-Feld jedes Ergebnisses.
Zählt total Produkte oder Kategorien? +
Unterschiedliche Kategorie-Strings, die zu q passen: In der aufgezeichneten Antwort ist total 11303 für q=chocolate, während die erste Zeile allein 46110 Produkte hält. Summiere product_count selbst für eine Produktgesamtzahl.
Weitere Endpoints entdecken
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 →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 Lebensmittel-Kategorien API
Kostenlos starten. Keine Kreditkarte nötig.
API-Schlüssel holen Zum Dashboard