Developers · Reference

Webhook event catalogue

Every webhook event the Battery Passport API sends: when it fires, which calls emit it, the fields of its data object and a sample payload.

Version
v1.0.0
Base URL
https://dppapi-production.up.railway.app/v1
Format
JSON · OpenAPI 3.1
FeedbackLast updated

Cet article n'est pas encore disponible en français ; il est affiché ci-dessous en anglais.

On this pageThe envelope

9 event types, plus ping for testing. Subscribe an endpoint to the ones you need (an empty list means all of them) with POST /webhooks; to verify signatures and handle retries, see Webhooks.

The envelope

Every delivery is a POST with a JSON body of the same four properties: id (stable across retries — de-duplicate on it), type, created_at and data, which is what the sections below describe. The event type and id are repeated in headers, and DPP-Signature signs the raw body. Answer with any 2xx within 10 seconds; otherwise the delivery is retried after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours.

Request headers
POST /your/webhook/path HTTP/1.1Content-Type: application/jsonUser-Agent: Collecta-DPP-Webhooks/1.0DPP-Event: passport.publishedDPP-Event-Id: evt_2f9e8d7c6b5a49382716f5e4d3c2b1a0DPP-Delivery: cm1qc2d3e0030l70fa9b8c7d6DPP-Signature: t=1799920931,v1=5c1f0a…

model.created

A battery model was created

Fires once when a model is created, over the API or in the app.

Fields of data for model.created
data fieldTypeDescription
model.idstringThe model id.
model.namestringThe model name.
model.categorystringEV, LMT or INDUSTRIAL.
model.capacityKwhnumberCapacity in kWh.
model.chemistrystring | nullCell chemistry.
model.updatedAtstringWhen the model last changed (ISO 8601).
model.created · sample delivery
{"id": "evt_4f0c2b9e8a1d4c7fb3e5a6d7c8b9a0e1","type": "model.created","created_at": "2027-01-15T09:12:44.512Z","data": {"model": {"id": "cm1q8x2k40003l70f9a8s7d6e","name": "Cargo 48V 15Ah","category": "LMT","capacityKwh": 0.72,"chemistry": "Lithium-ion NMC","updatedAt": "2027-01-15T09:12:44.120Z"}}}

model.updated

A battery model changed

Fires when a model’s name, chemistry or fields are updated. The payload carries the model’s identity, not the changed fields — read the model to see them.

Fields of data for model.updated
data fieldTypeDescription
model.idstringThe model id.
model.namestringThe model name.
model.categorystringEV, LMT or INDUSTRIAL.
model.capacityKwhnumberCapacity in kWh.
model.chemistrystring | nullCell chemistry.
model.updatedAtstringWhen the model last changed (ISO 8601).
model.updated · sample delivery
{"id": "evt_9a3d1f7c2e5b4a8d9c0b1e2f3a4b5c6d","type": "model.updated","created_at": "2027-02-03T14:20:05.902Z","data": {"model": {"id": "cm1q8x2k40003l70f9a8s7d6e","name": "Cargo 48V 15Ah","category": "LMT","capacityKwh": 0.72,"chemistry": "Lithium-ion NMC","updatedAt": "2027-02-03T14:20:05.511Z"}}}

document.uploaded

A document was attached to a model

Fires when a document such as the EU Declaration of Conformity is uploaded.

Fields of data for document.uploaded
data fieldTypeDescription
document.idstringThe document id.
document.modelIdstringThe model it belongs to.
document.namestringThe document name.
document.typestringThe document type, e.g. EU Declaration of Conformity.
document.pointintegerAnnex XIII point: 1 public, 3 authorities only.
document.createdAtstringUpload time (ISO 8601).
document.uploaded · sample delivery
{"id": "evt_1b2c3d4e5f60718293a4b5c6d7e8f901","type": "document.uploaded","created_at": "2027-01-15T09:40:12.688Z","data": {"document": {"id": "cm1q9a3fz0011l70fk8m2n4p6","modelId": "cm1q8x2k40003l70f9a8s7d6e","name": "EU Declaration of Conformity — Cargo 48V.pdf","type": "EU Declaration of Conformity","point": 1,"createdAt": "2027-01-15T09:40:12.300Z"}}}

