Créditos de IA

API de análisis de alimentos con IA

Una llamada convierte los datos en bruto de un producto en algo que puedes mostrar a un usuario: un resumen de dos frases, puntos buenos y alertas calculados a partir de los datos nutricionales con umbrales publicados, los alérgenos declarados, la compatibilidad con dietas indicando de dónde sale cada respuesta y el nivel de procesamiento, en seis idiomas y basado estrictamente en los datos de etiqueta del producto.

200 OK
POST /v1/analyze/product
curl -X POST -H "X-API-Key: food_•••" \
  -H "Content-Type: application/json" \
  -d '{"barcode":"3017620422003","lang":"en"}' \
  "https://foodbase.dev/v1/analyze/product"

{
  "analysis": {
    "summary": "Nutella is a hazelnut and cocoa
      chocolate spread from Ferrero...",
    "highlights": ["Low salt (0.11 g per 100 g)"],
    "warnings": [
      "High in fat (30.9 g per 100 g)",
      "High in saturated fat (10.6 g per 100 g)",
      "High in sugars (56.3 g per 100 g)",
      "Contains palm oil"
    ],
    "allergens": {
      "contains": ["soy", "milk", "nuts"],
      "text": "Contains: soy, milk, nuts."
    },
    "diets_detail": {
      "vegan": { "value": "no", "basis": "allergen_tag" },
      "gluten_free": { "value": "yes", "basis": "label_claim" }
    },
    "processing_level": "ultra_processed",
    "processing_basis": "nova"
  },
  "cached": false
}

¿Prefieres hacer clic? Prueba el explorador de productos o la zona de pruebas de fotos.

Qué obtienes

summary

Una o dos frases sencillas sobre qué es el producto y su carácter nutricional.

highlights / warnings

Puntos buenos (condiciones de las declaraciones nutricionales de la UE) y alertas (niveles altos según la FSA del Reino Unido, cafeína, edulcorantes, alcohol, aceite de palma). Un tema nunca aparece en ambos.

allergens

Alérgenos de la lista EU-14 que declara la etiqueta, divididos en contains y may contain, con una frase localizada.

diets_detail

vegan / vegetarian / gluten_free / lactose_free con su base: declaración de etiqueta, alérgeno declarado o ingredientes.

nutrient_levels

Grasas, grasas saturadas, azúcares y sal como low, medium o high, por 100 g/ml o por ración.

processing_level

A partir del grupo NOVA del producto; se juzga solo por los ingredientes cuando el registro no tiene ninguno.

Disponible en todos los planes mediante créditos de IA mensuales: cada llamada tiene un precio fijo en créditos y todos los planes (incluido el gratuito) incluyen una asignación de créditos. 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/analyze/product" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"barcode":"3017620422003","lang":"en"}'
            

Cómo funciona

Identifica el producto y elige el idioma

POST /v1/analyze/product recibe un cuerpo JSON con exactamente uno de food_id o barcode (de 8 a 14 dígitos; las variantes de GTIN con ceros a la izquierda se resuelven) más un lang opcional. Si envías ambos o ninguno, obtienes un 422 que dice "Provide exactly one of food_id or barcode", con el crédito reembolsado. Las cadenas vacías cuentan como omitidas.

lang vale en por defecto y también acepta fr, es, de, it y bg. Fija el idioma del texto, no los veredictos: cada veredicto se calcula a partir del registro con reglas fijas y se redacta desde un diccionario de frases en cada idioma, y los juicios del modelo se hacen una vez por producto y se comparten entre todos los idiomas, así que un producto no puede ser vegano en inglés y no serlo en alemán. Las reglas leen los nutrientes del registro, las etiquetas, las etiquetas de alérgenos y trazas y el grupo NOVA, los mismos datos que devuelven la API de base de datos de alimentos y la API de nutrición. A partir de una imagen, la API de reconocimiento de imágenes de alimentos te da primero el food_id.

Cómo leer el análisis, campo a campo

