# The public passport (current version)

> `GET /public/passports/{passportId}` · öffentlich, ohne Schlüssel · operationId `getPublicPassport`

No authentication. Only the `public` tier, as stored when the version was published (ADR-013).
Passports that are not public (`qr_locked`, `withdrawn`, `suspended`, `deleted_recycled`) answer
with their status and no content. Cached for 5 minutes; rate-limited per client address.

## Pfad-Parameter

- **passportId** `string (uuid)` (erforderlich): The UUID of the passport identifier `urn:dpp:{uuid}`.

## Antworten

### 200 (`application/json`)

The passport.

- **document** `PassportDocument`: A passport version projected to an access tier. The `public` projection is stored and signed at publication (ADR-013); verify it by canonicalising this object with RFC 8785 (JCS), hashing it with SHA-256 and checking the Ed25519 signature.
  - **category** `PassportCategory` (erforderlich)
  - **economic_operator** `PublicProfile`: The economic operator as shown on public passports. Every property is optional; publishing (M4) requires a complete profile.
  - **gs1_digital_link** `string` (erforderlich)
  - **gtin** `string` (erforderlich)
  - **model_name** `string` (erforderlich): The name of the battery model (the product name), for headings.
  - **passport_id** `string`: Absent only in a preview of a passport that has no identifier yet.
  - **predecessor_passport_id** `string`: Second life: the passport identifier of the battery this one was repurposed, reused or remanufactured from.
  - **restricted_fields_present** `string[]` (erforderlich): Keys of fields with a value above this tier. Keys only, never values.
  - **sections** `PassportSection[]` (erforderlich)
  - **serial_number** `string` (erforderlich)
  - **tier** `string` (erforderlich, einer von: `public`, `legitimate_interest`, `authority`): The access tier a passport document is projected to; each includes the tiers before it.
  - **version** `PassportDocumentVersion` (erforderlich)
- **links** `PublicPassportLinks` (erforderlich)
  - **gs1_digital_link** `string`
  - **json** `string` (erforderlich)
  - **keys** `string` (erforderlich)
  - **page** `string` (erforderlich)
  - **predecessor** `string`: Second life: the public JSON of the passport of the battery this one was made from.
  - **restricted** `string`: The page where authorised parties sign in to read restricted tiers; only while the portal is enabled (ADR-018).
  - **successors** `string[]`: Second life: the public JSON of the passports of batteries made from this one.
- **passport_id** `string` (erforderlich)
- **status** `string` (erforderlich, einer von: `draft`, `qr_locked`, `published`, `update_needed`, `suspended`, `withdrawn`, `deleted_recycled`): Status of a unit's passport (`docs/domain-model.md` §7).
- **valid_until** `string (date-time)`: Set when this version was replaced by a later one (history by date).
- **verification** `PassportSignature`
  - **algorithm** `string` (erforderlich, einer von: `Ed25519`)
  - **canonicalization** `string` (erforderlich, einer von: `RFC8785`)
  - **hash** `string` (erforderlich): `sha256:<hex>` of the canonical `document`.
  - **key_id** `string` (erforderlich)
  - **keys_url** `string` (erforderlich)
  - **signature** `string` (erforderlich): Ed25519 signature of the canonical `document` bytes (base64url, no padding).
  - **signed_at** `string (date-time)` (erforderlich)

### 400 (`application/problem+json`)

The request is malformed or failed validation (`validation_error`), or a token is invalid or expired (`invalid_token`).

### 404 (`application/problem+json`)

The resource does not exist in the organisation of the API key, or the public passport is unknown (`not_found`).

### 429 (`application/problem+json`)

Too many attempts (`rate_limited`); retry after the number of seconds in the `Retry-After` header.

### default (`application/problem+json`)

Any other problem, e.g. `internal_error`.

## Beispiel

```bash title="cURL"
curl -X GET "https://passport.kabin.sh/api/v1/public/passports/{passportId}"
```
