Transparency
What our battery passport can do — and what it cannot
A battery passport is a document with legal effect. Anyone expected to believe it must be able to verify it. This page states everything needed for that: which data we hold, who may see it, how the identifier is formed, how a third party checks authenticity — and where the service deliberately stops today.
- 211data fieldsheld in the catalogue
- 135publicreadable without sign-in
- 13groupsper Annex XIII
- 112mandatory (EV)per vehicle battery
These four figures are not written into this page. They are read on every request from the same field catalogue that builds the passport output and the publication gate. If one of them were wrong, the passport would be too.
Legal basis
The battery passport is not a product idea but an obligation under the EU Battery Regulation. Four provisions carry everything else.
- Art. 77(1)
- Every LMT battery, industrial battery above 2 kWh and electric vehicle battery placed on the market needs a passport. From 18 February 2027.
- Art. 77(2)
- The passport carries the information "to the extent applicable to the category of battery concerned". The obligation therefore depends on what kind of battery it is — which is why we measure completeness per category and not against a fixed list. What only becomes mandatory later (Art. 77(1): 18 Feb 2027; recycled content 18 Aug 2028; LMT 18 Aug 2033) does not block publication today — the studio lists it with its deadline, and the passport shows what it does not yet carry.
- Art. 77(3)
- One unique identifier per battery, reachable through a data carrier, with tiered access: the public sees part of it, market participants and authorities see more.
- Annex XIII
- The data content itself — in thirteen groups, from general battery information to the operating data of the individual battery.
Which data the passport holds
The field catalogue is our implementation of Annex XIII. Each field carries its regulatory reference, its group, its expected data type, its plausibility bounds and the categories for which it is mandatory. It is publicly queryable.
| Group | Title | Fields |
|---|---|---|
| A | A · Allgemeine Batterieinformationen | 19 |
| B | B · CO₂-Fußabdruck | 26 |
| C | C · Recyclinganteil | 24 |
| D | D · Verantwortungsvolle Beschaffung | 21 |
| E | E · Elektrische Kennwerte | 37 |
| F | F · Konformität, Kennzeichnung & Abfallinformationen | 17 |
| G | G · Detaillierte Zusammensetzung & Demontageinformationen | 18 |
| H | H · Behördeninformationen | 3 |
| I | I · Individuelle Batterie: Leistung & Haltbarkeit | 5 |
| J | J · Individuelle Batterie: State of Health (SoH) | 9 |
| K | K · Individuelle Batterie: Erwartete Lebensdauer | 11 |
| L | L · Individuelle Batterie: Betriebsdaten (dynamisch) | 8 |
| M | M · Identifikation & Technische Metadaten | 13 |
How many of these fields are mandatory depends on the battery category. The German text of the regulation says "LV-Batterie" rather than LMT — which is why our category token is lv.
- lv · 103 mandatory fields
- industrial · 115 mandatory fields
- ev · 112 mandatory fields
- furniture · 43 mandatory fields
Who sees which data
Art. 77(3) tiers the access. Every field in the catalogue carries its tier, and the tier decides whether a value leaves a response at all.
- public135
- Everyone. No sign-in, no key, no fee — this is the part a QR code on the vehicle opens.
- restricted39
- Market participants with a legitimate interest, and authorities. Repairers, remanufacturers, recyclers: what you need to take a battery apart and reuse it.
- authorities5
- Authorities and notified bodies only. Test reports, type-approval data, conformity evidence.
- individual32
- Only whoever operates the individual battery. State of health, cycles, operating events — data that says something about use.
The filter runs on the server, not in the browser. A field a role may not see is not hidden but not sent: it is not in the page source either.
How the identifier is formed
The passport identifier is printed onto the battery and has to stay readable there for 15 years and more. It is therefore derived by a procedure, not assigned.
- 1.Identifier per ISO/IEC 15459: issuing agency code (IAC) and company identification number (CIN) first, the battery serial number after. If IAC or CIN is missing, publication aborts — nothing is guessed.
- 2.Data carrier: QR code per ISO/IEC 18004, quality grade per ISO/IEC 15415, verified per ISO/IEC 15426-2. Sizes, module width and quiet zone are fixed as a print specification, every value with its source.
- 3.The QR code points at the passport address, and that address must be reachable by the public. A publication run from a development environment is refused — the address lands in an immutable record and would stay there for the life of the battery.
- 4.Identifier and QR address are written by the passport itself, not supplied. Both values only come into existence at publication, and a supplied value there would not be a contribution but a contradiction.
How a third party verifies the passport
Every published passport comes with a proof. It is reachable without a key and without a fee, because a check that presupposes a contract is not a check — whoever wants to verify a passport is precisely not a customer.
curl -s https://elektro-beta.vercel.app/api/v1/dpps/<UID>/proof- snapshot_sha256
- The hash over the published state. A verifier holds the retrieved data against it and sees whether it is unchanged.
- chain
- The hash chain across all versions (EN 18221 4.2). Every version from the second onwards carries the hash of its predecessor; the database enforces it on write, the proof checks it on read. A removed or inserted version breaks the chain.
- signature
- The signature (JWS/ES256) over identifier, version, hash, operator and timestamp. It additionally answers who the state came from.
- public_key
- The public key as a JWK. Without it the signature cannot be checked, and a public key is public.
- verification
- Our own recomputation — so a person without cryptographic tooling sees something. Explicitly not the proof: whoever does not trust us checks the signature against the key themselves.
- validity
- Is the passport valid? Status, issue date, expiry, and the mapping onto the four status values of the standard. A revoked passport does not answer "does not exist" but "no longer valid".
- integrity_status
- ok, suspect or compromised. If the recomputation contradicts a signature that is present, the service marks the passport suspect itself and records an incident.
- issuer
- The issuer as a did:oyd. The identifier resolves at a public resolver to a document carrying the signing key behind this proof, making "who issued it" a verifiable chain rather than a number.
No key, no fee, no account. A higher request quota than the passport view, because a verifier does not check one passport but a delivery — and the quota is stated in every response so nobody discovers it by hitting it.
Where a value comes from — and whether anyone checked it
Every value carries its provenance. Not decoration: an estimated carbon figure and one taken from a test report look different in the passport, because they are worth different amounts.
- verified
- Taken from a test or evidence document and cross-checked.
- partner_provided
- Supplied by the economic operator and taken over unchanged. We assert nothing about it.
- estimated
- Estimated or derived. Permitted, but visible — and never presented as checked.
A value a model read out of a document and nobody cross-checked blocks publication. Not because models read badly, but because in a document with legal effect the difference between "read" and "checked" must not disappear.
What we do not do when the passport is read
The passport view is the page someone opens because they trust a marking on a product. It therefore collects as little as possible.
- No analytics and no third-party components on the passport route. No cookie banner, because there is nothing to consent to.
- Public reads are not logged. The rate-limit log names route and quota, never the caller's address.
- No input fields, no sign-in, no download on the passport page. If you are asked for any of those, you are not with us.
- What we do not control, we say: the hosting platform's access logs contain IP addresses. We have no access to them and we do not evaluate them.
Changes, versions, retention
A passport accompanies a battery across its lifetime. What changes has to stay traceable — including the mistakes.
- Every publication creates a new version with its own hash. Versions are only appended, never overwritten: a later state does not rewrite an earlier one. A later version requires a reason; reason, actor and hash chain are stored on the version and in the audit log (EN 18246 4.7). An archived passport — after a reissue — stays readable as the last published version and names its successor (EN 18221 4.2).
- The state at any point in time is retrievable. Whoever wants to know what the passport said on the day of an incident does not ask for a publication but for a date.
- A published passport cannot be deleted. A draft can. The difference is deliberate: the regulation requires the passport, and the GDPR exempts it from erasure in Art. 17(3)(b).
Which standards we build against
Eight documents from CEN and CENELEC describe what a digital product passport looks like technically. Six are final, two are drafts.
| Document | Topic | Status |
|---|---|---|
| EN 18219:2026 | Unique identifiers | final |
| EN 18220:2026 | Data carriers and marking | final |
| EN 18221:2026 | Lifecycle, versioning, archiving | final |
| EN 18222:2026 | Interface and access methods | final |
| EN 18223:2026 | Data model and serialisation | final |
| EN 18216:2026 | Transport, protocols, content negotiation | final |
| prEN 18239:2025 | Actors, roles, rights, security | draft |
| prEN 18246:2025 | Trust, integrity, privacy, accessibility | draft |
Important, and easily missed: none of these documents is cited in the Official Journal of the EU. Without that citation there is no presumption of conformity — conformity with the standard is therefore not evidence of conformity with the regulation. We build against these standards because they are the best available state of the art, not because they cover us.
What does not work yet
This section is here because a transparency page without it would be a marketing page. Five things are missing, and none of them is missing implementation.
- There is no signature yet
- The mechanism is built and tested, but the private signing key is not set. The proof therefore returns the hash and answers "unsigned" for the signature. The hash answers "has the content changed", the signature additionally "by whom" — the second question we cannot answer today.
- The identifiers are not registered yet
- A globally unique identifier requires membership of an issuing agency under ISO/IEC 15459. Until that is in place, the identifiers carry a test code. They are formally well-formed, but global uniqueness is asserted rather than evidenced.
- There is no EU registry
- Art. 77 requires registration with the central EU registry. The implementing act for it is overdue and the registry is not operational. Our registration is built and reports "pending" with a reason, rather than claiming success.
- There is no recognised trust service
- The draft standards require actors to identify themselves through a legally recognised trust service, and authorities through a recognised certificate scheme. Neither exists for the battery passport yet. We issue keys ourselves, and we say so.
- The existing passports are demonstrations
- The service currently holds example passports with invented values. They therefore carry the provenance "estimated" throughout, not "verified". A real passport needs data from production, test bench, battery management and due-diligence documentation — the gate works, it simply has almost nothing to check yet.
Interfaces for integrators
The read methods follow EN 18222:2026. They return JSON, on request XML or JSON-LD, and redirect a browser to the human-readable view.
| Method | What it returns |
|---|---|
| GET /api/dpp/v1/dpps/{dppId} | The passport for a passport identifier. |
| GET /api/dpp/v1/dppsByProductId/{id} | The passport for a product identifier. |
| GET /api/dpp/v1/dppsByIdAndDate/{id}?date= | The state that was in force at a point in time. |
| GET /api/dpp/v1/dpps/{id}/elements/{path} | A single field via a JSONPath expression, instead of transferring the whole passport. |
| GET /api/v1/catalogue?category=ev | The field catalogue, optionally filtered by category. |
| GET /api/v1/dpps/{uid}/proof | The integrity proof. Without a key. |
| POST /api/v1/passports/{id}/reissue | Reissue after remanufacturing or repurposing: new passport as a draft, predecessor archived and linked. If the battery passes to another economic operator, the draft is created in their account — it becomes public only when they publish it, which is the acceptance of responsibility under Art. 77(7). Unchanged information about the battery (composition, dismantling) can be carried over, but then counts as unverified. Requires a key with publishing rights. |
Every route states its request quota in every response, including on errors. An unusual number of rejections leaves a note in the operations log — counted per route, never per caller.
If something is wrong
A passport that asserts something false is worse than a missing one. Whoever finds a mistake should be able to report it without signing in.
Wrong data, a QR code leading to a foreign address, or a passport whose proof does not add up: hello@sustainista.net