Skip to main content

e-label information

Introduction

Electronic labeling, or e-labels, for wine and spirits is governed by EU Regulation 2019/787, which is also known as the "Wine Act". This regulation sets the rules for the production, presentation, and labeling of wine, including the use of e-labels. In addition, the EU Regulation 1169/2011 (Food Information to Consumers Regulation or FIC Regulation) also sets the requirements for labeling.

e-labels appear on product packaging or on digital marketing materials and must contain all of the legally required information about a product, including, the product name or brand, volume, alcohol content, ingredients, and allergen information. The e-label format must comply with the EU regulations for food and beverage labeling, including the requirements for font size, language, and legibility.

There are 2 ways e-labels can be managed in Scantrust

  1. Edit e-label data in the scantrust portal under the products > e-label page
  2. Upload the e-label data for each product with the Scantrust e-label JSON API

e-label-1 e-label-2

The below process describes how to upload and download e-label data using the Scantrust REST Api. Because e-label data is set on the product, you will need a UAT token with the same minimum permissions as for managing products:

  • product_create
  • product_delete
  • product_edit
  • product_view

The UAT token must be set in the header fields of all requests as described in Authentication & Tokens.

API Design

POST: /api/v2/products/{product_id}/elabel/

Sets all e-label JSON data for a product

Response (201): Status CREATED

{
"name": "black-deer-cb-2018", // product name
"data": {
"editor": { ... },
"published": { ... }
}
}

Note that a complete JSON object needs to be posted each time an e-label is updated. This endpoint does not support partial updates of the JSON.

For an example of a full set of data to POST for the editor section, see JSON example here

GET: /api/v2/products/{product_id}/elabel/

Returns all e-label JSON data for a product

Response (200): Status OK

Example JSON:

