План Free

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

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

200 OK
GET /v1/foods/{id}
curl -H "X-API-Key: food_•••" \
  "https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd"

{
  "id": "62ea12b8-b260-c288-5c38-3a4906f5d6dd",
  "name_default": "Original Taste",
  "brand": "Coca-Cola",
  "category": "...,Carbonated drinks,Sodas,Colas",
  "ingredients_default": "carbonated water, sugar, ...",
  "allergens": null,
  "nutriscore": "e",
  "nova_group": 4,
  "image_url": "https://images..."
}

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

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

Идентичност

id, barcode, source, name, brand, category.

Съставки

Пълен текст на съставките плюс структурирани алергени и следи.

Оценки

Nutri-Score, NOVA група и Eco-Score, където са налични.

Медия и локал

URL на изображението на продукта и многоезични имена.

Една схема

Всеки продукт е нормализиран в една последователна форма.

Включено в безплатния план — 100 заявки/ден, без кредитна карта. Виж плановете →

Примерен код

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


              curl "https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd?lang=fr" \
  -H "X-API-Key: YOUR_API_KEY"
            

Как работи

Какво прави една заявка

GET /v1/foods/{id} приема UUID, който си получил от търсене или от търсене по баркод, и връща целия нормализиран запис. Няма избор на полета и няма странициране: записът за 62ea12b8-b260-c288-5c38-3a4906f5d6dd (баркод 5449000000996, source openfoodfacts) се връща с всеки ключ от схемата на 200, а всичко, което липсва в източника, е null, а не пропуснато.

Удостовери се със заглавката X-API-Key. Единственият незадължителен вход е ?lang=, един от en, fr, es, de, it или bg. Той добавя category_localized, category_segments_localized и allergens_localized и оставя всички други ключове непроменени, така че добавянето на lang по-късно никога не чупи съществуващ парсер. Всеки отговор носи и заглавка X-Request-Id, която да цитираш в заявки към поддръжката.

Имена, съставки и основното вписване

name и ingredients са масиви от {lang, text}. Първото вписване има lang main и повтаря name_default и ingredients_default; product_lang ти казва кой реален език е това. В записа на Coca-Cola основното име е Original Taste, вписването fr гласи Coca-Cola en canette, а вписването bg — Кока-Кола. Избери вписването, съвпадащо с езика на интерфейса ти, и се връщай към name_default.

Очаквай ingredients да е по-дълъг от броя на езиците: Open Food Facts съхранява текста на съставките по вариант на опаковката, така че един и същ lang може да се появи повече от веднъж в записа, често с еднакъв текст, както тук. Дедупликирай по lang и запази първото срещане. Текстът е въведен от контрибутори и се връща както е; вписването ar тук съдържа фрагменти от етикет, които не са съставки, затова валидирай, преди да го парсваш в структури.

Категория, тагове, алергени и lang

category е един низ със запетаи от общо към конкретно: Beverages and beverages preparations,Beverages,Carbonated drinks,Sodas,Colas,pt:bebidas cafeína. Раздели по запетая; последното ниво е най-конкретното. categories_tags съдържа същите нива като машинни тагове (en:beverages, en:carbonated-drinks, en:colas) и е стабилната стойност за филтриране или групиране, защото низът за показване се променя, когато контрибутори редактират продукта.

allergens и traces използват същите тагове от вида en:milk, както и countries (en:albania, en:austria, en:belgium) и labels. null означава, че източникът не е заявил нищо, а не че продуктът е без алергени; този запис има allergens: null и traces: null, така че предупреждение за алергии трябва да гласи „неизвестно“, а не „няма“.

С ?lang=bg API добавя category_localized като един преведен низ, category_segments_localized с по едно вписване за всяко ниво на йерархията и allergens_localized, успореден на allergens. Ниво или таг без запис в речника е null вътре в масива, затова пази индекса подравнен с categories_tags или allergens и за null позициите се връщай към английския таг.

Оценки, размер на порцията и обобщени хранителни вещества

nutriscore е малка буква (тук e), nova_group е число (4), а ecoscore_grade е низ, който може да е буква или стойност-заместител като not-applicable, което връща тази напитка. Третирай и трите като nullable и не съпоставяй not-applicable с цветна лента.

serving_size_raw и quantity са свободен текст, копиран от етикета. serving_size_raw гласи 1 can (330 ml) и става за показване; quantity гласи 0kg в този запис — грешка на контрибутор, затова никога не изчислявай тегло на опаковката от него без проверка за смисленост.

nutrition_summary дава шест стойности на 100 g: energy_kcal, proteins_g, carbs_g, fat_g, sugars_g и fiber_g. Всяка може да е null самостоятелно, а обектът може да е null, когато източникът няма таблица с хранителни стойности. Покрива ред от списък или бързо сравнение; пълните над 40 хранителни вещества се намират в API за хранителни стойности на /v1/foods/{id}/nutrients със същото id.

Стабилни id-та, кеширане и обичайният поток

