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

Este artículo aún no está disponible en español; se muestra a continuación en inglés.

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

Preferencias de cookies

Tú decides qué cookies se usan. Puedes cambiar tu elección en cualquier momento desde «Configuración de cookies» en el pie de página. Política de privacidad

Necesarias

Siempre activas

Imprescindibles para que el sitio funcione: tu tema claro/oscuro y esta elección de cookies se guardan en tu navegador. No sirven para rastrearte.

Analítica

Google Analytics 4 mide cómo se usan las páginas mediante estadísticas, lo que nos ayuda a mejorar el sitio. Si aceptas, instala cookies y mide tu visita por completo. Si rechazas, no instala cookies, pero Google aún puede recibir datos técnicos como la página vista, el tipo de navegador y la dirección IP.

_ga, _ga_* · hasta 2 años · Google