EUlabel
Quickstart

Quickstart

Go from zero to a working Digital Product Passport in under 5 minutes.

This guide walks you through creating a product, attaching passport data, and retrieving it -- all with simple API calls.

Prerequisites

  • An EUlabel account with an API key (format: sk_live_...)
  • curl or any HTTP client

Step 1: Create a product

Every product needs a name, category, brand, and a valid GTIN (Global Trade Item Number).

curl -X POST https://api.eulabel.eu/v1/products \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Quinta do Crasto Douro Red 2021",
    "category": "wine",
    "brand": "Quinta do Crasto",
    "gtin": "5601234567890"
  }'

Response:

{
  "productId": "a1b2c3d4-...",
  "qrCodeUrl": "https://eulabel.eu/01/05601234567890",
  "createdAt": "2026-03-14T20:00:00.000Z"
}

Save the productId -- you'll need it for the next steps.

Step 2: Attach a Digital Product Passport

Attach wine e-label data (ingredients, nutrition, allergens, origin) to your product:

curl -X POST https://api.eulabel.eu/v1/passports \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "productId": "a1b2c3d4-...",
    "data": {
      "productType": "wine",
      "colour": "red",
      "vintage": 2021,
      "ingredients": ["Grapes (Touriga Nacional, Touriga Franca)", "Sulphur Dioxide"],
      "nutrition": {
        "energyKj": 351,
        "energyKcal": 84,
        "fatG": 0,
        "saturatedFatG": 0,
        "carbohydratesG": 0.6,
        "sugarsG": 0.3,
        "proteinG": 0.1,
        "saltG": 0,
        "alcoholG": 13.5
      },
      "allergens": {
        "containsSulphites": true,
        "containsEgg": false,
        "containsFish": false,
        "containsMilk": false
      },
      "origin": {
        "country": "PT",
        "region": "Douro",
        "designation": "Douro DOC"
      },
      "producers": [
        { "name": "Quinta do Crasto", "role": "producer", "country": "PT" }
      ]
    }
  }'

Response:

{
  "passportId": "e5f6g7h8-...",
  "productId": "a1b2c3d4-...",
  "version": 1,
  "status": "published",
  "createdAt": "2026-03-14T20:00:00.000Z"
}

Step 3: Retrieve the passport

curl https://api.eulabel.eu/v1/products/a1b2c3d4-.../passport \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

The response contains the full structured passport data for your product.

Step 4: Download the QR code

curl https://api.eulabel.eu/v1/products/a1b2c3d4-.../qr \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -o label-qr.svg

This generates an SVG QR code encoding a GS1 Digital Link URI. When scanned, the resolver routes users to the appropriate passport view.

What happens when the QR code is scanned

Consumer scans QR code on wine bottle
         |
   eulabel.eu/01/05601234567890
         |
   Resolver detects audience context
         |
   Passport page displayed with ingredients, nutrition, allergens

The resolver serves different data to different audiences -- consumers see the product story, regulators get structured compliance data, and recyclers see material composition.

Next steps

  • Authentication -- Learn about API keys, scopes, and permissions
  • API Reference -- Full endpoint documentation
  • SDK -- Use the TypeScript or Python SDK instead of raw HTTP

On this page