EU DPP Platform

Compliance map

How this platform meets the EU rules

Requirement by requirement, from the ESPR, the Battery Regulation, the registry implementing regulation, the harmonised EN 182xx standards and the data models. Statuses are checked against the code in this repository. Where something is a mock or left to contracts, it says so.

36 × Implemented4 × Implemented (mock registry until EU credentials)22 × Partial1 × Not implemented2 × Waiting for the EU model4 × Out of scope (legal/contractual)

What's new from the Commission (30 Oct 2026)

  • Registry API published as OpenAPI 3.1: async submissions per product group and sub-group, task polling, idempotency keys. Implemented in packages/eu-dpp/src/registry.ts and mirrored by the local mock at /mock-registry.
  • Service-account authentication: private_key_jwt client assertions signed with ES256, exchanged for an access token. Implemented; real use needs a verified organisation with EU Login and an uploaded public key.
  • Self-hosted endpoint rules: no Authorization → public view (200); a valid registry token → public + protected views; an invalid token → 401, never the public fallback; wrong scope or requestor → 403; always Vary: Authorization. Implemented in the resolver.
  • Battery semantic model 1.0.0: JSON Schema, SHACL and JSON-LD per view (public, Restricted 1–3) and per sub-group. The platform validates with the JSON Schemas and serves a JSON-LD context; SHACL shapes are not used.
  • Data points v3.2: per-category obligations (EV / LMT / industrial). Read from the vocabulary scope notes and exposed by the field API that drives the dashboard forms.

A. ESPR — Regulation (EU) 2024/1781

#RequirementSourceHow this platform does itStatusSee it
A1DPP connected through a data carrier to a persistent unique product identifierESPR Art. 10(1)(a), 2(30)Each passport gets a GS1 Digital Link UPI (/01/{GTIN-14}/21/{serial}, /10/{lot} or model-level /01/{GTIN}) on the platform's resolver domain (PLATFORM_URL). The QR code encodes the UPI.ImplementedDemo passport
A2Carrier and UPI comply with ISO/IEC 15459 / EN 18219 / EN 18220ESPR Art. 10(1)(c), Annex IIIGTIN check digit and GS1 AI 21/10 syntax (CSET 82, max 20 chars) are validated on issue (packages/eu-dpp/src/identifiers.ts). GS1 is an ISO/IEC 15459 issuing agency. QR at error-correction level Q, no logo, human-readable (01)…(21)… printed under it.ImplementedDemo passport
A3Open, interoperable, machine-readable, structured, searchable, no lock-inESPR Art. 10(1)(d), 11(a)Data is the Commission's compact JSON with typed values (unit URIs, vocabulary URIs). The UPI serves JSON (?format=json or Accept: application/json), a JSON-LD context, the signed VC and a GS1 linkset. Lookup by UPI: GET /api/v1/dpps/lookup?upi=. Search: GET /api/v1/dpps?q=.ImplementedPublic JSON
A4No customer personal data without explicit consentESPR Art. 10(1)(e)Passports carry product data only; there is no field for an owner or end user. Personal data the platform does hold: names and e-mails of access requesters, and the IP address of restricted-view reads in the access log. No retention period is configured for those yet.Partial
A5Model, batch or item levelESPR Art. 10(1)(f)Granularity model, batch or item per passport. Model-level data points live on the product and are inherited by every batch and item passport.ImplementedBatch passport
A6Access regulated per actorESPR Art. 10(1)(g), 11(b)Four views (public, Restricted 1–3) with fixed role → view rules (ROLE_VIEWS). Authorities and notified bodies are verified by a platform admin; legitimate-interest parties need an approved grant per operator or per passport, with optional expiry.ImplementedDemo passport
A7Write rights restricted by access rightsESPR Art. 11(f)Only members of the operator's organisation or its API keys can write. API keys have scopes (read, write, dynamic, admin); a dynamic key may write only the data points listed on the key (e.g. the BMS key).ImplementedAPI example
A8Stored by the operator or a DPP service providerESPR Art. 11(c)The organisation profile stores the written authorisation (file + scope) for the platform to act as service provider. Whether the contract exists is a legal matter.PartialDashboard
A9New passport linked to the originalESPR Art. 11(d)POST /api/v1/dpps/{id}/successor issues a new passport with predecessorId, marks the original superseded (dppStatus invalid) and links both ways in the viewer.ImplementedSuccessor passport
A10Authentication, reliability, integrityESPR Art. 11(g)Every version is a W3C VC signed with the operator's Ed25519 key (eddsa-jcs-2022, issuer did:web). Restricted views are bound to the VC by salted SHA-256 digests. Events are hash-chained; versions and events tables are append-only (database triggers). The viewer re-verifies all of it on each request.ImplementedDemo passport
A11High security and privacy, fraud avoidedESPR Art. 11(h)Restricted views AES-256-GCM encrypted at rest; signing keys encrypted at rest; access keys and API keys stored as SHA-256 hashes; restricted reads logged. Gaps: one platform-wide encryption key (no per-organisation keys or HSM), no rate limiting on public reads.Partial
A12Available for the set period, including after insolvencyESPR Art. 9(2)(i), 11(e)Passports cannot be deleted (API returns 409); every version is replicated to a backup target and can be exported. The escrow of the decryption key and the hand-over agreement with a backup provider are contractual.Partial
A13Backup copy through an independent DPP service providerESPR Art. 10(4), 27(1), 29(2), Annex III(l); EN 18221 §4.5Each version (public view, signed VC, encrypted restricted views) is written to an S3-compatible bucket or a separate volume; the reference is stored on the passport and shown in the viewer. The demo writes to a local replica directory; choosing an independent provider is contractual.PartialDemo passport
A14Provider must not reuse or process data beyond the serviceESPR Art. 11; BR Art. 78(d)The platform runs no analytics on passport data and does not log public reads. The binding commitment belongs in the data processing agreement.Out of scope (legal/contractual)
A15Operator and facility identifiersESPR Art. 12(2)–(3)Typed EORI and LEI fields on the operator profile (format-checked); registry organisation identifier stored. Facility identifiers (GLN) are not modelled; place of manufacture is the EU model's city/region/country.PartialDashboard
A16Digital copy of the carrier, or link, for online sellersESPR Art. 10(3)QR as PNG (/dpp/{id}/qr.png, 1024 px) and SVG, the UPI, and a GS1 linkset are public endpoints.ImplementedQR PNG
A17Annex III content (GTIN, commodity code, DoC, operator IDs, EORI, backup reference)ESPR Annex IIIGTIN, EU declaration of conformity (related resource), EORI/LEI and backup reference are present. TARIC commodity code is not a field yet.PartialDemo passport