passport.created

A battery and its passport were created

Fires once per battery: creating a battery issues its passport as a draft. A batch of 500 sends 500 events.

Fields of data for passport.created
data fieldTypeDescription
passport.idstringThe passport id.
passport.uniqueIdentifierstringThe battery’s unique identifier — the key the QR code resolves.
passport.serialNumberstring | nullYour serial number, if you sent one.
passport.itemIdstringThe battery (item) id.
passport.modelIdstringThe battery model id.
passport.statusstringORIGINAL, REPURPOSED, REUSED, REMANUFACTURED or WASTE.
passport.lifecycleStatestringACTIVE, or CEASED_RECYCLED once recycled.
passport.publishedAtstring | nullWhen it was first published (ISO 8601); null for a draft.
passport.publicUrlstring | nullThe resolver URL the QR code encodes.

A battery brought over with its own uniqueIdentifier on a plan that can publish goes live at once, so publishedAt can already be set.

passport.created · sample delivery
{"id": "evt_7e6d5c4b3a2918f7e6d5c4b3a2918f7e","type": "passport.created","created_at": "2027-01-15T09:58:30.140Z","data": {"passport": {"id": "cm1q8y0bq0006l70fx9y8z7w6","uniqueIdentifier": "C-7KQ2M9XHT4R","serialNumber": "C48-2027-0001","itemId": "cm1q8y0bq0005l70fq2r3t4u5","modelId": "cm1q8x2k40003l70f9a8s7d6e","status": "ORIGINAL","lifecycleState": "ACTIVE","publishedAt": null,"publicUrl": "https://dppapi-production.up.railway.app/p/C-7KQ2M9XHT4R"}}}

passport.published

A passport went live

Fires when a draft is published and starts resolving publicly. Publishing an already published passport sends nothing.

Fields of data for passport.published
data fieldTypeDescription
passport.idstringThe passport id.
passport.uniqueIdentifierstringThe battery’s unique identifier — the key the QR code resolves.
passport.serialNumberstring | nullYour serial number, if you sent one.
passport.itemIdstringThe battery (item) id.
passport.modelIdstringThe battery model id.
passport.statusstringORIGINAL, REPURPOSED, REUSED, REMANUFACTURED or WASTE.
passport.lifecycleStatestringACTIVE, or CEASED_RECYCLED once recycled.
passport.publishedAtstring | nullWhen it was first published (ISO 8601); null for a draft.
passport.publicUrlstring | nullThe resolver URL the QR code encodes.
passport.published · sample delivery
{"id": "evt_2f9e8d7c6b5a49382716f5e4d3c2b1a0","type": "passport.published","created_at": "2027-01-15T10:02:11.371Z","data": {"passport": {"id": "cm1q8y0bq0006l70fx9y8z7w6","uniqueIdentifier": "C-7KQ2M9XHT4R","serialNumber": "C48-2027-0001","itemId": "cm1q8y0bq0005l70fq2r3t4u5","modelId": "cm1q8x2k40003l70f9a8s7d6e","status": "ORIGINAL","lifecycleState": "ACTIVE","publishedAt": "2027-01-15T10:02:11.000Z","publicUrl": "https://dppapi-production.up.railway.app/p/C-7KQ2M9XHT4R"}}}

passport.status_changed

A passport’s status changed

Fires on a status change. Repurposing, re-use and remanufacturing fork a new, linked passport (Art. 77(7)); the event then names the successor in forked.

