Product label
POST /v1/label · $0.01 a call
Send a photo of the back of a pack. A vision model copies the nutrition table and ingredient list as printed. Everything after that is deterministic: values are converted to per 100 g and checked for misreads, the Nutri-Score is computed with the official 2023 algorithm, the NOVA processing group comes from Open Food Facts ingredient markers, additives are matched against the Open Food Facts additives database with EFSA risk levels, and the 14 EU allergens are detected. Cosmetic ingredient lists are checked against EU-regulated and commonly avoided ingredients.
For product scanners like yuka, grocery and allergy apps, clean-beauty apps.
Request
Send the photo as image (multipart), image_base64 or image_url, as described in the overview. These optional fields go alongside it:
| Field | Type | Description |
|---|---|---|
product_type | one of food, beverage, cosmetic, supplement | What the product is, when you already know it. |
context | string, up to 500 characters | Anything else about the product, e.g. "this is the back of a cereal box". |
Photo tips. Photograph the back of the pack flat and in focus, with the whole nutrition table and ingredient list in frame. One label per photo.
curl https://ourapi.keronlabs.com/v1/label \
-H "Authorization: Bearer $FORKCAST_KEY" \
-F image=@label.jpg \
-F product_type="food"Response
| Field | Description |
|---|---|
summary | One line, e.g. "Nutri-Score E, NOVA 4, 1 additive". |
product | type (food, beverage, cosmetic, supplement, other), name, brand, language. |
nutrition | basis_printed, serving_size, unit, per_100 (energy_kj, energy_kcal, fat_g, saturated_fat_g, carbohydrates_g, sugars_g, fiber_g, protein_g, salt_g) and checks: any values that do not add up. |
nutri_score | grade A to E, score, category, the points for each component, and notes. Null for products Nutri-Score does not cover. |
nova | group 1 to 4, the ingredients that set it, and a one-line basis. |
additives[] | e_number, name, classes, efsa_overexposure_risk (high, moderate or null), note. |
allergens | contains and may_contain, each a list of EU allergen ids (gluten, milk, nuts, peanuts, soybeans, eggs, fish, crustaceans, molluscs, celery, mustard, sesame, sulphites, lupin). |
ingredients[], ingredients_text | The ingredient list as printed and parsed. |
cosmetic | For cosmetics: flags (ingredient, category, level info|caution|restricted, reason) and ingredient_count. Null for food. |
warnings | Problems with the photo or the label, such as a cut-off table. |
Example
Output of this API's own code on a sample photo. Values will differ for your photos.
{
"metadata": {
"id": "req_9cf4da08fe7f40dab71a",
"engine": "label",
"status": "success",
"cached": false,
"credits_used": 1,
"created_at": "2026-10-19T09:30:00.000Z",
"processing_ms": 3400
},
"summary": "Nutri-Score E, NOVA 4, 1 additive",
"product": {
"type": "food",
"name": "Chocolate hazelnut spread",
"brand": null,
"language": "en"
},
"legibility": "clear",
"nutrition": {
"basis_printed": "per_100g",
"serving_size": 15,
"unit": "g",
"per_100": {
"energy_kj": 2252,
"energy_kcal": 539,
"fat_g": 30.9,
"saturated_fat_g": 10.6,
"carbohydrates_g": 57.5,
"sugars_g": 56.3,
"fiber_g": null,
"protein_g": 6.3,
"salt_g": 0.11
},
"checks": []
},
"nutri_score": {
"grade": "E",
"score": 31,
"category": "general",
"negative_points": 31,
"positive_points": 0,
"components": {
"negative": [
{
"id": "energy",
"value": 2252,
"points": 6,
"points_max": 10
},
{
"id": "sugars",
"value": 56.3,
"points": 15,
"points_max": 15
},
{
"id": "saturated_fat",
"value": 10.6,
"points": 10,
"points_max": 10
},
{
"id": "salt",
"value": 0.11,
"points": 0,
"points_max": 20
}
],
"positive": [
{
"id": "fiber",
"value": null,
"points": 0,
"points_max": 5
},
{
"id": "fruits_vegetables_legumes",
"value": 0,
"points": 0,
"points_max": 5
}
]
},
"proteins_counted": false,
"algorithm": "2023",
"notes": [
"Fiber is not printed and counts as 0."
]
},
"nova": {
"group": 4,
"markers": [
{
"ingredient": "emulsifier: lecithins (soya)",
"marker": "Emulsifier",
"group": 4
},
{
"ingredient": "Sugar",
"marker": "sugar",
"group": 3
},
{
"ingredient": "skimmed milk powder",
"marker": "milk powder",
"group": 3
}
],
"basis": "Contains ingredients or additives typical of ultra-processed foods."
},
"additives": [
{
"e_number": "E322",
"name": "Lecithin‚ hydroxylated",
"classes": [],
"efsa_overexposure_risk": null,
"note": null
}
],
"allergens": {
"contains": [
"soybeans",
"milk",
"nuts"
],
"may_contain": []
},
"ingredients": [
{
"name": "Sugar",
"percent": null,
"e_number": null
},
{
"name": "palm oil",
"percent": null,
"e_number": null
},
{
"name": "hazelnuts",
"percent": 13,
"e_number": null
},
{
"name": "skimmed milk powder",
"percent": 8.7,
"e_number": null
},
{
"name": "fat-reduced cocoa",
"percent": 7.4,
"e_number": null
},
{
"name": "emulsifier: lecithins (soya)",
"percent": null,
"e_number": "E322"
},
{
"name": "vanillin",
"percent": null,
"e_number": null
}
],
"ingredients_text": "Sugar, palm oil, hazelnuts 13%, skimmed milk powder 8.7%, fat-reduced cocoa 7.4%, emulsifier: lecithins (soya), vanillin.",
"cosmetic": null,
"warnings": []
}