План Starter

API за групово търсене на храни

Вземи до 100 храни с една заявка. Изпрати масив от ID или баркодове и получи пълните записи, както и списък с ненамереното — идеално за попълване на хранителен план, количка, хранителния дневник за деня или каталог със сканирани продукти без сто отделни заявки.

200 OK
POST /v1/foods/bulk
curl -X POST -H "X-API-Key: food_•••" \
  -H "Content-Type: application/json" \
  -d '{"ids":["62ea12b8...","2fc13a3b..."]}' \
  "https://foodbase.dev/v1/foods/bulk"

{
  "data": [
    { "id": "62ea12b8...", "name_default": "Original Taste", "brand": "Coca-Cola" },
    { "id": "2fc13a3b...", "name_default": "Nutella", "brand": "Ferrero" }
  ],
  "not_found": []
}

Предпочиташ да кликаш? Пробвай търсачката на продукти или фото площадката.

Какво получаваш

ids[]

От 1 до 100 ID на храни в тялото на заявката — или:

barcodes[]

От 1 до 100 баркода (GTIN-8/12/13/14), всеки намиран както в API за търсене по баркод, включително вариантите с водещи нули.

data[]

Пълни записи в реда на заявката; при търсене по баркод има и requested_barcode (изпратеният код).

not_found[]

ID или баркодовете без продукт — без грешка за цялата заявка.

?lang=

По избор en/fr/es/de/it/bg, както при търсенето на един запис.

Налично в план Starter и по-горе. Виж плановете →

Примерен код

Същата заявка на curl, JavaScript и Python. Замени YOUR_API_KEY с ключ от таблото си.


              curl "https://foodbase.dev/v1/foods/bulk" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["62ea12b8-b260-c288-5c38-3a4906f5d6dd","2fc13a3b-1913-5ab6-d2c7-8c09b56f93bb"]}'
            

Как работи

Заявката, стъпка по стъпка

POST /v1/foods/bulk с Content-Type: application/json, хедъра ти X-API-Key и тяло във вида {"ids": [...]} или {"barcodes": [...]} — точно едно от двете, от 1 до 100 елемента. ids са UUID низове (тези в примерите с код по-горе са реални записи за тестове); баркодовете се намират точно както с GET /v1/foods/barcode/{code}, така че EAN-13 намира и продукт, записан във формата UPC-12 или GTIN-14, а полето barcode на записа показва записаната форма до requested_barcode.

Валидацията се прави преди да се стигне до базата и е всичко или нищо. Баркод в ids, двете полета или нито едно, празен масив или 101 елемента отхвърлят цялата заявка с 422 {"error": "Validation Error", "details": [{"field": "ids.3", "message": ...}]}. Незадължителният ?lang= (en, fr, es, de, it, bg) превежда етикетите на категориите и алергените, както при търсенето на един запис; имената и съставките на други езици са в масивите name и ingredients.

Четене на отговора

data е масив от обекти FoodItem, изградени от същия форматер като API за база данни с храни, така че парсер, написан за единичния запис, работи без промяна — от id, barcode и source до categories_tags, image_url и allergens. Липсващите данни от източника са null, никога липсващ ключ.

nutrition_summary съдържа energy_kcal, proteins_g, carbs_g, fat_g, sugars_g и fiber_g на 100 g. Той е null като цяло само когато продуктът изобщо няма ред с хранителни вещества; ред, на който липсва една стойност, показва null само за този ключ. Текст от етикета като quantity и serving_size_raw пристига точно както е въведен от контрибуторите, затова парсвай защитно.

Липсващи елементи, дубликати и промени

Отговорът може да е по-кратък от заявката: няма 404 за отделен елемент, но всяко id или баркод без продукт е в not_found, в реда на заявката, така че никога не сравняваш сам. Повторено id или баркод се връща като един запис — премахни дубликатите преди изпращане, за да работи всяко от 100-те места.