La muestra es la respuesta real para Nutella (código de barras 3017620422003, lang en). highlights son solo puntos buenos: un producto gana uno cuando cumple la condición de una declaración nutricional del Reglamento (CE) 1924/2006 de la UE, como bajo en sal (como máximo 0,3 g por 100 g), fuente de proteínas (al menos el 12 % de la energía) o alto contenido en fibra (al menos 6 g). warnings son solo alertas: un nutriente por encima del umbral «alto» del etiquetado frontal de la FSA del Reino Unido (azúcares por encima de 22,5 g por 100 g, o por encima de 11,25 g por 100 ml en bebidas), una ración grande que supera el límite por ración de la FSA, o cafeína, edulcorantes, alcohol o aceite de palma en los ingredientes. Un tema nunca es ambas cosas, y cada número es el valor propio del registro.

nutrient_levels da los mismos veredictos como datos: grasas, grasas saturadas, azúcares y sal, cada uno low, medium o high, con basis per_100 o per_portion. Una cola de 330 ml con 10,6 g de azúcares por 100 ml es medium por 100 ml pero high por lata, así que su alerta dice "High in sugars (35 g per serving)". allergens lista los alérgenos EU-14 declarados como contains y may_contain, con status "not_stated" cuando el registro no tiene datos de alérgenos, lo cual significa revisa el envase, no «ninguno».

diets_detail responde vegan, vegetarian, gluten_free y lactose_free con un value y una basis. Decide primero una declaración de etiqueta (vegano, sin gluten, sin lactosa, logotipos de certificación); después un alérgeno declarado o una etiqueta de carne descarta una dieta; si no, la respuesta sale de la lista de ingredientes. Sin gluten y sin lactosa son "yes" solo con una declaración de etiqueta: una lista de ingredientes sin ninguna fuente de gluten da "no_known_source", porque un producto sin certificar aún puede estar contaminado. diets mantiene la forma antigua yes/no/unknown, con no_known_source informado como unknown.

processing_level es el grupo NOVA como etiqueta: unprocessed (1), culinary_ingredient (2: aceites, mantequilla, azúcar), processed (3), ultra_processed (4), a partir del grupo NOVA del registro (processing_basis "nova"); solo cuando el registro no tiene ninguno se juzga a partir de los ingredientes ("model"). per_serving se calcula a partir del tamaño de ración del registro, o es null cuando no consta ninguno. disclaimer es una cadena fija; muéstrala, porque el texto es generado y describe el registro del catálogo, no el envase que el usuario tiene en la mano.

Créditos, caché y reembolsos

Cada llamada cuesta 4 créditos de IA de una asignación mensual compartida por todas las claves de la cuenta (20 Free, 500 Starter, 1300 Pro, 3000 Enterprise; se reinicia el día 1 del mes UTC), y después de créditos de recarga puntuales cuando la asignación no puede cubrir una llamada. Se descuenta antes de la inferencia, y cada respuesta lleva X-Credits-Limit, X-Credits-Remaining (mensuales más recarga), X-Credits-Topup-Remaining y X-Credits-Reset.

Los análisis se cachean por producto, idioma y versión del análisis, ligados al updated_at del registro, así que un producto reimportado o corregido se analiza de nuevo. El source_updated_at de la respuesta nombra la versión de los datos a partir de la cual se hizo; el updated_at del registro del alimento te dice si sigue vigente. Un acierto devuelve cached: true y se cobra igualmente con 4 créditos: no hay reembolsos por aciertos de caché en los endpoints de análisis. Cachea tú la respuesta, con clave food_id y lang, si muestras el mismo producto con frecuencia.

Solo hay reembolso cuando no se produjo nada: 404, 422, 502 (el mensaje termina en "You were not charged.") y 503. Un 401 o un 429 nunca tocan los créditos.

Tus propios datos de producto: /analyze/custom

POST /v1/analyze/custom devuelve el mismo objeto de análisis para un producto que describes tú: un artículo de marca blanca, un lanzamiento nuevo, una etiqueta que acabas de extraer. El cuerpo lleva name (de 2 a 150 caracteres) más brand, category, quantity, ingredients (hasta 3000 caracteres), un objeto nutrients con valores por 100 g y lang, todos opcionales. No hay campos de pregunta libre ni de perfil, ni declaraciones de etiqueta ni etiquetas de alérgenos, así que las dietas salen de los ingredientes y sin gluten o sin lactosa es como mucho no_known_source.

