API за категории храни
Разглеждай всяка категория храни с броя продукти в нея — гръбнакът на филтри, фасети и навигация. Странициран JSON върху целия каталог, сервиран от предварително изчислен изглед, за да остане бърз.
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
} Предпочиташ да кликаш? Пробвай търсачката на продукти или фото площадката.
Какво получаваш
category
Името на категорията.
product_count
Колко продукта попадат под нея.
total
Брой различни категории.
Готово за филтри
Комбинирай с търсене, за да ограничиш резултатите по категория.
Включено в безплатния план — 100 заявки/ден, без кредитна карта. Виж плановете →
Примерен код
Същата заявка на curl, JavaScript и Python. Замени YOUR_API_KEY с ключ от таблото си.
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()
Как работи
Какво връща една заявка
GET /v1/categories чете предварително изчислена таблица с всеки различен низ на категория в каталога и колко продукта го носят; продуктите без категория са изключени. Редовете са подредени по product_count низходящо без вторично сортиране, затова не разчитай на реда на редове с равен брой.
q е филтър по подниз без значение на регистъра, не префикс: q=chocolate съвпада с „Chocolate“, „en:chocolates“ и „Beverages, Dairies, Dairy drinks, Flavoured milks, Chocolate milks“ еднакво, стеснявайки заснетия отговор до total от 11303 различни низа. Интервалите в краищата се отрязват, % и _ са буквални, а q е ограничен до 200 символа.
limit е 1–100 (по подразбиране 20) и offset 0–10000, така че с limit=100 можеш да стигнеш най-много до първите 10 100 реда; стеснявай с q, вместо да странираш по-дълбоко. Отговорите носят Cache-Control: public, max-age=600, сървърът кешира за час, а таблицата се изгражда наново само при масов повторен внос, затова я дръпни веднъж при стартиране или в стъпка на билда и запази резултата.
Две форми на низ за категория
Продуктите от Open Food Facts носят йерархия със запетаи от общо към конкретно: „Snacks, Sweet snacks, Cocoa and its products, Chocolates, Dark chocolates“. Сегментите може да са суров таксономичен таг с двубуквен езиков префикс („en:chocolate-candies“), може да са на езика на етикета („Botanas, Snacks dulces, Cacao y sus productos, Chocolates, Chocolates negros“) и често завършват с обща категория като en:groceries, която не е най-конкретното ниво.
Продуктите от USDA носят една плоска търговска категория, чието име може само да съдържа запетаи („Chips, Pretzels & Snacks“); никога не я разделяй. Редовете тук не носят source, затова когато ти трябва, вземи продукт от категорията през API за база данни с храни и прочети source до category и categories_tags.
Една йерархия може да се появи като няколко реда: заснетият отговор изброява „Snacks, Sweet snacks, Cocoa and its products, Chocolates, Dark chocolates“ (497 продукта) и същия път без интервали след запетаите (339) поотделно. Обединявай по почистени сегменти, не по суровия низ.
Изграждане на дърво за разглеждане или интерфейс с филтри
Приложи почистването, което използва уебсайтът: раздели по запетаи, отрежи интервалите, махни водещ таг xx:, замени тиретата с интервали, направи първата буква главна и премахни повтарящите се сегменти без значение от регистъра. Първият почистен сегмент е коренът; последният, който не е обща категория (groceries, food, foods, products, unknown, none), е листът. Броят на възела е сумата от product_count за всеки суров низ, който се съпоставя с него.
- Коренови възли: групирай по първия почистен сегмент („Snacks“, „Beverages“, „Botanas“).
- Чипове за листа: последният сегмент, който не е обща категория („Dark chocolates“, „Chocolate milks“).
- Плоски имена от USDA: целият низ е едновременно корен и лист.
- Език: йерархиите на различни езици остават отделни възли; за преводи по продукт подай lang= към API за търсене на храни и чети category_localized и category_segments_localized.
- Дървото за разглеждане на уебсайта в /categories/ прилага същите правила за почистване към тези данни (и запазва само по-големите листа); използвай го, за да проверяваш резултата си.
От категория към нейните продукти
Търсенето няма параметър за категория. API за търсене на храни първо съпоставя имена на продукти и марки и само когато това не намери нищо, съпоставя думите от заявката ти с низове на категории. Изпрати като q цял почистен сегмент, който сам по себе си не е име на продукт, например „Seeds & Related Snacks“, и получаваш продуктите на тази категория, подредени по популярност.
Резервният вариант е по думи, така че „Seeds & Related Snacks“ съвпада с всеки низ на категория, съдържащ тези думи, на всеки език, а сегмент, който е и често срещана дума за продукт („Chocolate“ или „Dark chocolates“), никога не стига до него, защото имената на продуктите съвпадат първи. За стриктно изброяване филтрирай всеки резултат по полето му category, което е суровият низ, върнат от тази крайна точка.
Какво можеш да изградиш
Филтри и фасети
Визуализирай навигация по категории с актуален брой продукти.
Прегледи на каталога
Покажи на потребителите формата на набора от данни, преди да търсят.
Аналитични табла
Визуализирай как продуктите се разпределят по категории.
Лимити по план
| Free | 100 заявки/ден, споделени между крайните точки, 1/с (burst 5); достатъчно да обновяваш кеширано дърво няколко пъти на ден. |
|---|---|
| Starter | 5 000 заявки/ден, 5/с (burst 25). |
| Pro | 25 000 заявки/ден, 20/с (burst 100). |
| Enterprise | 100 000 заявки/ден, 50/с (burst 250). |
Всеки отговор съдържа хедъри X-RateLimit-* с оставащия бюджет; всеки 429 съдържа Retry-After . Сравни плановете →
Грешки и как да ги обработиш
401 — X-API-Key липсва, е невалиден или е отменен.
Изпрати ключ от таблото; полето error в тялото казва кое от трите е.
422 — limit извън 1–100, offset извън 0–10000 или q над 200 символа.
Ограничавай стойностите от страна на клиента; валидацията тук връща 422, не 400.
429 — Лимитът за секунда на ключа или дневната квота на акаунта е изчерпана.
Изчакай Retry-After и междувременно сервирай кеширано копие.
В сравнение с други API
Това е списък на низовете на категориите, както са съхранени, с брой, а не подбрана таксономия. Контрибуторите на Open Food Facts и вносът от USDA предоставят всеки своя форма, интервали, език и тагове, а крайната точка не ги обединява; правилата за почистване по-горе са за теб. В замяна броят съвпада точно с каталога и всеки низ може да се подаде директно обратно в търсене или да се сравни с полето category на продукта. Изгради едно нормализирано дърво от този списък и го кеширай, защото данните се променят само при повторен внос.
Често задавани въпроси
q префикс ли е, или съвпадение по подниз? +
Подниз, без значение на регистъра, навсякъде в низа; q=chocolate връща „Beverages, Dairies, Dairy drinks, Flavoured milks, Chocolate milks“, както и „Chocolate“. Няма начин да го закотвиш в началото.
Защо виждам една и съща йерархия повече от веднъж? +
Съхранените низове се различават по интервали, тагване („en:chocolates“ срещу „Chocolates“) или език, а крайната точка брои за всеки суров низ. Обединявай по почистени сегменти, за да ги слееш.
Мога ли да изброя само категориите от USDA или само от Open Food Facts? +
Не: няма филтър по източник и редовете не носят source. Вземи продукт от категорията през API за база данни с храни и прочети полето му source.
Мога ли да филтрирам търсенето по категория? +
Не с параметър. Изпрати сегмента като q към API за търсене на храни, което преминава към съпоставяне на категории само когато никое име на продукт или марка не съвпада; филтрирай по полето category на всеки резултат за точно съвпадение.
total брои продукти или категории? +
Различни низове на категории, съвпадащи с q: в заснетия отговор total е 11303 за q=chocolate, докато само първият ред съдържа 46110 продукта. Сумирай product_count сам за общ брой продукти.
Разгледай още endpoint-и
API за търсене на храни
Пълнотекстово търсене сред 6,1 милиона хранителни продукта по име, марка или категория — подредени по релевантност, със странициране и бързо. Търси на всеки език, на който е отпечатан етикетът (включително кирилица), и подай lang=en|fr|es|de|it|bg за локализирани имена, категории и алергени. Една GET заявка връща чист JSON, който приложението ти може да визуализира веднага.
Научи повече →API за база данни с храни
Единен източник за 6,1 милиона храни. Вземи пълен запис за продукт по ID — име, марка, съставки, алергени, Nutri-Score, NOVA група, изображения и още.
Научи повече →Започни да създаваш с API за категории храни
Безплатно за начало. Без кредитна карта.
Вземи API ключ Към таблото