Id-тата са детерминирани, получени от източника и неговия собствен идентификатор на продукта, така че продуктът запазва id си при повторен внос. Ако запазено id спре да се разрешава, продуктът вече не е в каталога под тази идентичност: маркирай реда като остарял и го разреши отново през API за търсене по баркод или API за търсене на храни, вместо да го триеш.

Квота и лимити — сметките

Едно групово извикване е една заявка от дневната квота и един токен от кофата за секунда, независимо от броя на id-тата. Редът на middleware е удостоверяване, лимит за секунда, проверка на плана, после дневна квота, така че 401, 429 от лимита или 403 за Starter никога не изразходват дневна заявка. 422 изразходва, защото валидацията се изпълнява, след като квотата е отчетена; проверявай UUID-тата от страна на клиента.

Чети заглавките при всеки 200: X-RateLimit-Second-Limit, X-RateLimit-Burst-Capacity и X-RateLimit-Second-Remaining за кофата на ключа, X-RateLimit-Account-Limit и X-RateLimit-Account-Remaining за агрегата за секунда на всички ключове на акаунта, и X-RateLimit-Daily-Limit, X-RateLimit-Daily-Remaining и X-RateLimit-Daily-Reset (при нормални акаунти) за споделения дневен бюджет и неговото нулиране в полунощ UTC. POST не носи заглавка Cache-Control, така че нищо не се кешира на ръба вместо теб: запазвай каквото си изтеглил.

Нощно синхронизиране на каталог

За асортимента на търговец изпращай директно баркодовете, по 100 на заявка, или запиши върнатото id до своя SKU и после синхронизирай по id. И в двата случая нощната задача никога не търси: чете записаните кодове, премахва дубликатите, разделя ги на групи по 100, изпраща всяка група тук и записва контролна точка след всяка завършена група, така че каталог, по-голям от бюджета за една нощ, продължава оттам, докъдето е стигнал. Сравнявай updated_at със своето копие, за да видиш какво се е променило.

Темпото задавай по заглавките, а не с фиксирано заспиване, и следи X-RateLimit-Daily-Remaining, за да не оставиш синхронизирането да лиши от квота дневния трафик на същия акаунт. Когато изглед има нужда от панела с над 40 хранителни вещества, извикай API за хранителни стойности за това id при поискване; то приема по едно id на заявка и също се брои като заявка.

  • Дедупликирай id-тата, дели на групи по 100, отбелязвай напредъка за всяка група.
  • Маркирай всичко в not_found като остаряло; провери го пак по-късно.
  • Дръпвай /nutrients лениво, за всеки продукт отделно, не в синхронизирането.

Какво можеш да изградиш

Менюта и дневници с храна

Разреши всеки елемент от плана за деня с едно извикване.

Зареждане на колички

Превърни списък със запазени ID-та на храни в пълни записи ефективно.

Задачи за синхронизиране

Обновявай много кеширани храни на партиди по график.

Лимити по план

Free Не е налично: 403 с required_plan starter (не се брои към 100-те заявки/ден)
Starter 5 000 заявки/ден, 5/с постоянно, burst 25; до 100 ID или баркода на заявка
Pro 25 000 заявки/ден, 20/с постоянно, burst 100; до 100 ID или баркода на заявка
Enterprise 100 000 заявки/ден, 50/с постоянно, burst 250; до 100 ID или баркода на заявка

Всеки отговор съдържа хедъри X-RateLimit-* с оставащия бюджет; всеки 429 съдържа Retry-After . Сравни плановете →

Грешки и как да ги обработиш

403 — Акаунт Free; тялото съдържа error Plan upgrade required, required_plan starter, current_plan free и upgrade_url

Надстрой на upgrade_url или ползвай GET /v1/foods/{id} във Free

422 — Нито едно или и двете полета ids и barcodes; празен масив или повече от 100 елемента; не-UUID в ids или празен баркод; details[] посочва грешната позиция