Un nombre solo es un 422: envía ingredients, al menos un valor de nutriente, o ambos, porque el modelo no puede inventar datos nutricionales. nutrients es estricto, con diecinueve claves nombradas como las columnas del catálogo (energy_kcal, sugars_g, sodium_mg, calcium_mg y así sucesivamente); una clave desconocida es un 422, y los valores fuera de rango se rechazan en lugar de recortarse.

La respuesta tiene input_hash en lugar de food_id, un SHA-256 de la entrada canonicalizada, así que los mismos datos y lang son un acierto de caché, cobrado como cualquier otro. Un barcode opcional no se analiza; solo marca el producto como uno que quieres en el catálogo.

Añadir un idioma: /translate/product

POST /v1/translate/product recibe food_id o barcode y un lang obligatorio, traduce el nombre y el texto de ingredientes del producto y escribe el resultado en el catálogo como una capa superpuesta que sobrevive a las reimportaciones y es visible para todos los llamantes como una nueva entrada {lang, text} en los arrays name e ingredients del registro, y a través de name_localized en la búsqueda. Los datos de etiqueta que ya existan en ese idioma nunca se sobrescriben.

cached: true aquí significa que el idioma ya existía y tus 4 créditos se reembolsan. force: true regenera una traducción que consideras mala, pero solo texto de una ejecución de IA anterior; si el texto del idioma procede de la etiqueta o de una corrección manual, obtienes un 422 con los créditos reembolsados. Una salida de baja confianza o insegura nunca se guarda: la llamada devuelve 502 y no se te cobra.

Arreglar texto de etiqueta defectuoso: /correct/product

El texto de etiqueta en el idioma propio del producto a veces llega roto desde el origen: errores de OCR, espacios que faltan tras las comas, listas en MAYÚSCULAS, caracteres rotos como "crème" por "crème", o un pasaje repetido dos veces. POST /v1/correct/product lo repara para todos, por 4 créditos. La reparación solo puede cambiar la forma: el código comprueba que no se añadió ni se quitó ningún ingrediente, número, porcentaje ni número E, que las comas y los corchetes siguen donde estaban, y que sobrevivieron todos los alérgenos y su énfasis. Una reparación que falla no se guarda ni se cobra.

Cuando el contenido en sí es incorrecto, POST /v1/correct/product/photo recibe una foto de la etiqueta y usa como evidencia la lista de ingredientes leída de ella, por 4 créditos. Leer la foto es la parte cara, así que una foto que se leyó pero no se puede usar (sin lista de ingredientes visible, código de barras no legible por completo, un producto distinto o una lectura demasiado incierta para fiarse) responde 422 y se cobra como /vision/label. Cada corrección conserva el texto anterior para poder revertir, se vuelve a aplicar tras las reimportaciones solo mientras la fuente original siga enviando el texto que se corrigió, y hace que las traducciones por IA del texto antiguo se regeneren en su siguiente petición. El análisis del producto también se regenera, porque el registro cambió.

Qué puedes crear

Pantallas de detalle de producto

Muestra a los compradores un veredicto instantáneo y legible junto a los números en bruto.

Filtros de dieta que se explican solos

Indicadores vegano o sin gluten que dicen si los respalda una declaración de etiqueta o la lista de ingredientes.

Apps de salud y coaching

Convierte escaneos en texto listo para orientar sin montar tu propio pipeline de LLM.

Límites por plan

Free 20 créditos de IA/mes compartidos entre claves (5 análisis a 4 créditos cada uno); 1 solicitud de IA/s por clave
Starter 500 créditos de IA/mes; 1 solicitud de IA/s por clave
Pro 1300 créditos de IA/mes; 2 solicitudes de IA/s por clave
Enterprise 3000 créditos de IA/mes; 5 solicitudes de IA/s por clave

Cada respuesta incluye cabeceras X-RateLimit-* con el presupuesto restante; cada 429 incluye Retry-After . Comparar planes →

Errores y cómo gestionarlos

402 — Se agotaron los créditos de IA mensuales y los de recarga; X-Credits-Remaining es 0, el mensaje indica la fecha de reinicio y el cuerpo tiene un top_up_url.

Detén las llamadas de IA hasta X-Credits-Reset, o mejora tu plan. Los endpoints de datos siguen funcionando.

404 — Ningún producto coincide con el food_id o el barcode. Reembolsado.

Vuelve a resolverlo por búsqueda o código de barras; los ids son estables, así que un 404 no es transitorio. Fuera del catálogo, usa /analyze/custom.

