Gerar Passaportes Digitais de Produto da UE via API

A maioria dos guias sobre DPP diz-lhe o que um passaporte tem de conter. Este mostra como criar Passaportes Digitais de Produto em conformidade com a UE de forma programática — com curl, o SDK do qr3, criação em lote, validação, códigos QR GS1 e webhooks.

por QR3 Redaktion

Gerar Passaportes Digitais de Produto da UE via API

A maioria dos artigos sobre o Passaporte Digital de Produto (DPP) da UE explica o que um passaporte tem de conter. Muito menos mostram como criar um — e quase nenhum mostra como fazê-lo para um catálogo de 500 ou 50 000 SKUs sem clicar num formulário 50 000 vezes.

Este guia é a versão para programadores. Cada passo abaixo é uma chamada real e funcional contra a API do qr3.app (https://qr3.app/v1). Se gere dados de produtos num ERP, num PIM ou numa base de dados, pode ligar a geração de DPP diretamente ao seu pipeline existente.

Porque é que uma API importa para os DPP

Um Passaporte Digital de Produto não é um documento pontual. Ao abrigo do Regulamento Conceção Ecológica para Produtos Sustentáveis (ESPR, UE 2024/1781) e do Regulamento das Baterias da UE 2023/1542, cada unidade regulada precisa de um passaporte que se mantenha atualizado ao longo de toda a sua vida útil. Para um fabricante, isso significa:

  • Escala — de centenas a dezenas de milhares de produtos, cada um com o seu próprio GTIN/número de série.
  • Atualidade — os dados (pegada de carbono, conteúdo reciclado, informações de reparação) mudam e têm de ser atualizados, não recriados.
  • Integração — a fonte da verdade é o seu ERP/PIM, não um formulário web.

Isso é um problema de API. Uma ferramenta web manual leva-o aos primeiros dez passaportes; uma API leva-o a todos eles.

1. Autenticação

Cada pedido usa um token bearer (crie uma chave de API no painel de controlo). O URL base é https://qr3.app/v1.

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

Ou com o SDK oficial:

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

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

2. Criar um passaporte de bateria

Um DPP é criado com POST /dpp. Os campos de nível superior são os mesmos para cada categoria; os dados específicos da categoria vão para battery_data, textile_data ou 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"]
    }
  }'

A mesma chamada com o 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

A resposta inclui uma página de destino virada para o consumidor (localizada em 25 línguas da UE) e um código QR GS1 Digital Link pronto para impressão de etiquetas — não é necessário um passo de QR separado.

3. Validar antes de criar

Quer detetar campos em falta ou inválidos antes de persistir? POST /dpp/validate executa as regras exatas de validação da UE sem criar nada. Ideal como verificação de pré-commit em 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. Criar um catálogo inteiro em lote

Para um catálogo de produtos, envie até 100 passaportes por pedido para POST /dpp/batch. Percorra a exportação do seu ERP num ciclo e tem toda a sua gama em minutos.

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. Obter o código QR para impressão de etiquetas

Cada passaporte expõe o seu QR GS1 Digital Link em quatro formatos de impressão. Obtenha-os através do objeto do passaporte ou diretamente:

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 e qr.eps estão todos disponíveis — SVG/EPS para a sua impressora de etiquetas, PNG para a web.

6. Manter os dados atualizados (sem quebrar o QR)

O GTIN/número de série/lote são imutáveis após a criação — isso mantém o URI GS1 impresso estável para sempre. Tudo o resto pode ser atualizado com 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,
  },
});

O QR no produto físico nunca muda; os dados por trás dele mudam. É esse precisamente o objetivo de um passaporte dinâmico.

7. Submeter ao registo da UE

Quando o registo central de DPP da UE for aplicável ao seu produto, submeta um passaporte com uma única chamada (plano Business e superiores):

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

8. Reagir a leituras com webhooks

As leituras de DPP são eventos. Subscreva qr.scanned e pode transmiti-las para as suas análises, despoletar reabastecimentos ou sinalizar um recall — em tempo real. Os payloads são assinados (HMAC-SHA256); verifique sempre a assinatura.

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

Juntando tudo: geração de DPP em CI

O estado final que a maioria dos fabricantes pretende: os dados dos produtos residem no ERP/PIM e uma tarefa agendada mantém os passaportes sincronizados.

  1. Exporte os produtos alterados do seu ERP.
  2. client.dpp.validate(...) cada um — faça a build falhar em caso de erros de validação.
  3. client.dpp.batch(...) para novos produtos; client.dpp.update(...) para os alterados.
  4. Envie os URLs qr.svg devolvidos para o seu sistema de impressão de etiquetas.

Sem formulário web, sem copy-paste, sem divergência entre os seus dados-mestre e os seus passaportes.

FAQ

Preciso de uma ferramenta de código QR separada? Não. Cada DPP devolve um QR GS1 Digital Link em SVG/PNG/PDF/EPS. O QR é o ponto de acesso ao passaporte.

Posso atualizar um passaporte depois de a etiqueta estar impressa? Sim — essa é a ideia central. O GTIN/número de série são imutáveis, por isso o URI impresso permanece válido; todos os campos de dados são atualizáveis via PUT /dpp/{id}.

Quantos passaportes posso criar de uma só vez? Até 100 por pedido POST /dpp/batch. Divida catálogos maiores em blocos; aplicam-se limites de taxa por plano.

Que categorias são suportadas? battery e textile já incluem hoje a validação completa da UE; general abrange outros tipos de produtos. Bateria e têxtil incluem uma verificação de conformidade da UE ao vivo (ESPR / AGEC).

Fontes

Comece gratuitamente e crie o seu primeiro DPP via API: app.qr3.app/sign-up