API de base de datos de alimentos
Una única fuente para 6,1 millones de alimentos. Obtén el registro completo de un producto por ID: nombre, marca, ingredientes, alérgenos, Nutri-Score, grupo NOVA, imágenes y más.
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..."
} ¿Prefieres hacer clic? Prueba el explorador de productos o la zona de pruebas de fotos.
Qué obtienes
Identidad
id, barcode, source, name, brand, category.
Ingredientes
Texto completo de ingredientes más alérgenos y trazas estructurados.
Puntuaciones
Nutri-Score, grupo NOVA y Eco-Score cuando están disponibles.
Medios e idioma
URL de la imagen del producto y nombres multilingües.
Un solo esquema
Todos los productos normalizados en una forma coherente.
Incluido en el plan gratuito: 100 solicitudes/día, sin tarjeta de crédito. Ver planes →
Ejemplos de código
La misma petición en curl, JavaScript y Python. Sustituye YOUR_API_KEY por una clave de tu panel.
curl "https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd?lang=fr" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch("https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd?lang=fr", {
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/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd?lang=fr",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=30,
)
res.raise_for_status()
data = res.json()
Cómo funciona
Qué hace una petición
GET /v1/foods/{id} recibe el UUID que obtuviste de una búsqueda o de una consulta por código de barras y devuelve todo el registro normalizado. No hay selección de campos ni paginación: el registro de 62ea12b8-b260-c288-5c38-3a4906f5d6dd (código de barras 5449000000996, source openfoodfacts) llega con todas las claves del esquema 200, y lo que la fuente no tiene es null en lugar de omitirse.
Autentícate con la cabecera X-API-Key. La única entrada opcional es ?lang=, uno de en, fr, es, de, it o bg. Añade category_localized, category_segments_localized y allergens_localized y deja intactas todas las demás claves, así que añadir lang más adelante nunca rompe un parser existente. Cada respuesta lleva además una cabecera X-Request-Id para citar en las solicitudes de soporte.
Nombres, ingredientes y la entrada principal
name e ingredients son arrays de {lang, text}. La primera entrada tiene lang main y refleja name_default e ingredients_default; product_lang te dice qué idioma real es. En el registro de Coca-Cola, el nombre principal es Original Taste, la entrada fr dice Coca-Cola en canette y la entrada bg dice Кока-Кола. Elige la entrada que coincida con el idioma de tu interfaz y recurre a name_default.
Espera que ingredients tenga más entradas que idiomas: Open Food Facts guarda el texto de ingredientes por variante de envase, así que el mismo lang puede aparecer más de una vez en un registro, a menudo con texto idéntico, como ocurre aquí. Deduplica por lang y conserva la primera aparición. El texto lo introducen colaboradores y se devuelve tal cual; la entrada ar de aquí contiene fragmentos de etiqueta que no son ingredientes, así que valídalo antes de convertirlo en estructuras.
Categoría, etiquetas, alérgenos y lang
category es una cadena unida con comas, de lo amplio a lo concreto: Beverages and beverages preparations,Beverages,Carbonated drinks,Sodas,Colas,pt:bebidas cafeína. Divídela por la coma; el último nivel es el más específico. categories_tags contiene los mismos niveles como etiquetas para máquinas (en:beverages, en:carbonated-drinks, en:colas) y es el valor estable para filtrar o agrupar, porque la cadena para mostrar cambia cuando los colaboradores editan el producto.
allergens y traces usan el mismo estilo de etiquetas en:milk, igual que countries (en:albania, en:austria, en:belgium) y labels. null significa que la fuente no indicó nada, no que el producto esté libre de alérgenos; este registro tiene allergens: null y traces: null, así que un aviso de alergias debería decir desconocido, no ninguno.
Con ?lang=bg la API añade category_localized como una sola cadena traducida, category_segments_localized con una entrada por nivel de la jerarquía y allergens_localized en paralelo a allergens. Un nivel o etiqueta sin entrada en el diccionario es null dentro del array, así que mantén el índice alineado con categories_tags o allergens y recurre a la etiqueta en inglés en los huecos null.
Puntuaciones, tamaño de ración y nutrientes resumidos
nutriscore es una letra minúscula (e aquí), nova_group un número (4) y ecoscore_grade una cadena que puede ser una letra o un valor centinela como not-applicable, que es lo que devuelve esta bebida. Trata los tres como anulables y no asignes not-applicable a una banda de color.
serving_size_raw y quantity son texto libre copiado de la etiqueta. serving_size_raw dice 1 can (330 ml) y sirve para mostrar; quantity dice 0kg en este registro, un error de un colaborador, así que nunca calcules el peso del envase a partir de él sin una comprobación de sensatez.
nutrition_summary da seis valores por 100 g: energy_kcal, proteins_g, carbs_g, fat_g, sugars_g y fiber_g. Cada uno puede ser null por separado y el objeto puede ser null cuando la fuente no tiene tabla nutricional. Cubre una fila de lista o una comparación rápida; los más de 40 nutrientes completos están en la API de nutrición, en /v1/foods/{id}/nutrients con el mismo id.
Ids estables, caché y el flujo habitual
El id es determinista, derivado de la fuente y del id de producto propio de la fuente, así que el mismo producto recibe el mismo UUID en cada reimportación. Guarda los ids en tus propias tablas y vuelve a consultarlos meses después sin un paso de remapeo. barcode admite null en el esquema, así que prefiere el id al código de barras como clave de unión.
Un 200 lleva Cache-Control: public, max-age=300 y un 404 lleva max-age=60, de modo que una CDN o caché HTTP delante de tu servicio los respeta sin configuración. Si cacheas en tu propia base de datos, usa como clave id más lang, ya que las claves localizadas difieren por idioma.
El flujo habitual: obtén un id de la API de búsqueda de alimentos o de la API de consulta de códigos de barras, guárdalo y llama a este endpoint cuando una vista de detalle necesite el registro completo. Para refrescar muchos ids guardados a la vez, la API de consulta masiva de alimentos recibe una lista en una sola petición desde Starter. Las imágenes son fotos de colaboradores de Open Food Facts alojadas en images.openfoodfacts.org, y los registros de otras fuentes pueden no tener ninguna, así que muestra un marcador de posición siempre que image_url sea null.
Qué puedes crear
Páginas de detalle de producto
Pinta una página de alimento completa a partir de un único registro canónico.
Pipelines de enriquecimiento de datos
Completa tu catálogo con ingredientes, alérgenos y puntuaciones.
Investigación y analítica
Trabaja con una vista limpia y normalizada de dos conjuntos de datos públicos.
Límites por plan
| Free | 100 solicitudes/día, 1/s sostenida, ráfaga de 5 |
|---|---|
| Starter | 5000 solicitudes/día, 5/s sostenidas, ráfaga de 25 |
| Pro | 25.000 solicitudes/día, 20/s sostenidas, ráfaga de 100 |
| Enterprise | 100.000 solicitudes/día, 50/s sostenidas, ráfaga de 250 |
Cada respuesta incluye cabeceras X-RateLimit-* con el presupuesto restante; cada 429 incluye Retry-After . Comparar planes →
Errores y cómo gestionarlos
401 — Falta la cabecera X-API-Key o la clave no es válida.
Envía una clave activa de tu panel; el cuerpo es {error, message}, como todos los demás errores.
404 — El id es un UUID bien formado pero ningún producto lo tiene.
Elimina el id de tu almacén; el 404 se puede cachear durante 60 segundos, así que no reintentes en bucle.
422 — El id de la ruta no es un UUID (por ejemplo, un código de barras o un slug).
Resuelve los códigos de barras con la API de consulta de códigos de barras y pasa aquí solo UUID.
429 — La clave superó su ráfaga por segundo o la cuenta agotó su cuota diaria.
Espera los segundos indicados en Retry-After y reanuda; vigila X-RateLimit-Second-Remaining y X-RateLimit-Daily-Remaining para frenar antes.
Comparada con otras API
La mayoría de las API de datos alimentarios te entregan o un volcado en bruto de Open Food Facts o un registro solo del USDA, cada uno con su propia forma. FoodBase devuelve ambas fuentes con un único esquema, así que un producto de openfoodfacts y uno del USDA comparten las mismas claves y reglas de nulabilidad y escribes un solo parser. Los ids son deterministas y no números de fila, de modo que sobreviven a las reimportaciones, y el registro ya incluye etiquetas de categoría, etiquetas de alérgenos y seis nutrientes resumidos. La contrapartida es que esto es una vista normalizada, no el editor de origen: los errores de colaboradores, como una quantity de 0kg, llegan tal cual, y el panel completo de nutrientes está en la API de nutrición y no en esta respuesta.
Preguntas frecuentes
¿De dónde saco un id para pasar a este endpoint? +
Cada resultado de la API de búsqueda de alimentos y cada registro de la API de consulta de códigos de barras incluye el id. Se deriva de la fuente y de su identificador de producto, así que guárdalo una vez y reutilízalo entre importaciones.
¿Por qué name es un array y qué es lang main? +
Los productos tienen nombres en varios idiomas, así que name lista pares {lang, text}. La entrada con lang main refleja name_default y es el texto principal de la fuente; elige la entrada que coincida con el idioma de tu interfaz y recurre a name_default.
¿Qué cambia ?lang=? +
Añade category_localized, category_segments_localized y allergens_localized para en, fr, es, de, it o bg. No cambia nada más del registro, y cualquier etiqueta sin traducción es null en esos campos.
¿allergens: null significa que el producto no tiene alérgenos? +
No. null significa que la fuente no registró ningún dato de alérgenos, así que muestra un estado desconocido y no una etiqueta de seguro. Solo un array no vacío es información positiva, e incluso entonces refleja lo que los colaboradores transcribieron del envase.
¿Los nutrientes de esta respuesta son el panel completo? +
No. nutrition_summary contiene energy_kcal, proteins_g, carbs_g, fat_g, sugars_g y fiber_g por 100 g; el conjunto completo de más de 40 nutrientes lo sirve la API de nutrición en /v1/foods/{id}/nutrients con el mismo id.
¿Puedo cachear el registro por mi cuenta? +
Sí. Un 200 se marca con Cache-Control: public, max-age=300 y un 404 con max-age=60, así que cualquier caché HTTP o CDN puede retenerlos; para un almacenamiento más largo, usa como clave el id y el lang del registro y refréscalo con tu propio calendario.
¿Este endpoint tiene su propia cuota? +
No. Consume la cuota de solicitudes normal del plan, compartida por todas las claves de la cuenta, mientras que el límite por segundo se aplica por clave. Solo la API de nutrición tiene una asignación diaria aparte en el plan gratuito.
Descubre más endpoints
API de búsqueda de alimentos
Búsqueda de texto completo en 6,1 millones de productos alimentarios por nombre, marca o categoría: ordenada por relevancia, paginada y rápida. Busca en cualquier idioma en que se imprimió la etiqueta (cirílico incluido) y pasa lang=en|fr|es|de|it|bg para obtener nombres, categorías y alérgenos localizados. Una sola petición GET devuelve un JSON limpio que tu app puede mostrar al instante.
Más información →API de nutrición
Ve más allá de los macros principales. Obtén un desglose detallado de más de 40 nutrientes por producto (energía, proteínas, hidratos de carbono, grasas, azúcares, fibra, sodio, vitaminas y minerales), todo por 100 g, para cualquier alimento por ID.
Más información →API de categorías de alimentos
Explora todas las categorías de alimentos con su recuento de productos: la base de filtros, facetas y navegación. JSON paginado sobre todo el catálogo, servido desde una vista precalculada para que siga siendo rápido.
Más información →Empieza a crear con la API de base de datos de alimentos
Gratis para empezar. Sin tarjeta de crédito.
Obtener clave API Ir al panel