B. Battery Regulation — Regulation (EU) 2023/1542

#RequirementSourceHow this platform does itStatusSee it
B1Passport for LMT, industrial >2 kWh and EV batteries from 18 Feb 2027BR Art. 77(1)Products carry a sub-group (evb, lmt, ind) that selects the Commission schemas, the battery category and the per-category obligations.ImplementedField catalogue (JSON)
B2QR code linking to an ISO/IEC 15459 unique identifierBR Art. 77(3), 13(6); EN 18220QR encodes the GS1 Digital Link UPI; level Q; no logo; human-readable identifier below. Minimum print size per EN 18220 is the label designer's job.ImplementedQR PNG
B3Access tiers: public (Annex XIII 1); legitimate interest + Commission (2); notified bodies, MSA + Commission (3); legitimate interest, per battery (4)BR Art. 77(2), Annex XIIIThe view of each data point comes from the Commission schemas, so tiers cannot be misconfigured. Views: pub, res1, res2, res3 exactly as in Annex XIII.ImplementedDemo passport
B4Free access by right; write rights limited by tierBR Art. 78(b), (f)Reads are free. Authorities get access keys after verification; legitimate interest is self-service (request form on every passport) with operator approval. The Art. 77(9) act defining legitimate interest is not adopted, so the approval stays manual.ImplementedDemo passport
B5Authentication, integrity, security, anti-fraud; key managementBR Art. 78(g), (h)Per-organisation Ed25519 signing keys, revocation via a W3C Bitstring Status List, signature and digest checks in the viewer. Key rotation adds a new active key; old keys stay stored, so earlier versions keep verifying. Keys are encrypted at rest, not in an HSM.PartialDemo passport
B6Authorities can reach restricted data without special softwareBR Art. 77(2)(b), 78(b)An access key in any browser (viewer form) or as Authorization: Bearer dppa_… on the JSON endpoint. Platform admins register and verify authority parties.ImplementedDemo passport
B7Operator ensures accuracy; may authorise another operator in writingBR Art. 77(4)Authorisation document and scope stored on the organisation; every change records the actor.PartialDashboard
B8Open, interoperable, machine-readable, no lock-inBR Art. 77(5), 78(a)As A3, plus GET /api/v1/dpps/{id}/export: full document with decrypted restricted views, every version and the event chain.ImplementedAPI example
B9Annex XIII point 1 contentAnnex XIII 1(a)–(s)Validated against the Commission JSON Schemas for each sub-group; mandatory/optional per category from the vocabulary scope notes (GET /api/v1/schema/batteries/{sg}/fields).ImplementedField catalogue (JSON)
B10Point 2: detailed composition, spares, dismantling, safetyAnnex XIII 2Restricted 1 view, encrypted at rest; documents can be uploaded and are gated by view.ImplementedDemo passport
B11Point 3: test reports, authorities onlyAnnex XIII 3Restricted 2 view: notified bodies, market surveillance, Commission.ImplementedDemo passport
B12Point 4: per-battery dynamic data (SoH, status, cycles, negative events, temperature, SoC)Annex XIII 4; BR Art. 14Restricted 3 view. Written by the operator or a delegated key limited to named data points; each write is a signed version plus an event.ImplementedDemo passport
B13Repurposed or remanufactured battery gets a new passport linked to the originalBR Art. 77(7)Successor flow with battery status from the EU vocabulary (repurposed / remanufactured / reused). Hand-over to a different operator organisation is not built: the successor is issued by the same organisation.PartialSuccessor passport
B14Passport ends after recyclingBR Art. 77(8)POST /api/v1/dpps/{id}/end-of-life: battery status Waste, dppStatus invalid, read-only, kept.ImplementedRecycled battery
B15Available after the operator ceasesBR Art. 78(e)As A12.Partial
B16Provider does not sell or reuse dataBR Art. 78(d)As A14.Out of scope (legal/contractual)
B17Due diligence informationAnnex XIII 1(d); Art. 48Not in the Commission battery model 1.0.0. Added when the semantic repository publishes the data points.Waiting for the EU model
B18Carbon footprint declarationBR Art. 7, Annex XIII 1(a)–(c)Not in model 1.0.0 (the calculation and format acts are pending). Same as B17.Waiting for the EU model
B19Upload the unique identifier to the registryBR Art. 77(10)POST /api/v1/registry/submissions submits UPIs per sub-group, polls the async task and stores the registry ID on each passport. Runs against a local mock of the Commission API until the organisation has EU service-account credentials.Implemented (mock registry until EU credentials)Dashboard (registry)

