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

Lire le passeport numérique publié pour un lot de production, à partir du GTIN de son modèle et du numéro du lot. Aucune clef d'API pour le niveau public.

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

---

Vous lisez le passeport numérique publié pour un lot de production. Le lot est
désigné par le GTIN de son modèle et par son numéro de lot, comme dans son lien
GS1 Digital Link. En quittant cette page, vous saurez récupérer le contenu du
passeport du lot, reconnaître qu'il s'agit d'un lot, et savoir pourquoi cette
adresse ne se rabat jamais sur le modèle.

Adresse complète :

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

Le même point d'entrée répond aussi sans le préfixe `/v1`. Utilisez la forme
`/v1` pour une nouvelle intégration.

> [!INFO] Ce point d'entrée décrit un lot
> Un passeport de lot est partagé par tous les articles d'un même lot de
> production. Il est rattaché au modèle par le lot : il part des données du
> modèle, et il porte ce qui est propre au lot, par exemple ses substances, ses
> sites de fabrication ou ses opérateurs. Son numéro de lot et le GTIN du modèle
> sont écrits dans ses propres données, sous `product_identity`, donc dans son
> empreinte et dans la preuve qui le date.
>
> Cette adresse ne sert **que** le passeport du lot. Si le lot n'en a pas de
> publié, elle répond 404, sans servir celui du modèle à sa place : les données
> d'un modèle ne doivent pas s'afficher sous le nom d'un lot. C'est le lien
> imprimé, [`GET /01/{gtin}/10/{lot}`](/reference/get-gs1-gtin-lot/), qui se
> rabat sur le modèle.

## Autorisation

Aucune pour le niveau public, qui est le niveau par défaut. Les niveaux d'accès
et les comptes qui les obtiennent sont exactement ceux de
[`GET /passport/01/{gtin}`](/reference/get-passport-gtin/) : le même contrôle
est appliqué aux deux adresses, par le même code.

## Plafond d'appels

600 appels par fenêtre de 60 secondes, comptés par adresse IP appelante. Ce
compteur est 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, ramené à quatorze chiffres avant la recherche. Sa clef de contrôle est vérifiée. |
| `lot` | `string` | oui | Le numéro du lot, comparé à l'identique, casse comprise. Encodez les caractères qui le demandent. |
| `access_tier` | `string` | non | Le niveau d'accès : `public` par défaut. Mêmes valeurs que pour le passeport d'un modèle. |

## Corps de la requête

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

## Requête d'exemple

Lecture du passeport du lot `LOT-26A` du GTIN `03701234567891`, au niveau
public.

:::onglets
```bash title="curl"
curl -i "https://api.sealtrust.io/v1/passport/01/03701234567891/10/LOT-26A"
```
```typescript
const gtin = "03701234567891";
const lot = "LOT-26A";

const response = await fetch(
  `https://api.sealtrust.io/v1/passport/01/${gtin}/10/${encodeURIComponent(lot)}`,
);

if (response.status === 404) {
  console.log("Aucun passeport publié pour ce lot.");
} else {
  const passeport = await response.json();
  console.log(passeport.level, passeport.batch_code, passeport.passport_version);
}
```
```python
from urllib.parse import quote

import requests

gtin = "03701234567891"
lot = "LOT-26A"

response = requests.get(
    f"https://api.sealtrust.io/v1/passport/01/{gtin}/10/{quote(lot, safe='')}",
    timeout=30,
)

if response.status_code == 404:
    print("Aucun passeport publié pour ce lot.")
else:
    passeport = response.json()
    print(passeport["level"], passeport["batch_code"], passeport["passport_version"])
