EU-Compliance prüfen
EU-Compliance prüfen
qr3.app enthält einen integrierten EU-Validator für Digital Product Passports. Er prüft deine DPPs gegen die relevanten EU-Regelwerke (ESPR, Loi AGEC) und liefert strukturierte Issues mit Severity, Feldpfad, Hinweisen und einem optionalen ESPR-ready-Badge.
Es gibt drei Einstiegspunkte:
- Server-seitig, bereits gespeicherte DPPs —
GET /v1/dpp/:id/eu-compliance - Live-Vorschau im Create-Formular —
POST /v1/dpp/validate - Live-Simulator im Detail —
POST /v1/dpp/:id/validate-update
Alle drei liefern dieselbe EuComplianceResult-Shape — du musst die Auswertung also nur einmal implementieren.
Shape des Ergebnisses
{ "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-Felder gesetzt (siehe Textil-DPP)issues[]ist nach Severity (error→warning→info) und dann nach Code stabil sortiert
Severity-Stufen
| Severity | Bedeutung | Beispiel |
|---|---|---|
error | Blockiert die EU-Konformität; sollte vor Release gefixt werden | TEXTILE_AGEC_REQUIRED wenn FR im Markt ist und die Herkunftskette unvollständig ist |
warning | Empfehlung; Kunde kann speichern, sollte aber handeln | TEXTILE_GREENWASHING außerhalb FR |
info | Status-Signal ohne Handlungsbedarf | TEXTILE_ESPR_READY — alle ESPR-Opt-in-Felder vollständig |
Regel-Katalog (Textil + Batterie)
Textil (Q3.3.4)
| Code | Schweregrad | Auslöser |
|---|---|---|
TEXTILE_AGEC_REQUIRED | error (FR) · warning (sonst) | AGEC-Chain (Weben/Färben/Konfektion) unvollständig, FR im Markt |
TEXTILE_MICROPLASTICS_CONSISTENCY | error | Synthetik ≥ 50 % aber contains_microplastics !== true |
TEXTILE_SVHC_THRESHOLD | warning | SVHC-Eintrag ohne CAS-Nummer oder Konzentration |
TEXTILE_GREENWASHING | error (FR) · warning (sonst) | Begriff aus der Verbotsliste in product_name/material |
TEXTILE_ESPR_READY | info | Alle ESPR-Felder B7–B15 vollständig |
Batterie (Phase 4a)
Der Validator prüft Grenzwerte aus der EU-Batterieverordnung 2023/1542 (Recycled Content Schwellen, Carbon-Footprint-Klassen, Mindestgarantie etc.). Details in der Batterie-DPP-Doku.
Live-Preview im Create-Formular
Sobald du einen DPP im Dashboard anlegst (/dashboard/dpp/new), läuft derselbe Validator stateless bei jedem Validate-Roundtrip mit — ohne dass der Pass gespeichert werden muss. Die eu_compliance-Sektion erscheint direkt unter dem bestehenden Validation-Panel und hebt Fehler und Warnungen vor dem Submit hervor.
Direkter API-Zugriff:
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 }] } }'Die Antwort enthält:
data.valid— syntaktische Gültigkeit (Zod)data.errors[]— klassische Zod-Fehlerdata.jsonld_preview— JSON-LD-Vorschaudata.eu_compliance— EU-Validator-Ergebnis (null, wenn die Zod-Validierung fehlschlägt)
Ist eu_compliance.summary.errors > 0, rendert das Dashboard einen Save-Guard-Banner unmittelbar über dem Submit-Button — der Save wird nicht blockiert, aber du siehst die Konsequenzen vor dem Klick.
Live-Simulator im Detail
Auf /dashboard/dpp/:dppId gibt es unterhalb der Compliance-Section eine Simulator-Karte. Sie erlaubt es, die beiden compliance-relevantesten Felder (status und market_countries) zu verändern und die Auswirkung sofort zu sehen — ohne die bestehenden Daten anzufassen. Typischer Flow:
- Preview: “Was passiert, wenn ich FR ins Sortiment aufnehme?” → Chip “FR” wählen → “Preview EU impact” →
TEXTILE_AGEC_REQUIREDwird sichtbar - Fix: Herkunftskette vervollständigen (außerhalb des Simulators im Create- oder Bulk-Flow)
- Save: “Save changes” speichert Status/Markt-Liste direkt via
PUT /v1/dpp/:id
Direkter API-Zugriff:
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" }'Die Response erweitert das Standard-Ergebnis um ein preview-Objekt:
{ "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[] listet nur Felder, die sich tatsächlich ändern würden — so kannst du z. B. in einer UI nur die geänderten Chips hervorheben.
Ein leerer Body ist erlaubt und liefert die aktuelle Compliance-Bewertung (Ist-Zustand neu prüfen).
Automatisierung
CI-Pipeline
Ein typischer 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
Der mitgelieferte @qr3/mcp-server bietet unter anderem ein validate_dpp-Tool — KI-Agenten können damit vor dem Create-Call prüfen, ob die vorliegenden Daten den AGEC-Regeln genügen.
Häufige Fehler
| Issue | Ursache | Fix |
|---|---|---|
TEXTILE_MICROPLASTICS_CONSISTENCY | Polyesteranteil ≥ 50 %, Flag aber false | contains_microplastics: true setzen |
TEXTILE_AGEC_REQUIRED mit hints.market: "FR" | FR im Markt, Chain unvollständig | country_weaving_knitting, country_dyeing_printing, country_assembly setzen |
TEXTILE_GREENWASHING als error | Verbotsbegriff + FR im Markt | Begriff aus product_name entfernen oder Markt anpassen |
TEXTILE_SVHC_THRESHOLD | SVHC-Stoff ohne CAS | CAS-Nummer aus der REACH-Liste eintragen |
Nächste Schritte
- Textil-DPP — Schema, Herkunftskette, Mikroplastik-Warnbox
- Batterie-DPP — Pflichtfelder Batterie-Pass
- API-Referenz — alle EU-Compliance-Endpoints im Detail