---
title: Batteriepass in Verkehr bringen
description: "Registriert einen veröffentlichten Batteriepass im EU-Register (Art. 77 Abs. 10). Asynchron: antwortet 202, dann wechselt der Pass zu placed oder rejected."
canonical: "https://www.tracepass.eu/de/docs/place-passport-on-market"
locale: de
source: "https://www.tracepass.eu/de/docs/place-passport-on-market"
---

# Batteriepass in Verkehr bringen

> Registriert einen veröffentlichten Batteriepass im EU-Register (Art. 77 Abs. 10). Asynchron: antwortet 202, dann wechselt der Pass zu placed oder rejected.

```http
POST /api/v1/passports/{id}/place-on-market
```

Bringt einen veröffentlichten **Batteriepass** in Verkehr: Der Pass wird mit dem für Ihr Konto eingerichteten Registerzugang im EU-Register für digitale Produktpässe registriert, der Eintrag erfolgt also mit Ihren eigenen Zugangsdaten (Batterieverordnung (EU) 2023/1542, Art. 77 Abs. 10). Das Veröffentlichen eines Passes registriert ihn nicht; das tut dieser Aufruf. Nur Batteriepässe.

**Asynchron.** Der Aufruf prüft den Pass, setzt `placeOnMarketStatus` auf `placing` und antwortet sofort mit `202` und `{ passport, passportId, status: "placing", dppId }`. Der Aufruf beim Register folgt im Hintergrund, mit automatischen Wiederholungen, solange das Register nicht erreichbar ist. Lesen Sie den Pass, um den Ausgang zu verfolgen: `placed` heißt, das Register hat ihn angenommen (`placedOnMarketAt`, dazu `registrationId`, wenn das Register eine zurückgegeben hat), und löst den Webhook `passport.placed_on_market` aus; `rejected` heißt, das Register hat ihn abgelehnt oder war nach Ausschöpfen der Wiederholungen nicht erreichbar (`registrationRejectedAt`, `registrationRejectionReason`), und löst `passport.placement_rejected` aus. Für einen neuen Versuch beheben Sie die Ursache und rufen diesen Endpoint erneut auf — ein abgelehnter Pass kann erneut in Verkehr gebracht werden. Hat der Pass noch keine DPP-ID, erhält er eine; sie wird als `dppId` zurückgegeben.

Ablehnungen antworten mit **409** und einem Code, geprüft in dieser Reihenfolge: `not_a_battery`, `not_published` (nur ein veröffentlichter Pass kann in Verkehr gebracht werden), `already_placed` (läuft bereits oder erledigt), `operator_id_missing` (das Konto hat keine Kennung des Wirtschaftsakteurs), `registry_not_configured` (ein Admin richtet den Registerzugang im Dashboard unter Settings → EU Registry ein) und `registry_not_ready`, dessen `findings[]` die Befunde der Registry-Bereitschaftsprüfung auflistet, die im Weg stehen — die Registry-Bereitschaftsprüfung liefert sie in strukturierter Form. Ein leeres `findings[]` heißt, dass das eingerichtete Register noch keine Einreichungen von TracePass annimmt.

**Nach dem Inverkehrbringen ist der Wirtschaftsakteur gesperrt:** Ein Schreibvorgang auf eine Partei, der einen gespeicherten `operatorIdentifier` oder `facilityIdentifier` ändern würde, antwortet mit 409 `operator_locked`. Zur Korrektur markieren Sie den Pass zur Löschung und legen einen neuen an. Kein Request-Body. Zählt als ein v1-Schreibvorgang, und nur, wenn der Aufruf angenommen wird. 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/place-on-market \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx" \
  -H "Idempotency-Key: 3f1c9a52-8b7e-4d6a-9f0e-2c4b6d8e0a13"
```

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

if (res.status === 409) {
  const { error, findings } = await res.json();
  // e.g. registry_not_ready: findings lists what stands in the way.
  console.log(error, findings ?? []);
} else if (res.status === 202) {
  // Accepted: read the passport later — placeOnMarketStatus becomes
  // "placed" (registrationId) or "rejected" (registrationRejectionReason).
  const { dppId } = await res.json();
  console.log("placing", dppId);
}
```

```python
import os, uuid, requests
res = requests.post(
    f"https://app.tracepass.eu/api/v1/passports/{passport_id}/place-on-market",
    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("findings", []))
else:
    res.raise_for_status()
    print("placing", res.json()["dppId"])
```

## Responses

### 202 — Wird platziert

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

### 409 — Register nicht bereit

```json
{
  "error": "registry_not_ready",
  "findings": [
    "Required field \"carbonFootprintTotal\" has no value."
  ]
}
```

### 409 — Bereits platziert

```json
{ "error": "already_placed" }
```

### 404 — Nicht gefunden

```json
{ "error": "passport_not_found" }
```

## Related

- [Registry-Bereitschaft prüfen](https://www.tracepass.eu/de/docs/passport-registry-readiness.md)
- [Pass lesen](https://www.tracepass.eu/de/docs/get-passport.md)
- [Partei anlegen oder ersetzen](https://www.tracepass.eu/de/docs/upsert-party.md)
