Passports

Push battery measurements (by serial).

Battery passports only (Art. 77 / Annex XIII 4 of Regulation (EU) 2023/1542): push over-life measurements from your own equipment, e.g. a BMS reporting state of health. Up to 500 per call.

Every measurement is stored. The newest one per field (by measuredAt) also becomes the passport's current value for that field, and sets dynamicDataAsOf. An older measurement arriving late is kept in the history but does not overwrite a newer value. An externalId makes a measurement idempotent: a repeat is counted in duplicates, not stored or metered again.

Accepted fieldKeys are the Annex XIII point 4 use-data fields (state of health, fades, cycle counts, dynamic values, state of charge, negative events, temperature history). batteryStatus is not a measurement: lifecycle status changes go through the dashboard, and a second-life battery gets a successor passport (lineage). A field the Regulation keeps off this battery category (e.g. state of certified energy on an LMT battery) is refused with field_not_applicable. The passport must be published.

Measurements are metered per calendar period against the plan's monthly allowance (maxMeasurementsPerMonth), not against the daily v1 write budget. Past the allowance, paid plans keep accepting and counting them at no charge; the Free plan stops at its allowance. Viewing a passport is never metered.

post/api/v1/passports/by-serial/{serial}/measurements

Request

  • Base URL: https://app.tracepass.eu
  • URL: https://app.tracepass.eu/api/v1/passports/by-serial/{serial}/measurements
  • Auth: one of:
    • HTTP bearer
    • OAuth 2 (authorization code, authorization URL https://app.tracepass.eu/api/oauth/authorize, token URL https://app.tracepass.eu/api/oauth/token, scopes: passports:write)

Headers

Idempotency-Keystring

UUID v4 (or any opaque string ≤ 64 chars) per logical operation. The platform stores the first response for 24 hours and replays it on the same key + same workspace. Reusing the same key with a different request body returns 422.

Request body

Response

Measurements accepted.

acceptedinteger
storedCountinteger
materializedCountinteger

How many became the passport's current value (newer than what it held).

duplicatesinteger

How many were skipped because their externalId had already been received (in this call or an earlier one).

duplicateExternalIdsstring[]
measurementIdsObjectId[]

Example response

{
  "measurementIds": [
    "6650a1b2c3d4e5f6a7b8c9d0"
  ]
}

Changes

No recorded changes to this operation across all 1 revision of this API.