EU-compliance controleren
EU-compliance controleren
qr3.app bevat een geïntegreerde EU-validator voor Digital Product Passports. Deze controleert je DPP’s tegen de relevante EU-regelgeving (ESPR, Loi AGEC) und levert gestructureerde issues met severity, veldpad, aanwijzingen en een optionele ESPR-ready-badge.
Er zijn drie toegangspunten:
- Server-side, al opgeslagen DPP’s —
GET /v1/dpp/:id/eu-compliance - Live preview in het aanmaakformulier —
POST /v1/dpp/validate - Live simulator in detail —
POST /v1/dpp/:id/validate-update
Alle drie leveren dezelfde EuComplianceResult-shape — je hoeft de verwerking dus maar één keer te implementeren.
Vorm van het resultaat
{ "compliant": false, "espr_ready": true, "issues": [ { "code": "TEXTILE_AGEC_REQUIRED", "severity": "error", "field": "textile_data.country_weaving_knitting", "message": "AGEC chain country is required for products sold on the French market", "hints": { "market": "FR" } }, { "code": "TEXTILE_GREENWASHING", "severity": "warning", "field": "product_name", "message": "\"natural\" is a prohibited term under AGEC", "hints": { "term": "natural", "locale": "en", "category": "generic" } } ], "summary": { "errors": 1, "warnings": 1, "info": 0 }}compliant: true⇔summary.errors === 0espr_ready: true⇔ alle ESPR-opt-in-velden ingesteld (zie Textiel-DPP)issues[]is stabiel gesorteerd op severity (error→warning→info) en vervolgens op code
Severity-niveaus
| Severity | Betekenis | Voorbeeld |
|---|---|---|
error | Blokkeert de EU-conformiteit; moet voor de release worden opgelost | TEXTILE_AGEC_REQUIRED als FR in de markt is en de herkomstketen onvolledig is |
warning | Aanbeveling; klant kan opslaan, maar moet actie ondernemen | TEXTILE_GREENWASHING buiten FR |
info | Statussignaal zonder actievereiste | TEXTILE_ESPR_READY — alle ESPR-opt-in-velden volledig |
Regelcatalogus (textiel + batterij)
Textiel (Q3.3.4)
| Code | Ernstgraad | Trigger |
|---|---|---|
TEXTILE_AGEC_REQUIRED | error (FR) · warning (anders) | AGEC-chain (weven/verven/confectie) onvolledig, FR in de markt |
TEXTILE_MICROPLASTICS_CONSISTENCY | error | Synthetisch ≥ 50% maar contains_microplastics !== true |
TEXTILE_SVHC_THRESHOLD | warning | SVHC-vermelding zonder CAS-nummer of concentratie |
TEXTILE_GREENWASHING | error (FR) · warning (anders) | Term uit de verbodslijst in product_name/material |
TEXTILE_ESPR_READY | info | Alle ESPR-velden B7–B15 volledig |
Batterij (Fase 4a)
De validator controleert grenswaarden uit de EU-batterijverordening 2023/1542 (drempels voor gerecyclede inhoud, carbon footprint-klassen, minimale garantie, enz.). Details in de Batterij-DPP-documentatie.
Live preview in het aanmaakformulier
Zodra je een DPP aanmaakt in het dashboard (/dashboard/dpp/new), draait dezelfde validator stateless mee bij elke validate-roundtrip — zonder dat de pas hoeft te worden opgeslagen. De eu_compliance-sectie verschijnt direct onder het bestaande validation-paneel en markeert fouten en waarschuwingen vóór de submit.
Directe API-toegang:
curl -X POST https://qr3.app/v1/dpp/validate \ -H "Authorization: Bearer $API_KEY" \ -H "X-Workspace-Id: $WS_ID" \ -H "Content-Type: application/json" \ -d '{ "category": "textile", "gtin": "04012345678901", "product_name": "Natural Cotton T-Shirt", "manufacturer": "EcoWear GmbH", "origin_country": "PT", "market_countries": ["FR"], "textile_data": { "fiber_composition": [{ "material": "cotton", "percentage": 100, "recycled_pct": 0 }] } }'Het antwoord bevat:
data.valid— syntactische geldigheid (Zod)data.errors[]— klassieke Zod-foutendata.jsonld_preview— JSON-LD-previewdata.eu_compliance— EU-validatorresultaat (nullals de Zod-validatie mislukt)
Als eu_compliance.summary.errors > 0 is, rendert het dashboard een Save-Guard-banner direct boven de submit-knop — het opslaan wordt niet geblokkeerd, maar je ziet de gevolgen vóór de klik.
Live simulator in detail
Op /dashboard/dpp/:dppId bevindt zich onder de compliance-sectie een simulatorkaart. Hiermee kun je de twee meest compliance-relevante velden (status en market_countries) wijzigen en het effect direct zien — zonder de bestaande gegevens aan te raken. Typische flow:
- Preview: “Wat gebeurt er als ik FR in het assortiment opneem?” → Chip “FR” selecteren → “Preview EU impact” →
TEXTILE_AGEC_REQUIREDwordt zichtbaar - Fix: Herkomstketen voltooien (buiten de simulator in de create- of bulk-flow)
- Save: “Save changes” slaat de status/markt-lijst direct op via
PUT /v1/dpp/:id
Directe API-toegang:
curl -X POST https://qr3.app/v1/dpp/$DPP_ID/validate-update \ -H "Authorization: Bearer $API_KEY" \ -H "X-Workspace-Id: $WS_ID" \ -H "Content-Type: application/json" \ -d '{ "market_countries": ["DE", "FR"], "status": "live" }'De response breidt het standaardresultaat uit met een preview-object:
{ "data": { "compliant": false, "espr_ready": false, "issues": [/* … */], "summary": { "errors": 1, "warnings": 0, "info": 0 }, "preview": { "status": "live", "landing_locale": "de", "market_countries": ["DE", "FR"], "changed_fields": ["status", "market_countries"] } }}changed_fields[] toont alleen velden die daadwerkelijk zouden veranderen — zo kun je bijvoorbeeld in een UI alleen de gewijzigde chips markeren.
Een lege body is toegestaan en levert de huidige compliance-beoordeling (actuele status opnieuw controleren).
Automatisering
CI-pipeline
Een typische CI-check:
STATUS=$(curl -s -o /tmp/out.json -w "%{http_code}" \ https://qr3.app/v1/dpp/$DPP_ID/eu-compliance \ -H "Authorization: Bearer $API_KEY" \ -H "X-Workspace-Id: $WS_ID")
if [ "$STATUS" != "200" ]; then exit 1fi
jq -e '.data.summary.errors == 0' /tmp/out.json > /dev/nullMCP-server
De meegeleverde @qr3/mcp-server biedt onder andere een validate_dpp-tool — AI-agents kunnen hiermee vóór de create-call controleren of de aanwezige gegevens voldoen aan de AGEC-regels.
Veelvoorkomende fouten
| Issue | Oorzaak | Oplossing |
|---|---|---|
TEXTILE_MICROPLASTICS_CONSISTENCY | Polyesteraandeel ≥ 50%, vlag echter false | contains_microplastics: true instellen |
TEXTILE_AGEC_REQUIRED met hints.market: "FR" | FR in de markt, chain onvolledig | country_weaving_knitting, country_dyeing_printing, country_assembly instellen |
TEXTILE_GREENWASHING als error | Verboden term + FR in de markt | Term uit product_name verwijderen of markt aanpassen |
TEXTILE_SVHC_THRESHOLD | SVHC-stof zonder CAS | CAS-nummer uit de REACH-lijst invoeren |
Volgende stappen
- Textiel-DPP — schema, herkomstketen, microplastic-waarschuwingsbox
- Batterij-DPP — verplichte velden batterijpas
- API-referentie — alle EU-compliance-endpoints in detail