---
title: Get passport snapshot
description: "Full archival record of one snapshot: the JSON-LD payload as it stood at that moment, who changed it, content hash re-verification, and restore eligibility."
canonical: "https://www.tracepass.eu/docs/get-passport-snapshot"
locale: en
source: "https://www.tracepass.eu/docs/get-passport-snapshot"
---

# Get passport snapshot

> Full archival record of one snapshot: the JSON-LD payload as it stood at that moment, who changed it, content hash re-verification, and restore eligibility.

```http
GET /api/v1/passports/{id}/snapshots/{snapshotId}
```

Returns the full archival record for one immutability **snapshot**: the complete JSON-LD payload exactly as the passport stood when the snapshot was taken — on publish, or after any change to a published, suspended, expired or archived passport — the snapshot metadata (version, reason, `actor` — who caused the change — and timestamp), and content hash re-verification. To get the version valid at a given date instead, use `?at=` on **List passport snapshots**. `hashValid: false` means the stored payload has been modified since the snapshot was taken — indicative of at-rest tampering.

The `restorable` flag indicates whether `rawFields` was captured at snapshot time. When `restorable` is `true`, a dashboard restore action can rewind the live passport to this version field-by-field. When `false` (either because `rawFields` was not captured, or is empty), the snapshot is evidence-only — the JSON-LD is still preserved and verifiable, but an automated field-level restore is not possible.

Tenant-scoped: you can only read snapshots for your company's passports. Counts as one v1 passport read against the daily cap. Supply the snapshot id from the `entries[].id` values returned by **List passport snapshots**.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `Authorization` | header | string | yes | `Bearer <token>` — either a `tp_` API key (Developer → API Keys; simplest, for server-to-server) or an OAuth 2.0 access token (Developer → OAuth Apps; for user-authorized apps, scoped + revocable). The Authentication page has the full OAuth flow and scope list. |
| `id` | path | ObjectId | yes | Passport ID. |
| `snapshotId` | path | ObjectId | yes | Snapshot ID (from the entries\[\].id field of List passport snapshots). |

## Examples

```bash
curl -sS "https://app.tracepass.eu/api/v1/passports/6650b2c3d4e5f6a7b8c9d0e1/snapshots/65a0f1b2c3d4e5f6a7b8c9d1" \
  -H "Authorization: Bearer tp_REDACTED_xxxxxxxxxxxx"
```

```typescript
const res = await fetch(
  `https://app.tracepass.eu/api/v1/passports/${passportId}/snapshots/${snapshotId}`,
  { headers: { Authorization: `Bearer ${process.env.TRACEPASS_API_KEY}` } },
);
const snapshot = await res.json();
// { id, version, reason, snapshotAt, contentHash, hashValid, restorable, fieldCount, jsonLd }
```

```python
import os, requests
res = requests.get(
    f"https://app.tracepass.eu/api/v1/passports/{passport_id}/snapshots/{snapshot_id}",
    headers={"Authorization": f"Bearer {os.environ['TRACEPASS_API_KEY']}"},
)
res.raise_for_status()
snapshot = res.json()  # { id, version, reason, actor?, snapshotAt, contentHash, hashValid, restorable, fieldCount, jsonLd }
```

## Responses

### 200 — Success

```json
{
  "id": "65a0f1b2c3d4e5f6a7b8c9d1",
  "version": 3,
  "reason": "field_edit",
  "actor": "apikey:tp_89b2482d",
  "snapshotAt": "2026-09-15T14:32:00.000Z",
  "contentHash": "a3f1c2d4e5b6a7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2",
  "hashValid": true,
  "restorable": true,
  "fieldCount": 124,
  "jsonLd": {
    "@context": "https://gs1.org/voc/",
    "@type": "gs1:Product",
    "gs1:productName": "Industrial Battery 48V 200Ah",
    "gs1:gtin": "09506000134376"
  }
}
```

### 404 — Not found

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

## Related

- [Get passport](https://www.tracepass.eu/docs/get-passport.md)
- [List snapshots](https://www.tracepass.eu/docs/list-passport-snapshots.md)
