Aller au contenu principal

Produits

Un produit est un article que vous achetez ou vendez sous forme finie : une denrée emballée, un composant prêt à l'emploi que vous achetez, un article du catalogue d'un fournisseur. Sa composition provient généralement de la liste des ingrédients figurant sur l'emballage.

Vous l'enregistrez une fois, sous votre propre id, et vous récupérez son empreinte calculée. Un produit enregistré peut aussi être utilisé dans une recette : référencez-le avec type: "products".

Enregistrer un produit​

PUT /products/{id}, avec votre propre id dans l'URL. La réponse contient déjà le calcul terminé : aucune deuxième request n'est nécessaire.

PUT /products/carrot-puree-500g
{
"id": "carrot-puree-500g",
"gtin": "00123456789023",
"names": [{"language": "de", "value": "Karottenpüree"}],
"amount": 500,
"unit": "gram",
"producer": "ACME Foods",
"ingredients-declaration": "Karotten, Wasser, Salz",
"nutrient-values": {
"energy-kcal": 35,
"fat-gram": 0.2,
"protein-gram": 0.9,
"carbohydrates-gram": 7.5
}
}

C'est l'ingredients-declaration qui nous indique la composition réelle du produit : incluez-la chaque fois que l'emballage en comporte une. Sans elle, le produit est identifié à partir de son seul nom.

Pour charger un catalogue, utilisez POST /products/batch. Chaque produit est traité séparément et reçoit sa propre entrée dans la réponse : un produit qui ne peut pas être calculé ne bloque pas les autres. Associez les entrées à votre request par product-id, ou par le request-id que vous avez envoyé.

Une fois le chargement effectué, tenez votre copie locale à jour avec GET /products?updated-since : voir Garder vos données à jour.

Garder vos données à jour​

Les valeurs que nous calculons ne sont pas figées. Elles s'améliorent avec le temps (un ingrédient est mis en correspondance plus précisément, les données d'arrière-plan sont actualisées) : un produit chargé il y a plusieurs mois peut donc avoir aujourd'hui une meilleure valeur de CO₂.

GET /products renvoie les id de vos produits. Ajoutez updated-since avec la date de votre dernière synchronisation : vous ne recevez alors que ceux qui valent la peine d'être récupérés à nouveau :

GET /products?updated-since=2026-07-01
{
"products": ["carrot-puree-500g", "tomato-sauce-400g"]
}

C'est-à-dire : les produits que vous avez modifiés, ceux qui n'ont jamais été calculés et ceux dont les valeurs ont pu changer parce qu'un élément dont ils dépendent s'est amélioré. Récupérez chacun avec GET /products/{id}. Un produit chargé via POST /products/batch se comporte dans ce flux exactement comme un produit chargé avec un seul PUT.

Un seul espace de noms d'id​

Les produits et les ingrédients ordinaires partagent un seul espace de noms d'id : un id appartient soit à un produit, soit à un ingrédient, jamais aux deux à la fois. GET /products/{id} renvoie celui qui le détient, et le champ type indique lequel :

typeCe qui détient l'id
productsUn produit. Il ne change que via les endpoints des produits.
conceptual-ingredientsUn ingrédient ordinaire. Une recette ou une fourniture le définit, et toute recette ou fourniture le modifie.

Une recette ou une fourniture qui envoie un id modifie l'ingrédient ordinaire correspondant à cet id, jamais un produit. Pour enregistrer un produit sous un id déjà détenu par un ingrédient ordinaire, définissez convert-ingredient-to-product=true.

Propriétés du produit​

Propriétés de la request​

PropriétéTypeObligatoireDescription
idStringOuiVotre identifiant unique du produit
namesArrayOuiNom du produit sous forme de tableau d'objets de langue : [{"language": "de", "value": "Karottenpüree"}]
ingredients-declarationStringRecommandéListe des ingrédients telle que déclarée sur l'emballage. Analysée pour déterminer la composition du produit.
nutrient-valuesObjectRecommandéValeurs nutritionnelles pour 100 g telles que déclarées sur l'emballage (voir Référence)
gtinStringRecommandéGlobal Trade Item Number (www.gtin.info)
amountFloatRecommandéQuantité du produit dans l'unité indiquée. Sans elle, l'empreinte porte sur un kilogramme.
unitStringNonUnité : kg, gram ou liter. Valeur par défaut : gram
producerStringRecommandéLe producteur ou la marque du produit
dateStringNonDate de production pour les calculs de saisonnalité. Format : YYYY-MM-DD
originStringRecommandéLieu de production : adresse postale ou pays
transportStringRecommandéMoyen de transport : air ou ground
productionStringRecommandéMode de production : standard, greenhouse, organic, fair-trade, farm, wild-caught, sustainable-fish
processingStringNonNiveau de transformation : raw, unboned, boned, skinned, beheaded, fillet, cut, boiled, peeled
conservationStringRecommandéMode de conservation : fresh, frozen, dried, conserved, canned, boiled-down
packagingStringNonType d'emballage : none, plastic, paper, pet, tin, alu, glas, cardboard, tetra