Fields of data for passport.status_changed
data fieldTypeDescription
passport.idstringThe passport id.
passport.uniqueIdentifierstringThe battery’s unique identifier — the key the QR code resolves.
passport.serialNumberstring | nullYour serial number, if you sent one.
passport.itemIdstringThe battery (item) id.
passport.modelIdstringThe battery model id.
passport.statusstringORIGINAL, REPURPOSED, REUSED, REMANUFACTURED or WASTE.
passport.lifecycleStatestringACTIVE, or CEASED_RECYCLED once recycled.
passport.publishedAtstring | nullWhen it was first published (ISO 8601); null for a draft.
passport.publicUrlstring | nullThe resolver URL the QR code encodes.
statusstringThe status that was requested.
forked.passportIdstringOnly on a fork: the successor passport id.
forked.uniqueIdentifierstringOnly on a fork: the successor’s identifier.
passport.status_changed · sample delivery
{"id": "evt_5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d","type": "passport.status_changed","created_at": "2031-05-20T08:15:42.019Z","data": {"passport": {"id": "cm1q8y0bq0006l70fx9y8z7w6","uniqueIdentifier": "C-7KQ2M9XHT4R","serialNumber": "C48-2027-0001","itemId": "cm1q8y0bq0005l70fq2r3t4u5","modelId": "cm1q8x2k40003l70f9a8s7d6e","status": "ORIGINAL","lifecycleState": "ACTIVE","publishedAt": "2027-01-15T10:02:11.000Z","publicUrl": "https://dppapi-production.up.railway.app/p/C-7KQ2M9XHT4R"},"status": "REPURPOSED","forked": {"passportId": "cm2a1k9pz0042l70fh6j7k8l9","uniqueIdentifier": "C-9RW3T6PNC2D"}}}

passport.recycled

A battery was recycled

Fires when a passport is marked recycled. The passport ceases (Art. 77(8)) and the resolver answers 410 from then on.

Fields of data for passport.recycled
data fieldTypeDescription
passport.idstringThe passport id.
passport.uniqueIdentifierstringThe battery’s unique identifier — the key the QR code resolves.
passport.serialNumberstring | nullYour serial number, if you sent one.
passport.itemIdstringThe battery (item) id.
passport.modelIdstringThe battery model id.
passport.statusstringORIGINAL, REPURPOSED, REUSED, REMANUFACTURED or WASTE.
passport.lifecycleStatestringACTIVE, or CEASED_RECYCLED once recycled.
passport.publishedAtstring | nullWhen it was first published (ISO 8601); null for a draft.
passport.publicUrlstring | nullThe resolver URL the QR code encodes.
passport.recycled · sample delivery
{"id": "evt_8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a39","type": "passport.recycled","created_at": "2037-03-02T11:47:09.233Z","data": {"passport": {"id": "cm1q8y0bq0006l70fx9y8z7w6","uniqueIdentifier": "C-7KQ2M9XHT4R","serialNumber": "C48-2027-0001","itemId": "cm1q8y0bq0005l70fq2r3t4u5","modelId": "cm1q8x2k40003l70f9a8s7d6e","status": "WASTE","lifecycleState": "CEASED_RECYCLED","publishedAt": "2027-01-15T10:02:11.000Z","publicUrl": "https://dppapi-production.up.railway.app/p/C-7KQ2M9XHT4R"}}}

passport.event_recorded

Dynamic data was recorded

Fires for every dynamic-data event appended to a passport: state of health, cycles, throughput, temperatures, negative events.

