---
title: Pass zur Löschung markieren
description: Schritt eins beim Löschen eines Passes, vor DELETE. Batteriepässe brauchen einen Grund; abgelehnt, solange ein neuerer Pass darauf verweist. Nur Bezahlpläne.
canonical: "https://www.tracepass.eu/de/docs/mark-passport-for-deletion"
locale: de
source: "https://www.tracepass.eu/de/docs/mark-passport-for-deletion"
---

# Pass zur Löschung markieren

> Schritt eins beim Löschen eines Passes, vor DELETE. Batteriepässe brauchen einen Grund; abgelehnt, solange ein neuerer Pass darauf verweist. Nur Bezahlpläne.

```http
POST /api/v1/passports/{id}/mark-for-deletion
```

**Schritt eins von zwei.** Ein Pass wird in zwei Schritten gelöscht: hier zur Löschung markieren, dann `DELETE /api/v1/passports/{id}` aufrufen (ein nie veröffentlichter Pass im Status `draft` oder `in_review` kann direkt gelöscht werden). Die Löschung ist ein Soft Delete: Es wird nichts vernichtet, aber der Pass verschwindet aus der API und von allen öffentlichen Oberflächen. Wer den QR-Code scannt, sieht eine Seite mit dem Hinweis, dass der Pass beendet ist, und die maschinenlesbaren Formate antworten mit `410 Gone`.

Ein markierter Pass kann nicht mehr bearbeitet werden, und das Markieren eines veröffentlichten Passes gibt seinen Platz im Plan frei. Markiert werden kann ein Pass in jedem Status außer archiviert; eine zweite Markierung gibt `409 already_marked_for_deletion` zurück. Sendet den `passport.marked_for_deletion`-Webhook.

**Batteriepässe brauchen einen Grund.** Nach der Batterieverordnung endet ein Batteriepass erst, wenn die Batterie recycelt wurde (Art. 77 Abs. 8), daher nennt die Anfrage den Grund, aus dem dieser Pass endet: `recycled`, `never_placed` (nie in Verkehr gebracht) oder `duplicate_or_error`. Ohne Grund antwortet ein Batteriepass mit `400 reason_required`. Für andere Kategorien ist `reason` optional; wenn angegeben, muss es einer der drei Werte sein.

**Abgelehnt, solange ein neuerer Pass darauf verweist.** Solange ein neuerer Batteriepass in Ihrem Konto diesen Pass als Vorgänger verknüpft, antwortet die Markierung mit `409 has_live_successor`; löschen Sie zuerst den neueren Pass.

Löschen über die API erfordert einen Bezahlplan: Auf Free antwortet die Markierung mit `403 deletion_not_on_plan`. Zählt als ein v1-Schreibvorgang. Unterstützt `Idempotency-Key`. `POST /api/v1/passports/by-serial/{serial}/mark-for-deletion` ist die By-Serial-Alternative (mit dem `?gtin=`-Disambiguator).

## 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. |
| `reason` | body | enum | no | `recycled`, `never_placed` oder `duplicate_or_error`. Pflicht für Batteriepässe, optional für andere Kategorien. |

## Examples

```bash
curl -sS -X POST \
  https://app.tracepass.eu/api/v1/passports/6650b2c3d4e5f6a7b8c9d0e1/mark-for-deletion \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 4f9c2a7e-1b3d-4c5e-8f60-7a8b9c0d1e2f" \
  -d '{ "reason": "recycled" }'
```

```typescript
const res = await fetch(
  `https://app.tracepass.eu/api/v1/passports/${id}/mark-for-deletion`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.TRACEPASS_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ reason: "recycled" }),
  },
);
if (!res.ok) {
  const { error, message } = await res.json();
  throw new Error(`${error}: ${message}`);
}
// Step two: DELETE /api/v1/passports/{id}
```

```python
import os, requests
res = requests.post(
    f"https://app.tracepass.eu/api/v1/passports/{passport_id}/mark-for-deletion",
    headers={"Authorization": f"Bearer {os.environ['TRACEPASS_API_KEY']}"},
    json={"reason": "recycled"},
)
res.raise_for_status()
# Step two: DELETE /api/v1/passports/{passport_id}
```

## Responses

### 200 — Zur Löschung markiert

```json
{
  "_id": "6650b2c3d4e5f6a7b8c9d0e1",
  "status": "marked_for_deletion",
  "markedForDeletionAt": "2026-11-01T10:00:00.000Z",
  "markedForDeletionReason": "recycled"
}
```

### 400 — Grund erforderlich

```json
{
  "error": "reason_required",
  "message": "A reason is required for battery passports: send { \"reason\": \"recycled\" | \"never_placed\" | \"duplicate_or_error\" }. A battery passport ends only when the battery has been recycled."
}
```

### 403 — Plan-Sperre

```json
{
  "error": "deletion_not_on_plan",
  "message": "Deletion is available on every paid plan; archive the passport instead."
}
```

### 409 — Neuerer Pass verweist darauf

```json
{
  "error": "has_live_successor",
  "message": "This passport has a live successor. Delete the successor first before marking this passport for deletion."
}
```

### 404 — Nicht gefunden

```json
{
  "error": "passport_not_found",
  "message": "Passport not found."
}
```

## Related

- [Pass löschen (Schritt zwei)](https://www.tracepass.eu/de/docs/delete-passport.md)
- [Pass archivieren (unumkehrbar)](https://www.tracepass.eu/de/docs/archive-passport.md)
