TracePass
Passports

Place a battery passport on the market

Places a published **battery** passport on the market: the passport is registered in the EU DPP registry with the registry access your account has configured, so the entry is made under your own credentials (Battery Regulation (EU) 2023/1542, Art. 77(10)). Publishing a passport does not register it; this call does. Battery passports only.

POST/api/v1/passports/{id}/place-on-market
Download OpenAPI 3.1
POST/api/v1/passports/{id}/place-on-market

Place a battery passport on the market

Places a published **battery** passport on the market: the passport is registered in the EU DPP registry with the registry access your account has configured, so the entry is made under your own credentials (Battery Regulation (EU) 2023/1542, Art. 77(10)). Publishing a passport does not register it; this call does. Battery passports only.

**Asynchronous.** The call checks the passport, sets `placeOnMarketStatus` to `placing` and answers `202` with `{ passport, passportId, status: "placing", dppId }`. The registry call follows in the background, with automatic retries while the registry is unreachable. Read the passport to follow it: `placed` means the registry accepted it (`placedOnMarketAt`, and `registrationId` when the registry returned one) and fires the `passport.placed_on_market` webhook; `rejected` means the registry refused it or could not be reached once the retries ran out (`registrationRejectedAt`, `registrationRejectionReason`) and fires `passport.placement_rejected`. To retry, fix the cause and call this endpoint again — a rejected passport may be placed again. If the passport has no DPP ID yet, one is assigned and returned as `dppId`.

Refusals answer **409** with a code, checked in this order: `not_a_battery`, `not_published` (only a published passport can be placed), `already_placed` (placing or placed), `operator_id_missing` (the account has no economic-operator identifier), `registry_not_configured` (an admin sets the registry access in the dashboard under Settings → EU Registry) and `registry_not_ready`, whose `findings[]` lists the registry-readiness findings that stand in the way — run the registry-readiness check for them in structured form. An empty `findings[]` means the configured registry is not open to submissions from TracePass yet.

**After placement the operator is locked:** a party write that would change a stored `operatorIdentifier` or `facilityIdentifier` answers 409 `operator_locked`. To correct one, mark the passport for deletion and create a new one. No request body. Counts as one v1 write, and only when the call is accepted. Honours `Idempotency-Key`.

Path parameters

  • idrequired

    string (24 hex chars)

    Passport ID of a published battery passport.

Headers

  • Authorizationrequired

    string

    `Bearer <token>` — either a `tp_` API key (Developer → API Keys; simplest, for server-to-server) or an OAuth 2.0 access token (Developer → OAuth Apps; for user-authorized apps, scoped + revocable). The Authentication page has the full OAuth flow and scope list.

    e.g. Bearer tp_REDACTED_xxxxxxxxxxxx

  • Idempotency-Key

    string

    UUID v4.

Request

curl -sS -X POST \
  https://app.tracepass.eu/api/v1/passports/6650b2c3d4e5f6a7b8c9d0e1/place-on-market \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx" \
  -H "Idempotency-Key: 3f1c9a52-8b7e-4d6a-9f0e-2c4b6d8e0a13"

Response

{
  "passport": {
    "_id": "6650b2c3d4e5f6a7b8c9d0e1",
    "status": "published",
    "placeOnMarketStatus": "placing"
  },
  "passportId": "6650b2c3d4e5f6a7b8c9d0e1",
  "status": "placing",
  "dppId": "https://id.tracepass.eu/dpp/7b1e4c2a-5f3d-4e8a-9c6b-2d1f0a3e5b7c"
}