{
"id": 1272,
"company": 7583,
"name": "black-deer-cb-2018",
"data": {
"editor": {
"type": "wine",
"theme": { "primary": "#F01515", "background": "#D8D790", "alcoholColor": "#890022" },
"footer": { "first_line": "", "second_line": "" },
"header": { "logo": "", "title": "E-Label" },
"default_country": "",
"default_language": "en",
"reviewed_languages": ["en"],
"available_languages": ["en"],
"enforce_language_per_country": false,
"sections": [
{ "key": "product-infos" },
{ "key": "geographical-indications" },
{ "key": "serving-infos" },
{ "key": "ingredients" },
{ "key": "allergens" },
{ "key": "nutrition" },
{ "key": "responsible-consumption" },
{ "key": "sustainability" },
{ "key": "business-operator" },
{ "key": "brand-infos" }
],
... (JSON objects for each of the above sections)

An e-label JSON contains 2 set of the e-label data at all time.

  • editor : draft version of the data, the data that you see in when using the e-label management tool.
  • published : Live data. What consumer see when they open an e-label landing page.

The elabel JSON consists of a set of generic fields and 10 sections each with its own JSON object:

Generic Fields

  • type : wine or spirit
  • theme : sets the primary, background and alcoholColor of the landing page
  • footer : sets the text for the first_line and second_line of the e-label footer
  • header : sets the logo and title (default: "E-Label")
  • default_country : sets the data for the country to be shown when an e-label is scanned in a non-EU country
  • default_language : sets the default language (default: English)
  • reviewed_languages : array of reviewed language (not necessary when uploading through the API)
  • available_languages : array of available languages to choose from as a user
  • enforce_language_per_country : forces a fixe language for each country (default: false)

Section Objects

  • Product Information product-infos
  • Geographic Indications geographical-indications
  • Serving Information serving-infos
  • Ingredients ingredients
  • Allergens allergens
  • Nutrition Table nutrition
  • Responsible Consumption Message responsible-consumption
  • Sustainability Certifications sustainability
  • Business Operators (country specific) business-operator
  • Branding Info brand-info

Each section contains variable information inluding country-specific data and translations. These translations each have a two-character ISO country code as a key.

product-infos

wine type and sales_description fields can contain translations

   "product-infos": {
"type": {
"bg": "Трапезно вино",
"cs": "Stolní víno",
"da": "Bordvin",
"de": "Tafelwein",
"el": "Επιτραπέζιο κρασί",
"en": "Table wine",
...
},
"origin": ["ZA"],
"volumes": ["750"],
"vine_variety": "Pinotage",
"vintage_year": "2020",
"wine_variety": "White Blend",
"alcohol_volume": "13",
"producing_year": "",
"wine_sweetness": "wine_sweetness_extra_dry",
"sales_description": {
"bg": "Ние сме много устойчиви",
"cs": "Jsme velmi udržitelní",
"da": "Vi er meget bæredygtige",
"de": "Wir sind sehr nachhaltig",
"el": "Είμαστε πολύ βιώσιμοι",
...
}

geographical-indications

mutiple geographical indications can apply.

      "geographical-indications": 
{ "list": [
{ "icon": "0", "description": "Appelation 1" }
]
},

serving-infos

unit and serving can be set specifically for each country

      "serving-infos": {
"unit": { "FR": "CL", "default": "ML" },
"serving": { "default": 100 },
"glass_icon": "default_wine",
"bottle_icon": "default_wine"
},

ingredients

ingredients can be nested in categories and description can have translations. set the is_allergen field to true to mark an ingrdient as an allergen.

    "ingredients": {
"list": [
{
"children": [],
"description": {
"bg": "Съставка 1",
"cs": "Složka 1",
"da": "Ingrediens 1",
"de": "Zutat 1",
"el": "Συστατικό 1",
"en": "Ingredient 1 ",
...
}
},
{
"description": {
"bg": "Съставка 2",
"cs": "Složka 2",
"da": "Ingrediens 2",
"de": "Zutat 2",
"el": "Συστατικό 2",
"en": "Ingredient 2",
...
}
},
{
"description": {
"bg": "Съставка 3",
"cs": "Složka 3",
"da": "Ingrediens 3",
"de": "Zutat 3",
"el": "Συστατικό 3",
"en": "Ingredient 3",
...
}
},
{
"description": {
"bg": "Съставка 4",
"cs": "Složka 4",
"da": "Ingrediens 4",
"de": "Zutat 4",
"el": "Συστατικό 4",
"en": "Ingredient 4",
...
}
},
{ "description": { "en": "Ingredient 5 only English" } },
{ "description": {
"en": "Ingredient 6 is an allergen" },
"is_allergen": true
}
]
}

allergens

description and no_allergens_description can have translations.

      "allergens": {
"icon": 1,
"list": [],
"description": {},
"has_allergens": true,
"no_allergens_description": {}
},

nutrition

nutrition can be nested but we highly recommend just using the default structure as shown below

      "nutrition": {
"table": [
{
"key": "energy",
"unit": "kJ",
"children": [{ "key": null, "unit": "kcal", "per_100ml": 72 }],
"per_100ml": 299
},
{
"key": "fat",
"unit": "g",
"children": [{ "key": "saturated_fat", "unit": "g", "per_100ml": 0 }],
"per_100ml": "1"
},
{
"key": "carbohydrate",
"unit": "g",
"children": [{ "key": "sugar", "unit": "g", "per_100ml": "1" }],
"per_100ml": "1"
},
{ "key": "protein", "unit": "g", "per_100ml": "1" },
{ "key": "salt", "unit": "g", "per_100ml": 0 }
]
},

responsible-consumption

description can have translations.

      "responsible-consumption": {
"icons": [],
"description": { "en": "Please consume alcohol responsibly" },
"custom_icons": [],
"responsible_drinking_logo": true
},

sustainability

organic_description, recyclability_description and certifications_description can have translations

      "sustainability": {
"custom_icons": [],
"organic_icons": [],
"organic_description": { "en": "Organic Wine" },
"recyclability_icons": [{ "key": "3" }],
"certifications_icons": [],
"recyclability_description": {},
"certifications_description": { "en": "Test Sustainability Certification" }
},

business-operator

bottled_by, imported_by and imported_by can all be set specific to a country

      "business-operator": {
"bottled_by": { "AT": "", "BE": "", "BG": "", "default": "Company B" },
"imported_by": { "AT": "Company D", "default": "Company C" },
"imported_by": { "default": "Company A" }
},

brand-info

description can have translations.

      "brand-infos": {
"link": "https://www.scantrust.com",
"image": "",
"text_color": "#FFFFFF",
"description": { "en": "Here is a Brand text" }
}

Full JSON Example

for a full JSON example click here