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.
curl -H "X-API-Key: food_•••" \
"https://foodbase.dev/v1/foods/62ea12b8.../nutrients"
{
"food_id": "62ea12b8...",
"macros": {
"energy_kcal": 42,
"proteins_g": 0,
"carbs_g": 10.6,
"sugars_g": 10.6,
"fat_g": 0,
"fiber_g": null
},
"fats": { "saturated_fat_g": 0 },
"minerals": { "sodium_mg": 0, "salt_g": 0 },
"other": { "added_sugars_g": 5.3 }
} Vous préférez cliquer ? Essayez l'explorateur de produits ou le bac à sable photo.
Ce que vous obtenez
Macros
Énergie, protéines, glucides, sucres, lipides, acides gras saturés, fibres.
Minéraux
Sodium, calcium, fer, potassium, magnésium, zinc, et plus encore.
Vitamines
A, C, D, E et les vitamines B quand elles sont déclarées.
Pour 100 g
Une base constante pour adapter à n'importe quelle portion.
40+ champs
Un seul objet avec tous les nutriments fournis par la source.
Inclus dans le forfait gratuit — 25 détails nutritionnels/jour, sans carte bancaire ; illimité dès Starter. 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/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd/nutrients" \
-H "X-API-Key: YOUR_API_KEY"
const res = await fetch("https://foodbase.dev/v1/foods/62ea12b8-b260-c288-5c38-3a4906f5d6dd/nutrients", {
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/nutrients",
headers={"X-API-Key": "YOUR_API_KEY"},
timeout=30,
)
res.raise_for_status()
data = res.json()
Comment ça marche
Une requête, cinq groupes, pour 100 g
GET /v1/foods/{id}/nutrients prend l'UUID de l'aliment dans le chemin et rien d'autre : ni paramètres de requête, ni corps, ni lang. L'id est le même que celui que renvoient tous les autres endpoints : un résultat de l'API de recherche alimentaire ou de l'API de recherche par code-barres devient un détail complet en un appel de plus. Les id sont déterministes d'une réimportation à l'autre : vous pouvez les stocker et continuer à appeler cette URL.
La réponse est un objet plat avec food_id plus cinq groupes fixes : macros, fats, minerals, vitamins et other. Chaque clé est toujours présente et chaque valeur est soit un nombre, soit null. Le schéma actuel compte 41 champs de nutriments, d'où le chiffre de 40+. Les unités figurent dans le nom de la clé (energy_kcal, sodium_mg, selenium_mcg, vitamin_a_iu) : pas besoin de table d'unités séparée.
Toutes les valeurs sont pour 100 g du produit tel que vendu. Pour afficher une portion, multipliez par les grammes divisés par 100. Le serving_size_raw de la fiche est un texte d'étiquette (pour la fiche Coca-Cola de l'exemple, "1 can (330 ml)"), donc la conversion de ce texte en grammes est à votre charge.
- macros (10 clés) couvre l'énergie en kcal et kJ, protéines, glucides, lipides, sucres, fibres, alcool, amidon et polyols ; fats (7) ajoute saturés, trans, mono- et polyinsaturés, omega3, omega6 et cholesterol_mg
- minerals (12) va de sodium_mg et salt_g à selenium_mcg et iodine_mcg ; vitamins (11) donne A et D en UI, B9 et B12 en mcg, le reste en mg ; other contient added_sugars_g
Bien lire les null et les zéros
La réponse d'exemple pour l'aliment 62ea12b8-b260-c288-5c38-3a4906f5d6dd montre le schéma typique d'Open Food Facts : energy_kcal 42, energy_kj 180.2, carbs_g 10.6, sugars_g 10.6, added_sugars_g 5.3, des zéros explicites pour proteins_g, fat_g, saturated_fat_g, sodium_mg et salt_g, et null pour tout le reste, de fiber_g à l'ensemble du groupe vitamins.
Traitez ces deux états différemment. Un 0 est une valeur déclarée par la source ; un null signifie que le nutriment ne figure ni sur l'étiquette ni dans la source. Ne convertissez jamais null en 0 avant d'additionner les apports d'une journée, sinon un repas composé de produits partiellement étiquetés sous-estimera silencieusement vitamines et minéraux. Affichez plutôt un tiret ou « non déclaré ».
La couverture dépend de la provenance. Les lignes de source usda_foundation ou usda_sr_legacy sont des analyses de laboratoire de l'USDA et remplissent les groupes vitamines et minéraux : la plupart des clés sont des nombres. Les lignes de source usda (USDA Branded Foods) et celles d'Open Food Facts sont transcrites depuis l'emballage : fiables pour les nutriments obligatoires de l'étiquette, souvent null au-delà. Le champ source de la fiche vous dit dans quel cas vous êtes avant d'afficher le tableau.
- Affichez null comme inconnu, pas comme zéro ; n'agrégez que les clés non null pour tous les éléments du repas.
- sodium_mg et salt_g existent tous deux car les étiquettes diffèrent selon les régions ; utilisez celui qu'attend votre public et repliez-vous sur l'autre.
Quand cet appel est vraiment nécessaire
Chaque fiche de l'API de base de données alimentaire et chaque résultat par code-barres inclut déjà nutrition_summary avec six valeurs principales : energy_kcal, proteins_g, carbs_g, fat_g, sugars_g et fiber_g. Les résultats de recherche sont des lignes allégées qui ne l'ont pas. Pour un résultat de scan, une carte de détail ou un enregistrement rapide de calories, cet objet suffit généralement et ne consomme aucun détail nutritionnel.
Réservez /nutrients à l'écran de détail ou au moment où l'utilisateur s'intéresse au sodium, aux acides gras saturés, au cholestérol ou à une vitamine précise. Cherchez ou scannez, affichez le résumé, récupérez le détail au toucher. Sur le forfait Free, c'est aussi ce qui vous maintient dans la limite de 25 par jour pendant le développement.
Les en-têtes de réponse capturés ne contiennent pas de Cache-Control : le cache est donc à votre charge. Les id sont stables et les valeurs ne changent que lors d'une réimportation du produit : un cache indexé sur food_id et conservé des heures ou des jours est sûr.
La limite du forfait Free, en-tête par en-tête
Sur le forfait Free, chaque détail réussi décompte un compteur quotidien séparé de 25, indiqué dans chaque réponse par X-RateLimit-Nutrients-Limit, X-RateLimit-Nutrients-Remaining et X-RateLimit-Nutrients-Reset. Lisez Remaining avant une série de récupérations de détails et vous pourrez vous replier sur nutrition_summary au lieu de buter sur la limite en pleine session.
À zéro, l'endpoint renvoie un 429 avec l'erreur "Nutrients daily allowance exceeded", une upgrade_url dans le corps, et Retry-After contenant les secondes restantes jusqu'à minuit UTC. Un appel refusé ne consomme ni détail ni requête quotidienne, et ne décale pas la réinitialisation. Les forfaits payants n'ont pas ce compteur ; leurs appels de nutriments ne sont limités que par le quota quotidien de requêtes du forfait (partagé entre toutes les clés du compte) et la limite par seconde de chaque clé.
Si vous êtes sur Starter ou plus et traitez un gros catalogue, récupérez d'abord les fiches de base via l'API de consultation groupée d'aliments et n'appelez /nutrients que pour les id dont le résumé ne suffit pas.
Ce que vous pouvez créer
Compteurs de calories et de macros
Enregistrez une nutrition précise par portion à partir d'une seule requête.
Plans de repas et régimes
Construisez des plans qui atteignent les objectifs en macro- et micronutriments.
Outils de santé et cliniques
Affichez des profils nutritionnels détaillés pour le conseil diététique.
Limites par forfait
| Free | 25 détails nutritionnels/jour (en-têtes X-RateLimit-Nutrients-*), dans la limite de 100 requêtes/jour ; 1 req/s, rafale de 5 |
|---|---|
| Starter | Détails illimités dans la limite de 5 000 requêtes/jour ; 5 req/s, rafale de 25 |
| Pro | Détails illimités dans la limite de 25 000 requêtes/jour ; 20 req/s, rafale de 100 |
| Enterprise | Détails illimités dans la limite de 100 000 requêtes/jour ; 50 req/s, rafale de 250 |
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
404 — Il n'existe aucune ligne de nutriments pour cet id : l'aliment n'existe peut-être pas, ou il existe sans aucune donnée nutritionnelle (son nutrition_summary vaut null). Le corps indique "No nutrient data for this food".
Ne réessayez pas. Affichez l'aliment sans détail ; si l'id vient d'un ancien cache, résolvez-le à nouveau par code-barres ou par recherche, car un 404 ici n'est pas transitoire.
422 — L'id du chemin n'est pas un UUID, par exemple un code-barres ou un id tronqué copié depuis un exemple.
Passez le champ id d'une recherche, d'un code-barres ou d'une fiche ; résolvez d'abord les codes-barres via l'API de recherche par code-barres.
429 — Forfait Free uniquement : le corps indique l'erreur "Nutrients daily allowance exceeded" et X-RateLimit-Nutrients-Remaining vaut 0. Aucun détail n'a été consommé.
Respectez Retry-After (secondes jusqu'à minuit UTC), repliez-vous sur nutrition_summary pour le reste de la journée, et proposez l'upgrade_url du corps si l'utilisateur a besoin des détails complets tout de suite.
429 — Tous forfaits : la limite par seconde de la clé ou le quota quotidien de requêtes du compte est épuisé ; X-RateLimit-Second-Remaining et X-RateLimit-Daily-Remaining indiquent lequel.
Attendez les secondes de Retry-After. Mettez les récupérations de détails en file au lieu de les lancer en parallèle ; en cas de limite quotidienne, arrêtez jusqu'à X-RateLimit-Daily-Reset.
Comparaison avec d'autres API
La plupart des API de nutrition renvoient soit un tableau par portion impossible à ramener à une autre base, soit des nutriments éclatés en lignes nom/valeur/unité qu'il faut normaliser soi-même. FoodBase renvoie un objet fixe et typé pour 100 g avec l'unité dans chaque clé : un client écrit une fois contre le schéma convient à tous les produits. La contrepartie, c'est l'honnêteté sur les lacunes : une ligne Open Food Facts issue de l'étiquette a des null là où une ligne USDA a des nombres, et l'API le signale au lieu de combler par des estimations. Si vous n'avez besoin que des macros principales, la fiche alimentaire les contient déjà et cet endpoint est facultatif.
Voir la comparaison complète des API de données alimentaires →
Questions fréquentes
Les valeurs sont-elles par portion ou pour 100 g ? +
Toujours pour 100 g, quels que soient le forfait et la source. Le serving_size_raw de la fiche est un texte d'étiquette comme "1 can (330 ml)" : la conversion en grammes et la mise à l'échelle se font dans votre code. Cela permet de comparer deux produits sans savoir comment chaque marque définit une portion.
Que signifie une valeur null, et en quoi diffère-t-elle de 0 ? +
Null signifie que le nutriment ne figure ni sur l'étiquette ni dans la source ; 0 signifie que la source a déclaré zéro. Dans la réponse Coca-Cola de l'exemple, fat_g vaut 0 alors que fiber_g vaut null. Ne traitez jamais les deux de la même façon quand vous totalisez un repas.
Pourquoi un aliment USDA a-t-il ses vitamines renseignées alors qu'un produit de supermarché non ? +
Les lignes USDA Foundation et SR Legacy (source usda_foundation, usda_sr_legacy) proviennent d'analyses de laboratoire et remplissent généralement les groupes vitamines et minéraux. Les lignes USDA Branded (source usda) et Open Food Facts sont transcrites depuis l'emballage, qui dans la plupart des régions n'impose que les nutriments principaux. Vérifiez le champ source de la fiche pour savoir quel type de ligne vous avez.
Ai-je besoin de cet endpoint si j'ai déjà nutrition_summary ? +
Souvent non. nutrition_summary sur la fiche donne déjà energy_kcal, proteins_g, carbs_g, fat_g, sugars_g et fiber_g. Appelez /nutrients quand il vous faut le reste, comme les acides gras saturés, le sodium, le cholestérol ou une vitamine ou un minéral, ce qui ne concerne généralement qu'un écran de détail.
Quel est le lien entre la limite de 25 détails du forfait Free et les 100 requêtes par jour ? +
Les 25 sont un compteur séparé, indiqué dans les en-têtes X-RateLimit-Nutrients-* et réinitialisé à minuit UTC ; les 100 sont le quota de requêtes du compte. Un détail réussi décompte les deux. Un 429 dû à la limite de nutriments ne consomme ni l'un ni l'autre, mais continue d'échouer jusqu'à la réinitialisation : cessez d'appeler d'ici là.
Quel endpoint me donne l'id à passer ici ? +
N'importe lequel. L'API de recherche alimentaire renvoie des id pour les requêtes textuelles et l'API de recherche par code-barres résout un GTIN en une fiche. Le food_id d'exemple 62ea12b8-b260-c288-5c38-3a4906f5d6dd est la fiche derrière le code-barres 5449000000996.
Découvrez d'autres endpoints
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.
En savoir plus →API de recherche alimentaire
Recherche plein texte dans 6,1 millions de produits alimentaires par nom, marque ou catégorie — classée par pertinence, paginée et rapide. Cherchez dans la langue imprimée sur l'étiquette (cyrillique compris) et passez lang=en|fr|es|de|it|bg pour obtenir les noms, catégories et allergènes localisés. Une seule requête GET renvoie un JSON propre que votre application peut afficher immédiatement.
En savoir plus →API de recherche par code-barres
Scannez ou tapez un code-barres, obtenez le produit. Résolvez n'importe quel code EAN-13 ou UPC en fiche alimentaire — marque, catégorie, Nutri-Score et résumé nutritionnel — en une seule requête. Conçue pour les applis de scan.
En savoir plus →Commencez à développer avec l'API de nutrition
Gratuit pour démarrer. Sans carte bancaire.
Obtenir une clé API Aller au tableau de bord