---
title: Produkt dauerhaft löschen
description: Produkt mit null Pässen dauerhaft löschen. Geteilte Dokumente entkoppelt, verwaiste Dokumente + R2-Dateien gelöscht. Nur Bezahlpläne. Unumkehrbar.
canonical: "https://www.tracepass.eu/de/docs/delete-product"
locale: de
source: "https://www.tracepass.eu/de/docs/delete-product"
---

# Produkt dauerhaft löschen

> Produkt mit null Pässen dauerhaft löschen. Geteilte Dokumente entkoppelt, verwaiste Dokumente + R2-Dateien gelöscht. Nur Bezahlpläne. Unumkehrbar.

```http
DELETE /api/v1/products/{id}
```

**Dauerhaft und unumkehrbar.** Entfernt die Produkt-Zeile + alle hochgeladenen Dokumente, deren einzige Referenz dieses Produkt war (Dokumente, die mit anderen Produkten/Pässen verknüpft sind, bleiben erhalten, nur ohne `productId`). Der R2-Speicher unter `<companyId>/products/<productId>/` wird bereinigt.

**Nur Produkte mit NULL Pässen jeglichen Status sind berechtigt** — einschließlich archivierter. Gibt `409 Conflict` mit der Live-Passzahl in `reason` zurück, wenn nicht berechtigt. Die Regel bewahrt die Audit-Historie: Ein archivierter Pass trägt die regulatorische Geschichte ("wir haben dies veröffentlicht, dann zurückgezogen"), die verwaist wäre, wenn das übergeordnete Produkt verschwindet.

**Bezahlplan-Funktion.** Gibt auf Free-Plänen `403 Forbidden` zurück; verwenden Sie stattdessen `POST /api/v1/products/{id}/archive` — Archivieren behält die Zeile für Audit und funktioniert auf jedem Plan.

Zählt als ein v1-Schreibvorgang. Unterstützt `Idempotency-Key`. Kein Webhook (der `billingEvents`-Audit-Eintrag ist die Spur).

## 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 | ObjectId | yes | Produkt-ID. |

## Examples

```bash
curl -sS -X DELETE \
  https://app.tracepass.eu/api/v1/products/6650b2c3d4e5f6a7b8c9d0e1 \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx"
```

```typescript
const res = await fetch(
  `https://app.tracepass.eu/api/v1/products/${id}`,
  {
    method: "DELETE",
    headers: { Authorization: `Bearer ${process.env.TRACEPASS_API_KEY}` },
  },
);
if (res.status === 409) {
  const { reason } = await res.json();
  console.warn("Cannot delete:", reason);
}
```

```python
import os, requests
res = requests.delete(
    f"https://app.tracepass.eu/api/v1/products/{product_id}",
    headers={"Authorization": f"Bearer {os.environ['TRACEPASS_API_KEY']}"},
)
if res.status_code == 409:
    print("Not eligible:", res.json().get("reason"))
else:
    res.raise_for_status()
```

## Responses

### 200 — Gelöscht

```json
{
  "message": "Product permanently deleted",
  "summary": {
    "productId": "6650b2c3d4e5f6a7b8c9d0e1",
    "name": "Demo product",
    "deletedCounts": {
      "documentRefsUnlinked": 2,
      "documentsDeleted": 1,
      "r2ObjectsDeleted": 3,
      "documentR2ObjectsDeleted": 1
    }
  }
}
```

### 403 — Plan-Sperre

```json
{
  "error": "Permanent delete is not available on your plan",
  "reason": "Hard-delete is a paid-plan feature. Use POST /api/v1/products/{id}/archive instead."
}
```

### 409 — Nicht berechtigt

```json
{
  "error": "Product is not eligible for permanent deletion",
  "reason": "This product has 3 passports. Delete or archive every passport first."
}
```

### 404 — Nicht gefunden

```json
{ "error": "Product not found" }
```

## Related

- [Produkt archivieren](https://www.tracepass.eu/de/docs/archive-product.md)