C. Registry — Implementing Regulation (EU) 2026/1778

#RequirementSourceHow this platform does itStatusSee it
C1Register through the registry UI or API at the right levelIR Art. 8(1), (2), (6)API client (packages/eu-dpp/src/registry.ts): private_key_jwt client assertion (ES256), token exchange, idempotent submission, task polling with the guide's back-off. Item, batch and model granularity sent per item.Implemented (mock registry until EU credentials)Dashboard (registry)
C2Third-party registration: Union-law basis, verification, client stays responsibleIR Art. 8(2), 19(4), 6(1)Written authorisation stored per organisation. Qualified e-seal / EU Login verification of the platform as a registrant is not set up.Partial
C3https UPI, max 2000 characters, resolving to the hosted DPPRegistry user guide v1.03UPIs are short GS1 paths on PLATFORM_URL (https in production) and resolve to the passport. The local demo runs on http.ImplementedDemo passport
C4Semantic conformity to the semantic repositoryIR Art. 8(7), 11(3), 12Vendored Commission schemas, vocabularies and test instances (model 1.0.0); every write is validated (Ajv, JSON Schema 2020-12) and refused with the EU error codes. The mock registry re-validates what the resolver returns.ImplementedField catalogue (JSON)
C5Registration identifierIR Art. 6a, 8(8)Registry ID stored per passport and shown in the viewer's verification panel.Implemented (mock registry until EU credentials)Dashboard (registry)
C6Proof of registrationIR Art. 8(9)Each submission is stored with the full task outcome; a registered event is appended to the passport's chain.Implemented (mock registry until EU credentials)Dashboard (registry)
C7Updates and versioningIR Art. 9A change to a registered passport sets it to update pending. Re-submission is manual; no automatic registry update call yet.PartialDashboard (registry)
C8Transfer of responsibilityIR Art. 10Not implemented (no operator-to-operator transfer, in the platform or in the registry).Not implemented

D. Harmonised standards — EN 182xx (Decision (EU) 2026/1736)

