API d'analyse IA des aliments
Un seul appel transforme les données brutes d'un produit en quelque chose que vous pouvez montrer à un utilisateur : un résumé en deux phrases, des points forts et des points de vigilance calculés à partir des données nutritionnelles avec des seuils publiés, les allergènes déclarés, la compatibilité avec les régimes en précisant d'où vient chaque réponse, et le niveau de transformation — en six langues, strictement fondé sur les données d'étiquette du produit.
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
} Vous préférez cliquer ? Essayez l'explorateur de produits ou le bac à sable photo.
Ce que vous obtenez
summary
Une ou deux phrases simples sur ce qu'est le produit et son profil nutritionnel.
highlights / warnings
Points forts (conditions des allégations nutritionnelles UE) et points de vigilance (niveaux élevés UK FSA, caféine, édulcorants, alcool, huile de palme). Un sujet n'est jamais dans les deux.
allergens
Les 14 allergènes UE déclarés sur l'étiquette, répartis entre contient et peut contenir, avec une phrase localisée.
diets_detail
vegan / vegetarian / gluten_free / lactose_free avec la justification : allégation d'étiquette, allergène déclaré ou ingrédients.
nutrient_levels
Lipides, acides gras saturés, sucres et sel en bas, moyen ou élevé, pour 100 g/ml ou par portion.
processing_level
D'après le groupe NOVA du produit ; jugé à partir des ingrédients seulement quand la fiche n'en a pas.
Disponible sur tous les forfaits grâce aux crédits IA mensuels — chaque appel a un prix fixe en crédits, et chaque forfait (Free compris) inclut une dotation de crédits. Voir les forfaits →
Exemples de code
La même requête en curl, JavaScript et Python. Remplacez YOUR_API_KEY par une clé de votre tableau de bord.
curl "https://foodbase.dev/v1/analyze/product" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"barcode":"3017620422003","lang":"en"}'
const res = await fetch("https://foodbase.dev/v1/analyze/product", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"barcode": "3017620422003",
"lang": "en"
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
import requests
res = requests.post(
"https://foodbase.dev/v1/analyze/product",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"barcode": "3017620422003",
"lang": "en"
},
timeout=30,
)
res.raise_for_status()
data = res.json()
Comment ça marche
Désigner le produit, choisir la langue
POST /v1/analyze/product prend un corps JSON avec exactement un de food_id ou barcode (8 à 14 chiffres ; les variantes GTIN avec zéros de remplissage sont résolues) plus une lang facultative. Envoyez les deux ou aucun et vous obtenez un 422 indiquant "Provide exactly one of food_id or barcode", avec le crédit remboursé. Les chaînes vides comptent comme omises.
lang vaut en par défaut et accepte aussi fr, es, de, it et bg. Elle fixe la langue du texte, pas les verdicts : chaque verdict est calculé à partir de la fiche selon des règles fixes et formulé à partir d'un dictionnaire de phrases dans chaque langue, et les jugements du modèle sont rendus une fois par produit et partagés par toutes les langues, si bien qu'un produit ne peut pas être végan en anglais et pas en allemand. Les règles lisent les nutriments de la fiche, ses labels, ses tags d'allergènes et de traces et son groupe NOVA, les mêmes données que renvoient l'API de base de données alimentaire et l'API de nutrition. À partir d'une photo, l'API de reconnaissance d'images alimentaires vous donne d'abord le food_id.
Lire l'analyse, champ par champ
L'exemple est la réponse réelle pour le Nutella (code-barres 3017620422003, lang en). highlights ne contient que des points forts : un produit en obtient un quand il remplit la condition d'une allégation nutritionnelle du règlement UE 1924/2006, comme faible teneur en sel (au plus 0,3 g pour 100 g), source de protéines (au moins 12 % de l'énergie) ou riche en fibres (au moins 6 g). warnings ne contient que des points de vigilance : un nutriment au-dessus du seuil « élevé » de l'étiquetage avant de la UK FSA (sucres au-dessus de 22,5 g pour 100 g, ou de 11,25 g pour 100 ml pour les boissons), une grande portion qui dépasse la limite FSA par portion, ou de la caféine, des édulcorants, de l'alcool ou de l'huile de palme dans les ingrédients. Un sujet n'est jamais dans les deux, et chaque chiffre est la valeur propre de la fiche.
nutrient_levels donne les mêmes verdicts sous forme de données : lipides, acides gras saturés, sucres et sel, chacun low, medium ou high, avec basis per_100 ou per_portion. Un cola de 330 ml avec 10,6 g de sucres pour 100 ml est medium pour 100 ml mais high par canette, d'où son avertissement "High in sugars (35 g per serving)". allergens liste les 14 allergènes UE déclarés en contains et may_contain, avec le statut "not_stated" quand la fiche n'a pas de données d'allergènes, ce qui veut dire vérifier l'emballage, pas « aucun ».
diets_detail répond pour vegan, vegetarian, gluten_free et lactose_free avec une valeur et une justification (basis). Une allégation d'étiquette (végan, sans gluten, sans lactose, logos de certification) décide en premier ; un allergène déclaré ou un tag de viande exclut ensuite un régime ; sinon la réponse vient de la liste d'ingrédients. Sans gluten et sans lactose ne valent "yes" qu'avec une allégation d'étiquette : une liste d'ingrédients sans source de gluten donne "no_known_source", car un produit non certifié peut quand même être contaminé. diets garde l'ancienne forme yes/no/unknown, avec no_known_source rapporté comme unknown.
processing_level est le groupe NOVA sous forme de libellé — unprocessed (1), culinary_ingredient (2 : huiles, beurre, sucre), processed (3), ultra_processed (4) — d'après le groupe NOVA de la fiche (processing_basis "nova") ; c'est seulement quand la fiche n'en a pas qu'il est jugé à partir des ingrédients ("model"). per_serving est calculé à partir de la taille de portion de la fiche, ou null si aucune n'est enregistrée. disclaimer est une chaîne fixe ; affichez-la, car le texte est généré et décrit la fiche du catalogue, pas l'emballage que l'utilisateur a en main.
Crédits, cache et remboursements
Chaque appel coûte 4 crédits IA, pris sur une dotation mensuelle partagée par toutes les clés du compte (20 Free, 500 Starter, 1 300 Pro, 3 000 Enterprise ; réinitialisée le premier du mois UTC), puis sur les crédits de recharge ponctuels quand la dotation ne peut plus couvrir un appel. Ils sont débités avant l'inférence, et chaque réponse porte X-Credits-Limit, X-Credits-Remaining (mensuel plus recharge), X-Credits-Topup-Remaining et X-Credits-Reset.
Les analyses sont mises en cache par produit, langue et version d'analyse, liées au updated_at de la fiche : un produit réimporté ou corrigé est donc analysé à nouveau. Le source_updated_at de la réponse indique la version des données utilisée ; le updated_at de la fiche alimentaire vous dit si elle est toujours à jour. Une réponse en cache renvoie cached: true et coûte quand même 4 crédits : il n'y a pas de remboursement pour les réponses en cache sur les endpoints d'analyse. Mettez vous-même la réponse en cache, avec pour clé food_id et lang, si vous affichez souvent le même produit.
Les remboursements n'ont lieu que si rien n'a été produit : 404, 422, 502 (le message se termine par "You were not charged.") et 503. Un 401 ou un 429 ne touche jamais aux crédits.
Vos propres données produit : /analyze/custom
POST /v1/analyze/custom renvoie le même objet d'analyse pour un produit que vous décrivez vous-même : un article de marque de distributeur, un nouveau lancement, une étiquette que vous venez d'extraire. Le corps contient name (2 à 150 caractères) plus, en option, brand, category, quantity, ingredients (jusqu'à 3 000 caractères), un objet nutrients de valeurs pour 100 g et lang. Il n'y a ni champ de question libre ni profil, ni allégations d'étiquette ni tags d'allergènes : les régimes viennent donc des ingrédients, et sans gluten ou sans lactose vaut au mieux no_known_source.
Un nom seul donne un 422 : envoyez des ingrédients, au moins une valeur nutritionnelle, ou les deux, car le modèle n'a pas le droit d'inventer des valeurs nutritionnelles. nutrients est strict, avec dix-neuf clés nommées comme les colonnes du catalogue (energy_kcal, sugars_g, sodium_mg, calcium_mg, etc.) ; une clé inconnue donne un 422, et les valeurs hors plage sont rejetées plutôt que bornées.
La réponse contient input_hash au lieu de food_id, un SHA-256 de l'entrée canonisée : des données et une lang identiques donnent une réponse en cache, facturée comme les autres. Un barcode facultatif n'est pas analysé ; il signale seulement le produit comme un produit que vous voulez voir dans le catalogue.
Ajouter une langue : /translate/product
POST /v1/translate/product prend food_id ou barcode et une lang obligatoire, traduit le nom et le texte des ingrédients du produit, et écrit le résultat dans le catalogue sous forme de surcouche qui survit aux réimportations et est visible par tous les appelants comme une nouvelle entrée {lang, text} dans les tableaux name et ingredients de la fiche, et via name_localized dans la recherche. Les données d'étiquette déjà présentes dans cette langue ne sont jamais écrasées.
Ici, cached: true signifie que la langue existait déjà, et vos 4 crédits sont remboursés. force: true régénère une traduction que vous jugez mauvaise, mais seulement un texte issu d'une génération IA antérieure ; si le texte de la langue provient de l'étiquette ou d'une correction manuelle, vous obtenez un 422 avec les crédits remboursés. Une sortie peu fiable ou dangereuse n'est jamais stockée : l'appel renvoie 502 et vous n'êtes pas débité.
Corriger un texte d'étiquette abîmé : /correct/product
Le texte d'étiquette dans la langue du produit est parfois abîmé à la source : erreurs d'OCR, espaces manquants après les virgules, listes EN MAJUSCULES, caractères cassés comme "crème" pour "crème", ou un passage répété deux fois. POST /v1/correct/product le répare pour tout le monde, pour 4 crédits. La réparation ne peut changer que la forme : le code vérifie qu'aucun ingrédient, nombre, pourcentage ou numéro E n'a été ajouté ni retiré, que les virgules et les parenthèses sont restées à leur place, et que chaque allergène et sa mise en évidence ont survécu. Une réparation qui échoue n'est ni stockée ni facturée.
Quand c'est le contenu lui-même qui est faux, POST /v1/correct/product/photo prend une photo de l'étiquette et utilise la liste d'ingrédients qui y est lue comme preuve, pour 4 crédits. La lecture de la photo est la partie coûteuse : une photo lue mais inutilisable (aucune liste d'ingrédients visible, code-barres pas entièrement lisible, autre produit, ou lecture trop incertaine pour être fiable) répond 422 et est facturée comme /vision/label. Chaque correction conserve le texte précédent pour pouvoir revenir en arrière, se réapplique après les réimportations tant que la source en amont fournit encore le texte corrigé, et fait régénérer les traductions IA de l'ancien texte à leur prochaine demande. L'analyse du produit est régénérée elle aussi, puisque la fiche a changé.
Ce que vous pouvez créer
Écrans de détail produit
Montrez aux acheteurs un avis instantané et lisible à côté des chiffres bruts.
Filtres de régime qui s'expliquent
Des mentions végan ou sans gluten qui indiquent si elles reposent sur une allégation d'étiquette ou sur la liste d'ingrédients.
Applis de santé et de coaching
Transformez des scans en textes prêts pour le conseil sans construire votre propre pipeline LLM.
Limites par forfait
| Free | 20 crédits IA/mois partagés entre les clés (5 analyses à 4 crédits chacune) ; 1 requête IA/s par clé |
|---|---|
| Starter | 500 crédits IA/mois ; 1 requête IA/s par clé |
| Pro | 1 300 crédits IA/mois ; 2 requêtes IA/s par clé |
| Enterprise | 3 000 crédits IA/mois ; 5 requêtes IA/s par clé |
Chaque réponse contient des en-têtes X-RateLimit-* indiquant le budget restant ; chaque 429 contient Retry-After . Comparer les forfaits →
Erreurs et comment les gérer
402 — Crédits IA mensuels et crédits de recharge épuisés ; X-Credits-Remaining vaut 0, le message indique la date de réinitialisation et le corps contient une top_up_url.
Suspendez les appels IA jusqu'à X-Credits-Reset, ou passez au forfait supérieur. Les endpoints de données continuent de fonctionner.
404 — Aucun produit ne correspond au food_id ou au barcode. Remboursé.
Résolvez à nouveau par recherche ou code-barres ; les id sont stables, un 404 n'est donc pas transitoire. Hors catalogue, utilisez /analyze/custom.
422 — food_id et barcode tous les deux ou aucun des deux ; un nom personnalisé sans ingrédients ni nutriments ; une clé ou une valeur de nutriment invalide ; force sur un texte qui n'est pas généré par IA. Remboursé, sauf un /correct/product/photo dont la photo a été lue mais n'a pas pu servir, qui est facturé.
Lisez details[].field et details[].message, corrigez la requête, ne la renvoyez pas à l'identique.
429 — La limite IA par clé (1/s Free et Starter, 2/s Pro, 5/s Enterprise) ou le plafond du compte, trois fois plus élevé. Aucun crédit n'est pris.
Attendez la seconde de Retry-After et sérialisez les appels IA par clé.
502 — L'appel au modèle a échoué, ou une traduction est passée sous le seuil de confiance. Le message se termine par "You were not charged."
Réessayez après une courte pause ; une réussite ultérieure est mise en cache normalement.
503 — L'IA n'est pas activée, ou le stockage des crédits ou des limites de débit est injoignable. Remboursé.
Réessayez avec un délai croissant et affichez entre-temps la fiche brute de l'API de base de données alimentaire.
Comparaison avec d'autres API
Une API LLM généraliste résumera un produit si vous lui collez l'étiquette ; vous gérez alors le prompt, les règles d'ancrage, le schéma de sortie, le cache et la cohérence entre les langues. FoodBase le fait une fois par produit : les verdicts sont calculés à partir de la fiche enregistrée avec des seuils publiés (allégations nutritionnelles UE, feux tricolores UK FSA), le modèle n'écrit que le résumé et les jugements fondés sur les ingrédients, tout est validé par rapport à un schéma fixe et mis en cache par produit et par langue, si bien qu'un verdict ne peut pas différer d'une langue à l'autre. La contrepartie : l'analyse ne vaut que ce que vaut la fiche. Pas d'ingrédients enregistrés, c'est des régimes inconnus, et rien n'est estimé pour combler le manque — même si un texte d'étiquette abîmé peut être réparé avec /correct/product. Si vous avez besoin de chiffres plutôt que de texte, l'API de nutrition est l'appel le moins cher.
Voir la comparaison complète des API de données alimentaires →
Questions fréquentes
Suis-je facturé quand cached vaut true ? +
Sur /analyze/product et /analyze/custom, oui : une réponse en cache coûte les mêmes 4 crédits qu'une nouvelle analyse, sans remboursement. Sur /translate/product, non : cached: true signifie que la langue existait déjà, et vos 4 crédits sont remboursés.
Que signifient "unknown" et "no_known_source" dans les régimes ? +
unknown : la fiche n'a ni allégation d'étiquette, ni tag d'allergène, ni liste d'ingrédients qui permette de trancher — c'est un constat sur la fiche, pas un « non » adouci. no_known_source (sans gluten et sans lactose uniquement) : la liste d'ingrédients ne mentionne aucune source, mais l'étiquette ne revendique rien, donc le produit n'est pas certifié. Les personnes cœliaques ou intolérantes au lactose ne doivent considérer comme sûr que "yes" avec basis label_claim.
Puis-je poser une question personnalisée, par exemple si un produit convient à un régime pauvre en sodium ? +
Pas via ces endpoints : l'analyse a une forme fixe et /analyze/custom prend des données produit, pas des questions. Lisez sodium_mg ou salt_g via l'API de nutrition et appliquez votre propre seuil plutôt que d'analyser le texte des warnings.
D'où viennent les points forts et les points de vigilance ? +
De règles fixes, pas du modèle : les points forts utilisent les conditions des allégations nutritionnelles UE (règlement 1924/2006), les points de vigilance les seuils « élevé » de l'étiquetage avant de la UK FSA, y compris les limites par portion pour les portions de plus de 100 g ou 150 ml. Un même produit obtient donc les mêmes points à chaque fois et dans toutes les langues, et nutrient_levels les renvoie sous forme de données filtrables.
Que devient l'analyse en cache quand la fiche du produit change ? +
L'entrée de cache est liée au updated_at de la fiche : après une réimportation ou une correction, l'appel suivant génère une nouvelle analyse à partir des nouvelles données et coûte 4 crédits. D'ici là, la réponse en cache est servie.
Découvrez d'autres endpoints
API de reconnaissance d'images alimentaires
Transformez une photo en données alimentaires. Quatre endpoints de vision couvrent tout le parcours caméra : décoder un code-barres, identifier un produit par sa face avant, lire l'étiquette nutritionnelle et les ingrédients, ou analyser une assiette avec des estimations de portions — avec correspondance parmi 6,1 M de produits, en six langues dont le cyrillique.
En savoir plus →API de nutrition
Allez au-delà des macros principales. Obtenez le détail de plus de 40 nutriments par produit — énergie, protéines, glucides, lipides, sucres, fibres, sodium, vitamines et minéraux — tous pour 100 g, pour n'importe quel aliment par ID.
En savoir plus →API de base de données alimentaire
Une source unique pour 6,1 millions d'aliments. Récupérez une fiche produit complète par ID — nom, marque, ingrédients, allergènes, Nutri-Score, groupe NOVA, images, et plus encore.
En savoir plus →Commencez à développer avec l'API d'analyse IA des aliments
Gratuit pour démarrer. Sans carte bancaire.
Obtenir une clé API Aller au tableau de bord