---
title: "Generér EU digitale produktpas via API — qr3.app Blog"
description: "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."
canonical: "https://qr3.app/da/blog/dpp-api-generate-passports/"
lang: "da"
robots: "index,follow,max-image-preview:large,max-snippet:-1"
---

# Generér EU digitale produktpas via API — qr3.app Blog

> 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.

Canonical: <https://qr3.app/da/blog/dpp-api-generate-passports/>

[← Blog](/da/blog/) [Tutorials](/da/blog/category/tutorials/)

30. maj 2026 4 min læsning [Tutorials](/da/blog/category/tutorials/) [dpp](/da/blog/tag/dpp/)[api](/da/blog/tag/api/)[gs1-digital-link](/da/blog/tag/gs1-digital-link/)[developers](/da/blog/tag/developers/)[eu-2024-1781](/da/blog/tag/eu-2024-1781/)

# 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](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/dpp-api-generate-passports/hero.png)

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)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1781) og [EU's batteriforordning 2023/1542](https://eur-lex.europa.eu/eli/reg/2023/1542/oj) 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);
```

> **Status i dag:** EU har endnu ikke offentliggjort API'en til sit centrale DPP-register. Indtil da er dette kald en teststi — status forbliver `pending`, og ingen myndighed modtager passet. Så snart API'en er live, bliver det samme kald til en reel registrering.

## 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 { createHmac, timingSafeEqual } from "crypto";

app.post("/webhooks/qr3", express.raw({ type: "application/json" }), (req, res) => {
  const expected = createHmac("sha256", secret).update(req.body).digest("hex");
  const expectedBytes = Buffer.from(`sha256=${expected}`);
  const receivedBytes = Buffer.from(String(req.headers["x-qr3-signature"] ?? ""));
  const ok =
    expectedBytes.length === receivedBytes.length &&
    timingSafeEqual(expectedBytes, receivedBytes);
  if (!ok) return res.sendStatus(401);

  const event = JSON.parse(req.body.toString("utf8"));
  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; grænsen er 60 forespørgsler pr. minut pr. API-nøgle på alle planer.

**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

- [ESPR — Forordning (EU) 2024/1781](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1781)

- [EU's batteriforordning 2023/1542](https://eur-lex.europa.eu/eli/reg/2023/1542/oj)

- [GS1 Digital Link](https://www.gs1.org/standards/gs1-digital-link)

**Start gratis** og opret dit første DPP via API: [app.qr3.app/sign-up](https://app.qr3.app/sign-up)

## Relaterede indlæg

- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/gs1-resolver-test-suite-dpp-links/hero.png) Tutorials GS1 Resolver Test Suite: DPP-links pålideligt testet før go-live Den stabile GS1-testpakke gør Resolver 1.2 testbar. Sådan tester du redirects, linksets, CORS, sprog og fejltilfælde før go-live.](/da/blog/gs1-resolver-test-suite-dpp-links/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/dpp-battery-passport-2027-20260715/hero.png) Branchenyheder BatteryPass-Ready lancerer testmiljø til den digitale batteripass Konsortiet BatteryPass-Ready lancerede den 24. juni 2026 et offentligt testmiljø til den digitale batteripass med fokus på EU-kravet fra februar 2027.](/da/blog/dpp-battery-passport-2027-20260715/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/sector-20260713/hero.png) Branchenyheder Digitalt batteripas 2027: Hvad producenter skal vide nu Webinarer, open source-værktøjer og nye standarder: EU's batteripas vinder frem. Et overblik over status i juli 2026 og de åbne spørgsmål frem til februar 2027.](/da/blog/sector-20260713/)
- [![](https://qr3-blog-agent.meistern.workers.dev/cdn/blog/sector-20260711/hero.png) Branchenyheder Digitalt batteripas 2026: Testmiljøer, standarder og åbne spørgsmål Hvor langt er industrien nået med det digitale batteripas? Et overblik over testmiljøer, CEN/CENELEC-standarder, open source-værktøjer og lovgivningsmæssige tiltag i juli 2026.](/da/blog/sector-20260711/)

[← Alle artikler](/da/blog/) [Kom gratis i gang](https://app.qr3.app/sign-up)