Валидирай и премахвай дубликати при клиента; изпращай баркодовете в barcodes[], не в ids[]

429 — Кофата на ключа или на акаунта е празна, или X-RateLimit-Daily-Remaining е стигнало 0 (тяло: Daily quota exceeded)

Изчакай Retry-After секунди; за дневния случай това е времето до полунощ UTC

401 — Заглавката X-API-Key липсва или ключът е невалиден или отменен

Провери името на заглавката и ключа в таблото

503 — Хранилището за квоти или лимити е недостъпно; API се отказва безопасно (fails closed)

Опитай отново с backoff; заявката не е била отчетена

В сравнение с други API

В сравнение с единичния GET печалбата е в заявките и квотата: 100 записа с една заявка вместо 100 заявки. GET печели, когато много клиенти четат един и същ популярен продукт, защото отговорите му могат да се кешират 300 секунди от всеки HTTP кеш и приема lang; груповото извикване не се кешира и пълни собственото ти хранилище. API за търсене на храни и API за търсене по баркод превръщат текст или GTIN в id; тази крайна точка превръща id-та, които вече държиш, в записи. API за хранителни стойности върви в обратната посока: пълната таблица за един продукт вместо шест обобщени стойности за до 100.

Виж пълното сравнение на API за хранителни данни →

Често задавани въпроси

Мога ли да изпращам баркодове или думи за търсене вместо id-та? +

Не. Всеки елемент трябва да е UUID, иначе цялата партида се отхвърля с 422. Разрешавай баркодовете през API за търсене по баркод, а имената — през API за търсене на храни, запази id-тата и ги използвай тук.

Извикване със 100 id-та струва ли 100 заявки? +

Не, струва една. Дневният брояч и кофата за секунда се движат с по едно на заявка, независимо колко id-та има вътре.

Защо няма параметър lang? +

Груповото извикване връща суровия запис без локализираните помощни полета. Масивите name и ingredients съдържат всеки език, който контрибуторите са предоставили, затова избери вписването от страна на клиента; ако ти трябват category_localized или allergens_localized, ползвай GET /v1/foods/{id}?lang= за този продукт.

Какво вижда акаунт Free? +

403 с error Plan upgrade required, required_plan starter и upgrade_url, сочещ към страницата за фактуриране. Проверката на плана се изпълнява преди дневната квота, така че тези 403 не изразходват 100-те заявки на ден, а GET /v1/foods/{id} остава достъпен.

Мога ли да получа пълната разбивка на хранителните вещества групово? +

Не. Груповите записи носят само nutrition_summary. Панелът с над 40 хранителни вещества идва от API за хранителни стойности, по едно id на заявка; от Starter нагоре няма отделен дневен лимит, а във Free е ограничен до 25 на ден.

Разгледай още endpoint-и

API за търсене на храни

Пълнотекстово търсене сред 6,1 милиона хранителни продукта по име, марка или категория — подредени по релевантност, със странициране и бързо. Търси на всеки език, на който е отпечатан етикетът (включително кирилица), и подай lang=en|fr|es|de|it|bg за локализирани имена, категории и алергени. Една GET заявка връща чист JSON, който приложението ти може да визуализира веднага.

Научи повече →

API за хранителни стойности

Отиди отвъд основните макроси. Вземи подробна разбивка на над 40 хранителни вещества на продукт — енергия, протеини, въглехидрати, мазнини, захари, фибри, натрий, витамини и минерали — всичко на 100 g, за всяка храна по ID.

Научи повече →

API за база данни с храни

Единен източник за 6,1 милиона храни. Вземи пълен запис за продукт по ID — име, марка, съставки, алергени, Nutri-Score, NOVA група, изображения и още.

Научи повече →

Започни да създаваш с API за групово търсене на храни

Безплатно за начало. Без кредитна карта.

Вземи API ключ Към таблото