#RequirementSourceHow this platform does itStatusSee it
D1Unique identifiers: approved scheme, never reassigned, persistentEN 18219 §4–5GS1 Digital Link; a UPI that exists is never issued again (409); passports are never deleted.ImplementedDemo passport
D2Data carrier: QR per ISO/IEC 18004, readable by a stock phone, human-readable IDEN 18220As B2.ImplementedQR PNG
D3Exchange protocols and formatsEN 18216HTTPS + JSON, JSON-LD context, W3C VC, GS1 linkset, content negotiation on the UPI. Not yet checked clause by clause against EN 18216.PartialPublic JSON
D4Archiving: no silent overwrite, persistence, replicationEN 18221Append-only versions (database trigger), each replicated; any version readable at /dpp/{id}/versions/{n} (public part) or via the API by number or date.ImplementedVersion 1
D5Life-cycle API (ReadDPPById, ReadDPPByProductId, ReadDPPVersionByIdAndDate, CreateDPP, UpdateDPPById, …)EN 18222All of these operations exist under /api/v1/dpps (paths are the platform's own). DeleteDPP is refused by design.ImplementedAPI example
D6Interoperability model: JSON (Annex A), XML (Annex B)EN 18223Output is the Commission's compact JSON, which the registry requires. No EN 18223 XML serialisation.PartialPublic JSON
D7Access rights, revocation, transferEN 18239 (not harmonised)Grants with approve / deny / revoke and optional expiry. Access-party keys have no revoke action yet. Transfer between operators: see C8.PartialDashboard
D8Signed data, anti-scraping, anti-phishingEN 18246 (not harmonised)Signed VC per version, verification shown to the reader. No rate limiting or bot protection on the resolver yet.PartialSigned VC

E. Data models

#RequirementSourceHow this platform does itStatusSee it
E1Attribute metadata (access level, type, unit, obligation)DIN DKE SPEC 99100The field catalogue carries view, type, default unit, obligation per category, Annex reference and definition for every data point, taken from the Commission model.ImplementedField catalogue (JSON)
E2Battery Pass data model mappinggithub.com/batterypassSuperseded for registry purposes by the Commission model 1.0.0, which this platform uses directly. No Battery Pass crosswalk.Out of scope (legal/contractual)
E3Commission data points per categoryCommission guidance (data points v3.2)Obligations per EV / LMT / industrial come from the vocabulary scope notes shipped with model 1.0.0.ImplementedField catalogue (JSON)
E4Textile DPPJRC draft, May 2026Not in scope; the identifier, access, versioning and registry parts are product-agnostic.Out of scope (legal/contractual)
E5Core DPP plus an append-only signed life-cycle logJRC145830 Annex 9Typed events (soh_reading, repair, maintenance, inspection, incident, transfer, note, issued, superseded, end_of_life, registered) in a SHA-256 hash chain; each data change is a signed version.ImplementedDemo passport

F. Engineering

#RequirementSourceHow this platform does itStatusSee it
F1Persistence if the provider disappearsA12As A12.Partial
F2Identifier scheme and resolverA1GS1 Digital Link resolver on a configurable domain the operator can point elsewhere.ImplementedDemo passport
F3QR generationB2As B2.ImplementedQR PNG
F4Versioning and audit trailSigned versions, hash-chained events, access log of restricted reads.ImplementedDemo passport
F5Access control, encryption per role, key managementRole-based views, encrypted restricted data, signed digests. One encryption key for the platform; per-tier keys and HSM not built.Partial
F6Personal data / GDPRA4As A4.Partial
F7API (REST, JSON-LD)REST JSON under /api/v1, session or API-key auth; JSON-LD context for the passport vocabulary.ImplementedAPI example
F8ExportAs B8.ImplementedAPI example
F9MultilingualViewer interface in 7 languages (en, de, fr, es, it, pl, nl), multi-language data values shown in the reader's language when present. Field labels come from the Commission vocabulary, in English only.PartialViewer in German
F10Schema validationAs C4: all four views validated on every write.ImplementedField catalogue (JSON)
F11Accessibility of the passport pageBuilt to WCAG 2.1 AA (landmarks, contrast, focus states, labelled forms, no colour-only status, light/dark, print). No external audit yet.PartialDemo passport
F12Template changes must not affect old passportsEach version records its contentSpecificationIds (model 1.0.0) and is signed; a new model release does not rewrite old versions.ImplementedVersion 1

Requirement IDs and wording follow an earlier independent audit framework (A ESPR, B Battery Regulation, C Registry IR, D standards, E data models, F engineering). Standards marked "contents" or "not harmonised" were assessed from their published scope. Last reviewed 9 Nov 2026.