```
:::

> [!INFO] Le SDK TypeScript ne couvre pas ce point d'entrée
> `@sealtrust-io/sdk` n'expose aucune méthode pour cette adresse. Les exemples
> utilisent `fetch`, sans dépendance.

## Réponse d'exemple

Code HTTP `200`.

```json
{
  "id": 412,
  "product_id": null,
  "product_model_id": 7,
  "gtin": "03701234567891",
  "level": "batch",
  "brand_id": 3,
  "brand_code": "K7Q2M9XH4B",
  "schema_version": "1.0",
  "passport_version": 2,
  "data": {
    "product_identity": {
      "gtin": "03701234567891",
      "batch_or_serial_identifier": "LOT-26A",
      "production_facility": "Atelier de Porto",
      "made_in": "PT"
    }
  },
  "data_hash": "9f2c1e7d4b8a6f0e3d5c2b1a9e8f7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e",
  "ipfs_uri": null,
  "visibility": "public",
  "published_at": "2026-09-26T08:00:00+00:00",
  "product_name": "T-shirt coton",
  "brand_name": "Atelier",
  "image_url": "https://atelier.test/images/t-shirt-coton.jpg",
  "product_batch_id": 11,
  "batch_code": "LOT-26A"
}
```

Toutes les valeurs de cet exemple sont fictives.

| Champ | Type | Description |
| --- | --- | --- |
| `level` | `string` | Toujours `batch` ici. Le passeport d'un modèle porte `model`. |
| `product_id` | `integer` | Toujours `null` : un passeport de lot n'est rattaché à aucun exemplaire. |
| `product_model_id` | `integer` | Le modèle du lot, atteint par le lot. |
| `product_batch_id` | `integer` | Le lot auquel ce passeport est rattaché. |
| `batch_code` | `string` | Le numéro du lot, tel qu'il figure dans le lien GS1. |
| `gtin` | `string` | Le GTIN du modèle, sous sa forme à quatorze chiffres. |
| `image_url` | `string \| null` | La photographie du modèle du lot, calculée comme sur le passeport du modèle. `null` quand le modèle n'en a pas, ou quand il appartient à une autre marque que ce passeport. C'est la copie allégée de la photo (WebP, 800 pixels au plus sur le grand côté, 100 Ko au plus, sans données EXIF) quand elle existe, sinon l'original. Une adresse d'un autre site est rendue telle quelle. |
| `data` | `object` | Le contenu du passeport, filtré selon le niveau d'accès. |
| `ipfs_uri` | `string` | L'adresse de la copie IPFS, rendue seulement aux niveaux authentifiés, comme pour le modèle. |
| `access_tier` | `string` | Le niveau réellement servi : celui demandé, ou `public` par défaut. |
| `available_tiers` | `array` de `string` | Les niveaux que VOTRE appel peut demander sur ce passeport, dans l'ordre `public`, `end_user`, `repairer`, `recycler`, `upstream`, `authority` : `["public"]` sans authentification, `end_user` en plus pour un compte connecté, le métier accrédité par la marque pour un partenaire, tous pour une autorité. La liste ne donne aucun droit : chaque niveau demandé reste vérifié. Une réponse qui la porte pour un compte connecté ne doit aller dans aucun cache partagé. |
| `passport_service_provider` | `object` ou `null` | Le prestataire de services de passeport qui tient la copie de sauvegarde de cette version (règlement (UE) 2024/1781, article 10(4) et annexe III point (l)) : `identifier`, sa référence, `name`, sa raison sociale, et `backed_up_at`, la date de la copie au format ISO 8601. `null` tant que la copie de cette version n'existe pas, ou quand sa dernière vérification a échoué. Hors de `data`, donc hors de l'empreinte `data_hash`. |

Les autres champs ont le même sens que dans la réponse de
[`GET /passport/01/{gtin}`](/reference/get-passport-gtin/).

## Erreurs

| Code | Condition | Que faire |
| --- | --- | --- |
| 400 | La clef de contrôle du GTIN ne correspond pas. | Recopiez le GTIN depuis le code-barres. |
| 401 | Un niveau qui exige un compte, demandé sans session. | Connectez-vous, ou demandez le niveau `public`. |
| 403 | Un niveau que votre compte n'ouvre pas pour cette marque. | Demandez un niveau auquel votre compte a droit. |
| 404 | Aucun passeport publié et public 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}/proof`](/reference/get-passport-gtin-lot-proof/),
  les preuves publiques du passeport d'un lot.
- [`GET /01/{gtin}/10/{lot}`](/reference/get-gs1-gtin-lot/),
  le lien GS1 du lot.
- [`GET /passport/01/{gtin}`](/reference/get-passport-gtin/),
  le passeport du modèle.
