Generér EU digitale produktpas via API

De fleste DPP-guider fortæller dig, hvad et pas skal indeholde. Denne her viser, hvordan du opretter EU-kompatible digitale produktpas programmatisk — med curl, qr3 SDK, batch-oprettelse, validering, GS1 QR-koder og webhooks.

af QR3 Redaktion

Generér EU digitale produktpas via API

De fleste artikler om EU's digitale produktpas (DPP) forklarer, hvad et pas skal indeholde. Langt færre viser dig hvordan du opretter et — og næsten ingen viser dig, hvordan du gør det for et katalog med 500 eller 50.000 SKU'er uden at klikke dig igennem en formular 50.000 gange.

Denne guide er udviklerens version. Hvert trin nedenfor er et reelt, fungerende kald mod qr3.app API'et (https://qr3.app/v1). Hvis du administrerer produktdata i et ERP, et PIM eller en database, kan du koble DPP-generering direkte ind i din eksisterende pipeline.

Hvorfor et API er vigtigt for DPP'er

Et digitalt produktpas er ikke et engangsdokument. Under forordningen om miljøvenligt design af bæredygtige produkter (ESPR, EU 2024/1781) og EU's batteriforordning 2023/1542 skal hver reguleret enhed have et pas, der holdes opdateret i hele dens levetid. For en producent betyder det:

  • Skala — hundredvis til titusinder af produkter, hvert med sit eget GTIN/serienummer.
  • Aktualitet — data (CO2-aftryk, genanvendt indhold, reparationsoplysninger) ændrer sig og skal opdateres, ikke genskabes.
  • Integration — kilden til sandheden er dit ERP/PIM, ikke en webformular.

Det er et API-problem. Et manuelt webværktøj giver dig de første ti pas; et API giver dig dem alle.

1. Autentificering

Hver forespørgsel bruger et bearer-token (opret en API-nøgle i dashboardet). Base-URL'en er https://qr3.app/v1.

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

Eller med den officielle SDK:

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

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

2. Opret et batteripas

Et DPP oprettes med POST /dpp. Felterne på øverste niveau er de samme for hver kategori; de kategorispecifikke data placeres i battery_data, textile_data eller 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"]
    }
  }'

Det samme kald med SDK'en:

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

Svaret indeholder en forbrugervendt landingsside (lokaliseret til 25 EU-sprog) og en GS1 Digital Link QR-kode klar til etiketprint — intet separat QR-trin er nødvendigt.

3. Validér før du opretter

Vil du fange manglende eller ugyldige felter, før du gemmer? POST /dpp/validate kører de præcise EU-valideringsregler uden at oprette noget. Ideelt som et pre-commit-tjek i 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. Batch-opret et helt katalog

For et produktkatalog kan du sende op til 100 pas pr. forespørgsel til POST /dpp/batch. Loop over din ERP-eksport, og du har hele dit sortiment på få minutter.

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. Hent QR-koden til etiketprint

Hvert pas eksponerer sin GS1 Digital Link QR i fire printformater. Hent dem via pas-objektet eller direkte:

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 og qr.eps er alle tilgængelige — SVG/EPS til din etiketprinter, PNG til nettet.

6. Hold data opdateret (uden at ødelægge QR-koden)

GTIN/serienummer/lot er uforanderlige efter oprettelsen — det holder den printede GS1-URI stabil for altid. Alt andet kan opdateres med 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,
  },
});

QR-koden på det fysiske produkt ændrer sig aldrig; dataene bag den gør. Det er hele pointen med et dynamisk pas.

7. Indsend til EU-registret

Når det centrale EU DPP-register er relevant for dit produkt, indsender du et pas med ét kald (Business-plan og opefter):

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

8. Reagér på scanninger med webhooks

DPP-scanninger er hændelser. Abonnér på qr.scanned, og du kan streame dem ind i din analyse, udløse genbestillinger eller markere en tilbagekaldelse — i realtid. Payloads er signeret (HMAC-SHA256); verificér altid signaturen.

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);
});

Sæt det sammen: DPP-generering i CI

Den sluttilstand, de fleste producenter ønsker: produktdata bor i ERP/PIM, og et planlagt job holder passene synkroniseret.

  1. Eksportér ændrede produkter fra dit ERP.
  2. client.dpp.validate(...) for hvert af dem — lad builden fejle ved valideringsfejl.
  3. client.dpp.batch(...) nye produkter; client.dpp.update(...) ændrede.
  4. Skub de returnerede qr.svg-URL'er til dit etiketprintsystem.

Ingen webformular, ingen copy-paste, ingen afvigelse mellem dine stamdata og dine pas.

FAQ

Skal jeg bruge et separat QR-kodeværktøj? Nej. Hvert DPP returnerer en GS1 Digital Link QR i SVG/PNG/PDF/EPS. QR-koden er adgangspunktet til passet.

Kan jeg opdatere et pas, efter etiketten er printet? Ja — det er kerneidéen. GTIN/serienummer er uforanderlige, så den printede URI forbliver gyldig; alle datafelter kan opdateres via PUT /dpp/{id}.

Hvor mange pas kan jeg oprette på én gang? Op til 100 pr. POST /dpp/batch-forespørgsel. Opdel større kataloger i bidder; rate limits gælder pr. plan.

Hvilke kategorier understøttes? battery og textile leveres med fuld EU-validering i dag; general dækker andre produkttyper. Batteri og tekstil inkluderer et live EU-overholdelsestjek (ESPR / AGEC).

Kilder

Start gratis og opret dit første DPP via API: app.qr3.app/sign-up