422 — Ambos o ninguno de food_id y barcode; un custom con name sin ingredientes ni nutrientes; una clave o valor de nutriente incorrectos; force sobre texto que no es generado por IA. Reembolsado, salvo un /correct/product/photo cuya foto se leyó pero no se pudo usar, que se cobra.

Lee details[].field y details[].message, corrige la petición y no la reintentes sin cambios.

429 — El límite de IA por clave (1/s Free y Starter, 2/s Pro, 5/s Enterprise) o el techo de la cuenta del triple de eso. No se cobra ningún crédito.

Espera el segundo de Retry-After y serializa las llamadas de IA por clave.

502 — La llamada al modelo falló, o una traducción quedó por debajo del umbral de confianza. El mensaje termina en "You were not charged."

Reintenta tras una breve pausa; un éxito posterior se cachea con normalidad.

503 — La IA no está activada, o el almacén de créditos o de límites de tasa no está accesible. Reembolsado.

Reintenta con retroceso exponencial y mientras tanto muestra el registro en bruto de la API de base de datos de alimentos.

Comparada con otras API

Una API de LLM de propósito general resumirá un producto si le pegas la etiqueta; entonces el prompt, las reglas de anclaje, el esquema de salida, la caché y la coherencia entre idiomas son cosa tuya. FoodBase lo hace una vez por producto: los veredictos se calculan a partir del registro con umbrales publicados (declaraciones nutricionales de la UE, semáforos de la FSA del Reino Unido), el modelo solo escribe el resumen y los juicios basados en ingredientes, todo se valida contra un esquema fijo y se cachea por producto e idioma, de modo que un veredicto no puede diferir entre idiomas. La contrapartida es que solo es tan bueno como el registro: sin ingredientes guardados, las dietas son desconocidas y no se estima nada para rellenar el hueco, aunque el texto de etiqueta roto se puede reparar con /correct/product. Si necesitas números en lugar de prosa, la API de nutrición es la llamada más barata.

Ver la comparativa completa de API de datos de alimentos →

Preguntas frecuentes

¿Se me cobra cuando cached es true? +

En /analyze/product y /analyze/custom, sí: un acierto de caché cuesta los mismos 4 créditos que un análisis nuevo, sin reembolso. En /translate/product, no: cached: true significa que el idioma ya existía y tus 4 créditos se reembolsan.

En diets, ¿qué significan "unknown" y "no_known_source"? +

unknown: el registro no tiene ni una declaración de etiqueta, ni una etiqueta de alérgeno, ni una lista de ingredientes que lo resuelva; es una afirmación sobre el registro, no un «no» suave. no_known_source (solo sin gluten y sin lactosa): la lista de ingredientes no nombra ninguna fuente, pero la etiqueta no hace ninguna declaración, así que el producto no está certificado. Los usuarios celíacos o intolerantes a la lactosa deben considerar seguro solo un "yes" con basis label_claim.

¿Puedo hacer una pregunta personalizada, como si un producto encaja en una dieta baja en sodio? +

No con estos endpoints: el análisis tiene una forma fija y /analyze/custom recibe datos de producto, no preguntas. Lee sodium_mg o salt_g de la API de nutrición y aplica tu propio umbral en lugar de analizar el texto de warnings.

¿De dónde salen los puntos buenos y las alertas? +

De reglas fijas, no del modelo: los puntos buenos usan las condiciones de las declaraciones nutricionales de la UE (Reglamento 1924/2006), las alertas los umbrales «altos» del etiquetado frontal de la FSA del Reino Unido, incluidos los límites por ración para raciones de más de 100 g o 150 ml. Por eso el mismo producto recibe los mismos puntos siempre y en todos los idiomas, y nutrient_levels los devuelve como datos por los que puedes filtrar.

¿Qué pasa con el análisis en caché cuando cambia el registro del producto? +

La entrada de caché está ligada al updated_at del registro, así que tras una reimportación o corrección la siguiente llamada genera un análisis nuevo a partir de los datos nuevos y cobra 4 créditos. Hasta entonces se sirve la respuesta en caché.

Empieza a crear con la API de análisis de alimentos con IA

Gratis para empezar. Sin tarjeta de crédito.

Obtener clave API Ir al panel