Propriétés de la réponse​

Le produit est renvoyé sous product, à côté d'un statuscode qui indique s'il a pu être calculé.

PropriétéTypeDescription
statuscodeInteger200 lorsque le produit a été calculé. Voir Codes de statut.
messageStringExplique le statuscode lorsqu'il n'est pas 200
product-idStringL'id du produit auquel appartient cette entrée
productObjectLe produit et ses valeurs calculées (ci-dessous)
PropriétéTypeDescription
idStringIdentifiant du produit
typeStringproducts (protégé en écriture) ou conceptual-ingredients (toute recette peut l'écraser)
namesArrayNoms du produit sous forme de tableau d'objets de langue
co2-valueIntegerÉmissions de CO₂ en grammes de CO₂e pour l'amount indiqué (voir la remarque ci-dessous)
ratingStringNotation CO₂ (A-E). A est la meilleure, E la moins bonne.
eaternity-awardBooleantrue si le produit est respectueux du climat
co2-value-improvement-percentageFloatComparaison de l'empreinte carbone de ce produit par food unit avec la moyenne
co2-value-reduction-valueFloatGrammes de CO₂ économisés par rapport à un produit moyen de même valeur nutritionnelle
food-unitFloatValeur nutritionnelle du produit pour l'amount indiqué
amountFloatQuantité du produit, reprise de votre request
unitStringUnité de mesure
gtinStringGlobal Trade Item Number
dateStringDate de production
ingredients-declarationStringLe texte original de la liste des ingrédients (lorsque ingredients-declaration=true est défini)
nutrient-values-estimated-per-specified-amountObjectValeurs nutritionnelles estimées par le backend, rapportées à la quantité indiquée (lorsque nutrient-values=true est défini)
indicatorsObjectIndicateurs environnementaux (lorsque indicators=true est défini)
L'empreinte d'un produit porte sur la quantité envoyée

co2-value et food-unit sont calculés pour l'amount (et l'unit) de votre request : dix fois la quantité donne dix fois l'empreinte. 500 gram et 0.5 kilogram donnent le même résultat. Si vous n'envoyez aucune quantité, l'empreinte porte sur un kilogramme.

Si vous référencez plutôt le produit depuis une recette, c'est l'amount de cette ligne de recette qui le met à l'échelle : l'amount propre au produit n'est pas repris.

Exemple de réponse​

{
"statuscode": 200,
"message": "",
"request-id": 0,
"product-id": "carrot-puree-500g",
"product": {
"food-unit": 0.62,
"eaternity-award": true,
"co2-value": 77,
"rating": "A",
"co2-value-improvement-percentage": 84,
"co2-value-reduction-value": 403,
"id": "carrot-puree-500g",
"gtin": "00123456789023",
"names": [{"language": "de", "value": "Karottenpüree"}],
"amount": 500.0,
"unit": "gram",
"producer": "ACME Foods",
"origin": "",
"transport": "",
"production": "",
"processing": "",
"conservation": "",
"packaging": "",
"type": "products"
}
}

Codes de statut​

En plus des codes de statut habituels, les produits utilisent :

CodeSignificationQue faire
612Le produit référencé n'existe pasEnregistrez d'abord le produit, puis envoyez la recette
613Une écriture qu'un produit n'accepte pas : soit une recette a tenté de définir un ingrédient sous l'id d'un produit, soit l'écriture d'un produit convertirait un ingrédient existantRéférencez le produit avec type: "products" au lieu de le définir. Pour convertir volontairement un ingrédient, ajoutez convert-ingredient-to-product=true.

Remarque : produits et ingrédients​

Un produit et un ingrédient décrivent la même chose : un aliment avec un nom, une quantité et des attributs comme l'origine, la production et la conservation. Ils diffèrent par la façon dont ils sont enregistrés. Un produit est enregistré une fois sous son propre id et ne change que via les endpoints des produits. Un ingrédient est défini dans une recette ou une fourniture.

Endpoints​