Fields of data for passport.event_recorded
data fieldTypeDescription
passport.idstringThe passport id.
passport.uniqueIdentifierstringThe battery’s unique identifier — the key the QR code resolves.
passport.serialNumberstring | nullYour serial number, if you sent one.
passport.itemIdstringThe battery (item) id.
passport.modelIdstringThe battery model id.
passport.statusstringORIGINAL, REPURPOSED, REUSED, REMANUFACTURED or WASTE.
passport.lifecycleStatestringACTIVE, or CEASED_RECYCLED once recycled.
passport.publishedAtstring | nullWhen it was first published (ISO 8601); null for a draft.
passport.publicUrlstring | nullThe resolver URL the QR code encodes.
event.idstringThe event id.
event.eventTypestringe.g. SOH_READING, CYCLE_COUNT, OPERATING_CONDITION.
event.payloadobjectThe values recorded, keyed by field name.
event.recordedAtstringWhen it was recorded (ISO 8601).
passport.event_recorded · sample delivery
{"id": "evt_3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8b","type": "passport.event_recorded","created_at": "2027-06-01T06:00:00.418Z","data": {"passport": {"id": "cm1q8y0bq0006l70fx9y8z7w6","uniqueIdentifier": "C-7KQ2M9XHT4R","serialNumber": "C48-2027-0001","itemId": "cm1q8y0bq0005l70fq2r3t4u5","modelId": "cm1q8x2k40003l70f9a8s7d6e","status": "ORIGINAL","lifecycleState": "ACTIVE","publishedAt": "2027-01-15T10:02:11.000Z","publicUrl": "https://dppapi-production.up.railway.app/p/C-7KQ2M9XHT4R"},"event": {"id": "cm2b4n7qr0051l70fa1b2c3d4","eventType": "SOH_READING","payload": {"stateOfCertifiedEnergy": 97.4,"capacityFade": 2.6},"recordedAt": "2027-06-01T06:00:00.000Z"}}}

supplier.submitted

A supplier answered a data request

Fires when a supplier submits values or uploads a file through the link you sent them. request.kind says which; values carry fields, files carry file.

Sent byThe supplier’s form (no API call of yours)
Fields of data for supplier.submitted
data fieldTypeDescription
request.idstringThe supplier request (upload link) id.
request.supplierNamestring | nullThe supplier, as you named them.
request.modelIdstring | nullThe model the request is for.
request.kindstringvalues or file.
fieldsstring[]Only for values: the field names submitted.
file.id / filename / mimeType / sizeobjectOnly for file: the uploaded file.
supplier.submitted · sample delivery
{"id": "evt_6f5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c","type": "supplier.submitted","created_at": "2027-01-12T16:31:57.770Z","data": {"request": {"id": "cm2c8s1tu0063l70fe5f6g7h8","supplierName": "Cellwerk AG","modelId": "cm1q8x2k40003l70f9a8s7d6e","kind": "values"},"fields": ["criticalRawMaterials","hazardousSubstances"]}}

ping

A test delivery

Sent only when you ask for it, to check that an endpoint receives and verifies deliveries. The answer is returned to the caller as the delivery record.

Fields of data for ping
data fieldTypeDescription
messagestringA fixed explanation of the test.

The id of a test event starts with evt_test_.

ping · sample delivery
{"id": "evt_test_mg8k2x4p","type": "ping","created_at": "2027-01-10T12:00:00.000Z","data": {"message": "Test event from Collecta DPP. Verify the DPP-Signature header and answer 2xx."}}

Préférences en matière de cookies

Vous choisissez les cookies utilisés. Vous pouvez modifier votre choix à tout moment via « Paramètres des cookies » en bas de page. Politique de confidentialité

Nécessaires

Toujours actifs

Indispensables au fonctionnement du site : votre thème clair/sombre et ce choix de cookies sont enregistrés dans votre navigateur. Ils ne servent pas à vous suivre.

Analyse

Google Analytics 4 mesure l’utilisation des pages au moyen de statistiques, ce qui nous aide à améliorer le site. Si vous acceptez, il dépose des cookies et mesure votre visite en détail. Si vous refusez, il ne dépose aucun cookie, mais Google peut tout de même recevoir des données techniques, comme la page consultée, le type de navigateur et l’adresse IP.

_ga, _ga_* · jusqu’à 2 ans · Google