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:

FieldTypeDescription
product_typeone of food, beverage, cosmetic, supplementWhat the product is, when you already know it.
contextstring, up to 500 charactersAnything 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

FieldDescription
summaryOne line, e.g. "Nutri-Score E, NOVA 4, 1 additive".
producttype (food, beverage, cosmetic, supplement, other), name, brand, language.
nutritionbasis_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_scoregrade A to E, score, category, the points for each component, and notes. Null for products Nutri-Score does not cover.
novagroup 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.
allergenscontains 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_textThe ingredient list as printed and parsed.
cosmeticFor cosmetics: flags (ingredient, category, level info|caution|restricted, reason) and ingredient_count. Null for food.
warningsProblems 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": []
}