EU Digital Product Passports genereren via API

De meeste DPP-handleidingen vertellen je wat een paspoort moet bevatten. Deze laat zien hoe je EU-conforme Digital Product Passports programmatisch aanmaakt — met curl, de qr3 SDK, batch-aanmaak, validatie, GS1 QR-codes en webhooks.

door QR3 Redaktion

EU Digital Product Passports genereren via API

De meeste artikelen over het EU Digital Product Passport (DPP) leggen uit wat een paspoort moet bevatten. Veel minder laten zien hoe je er een aanmaakt — en bijna geen enkel laat zien hoe je dat doet voor een catalogus van 500 of 50.000 SKU's zonder 50.000 keer door een formulier te klikken.

Dit is de versie voor developers. Elke stap hieronder is een echte, werkende call tegen de qr3.app API (https://qr3.app/v1). Als je productdata beheert in een ERP, een PIM of een database, kun je DPP-generatie rechtstreeks in je bestaande pipeline inbouwen.

Waarom een API belangrijk is voor DPP's

Een Digital Product Passport is geen eenmalig document. Onder de Ecodesign for Sustainable Products Regulation (ESPR, EU 2024/1781) en de EU Battery Regulation 2023/1542 heeft elke gereguleerde eenheid een paspoort nodig dat gedurende de hele levensduur actueel blijft. Voor een fabrikant betekent dat:

  • Schaal — honderden tot tienduizenden producten, elk met zijn eigen GTIN/serienummer.
  • Actualiteit — data (CO₂-voetafdruk, gerecycled materiaal, reparatie-informatie) verandert en moet worden bijgewerkt, niet opnieuw aangemaakt.
  • Integratie — de bron van waarheid is je ERP/PIM, niet een webformulier.

Dat is een API-vraagstuk. Een handmatige webtool levert je de eerste tien paspoorten op; een API levert je ze allemaal.

1. Authenticatie

Elke aanvraag gebruikt een bearer-token (maak een API-sleutel aan in het dashboard). De basis-URL is https://qr3.app/v1.

curl https://qr3.app/v1/dpp \
  -H "Authorization: Bearer $QR3_API_KEY"

Of met de officiële SDK:

import { QR3 } from "@qr3/sdk";

const client = new QR3({ apiKey: process.env.QR3_API_KEY! });

2. Een batterijpaspoort aanmaken

Een DPP wordt aangemaakt met POST /dpp. De velden op het bovenste niveau zijn voor elke categorie hetzelfde; de categoriespecifieke data gaat in battery_data, textile_data of general_data.

curl -X POST https://qr3.app/v1/dpp \
  -H "Authorization: Bearer $QR3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "gtin": "09506000134376",
    "serial": "SN-00012345",
    "product_name": "PowerCell 5 kWh LFP",
    "manufacturer": "ExampleTech GmbH",
    "origin_country": "DE",
    "category": "battery",
    "market_countries": ["DE", "FR", "AT"],
    "status": "live",
    "battery_data": {
      "capacity_kwh": 5,
      "carbon_footprint_kg": 62,
      "carbon_footprint_class": "B",
      "recycled_content_pct": 12,
      "recyclability_pct": 95,
      "manufacturer_warranty_years": 8,
      "lithium_content_pct": 6.5,
      "certifications": ["CE", "UN38.3"]
    }
  }'

Dezelfde call met de SDK:

const passport = await client.dpp.create({
  gtin: "09506000134376",
  serial: "SN-00012345",
  product_name: "PowerCell 5 kWh LFP",
  manufacturer: "ExampleTech GmbH",
  origin_country: "DE",
  category: "battery",
  market_countries: ["DE", "FR", "AT"],
  battery_data: {
    capacity_kwh: 5,
    carbon_footprint_kg: 62,
    recycled_content_pct: 12,
    recyclability_pct: 95,
    manufacturer_warranty_years: 8,
  },
});

console.log(passport.id);      // dpp_xxxxxxxx
console.log(passport.qr.svg);  // print-ready GS1 Digital Link QR

Het antwoord bevat een landingspagina voor consumenten (gelokaliseerd in 25 EU-talen) en een GS1 Digital Link QR-code die klaar is om op een label te printen — geen aparte QR-stap nodig.

3. Valideren vóór je aanmaakt

Wil je ontbrekende of ongeldige velden opvangen voordat je iets persisteert? POST /dpp/validate voert exact dezelfde EU-validatieregels uit zonder iets aan te maken. Ideaal als pre-commit-check in CI.

const result = await client.dpp.validate({
  gtin: "09506000134376",
  product_name: "PowerCell 5 kWh LFP",
  manufacturer: "ExampleTech GmbH",
  origin_country: "DE",
  category: "battery",
  battery_data: {
    capacity_kwh: 5,
    carbon_footprint_kg: 62,
    recycled_content_pct: 12,
    recyclability_pct: 95,
    manufacturer_warranty_years: 8,
  },
});