Id е детерминирано, получено от източника и собствения идентификатор на продукта в източника, така че един и същ продукт получава един и същ UUID при всеки повторен внос. Пази id-тата в собствените си таблици и ги извличай отново след месеци без стъпка на пренасочване. barcode е nullable в схемата, затова предпочитай id пред barcode като ключ за връзка.

Отговор 200 носи Cache-Control: public, max-age=300, а 404 — max-age=60, така че CDN или HTTP кеш пред услугата ти ги спазва без конфигурация. Ако кешираш в собствената си база данни, използвай ключ id плюс lang, защото локализираните ключове се различават по език.

Обичайният поток: вземи id от API за търсене на храни или API за търсене по баркод, запази го и викай тази крайна точка, когато изглед с детайли има нужда от пълния запис. За да обновиш много запазени id-та наведнъж, API за групово търсене на храни приема списък в една заявка от Starter нагоре. Изображенията са снимки от контрибутори на Open Food Facts, хоствани в images.openfoodfacts.org, а записи от други източници може да нямат такива, затова показвай заместваща картинка, когато image_url е null.

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

Страници с детайли за продукт

Визуализирай богата страница за храна от един каноничен запис.

Конвейери за обогатяване на данни

Допълни каталога си със съставки, алергени и оценки.

Изследвания и анализи

Работи с чист, нормализиран изглед върху два публични набора от данни.

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

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, message}, както при всяка друга грешка.

404 — Id е правилно оформен UUID, но никой продукт не го има.

Махни id от хранилището си; 404 може да се кешира 60 секунди, така че не повтаряй в цикъл.

422 — Id в пътя не е UUID (например баркод или slug).

Разрешавай баркодовете през API за търсене по баркод и подавай тук само UUID-та.

429 — Ключът е надвишил burst-а си за секунда или акаунтът е изразходвал дневната си квота.

Изчакай секундите от Retry-After и продължи; следи X-RateLimit-Second-Remaining и X-RateLimit-Daily-Remaining, за да забавиш по-рано.

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

Повечето API за хранителни данни ти дават или суров дъмп на Open Food Facts, или запис само от USDA, всеки в собствена форма. FoodBase връща и двата източника през една схема, така че продукт от openfoodfacts и продукт от USDA споделят едни и същи ключове и правила за nullability и пишеш един парсер. Id-тата са детерминирани, а не номера на редове, така че оцеляват при повторен внос, а записът вече включва тагове за категории, тагове за алергени и шест обобщени хранителни вещества. Компромисът е, че това е нормализиран изглед, а не изходният редактор: грешки на контрибутори като quantity 0kg пристигат такива, каквито са, а пълната таблица с хранителни вещества е в API за хранителни стойности, а не в този отговор.

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

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

Откъде да взема id, което да подам на тази крайна точка? +

Всеки резултат от API за търсене на храни и всеки запис от API за търсене по баркод включва id. То е получено от източника и неговия идентификатор на продукта, така че го запази веднъж и го преизползвай при различни внасяния.

Защо name е масив и какво е lang main? +

Продуктите носят имена на няколко езика, затова name изброява двойки {lang, text}. Вписването с lang main повтаря name_default и е основният текст на източника; избери вписването, съвпадащо с езика на интерфейса ти, и се връщай към name_default.

Какво променя ?lang=? +

Добавя category_localized, category_segments_localized и allergens_localized за en, fr, es, de, it или bg. Нищо друго в записа не се променя, а всеки таг без превод е null в тези полета.

Означава ли allergens: null, че продуктът няма алергени? +

Не. null означава, че източникът изобщо не е записал данни за алергени, затова показвай състояние „неизвестно“, а не етикет за безопасност. Само непразен масив е положителна информация и дори тя отразява това, което контрибуторите са преписали от опаковката.

Хранителните вещества в този отговор пълната таблица ли са? +

Не. nutrition_summary съдържа energy_kcal, proteins_g, carbs_g, fat_g, sugars_g и fiber_g на 100 g; пълният набор от над 40 хранителни вещества се предоставя от API за хранителни стойности на /v1/foods/{id}/nutrients със същото id.

Мога ли да кеширам записа при себе си? +

Да. Отговор 200 е маркиран с Cache-Control: public, max-age=300, а 404 — с max-age=60, така че всеки HTTP кеш или CDN може да ги задържи; за по-дълго съхранение ключирай записа по id и lang и го обновявай по собствен график.

Тази крайна точка има ли собствена квота? +

Не. Тя ползва обикновената квота заявки на плана, която се споделя от всички ключове на акаунта, докато лимитът за секунда важи на ключ. Само API за хранителни стойности има отделен дневен лимит в плана Free.

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

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

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

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

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

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

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

API за категории храни

Разглеждай всяка категория храни с броя продукти в нея — гръбнакът на филтри, фасети и навигация. Странициран JSON върху целия каталог, сервиран от предварително изчислен изглед, за да остане бърз.

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

Започни да създаваш с API за база данни с храни

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

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