Zum Hauptinhalt springen

Produkte

Ein Produkt ist ein Artikel, den Sie als fertige Ware einkaufen oder verkaufen: ein verpacktes Produkt, eine zugekaufte Fertigkomponente, ein Artikel aus dem Katalog eines Lieferanten. Seine Zusammensetzung stammt meist aus der Zutatenliste auf der Verpackung.

Sie speichern es einmal unter Ihrer eigenen id und lesen seinen berechneten Fussabdruck zurück. Ein gespeichertes Produkt kann auch in einem Rezept verwendet werden – referenzieren Sie es mit type: "products".

Ein Produkt speichern​

PUT /products/{id}, mit Ihrer eigenen id in der URL. Die Response enthält bereits die fertige Berechnung – ein zweiter Request ist nicht nötig.

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
}
}

Die ingredients-declaration sagt uns, woraus das Produkt tatsächlich besteht. Senden Sie sie deshalb immer mit, wenn die Verpackung eine hat. Ohne sie wird das Produkt allein anhand seines Namens erkannt.

Um einen Katalog hochzuladen, verwenden Sie POST /products/batch. Jedes Produkt wird einzeln verarbeitet und erhält einen eigenen Eintrag in der Response. Ein Produkt, das nicht berechnet werden kann, hält die übrigen also nicht auf. Ordnen Sie die Einträge Ihrem Request über product-id zu oder über die mitgesendete request-id.

Nach dem Hochladen halten Sie Ihre lokale Kopie mit GET /products?updated-since aktuell – siehe Daten aktuell halten.

Daten aktuell halten​

Die von uns berechneten Werte sind nicht eingefroren. Sie werden mit der Zeit besser – eine Zutat wird genauer zugeordnet, Hintergrunddaten werden aktualisiert. Ein Produkt, das Sie vor Monaten hochgeladen haben, kann heute einen besseren CO₂-Wert haben.

GET /products gibt die ids Ihrer Produkte zurück. Ergänzen Sie updated-since mit dem Datum Ihrer letzten Synchronisation, dann erhalten Sie nur die Produkte, die sich erneut abzurufen lohnen:

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

Das sind: die Produkte, die Sie geändert haben, die noch nie berechneten und jene, deren Werte sich verschoben haben können, weil sich etwas verbessert hat, worauf sie beruhen. Rufen Sie jedes mit GET /products/{id} ab. Ein über POST /products/batch hochgeladenes Produkt verhält sich in diesem Feed genau wie eines, das mit einem einzelnen PUT hochgeladen wurde.

Ein gemeinsamer ID-Namensraum​

Produkte und gewöhnliche Zutaten teilen sich einen einzigen id-Namensraum: Eine id gehört entweder einem Produkt oder einer Zutat, nie beiden zugleich. GET /products/{id} gibt zurück, was die id gerade belegt, und das Feld type sagt Ihnen, was es ist:

typeWas die id belegt
productsEin Produkt. Es ändert sich nur über die Produkt-Endpoints.
conceptual-ingredientsEine gewöhnliche Zutat. Ein Rezept oder Einkauf definiert sie, und jedes Rezept und jeder Einkauf kann sie ändern.

Ein Rezept oder Einkauf, der eine id sendet, ändert die gewöhnliche Zutat unter dieser id, nie ein Produkt. Um ein Produkt unter einer id zu speichern, die bereits eine gewöhnliche Zutat belegt, setzen Sie convert-ingredient-to-product=true.

Produkt-Eigenschaften​

Request-Eigenschaften​

EigenschaftTypPflichtBeschreibung
idStringJaIhre eindeutige Produkt-ID
namesArrayJaProduktname als Array von Sprachobjekten: [{"language": "de", "value": "Karottenpüree"}]
ingredients-declarationStringEmpfohlenZutatenliste wie auf der Verpackung deklariert. Wird ausgewertet, um zu bestimmen, woraus das Produkt besteht.
nutrient-valuesObjectEmpfohlenNährwerte pro 100g wie auf der Verpackung deklariert (siehe Referenz)
gtinStringEmpfohlenGlobal Trade Item Number (www.gtin.info)
amountFloatEmpfohlenMenge des Produkts in der angegebenen Einheit. Ohne Angabe gilt der Fussabdruck für ein Kilogramm.
unitStringNeinEinheit: kg, gram oder liter. Standard: gram
producerStringEmpfohlenHersteller oder Marke des Produkts
dateStringNeinProduktionsdatum für saisonale Berechnungen. Format: YYYY-MM-DD
originStringEmpfohlenProduktionsort: Postadresse oder Land
transportStringEmpfohlenTransportmittel: air oder ground
productionStringEmpfohlenProduktionsweise: standard, greenhouse, organic, fair-trade, farm, wild-caught, sustainable-fish
processingStringNeinVerarbeitungsstufe: raw, unboned, boned, skinned, beheaded, fillet, cut, boiled, peeled
conservationStringEmpfohlenKonservierungsart: fresh, frozen, dried, conserved, canned, boiled-down
packagingStringNeinVerpackungsart: none, plastic, paper, pet, tin, alu, glas, cardboard, tetra