if (!result.valid) {
  console.error(result.errors);
  // [{ field: "battery_data.recyclability_pct", message: "..." }]
}

4. Een hele catalogus in batch aanmaken

Voor een productcatalogus stuur je tot 100 paspoorten per aanvraag naar POST /dpp/batch. Loop over je ERP-export en je hebt je volledige assortiment binnen enkele minuten.

const items = products.map((p) => ({
  gtin: p.gtin,
  serial: p.serial,
  product_name: p.name,
  manufacturer: "ExampleTech GmbH",
  origin_country: "DE",
  category: "battery" as const,
  battery_data: {
    capacity_kwh: p.capacityKwh,
    carbon_footprint_kg: p.co2Kg,
    recycled_content_pct: p.recycledPct,
    recyclability_pct: p.recyclablePct,
    manufacturer_warranty_years: p.warrantyYears,
  },
}));

// Chunk into batches of 100
const result = await client.dpp.batch({ items: items.slice(0, 100) });

5. De QR-code ophalen om labels te printen

Elk paspoort stelt zijn GS1 Digital Link QR beschikbaar in vier printformaten. Haal ze op via het paspoortobject of rechtstreeks:

curl https://qr3.app/v1/dpp/dpp_xxxxxxxx/qr.svg \
  -H "Authorization: Bearer $QR3_API_KEY" -o label.svg

qr.svg, qr.png, qr.pdf en qr.eps zijn allemaal beschikbaar — SVG/EPS voor je labelprinter, PNG voor het web.

6. Data actueel houden (zonder de QR te breken)

De GTIN/serienummer/lot zijn onveranderlijk na het aanmaken — dat houdt de geprinte GS1-URI voor altijd stabiel. Al het overige kan worden bijgewerkt met PUT /dpp/{id}:

await client.dpp.update(passport.id, {
  battery_data: {
    capacity_kwh: 5,
    carbon_footprint_kg: 58, // re-measured, lower footprint
    recycled_content_pct: 16, // 2031 target reached early
    recyclability_pct: 95,
    manufacturer_warranty_years: 8,
  },
});

De QR op het fysieke product verandert nooit; de data erachter wel. Dat is precies het idee van een dynamisch paspoort.

7. Indienen bij het EU-register

Wanneer het centrale EU DPP-register van toepassing is op jouw product, dien je een paspoort in met één call (Business-abonnement en hoger):

const reg = await client.dpp.registerForEuRegistry(passport.id);
console.log(reg.data.eu_registry_status);          // "pending"
console.log(reg.data.registry_request_id);

8. Reageren op scans met webhooks

DPP-scans zijn events. Abonneer je op qr.scanned en je kunt ze rechtstreeks in je analytics streamen, herbestellingen triggeren of een recall markeren — in realtime. Payloads zijn ondertekend (HMAC-SHA256); verifieer altijd de handtekening.

import { verifyWebhook } from "@qr3/sdk";

app.post("/webhooks/qr3", async (req, res) => {
  const event = verifyWebhook(req.body, req.headers["qr3-signature"], secret);
  if (event.type === "qr.scanned") {
    console.log(event.data.country, event.data.dpp_id);
  }
  res.sendStatus(200);
});

Alles bij elkaar: DPP-generatie in CI

De eindsituatie die de meeste fabrikanten willen: productdata leeft in het ERP/PIM en een geplande job houdt de paspoorten gesynchroniseerd.

  1. Exporteer gewijzigde producten uit je ERP.
  2. client.dpp.validate(...) voor elk product — laat de build falen bij validatiefouten.
  3. client.dpp.batch(...) voor nieuwe producten; client.dpp.update(...) voor gewijzigde.
  4. Push de teruggegeven qr.svg-URL's naar je labelprintsysteem.

Geen webformulier, geen copy-paste, geen drift tussen je masterdata en je paspoorten.

FAQ

Heb ik een aparte QR-codetool nodig? Nee. Elk DPP retourneert een GS1 Digital Link QR in SVG/PNG/PDF/EPS. De QR is het toegangspunt tot het paspoort.

Kan ik een paspoort bijwerken nadat het label is geprint? Ja — dat is het kernidee. GTIN/serienummer zijn onveranderlijk, zodat de geprinte URI geldig blijft; alle datavelden zijn aanpasbaar via PUT /dpp/{id}.

Hoeveel paspoorten kan ik in één keer aanmaken? Tot 100 per POST /dpp/batch-aanvraag. Splits grotere catalogi in chunks; rate limits gelden per abonnement.

Welke categorieën worden ondersteund? battery en textile worden vandaag geleverd met volledige EU-validatie; general dekt overige producttypen. Battery en textile bevatten een live EU-conformiteitscontrole (ESPR / AGEC).

Bronnen

Begin gratis en maak je eerste DPP aan via de API: app.qr3.app/sign-up