---
title: Adresse eines Batteriepasses für das EU DPP Registry abrufen
description: Die eindeutige Produktkennung für das Online-Formular des EU DPP Registry zu einem Batteriepass. Der Wirtschaftsakteur registriert selbst. Bezahlpläne.
canonical: "https://www.tracepass.eu/de/docs/passport-registry-upi"
locale: de
source: "https://www.tracepass.eu/de/docs/passport-registry-upi"
---

# Adresse eines Batteriepasses für das EU DPP Registry abrufen

> Die eindeutige Produktkennung für das Online-Formular des EU DPP Registry zu einem Batteriepass. Der Wirtschaftsakteur registriert selbst. Bezahlpläne.

```http
POST /api/v1/passports/{id}/registry-upi
```

Liefert die eindeutige Produktkennung (UPI), die in das Online-Formular des EU DPP Registry eingefügt wird, für einen veröffentlichten **Batteriepass**, als `{ upi, preparedAt }`. Der Wirtschaftsakteur registriert den Pass auf der Website des Registry mit seinem eigenen EU Login (Product group: Batteries; Granularity: Item). TracePass bereitet die Adresse vor und hält fest, dass es das getan hat; es reicht nie etwas beim Registry ein.

**Der erste Aufruf friert die Adresse** im Pass als `registryUpi` ein, spätere Aufrufe liefern dieselbe Adresse. Das Registry behält die URL, die es erhalten hat, daher muss diese URL weiter auflösen, auch wenn sich die Domain Ihres Kontos später ändert. Jeder Aufruf hält die Vorbereitung im Pass fest (`registrationPreparedAt`, `registrationPreparedVia: "form"`). Eine Vorbereitung ist keine Registrierung: Sobald das Registry geantwortet hat, erfassen Sie seine Antwort mit `POST /api/v1/passports/{id}/registration`.

Ablehnungen antworten mit **409** und einem Code in `error`: `not_a_battery`, `not_published` (nur ein veröffentlichter Pass kann registriert werden), `registered_in_production` (der Pass ist bereits im Produktiv-Registry registriert), `registry_not_ready` (der Pass hat einen blockierenden Befund der Registry-Bereitschaftsprüfung; `findingDetails` listet die Befunde auf, blockierende zuerst, aus derselben Prüfung wie `GET /api/v1/passports/{id}/registry-readiness`) und `invalid_upi` (die Adresse ist keine `https://`-URL mit höchstens 2000 Zeichen).

**Nur in Bezahlplänen** (`402` auf Free: Ein Free-Pass läuft nach 30 Tagen ab). OAuth-Aufrufer müssen für einen Admin oder Owner handeln. Kein Request-Body. Zählt als ein v1-Schreibvorgang, und nur, wenn der Aufruf gelingt. Unterstützt `Idempotency-Key`.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Authorization` | header | string | yes | `Bearer <token>` — entweder ein `tp_` API-Schlüssel (Developer → API Keys; am einfachsten, für Server-zu-Server) oder ein OAuth-2.0-Access-Token (Developer → OAuth Apps; für nutzerautorisierte Apps, scoped und widerrufbar). Die Authentication-Seite enthält den vollständigen OAuth-Flow und die Scope-Liste. |
| `Idempotency-Key` | header | string | no | UUID v4. |
| `id` | path | string (24 hex chars) | yes | Pass-ID eines veröffentlichten Batteriepasses. |

## Examples

```bash
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"
```

```typescript
const res = await fetch(
  `https://app.tracepass.eu/api/v1/passports/${id}/registry-upi`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.TRACEPASS_API_KEY}`,
      "Idempotency-Key": crypto.randomUUID(),
    },
  },
);

if (res.status === 409) {
  const { error, findingDetails } = await res.json();
  // e.g. registry_not_ready: findingDetails lists the blocking findings first.
  console.log(error, findingDetails ?? []);
} else if (res.ok) {
  // Paste upi into the EU DPP Registry's online form, under your own EU Login.
  const { upi } = await res.json();
  console.log(upi);
}
```

```python
import os, uuid, requests
res = requests.post(
    f"https://app.tracepass.eu/api/v1/passports/{passport_id}/registry-upi",
    headers={
        "Authorization": f"Bearer {os.environ['TRACEPASS_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
)
if res.status_code == 409:
    body = res.json()
    print(body["error"], body.get("findingDetails", []))
else:
    res.raise_for_status()
    print(res.json()["upi"])  # paste into the Registry's online form
```

## Responses

### 200 — Adresse zum Einfügen

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

### 409 — Register nicht bereit

```json
{
  "error": "registry_not_ready",
  "findingDetails": [
    {
      "severity": "critical",
      "ruleId": "REG-READY-MANDATORY",
      "target": "batteryUniqueIdentifier",
      "why": "A mandatory field that applies to this battery is missing.",
      "fix": "Provide batteryUniqueIdentifier before submitting to the registry."
    }
  ]
}
```

### 409 — Bereits registriert

```json
{ "error": "registered_in_production" }
```

### 402 — Free-Plan

```json
{ "error": "Available on every paid plan. Upgrade to use it." }
```

## Related

- [Ergebnis des Registry erfassen](https://www.tracepass.eu/de/docs/record-passport-registration.md)
- [Upload-Datei erstellen](https://www.tracepass.eu/de/docs/registry-upload-file.md)
- [Registry-Bereitschaft prüfen](https://www.tracepass.eu/de/docs/passport-registry-readiness.md)