Response-Eigenschaften​

Das Produkt wird unter product zurückgegeben, zusammen mit einem statuscode, der angibt, ob es berechnet werden konnte.

EigenschaftTypBeschreibung
statuscodeInteger200, wenn das Produkt berechnet wurde. Siehe Statuscodes.
messageStringErklärt den statuscode, wenn er nicht 200 ist
product-idStringDie ID des Produkts, zu dem dieser Eintrag gehört
productObjectDas Produkt und seine berechneten Werte (unten)
EigenschaftTypBeschreibung
idStringProdukt-ID
typeStringproducts (schreibgeschützt) oder conceptual-ingredients (jedes Rezept darf sie überschreiben)
namesArrayProduktnamen als Array von Sprachobjekten
co2-valueIntegerCO₂-Emissionen in Gramm CO₂e für die angegebene amount (siehe Hinweis unten)
ratingStringCO₂-Bewertung (A-E). A ist am besten, E am schlechtesten.
eaternity-awardBooleantrue, wenn das Produkt klimafreundlich ist
co2-value-improvement-percentageFloatVergleich des CO₂-Fussabdrucks dieses Produkts pro Food Unit mit dem Durchschnitt
co2-value-reduction-valueFloatEingesparte Gramm CO₂ im Vergleich zu einem durchschnittlichen Produkt mit gleichem Nährwert
food-unitFloatNährwert des Produkts für die angegebene amount
amountFloatProduktmenge, aus Ihrem Request zurückgegeben
unitStringMasseinheit
gtinStringGlobal Trade Item Number
dateStringProduktionsdatum
ingredients-declarationStringDer ursprüngliche Text der Zutatenliste (wenn ingredients-declaration=true gesetzt ist)
nutrient-values-estimated-per-specified-amountObjectVom Backend geschätzte Nährwerte, skaliert auf die angegebene Menge (wenn nutrient-values=true gesetzt ist)
indicatorsObjectUmweltindikatoren (wenn indicators=true gesetzt ist)
Der Fussabdruck eines Produkts gilt für die gesendete Menge

co2-value und food-unit werden für die amount (und unit) in Ihrem Request berechnet – die zehnfache Menge ergibt den zehnfachen Fussabdruck. 500 gram und 0.5 kilogram ergeben dasselbe Resultat. Senden Sie keine Menge, gilt der Fussabdruck für ein Kilogramm.

Wenn Sie das Produkt stattdessen in einem Rezept referenzieren, skaliert die amount auf dieser Rezeptzeile – die eigene amount des Produkts wird nicht übernommen.

Response-Beispiel​

{
"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"
}
}

Statuscodes​

Neben den üblichen Statuscodes verwenden Produkte:

CodeBedeutungWas zu tun ist
612Das referenzierte Produkt existiert nichtSpeichern Sie zuerst das Produkt und senden Sie dann das Rezept
613Ein Schreibvorgang, den ein Produkt nicht akzeptiert – entweder hat ein Rezept versucht, unter der id eines Produkts eine Zutat zu definieren, oder ein Schreibvorgang für ein Produkt würde eine bestehende Zutat umwandelnReferenzieren Sie das Produkt mit type: "products", statt es zu definieren. Um eine Zutat bewusst umzuwandeln, ergänzen Sie convert-ingredient-to-product=true.

Randnotiz: Produkte und Zutaten​

Ein Produkt und eine Zutat beschreiben dasselbe: ein Lebensmittel mit Name, Menge und Attributen wie Herkunft, Produktionsweise und Konservierung. Sie unterscheiden sich darin, wie sie gespeichert werden. Ein Produkt wird einmal unter seiner eigenen id gespeichert und ändert sich nur über die Produkt-Endpoints. Eine Zutat wird innerhalb eines Rezepts oder eines Einkaufs definiert.

Endpoints​