---
title: "Delete a passport permanently."
method: DELETE
path: "/api/v1/passports/{id}"
tags: ["Passports"]
---

# Delete a passport permanently.

`DELETE /api/v1/passports/{id}`

## Request

- Base URL: `https://app.tracepass.eu`
- URL: `https://app.tracepass.eu/api/v1/passports/{id}`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.tracepass.eu/api/oauth/authorize`, token URL `https://app.tracepass.eu/api/oauth/token`, scopes: `passports:write`)

**Permanent and irreversible.** Removes the passport with
everything that belongs only to it: its extractions, scan and
service events, ownership transfers, EPCIS event links, and
any uploaded documents and stored files no other record uses.
Shared documents stay, with the link removed.

**Only never-published passports are eligible.** Status
must be `draft` or `in_review` AND `publishedAt` must be
`null`. Anything else returns 409 with a `reason` naming
the policy. The compliance moat protecting printed QRs in
the wild is preserved — a published passport can only be
archived, never deleted.

**Paid-plan feature.** Returns 403 on Free plans with a
`reason` field pointing at the archive endpoint as the
no-cost alternative.

Honours `Idempotency-Key`. No webhook; the deletion is
recorded in your account's audit trail.

## Response `200`

Permanently deleted; summary includes cascade counts.

- object
  - `message` string
  - `summary` object
    - `passportId` string
    - `serialNumber` string
    - `gtin` string
    - `deletedCounts` object: What was removed with the passport.
      - `extractions` integer
      - `serviceEvents` integer
      - `scanEvents` integer
      - `ownershipTransfers` integer
      - `supplierRequestRefsRemoved` integer
      - `epcisEventRefsRemoved` integer
      - `epcisEventsDeleted` integer
      - `documentRefsRemoved` integer
      - `documentsDeleted` integer
      - `filesDeleted` integer
    - `dppsActiveDelta` -1 | 0: How the live-active counter moved (always -1 or 0).

## Other responses

- `401`: Missing or invalid API key.
- `403`: Plan gate — hard-delete is paid-only.
- `404`: Resource doesn't exist or is in a different workspace.
- `409`: Passport not eligible (already published / approved / suspended / etc).
- `429`: Daily v1 write or passport-read budget exhausted. Resets at 00:00 UTC.

---

[API](https://skmtc.dev/tracepass/apis/tracepass-api.md) · [All operations](https://skmtc.dev/tracepass/apis/tracepass-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tracepass/apis/tracepass-api/revisions/60ddeb25638b?raw)
