8 min read DPP Textile AGEC ESPR EU Release

Textile DPP is live: check EU compliance in seconds — before you save

qr3.app now supports complete textile passports under France's Loi AGEC + ESPR. New: a live validator and simulator that flags AGEC violations, greenwashing, and ESPR readiness inside the form — before you save.

by qr3.app Team

Textile DPP is live: check EU compliance in seconds — before you save — qr3.app Blog
8 min read DPP Textile AGEC ESPR EU Release

Textile DPP is live: check EU compliance in seconds — before you save

qr3.app now supports complete textile passports under France's Loi AGEC + ESPR. New: a live validator and simulator that flags AGEC violations, greenwashing, and ESPR readiness inside the form — before you save.

by qr3.app Team

On top of the battery lane, qr3.app now ships a second complete DPP category: textiles under France’s Loi AGEC (Décret 2022-748) and the ESPR delegated act draft. At the same time we have baked in a live EU validator that runs inside the dashboard — before you save a passport and before you list a product in a new market.

TL;DR, three things you do not get on typical QR platforms:

  1. A complete textile DPP schema including AGEC mandatory chain and ESPR opt-in.
  2. A live preview inside the create form that flags AGEC violations and greenwashing instantly.
  3. A compliance simulator on the detail page that answers: “what happens if I add France to my markets tomorrow?”

Why the textile DPP matters today

The ESPR textile delegated act is still in draft — the central EU DPP registry goes live on 2026-07-19. You cannot wait until then, because a slice of the regulation is already legally binding today:

  • Loi AGEC (France, since 2023-01-01): mandatory origin chain, microplastics warning, REACH SVHC transparency, ban on vague environmental claims.
  • From 2025 AGEC applies to textile sellers with >€10M revenue or >10,000 units. Smaller manufacturers follow in 2027, and almost everyone by 2028.
  • Greenwashing cease-and-desist letters hit a record volume in France in 2024 — “natural”, “biodegradable” or “écologique” without proof is more expensive than a docs sprint.

If you are shipping textiles into the EU (or even just France), setting up your DPP stack now is cheaper than panic-migrating in 2027.

The textile schema at a glance

We build directly on the AGEC mandatory field catalog:

{
  "category": "textile",
  "gtin": "04012345678901",
  "product_name": "Organic Cotton T-Shirt",
  "manufacturer": "EcoWear GmbH",
  "origin_country": "PT",
  "market_countries": ["DE", "AT", "FR"],
  "textile_data": {
    "fiber_composition": [
      { "material": "cotton", "percentage": 95, "origin_country": "TR", "recycled_pct": 0 },
      { "material": "elastane", "percentage": 5, "origin_country": "IT", "recycled_pct": 0 }
    ],
    "country_weaving_knitting": "PT",
    "country_dyeing_printing": "PT",
    "country_assembly": "PT",
    "contains_microplastics": false
  }
}

The mandatory fields cover the four AGEC rules French authorities enforce most often:

AGEC articleFieldWhat the validator does
A1fiber_composition[].recycled_pctAll fiber percentages must total 100%
A2–A4country_weaving_knitting / dyeing_printing / assemblyThree countries required whenever FR is in market
A5contains_microplasticsForced to true when synthetic fibers ≥ 50%
A6svhc_substances[]CAS number + concentration required from 0.1%

On top of that we support optional ESPR fields (durability, PEF CO₂, repair URL, spare-part deadline, recyclability class). When all of them are set, the dashboard surfaces an ESPR-ready badge — perfect for manufacturers who invest time now to ship in 2027 without a migration.

Live preview: see errors before you save

The typical flow used to be: fill the form → save → jump to the detail page → read compliance errors → go back to the form. That hurts the moment you’re creating a batch.

Since this release, the EU validator runs stateless inside the create form:

  • POST /v1/dpp/validate now returns an extra eu_compliance field with compliant, espr_ready, issues[] and a summary grouped by severity, in addition to the Zod validation.
  • The dashboard renders the issues directly below the validation panel, grouped by error / warning / info.
  • A save-guard banner appears above the submit buttons (“2 errors and 1 warning — save anyway?”) whenever issues remain. The save is not blocked, but you see in black and white what you are accepting.

For you as a developer this means: you can ship the validator anywhere — inside your own import flow, in a CI check, in a Cursor agent hook.

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 @textile-payload.json | jq '.data.eu_compliance.summary'

The compliance simulator: “what if I add France?”

The feature I personally wanted most is the compliance simulator on an existing DPP’s detail page. Typical scenario:

You have 500 textile passports in the system, all for the German market. Sales walks in: “We are expanding to France next month.” Question: which of your passports suddenly break AGEC?

Open a passport in the dashboard and a new card appears under the EU compliance section: Compliance simulator.

  • Click the chip FR (next to presets DE/AT/FR/IT/ES/NL) or type a custom ISO code.
  • Optional: flip the status from draft to live.
  • Button Preview EU impact.

The UI instantly shows you, without saving the passport:

  • New error cards (e.g. TEXTILE_AGEC_REQUIRED on the field path textile_data.country_weaving_knitting).
  • A greenwashing warning that escalates from warning to error because FR is in market.
  • A preview.changed_fields tag pinpointing exactly which fields would change.

When you’re happy, Save changes pushes the delta via PUT /v1/dpp/:id. If not — Reset, and nothing happened.

Under the hood this is one new endpoint:

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" }'

The worker merges the patch in memory with the existing DPP and runs the EU validator over the result — no write access. An empty body is allowed and returns the current verdict.

Why this is more than a “nice to have”

Three reasons the simulator is not a gimmick:

  1. Pre-sales check for market expansion. Sales can answer in 60 seconds which products are FR-ready and how expensive a rollout would be.
  2. Decouple data ops from compliance ops. Compliance no longer chases every data defect — run the simulator once, filter cleanly, open tickets.
  3. AI-agent-friendly. The endpoint has the exact same shape as POST /v1/dpp/validate. A Cursor or Claude agent can call it directly from a task like “find FR-ready passports” — without a mini script in between.

Still API-first

Everything visible in the dashboard is reachable over the API:

  • POST /v1/dpp/validate — stateless validator for create flows.
  • POST /v1/dpp/:id/validate-update — stateless validator for partial updates (the simulator).
  • GET /v1/dpp/:id/eu-compliance — persistent check for existing passports (great for CI).
  • POST /v1/dpp/import — CSV/XLSX bulk import with new textile templates (GET /v1/dpp/import/templates/textile?format=xlsx).
  • GET /01/{GTIN}/21/{SERIAL} — consumer view with the AGEC microplastics warning box, origin chain, SVHC list, durability section.

All three validator endpoints return the same EuComplianceResult shape. So you build issue grouping and severity rendering exactly once.

Non-breaking guarantee

Everything in this release is additive:

  • Existing POST /v1/dpp/validate clients can ignore the new eu_compliance field without changes.
  • Battery flows are unchanged.
  • market_countries is optional and defaults to [].

Details are in the changelog and our API versioning policy.

Get started

If you have a large textile passport catalog or need to audit AGEC/France risk, talk to us — we are set up for pilot customers between 500 and 50,000 SKUs.