# GET /passport/01/{gtin}/10/{lot}/proof

Récupérer les preuves publiques du passeport d'un lot : empreinte du contenu, sceau, ancrage du document sur Base sans aucune frappe, état de l'attestation signée. Point d'entrée public.

Source : https://docs.sealtrust.io/reference/get-passport-gtin-lot-proof/

---

Vous récupérez les preuves publiques du passeport d'un lot de production. En
quittant cette page, vous saurez demander ces preuves, vérifier vous-même que
la version du lot est inscrite sur la chaîne, et comprendre pourquoi aucune
frappe n'a été nécessaire.

Adresse complète :

```http
GET https://api.sealtrust.io/v1/passport/01/{gtin}/10/{lot}/proof
```

> [!INFO] Un lot est daté sans rien frapper
> Chaque version publiée d'un passeport est scellée, puis ajoutée à un arbre de
> Merkle dont la racine est inscrite sur Base par un balayage périodique. Ce
> balayage prend toutes les versions scellées, quel que soit ce à quoi elles
> sont rattachées. Le passeport d'un lot est donc daté sur la chaîne comme les
> autres, sans qu'aucun jeton ne soit créé pour le lot ni pour ses articles.

## Autorisation

Aucune, point d'entrée public. La réponse est la même pour tout le monde.

## Plafond d'appels

600 appels par fenêtre de 60 secondes, comptés par adresse IP appelante, commun
à toutes les lectures (`GET`) dont l'adresse commence par `/passport`.

## Paramètres de chemin et de requête

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `gtin` | `string` | oui | Le GTIN du modèle du lot. Sa clef de contrôle est vérifiée. |
| `lot` | `string` | oui | Le numéro du lot, comparé à l'identique, casse comprise. |

Ce point d'entrée n'a aucun paramètre de requête.

## Corps de la requête

Aucun. Cette requête n'a pas de corps.

## Requête d'exemple

:::onglets
```bash title="curl"
curl -i "https://api.sealtrust.io/v1/passport/01/03701234567891/10/LOT-26A/proof"
```
```typescript
const response = await fetch(
  "https://api.sealtrust.io/v1/passport/01/03701234567891/10/LOT-26A/proof",
);
const preuves = await response.json();
console.log(preuves.level, preuves.batch_code, preuves.passport_anchor);
```
```python
import requests

response = requests.get(
    "https://api.sealtrust.io/v1/passport/01/03701234567891/10/LOT-26A/proof",
    timeout=30,
)
preuves = response.json()
print(preuves["level"], preuves["batch_code"], preuves.get("passport_anchor"))
```
:::

## Réponse d'exemple

Code HTTP `200`, pour une version déjà ancrée.

```json
{
  "passport_version": 2,
  "data_hash": "9f2c1e7d4b8a6f0e3d5c2b1a9e8f7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e",
  "passport_anchor": {
    "type": "passport_anchor",
    "chain": "base",
    "chain_id": 8453,
    "tx_hash": "0x5e1f0c2d3b4a59687766554433221100ffeeddccbbaa99887766554433221100",
    "merkle_root": "0x0d1c2b3a49586776655443322110ffeeddccbbaa998877665544332211000f1e",
    "leaf": "0x7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b",
    "leaf_index": 3,
    "proof": ["0x1122334455667788990011223344556677889900112233445566778899001122"],
    "block_timestamp": "2026-09-26T09:00:02+00:00",
    "passport_version": 2,
    "data_hash_matches": true,
    "anchored": true,
    "proves": "content_existed_at_or_before_tx"
  },
  "seal": {"sealed": true, "linked": true, "chain_link_match": true},
  "vc": {"issued": false},
  "level": "batch",
  "gtin": "03701234567891",
  "batch_code": "LOT-26A"
}
```

Toutes les valeurs de cet exemple sont fictives, et la réponse réelle porte
d'autres champs dans `passport_anchor` et `seal`, décrits sur
[`GET /passport/01/{gtin}/proof`](/reference/get-passport-gtin-proof/).

Deux blocs sont absents, et leur absence est la réponse juste : `anchor`, qui
date un exemplaire, et `verifications`, qui compte les lectures d'une étiquette
physique. Un lot n'est ni l'un ni l'autre. Tant que la version n'a pas été
prise par le balayage, `passport_anchor` est absent lui aussi, et `seal` suffit
à rendre visible toute réécriture en attendant.

### Vérifier la preuve vous-même

La feuille vaut `keccak256(abi.encode(uint256 passportId, uint256
passportVersion, bytes32 dataHash))`, où `passportId` est le champ `id` de
[`GET /passport/01/{gtin}/10/{lot}`](/reference/get-passport-gtin-lot/). En
remontant la feuille avec chaque nœud de `proof`, deux à deux et dans l'ordre
croissant des octets, vous retrouvez `merkle_root`. Le détail est sur
[Confiance et preuves](/confiance-et-preuves/).

## Erreurs

| Code | Condition | Que faire |
| --- | --- | --- |
| 400 | La clef de contrôle du GTIN ne correspond pas. | Recopiez le GTIN depuis le code-barres. |
| 404 | Aucun passeport publié pour ce lot, un lot d'une autre marque que celle du domaine appelé, ou un lot d'une autre marque que celle qui publie le passeport de modèle de ce GTIN. | Vérifiez le numéro de lot, casse comprise, et la publication dans la console. |
| 429 | Plus de 600 appels en 60 secondes depuis la même adresse IP. | Attendez le nombre de secondes indiqué par `Retry-After`. |

## Voir aussi

- [`GET /passport/01/{gtin}/10/{lot}`](/reference/get-passport-gtin-lot/),
  le contenu du passeport du lot.
- [Confiance et preuves](/confiance-et-preuves/),
  ce que chaque preuve établit et comment la recouper.
