TracePass
Passports

Get the EU DPP Registry address for a battery passport

Returns the unique product identifier (UPI) to paste into the EU DPP Registry's online form for one published **battery** passport, as `{ upi, preparedAt }`. The economic operator registers the passport on the Registry website under its own EU Login (Product group: Batteries; Granularity: Item). TracePass prepares the address and records that it did; it never submits anything to the Registry.

POST/api/v1/passports/{id}/registry-upi
Download OpenAPI 3.1
POST/api/v1/passports/{id}/registry-upi

Get the EU DPP Registry address for a battery passport

Returns the unique product identifier (UPI) to paste into the EU DPP Registry's online form for one published **battery** passport, as `{ upi, preparedAt }`. The economic operator registers the passport on the Registry website under its own EU Login (Product group: Batteries; Granularity: Item). TracePass prepares the address and records that it did; it never submits anything to the Registry.

**The first call freezes the address** on the passport as `registryUpi`, and later calls return that same address. The Registry keeps the URL it was given, so the URL has to keep resolving even if your account's domain changes later. Every call records the preparation on the passport (`registrationPreparedAt`, `registrationPreparedVia: "form"`). A preparation is not a registration: once the Registry has answered, record its answer with `POST /api/v1/passports/{id}/registration`.

Refusals answer **409** with a code in `error`: `not_a_battery`, `not_published` (only a published passport can be registered), `registered_in_production` (the passport is already registered in the production Registry), `registry_not_ready` (the passport has a blocking registry-readiness finding; `findingDetails` lists the findings, blocking ones first, from the same check as `GET /api/v1/passports/{id}/registry-readiness`) and `invalid_upi` (the address is not an `https://` URL of at most 2000 characters).

**Paid plans only** (`402` on Free: a Free passport expires after 30 days). OAuth callers must act for an admin or owner. No request body. Counts as one v1 write, and only when the call succeeds. 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/registry-upi \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx" \
  -H "Idempotency-Key: 7c2e4a91-3d5b-4f8e-a6c0-1b9d2e4f6a80"

Response

{
  "upi": "https://id.tracepass.eu/01/04012345000016/21/A1B2C3",
  "preparedAt": "2026-11-06T10:00:00.000Z"
}