# GET /partner/mint/batch/status/{job_id}

Lit l'avancement d'un lot de produits envoyé à la frappe, à partir de l'identifiant rendu au moment de l'envoi.

Source : https://docs.sealtrust.io/reference/get-partner-mint-batch-status/

---

Vous suivez l'avancement d'un lot envoyé à la frappe, et vous savez quand
arrêter votre boucle. Interrogez ce point d'entrée autant de fois que
nécessaire : il ne crée ni ne modifie aucun produit, et il ne consomme aucun
quota quotidien. Lisez l'avertissement ci-dessous avant de conclure, à partir
de cette lecture, que vos articles existent.

> [!DANGER] Aucune valeur de `status` ne vous dit combien d'articles ont été créés
> Le champ `status` décrit le déroulement du traitement. Ce qui a été créé se
> lit dans les compteurs, présents dès votre premier appel et exacts à
> l'instant de votre lecture. `finished` dit seulement que le lot est allé au
> bout. `failed` dit seulement que le traitement s'est arrêté sur un échec, et
> des lignes peuvent avoir abouti quand même : elles restent comptées, et ces
> articles existent bel et bien. Lisez `success_count` avant de conclure, dans
> un sens comme dans l'autre, et avant de jeter un lot.

Le serveur expose deux adresses qui appellent le même code :
`/v1/partner/mint/batch/status/{job_id}` et
`/partner/mint/batch/status/{job_id}`. Utilisez la forme `/v1` pour toute
nouvelle intégration.

## Autorisation

Droit requis sur la clef : `mint:batch`.

C'est le même droit que l'envoi d'un lot. Une clef qui n'a pas ce droit reçoit
403, et le message nomme le droit manquant.

Authentifiez-vous par l'en-tête `Authorization`, au format `Bearer`.

```http
Authorization: Bearer votre_clef
```

Seule une clef de la marque qui a envoyé le lot peut le lire.

## Plafond d'appels

Le plafond de débit de l'API partenaire s'applique à ce point d'entrée, sur une
fenêtre fixe de 60 secondes.

Deux compteurs tournent en même temps, un pour votre clef, un pour la somme des
clefs de votre marque. Le plafond appliqué vient d'une valeur posée sur votre
compte, ou à défaut de votre offre. Quand aucune des deux n'est définie, il est
de 120 appels par fenêtre.

Ne devinez pas cette valeur. Toute réponse qui a franchi le contrôle de débit
porte quatre en-têtes qui la donnent. Une réponse 401, un 403
d'authentification ou un 503 arrivent avant ou pendant ce contrôle, et ne les
portent pas.

| En-tête | Ce qu'il contient |
| --- | --- |
| `X-RateLimit-Limit` | le plafond applicable, en appels par fenêtre |
| `X-RateLimit-Remaining` | ce qu'il vous reste dans la fenêtre en cours |
| `X-RateLimit-Reset` | l'horodatage, en secondes depuis 1970, où la fenêtre repart |
| `X-RateLimit-Scope` | `key` ou `brand`, selon celui des deux compteurs qui est le plus contraignant |

> [!ATTENTION] Espacez vos interrogations
> Une boucle qui interroge ce point d'entrée sans pause épuise votre fenêtre en
> quelques secondes, et vos autres appels sont refusés avec elle. Attendez
> quelques secondes entre deux lectures, et pilotez votre cadence sur
> `X-RateLimit-Remaining`.

Ce point d'entrée ne consomme aucune unité de votre quota quotidien, et aucune
unité du quota mensuel de produits de votre offre.

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

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `job_id` | `chaîne` | oui | L'identifiant de lot rendu par l'envoi du lot, dans le champ `job_id` de sa réponse. Placez-le dans le chemin de l'adresse. |

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

## Corps de la requête

Aucun. C'est une lecture, elle n'a pas de corps.

## Requête d'exemple

:::onglets
```bash title="curl"
curl -sS https://api.sealtrust.io/v1/partner/mint/batch/status/0000a1b2c3d4e5f6 \
  -H "Authorization: Bearer st_test_0000000000000000000000000000000000000000000000"
```
```typescript
import { SealTrustClient } from "@sealtrust-io/sdk";

const sealtrust = new SealTrustClient({
  apiKey: "st_test_0000000000000000000000000000000000000000000000",
});

const etat = await sealtrust.products.getBatchStatus("0000a1b2c3d4e5f6");

console.log(etat.status);
console.log(etat.is_finished);
```
```python
import requests

response = requests.get(
    "https://api.sealtrust.io/v1/partner/mint/batch/status/0000a1b2c3d4e5f6",
    headers={
        "Authorization": "Bearer st_test_0000000000000000000000000000000000000000000000"
    },
    timeout=30,
)

print(response.status_code)
print(response.json()["status"])
```
:::

## Réponse d'exemple

Code HTTP 200, pour un lot de 500 lignes en cours de traitement, dont douze
lignes ont déjà abouti.

```json title="200 OK"
{
  "job_id": "0000a1b2c3d4e5f6",
  "status": "started",
  "is_finished": false,
  "batch_status": "pending",
  "items_count": 500,
  "success_count": 12,
  "error_count": 0,
  "enqueued_at": "2026-08-20T09:14:32.118431+00:00",
  "started_at": "2026-08-20T09:14:33.402118+00:00",
  "ended_at": null,
  "result": null,
  "exc_info": null
}
```

Les douze clefs sont toujours présentes dans cette forme de réponse. Seules
leurs valeurs changent. Les compteurs sont là dès votre premier appel : chaque
ligne du lot est comptée au moment où elle aboutit. Quand le traitement du lot
arrive à son terme, `is_finished` passe à vrai et `ended_at` porte une date. Cela vous dit que le traitement est allé
au bout. Pour savoir combien d'articles ont été créés, lisez `success_count`.

| Champ | Type | Description |
| --- | --- | --- |
| `job_id` | `chaîne` | L'identifiant que vous avez demandé, repris tel quel. |
| `status` | `chaîne` | L'avancement du traitement du lot. Les valeurs sont détaillées ci-dessous. |
| `is_finished` | `booléen` | Vrai quand le traitement du lot est terminé. Un lot qui répond `status: "failed"` peut porter l'une ou l'autre valeur. Pilotez votre boucle sur `status`. |
| `batch_status` | `chaîne ou nul` | L'état du lot lui-même. Les valeurs sont détaillées ci-dessous. |
| `items_count` | `entier ou nul` | Le nombre de lignes du lot. |
| `success_count` | `entier ou nul` | Le nombre d'articles réellement créés à l'instant de votre lecture, compté ligne par ligne. |
| `error_count` | `entier ou nul` | Le nombre de lignes réellement en échec à l'instant de votre lecture, compté ligne par ligne. |
| `enqueued_at` | `chaîne ou nul` | Date et heure à laquelle le lot a été accepté et mis en attente de traitement. |
| `started_at` | `chaîne ou nul` | Date et heure du début du traitement. Nul tant qu'il n'a pas commencé. |
| `ended_at` | `chaîne ou nul` | Date et heure de fin du traitement. Nul tant qu'il n'est pas terminé. |

Les trois dates portent le décalage `+00:00` : elles suivent le temps
universel.

La réponse porte deux champs de plus, `result` et `exc_info`. Ils sont internes
à notre traitement. Ignorez-les : ne les affichez pas, ne les stockez pas, n'y
branchez aucune logique. Aucun des deux ne vous dit combien d'articles ont été
créés.

### Les valeurs de `status`

| Valeur | Ce qu'elle veut dire |
| --- | --- |
| `queued` | le lot attend son tour |
| `started` | le lot est en cours de traitement |
| `finished` | le lot est allé au bout, quel que soit le nombre d'articles créés |
| `failed` | le traitement s'est arrêté sur un échec. Des lignes peuvent avoir abouti quand même : lisez `success_count` |
| `unknown` | aucun lot accessible avec cette clef ne correspond à cet identifiant |

D'autres valeurs que ces cinq peuvent apparaître. Les types du SDK TypeScript
en déclarent quatre de plus :
`deferred`, `scheduled`, `stopped` et `canceled`. Écrivez votre boucle de façon
à traiter une valeur inattendue sans planter.

Bouclez tant que le statut vaut `queued` ou `started`. Arrêtez-vous sur
`finished`, sur `failed` et sur `unknown`. Arrêter votre boucle ne vous dit rien
du nombre d'articles créés : ce nombre se lit dans `success_count`.

### Les valeurs de `batch_status`

Un lot envoyé par cette API part à `pending`. Seul son traitement le fait
changer, vers `retrying`, vers `pending_multisig`, ou vers un état terminal,
`success`, `partial` ou `failed`. La valeur `running` n'apparaît pas sur cette
voie : n'écrivez pas de branche pour elle. `partial` signifie qu'une partie
seulement des articles a été créée. Comparez alors `success_count` et
`items_count`.

> [!ATTENTION] `retrying` et `pending_multisig` ne se referment pas d'eux-mêmes
> `pending_multisig` veut dire que le lot attend des signatures, et `retrying`
> que des lignes sont reparties en reprise. Sur ces deux valeurs, `status` peut
> annoncer un traitement terminé alors que le lot ne l'est pas. Regardez
> `batch_status` et `success_count` avant de considérer vos articles créés.

### La réponse quand aucun lot accessible ne correspond

Quand aucun lot accessible avec votre clef ne correspond à l'identifiant, vous
recevez 200, avec deux champs et rien d'autre.

```json title="200 OK"
{
  "job_id": "0000a1b2c3d4e5f6",
  "status": "unknown"
}
```

> [!ATTENTION] `unknown` arrête votre boucle
> Cette réponse ne porte ni `is_finished`, ni les compteurs. Un `is_finished`
> absent signifie donc qu'aucun lot accessible avec cette clef ne correspond.
> N'en concluez pas que le lot est encore en cours : votre boucle ne
> s'arrêterait jamais.

### La seconde forme de réponse, sur un lot ancien

Nous ne gardons le détail du déroulement que pendant un temps. Passé ce délai,
la réponse prend une seconde forme, construite à partir de l'état du lot
lui-même. Elle porte les sept premiers champs et rien d'autre : ni les trois
dates, ni les deux champs internes. Les compteurs, eux, sont dans les deux
formes. Traitez les deux formes.

```json title="200 OK"
{
  "job_id": "0000a1b2c3d4e5f6",
  "status": "failed",
  "is_finished": true,
  "batch_status": "failed",
  "items_count": 500,
  "success_count": 0,
  "error_count": 500
}
```

Elle peut porter n'importe quel statut, y compris `queued` et `started`. Ne
déduisez pas de sa forme que le lot est terminé.

Dans cette forme de réponse, `is_finished` vaut vrai pour `success`, `partial`
et `failed`, et `status` vient de l'état du lot. Un lot dont chaque ligne a été
rejetée y répond `status: "failed"` et `is_finished: true`, et la première
forme répond la même chose pour la même exécution. Ne comparez pas deux
lectures faites à des moments différents pour en déduire que le lot a changé
d'état. Le nombre d'articles créés se lit dans `success_count`.

## Erreurs

| Code | Condition | Que faire |
| --- | --- | --- |
| 401 | l'en-tête `Authorization` est absent | ajoutez-le, la réponse porte aussi `WWW-Authenticate: Bearer` |
| 401 | l'en-tête ne commence pas par `Bearer ` suivi d'un espace | corrigez la forme de l'en-tête, la réponse porte aussi `WWW-Authenticate: Bearer` |
| 401 | la valeur envoyée après `Bearer ` fait moins de 40 caractères | envoyez le secret complet, cette réponse ne porte pas `WWW-Authenticate` |
| 401 | la valeur envoyée n'est pas une clef connue | vérifiez que vous copiez le secret entier, sans espace ni retour à la ligne |
| 403 | la clef a été révoquée, le message donne son état | créez une nouvelle clef depuis la console de votre marque |
| 403 | la clef a atteint sa date d'expiration | créez une nouvelle clef, l'ancienne ne redeviendra jamais valide |
| 403 | la clef n'a pas le droit `mint:batch`, le message le nomme | créez une clef portant ce droit, il commande aussi l'envoi d'un lot |
| 403 | vous n'avez pas accès à ce lot | vérifiez que vous interrogez le bon identifiant avec la clef de la bonne marque |
| 429 | votre clef a dépassé son propre plafond de débit | attendez le nombre de secondes indiqué par `Retry-After`, puis réessayez. `X-RateLimit-Scope` vaut alors `key` |
| 429 | l'ensemble des clefs de votre marque a dépassé le plafond de la marque | attendez le nombre de secondes indiqué par `Retry-After`, puis réessayez. `X-RateLimit-Scope` vaut alors `brand`. Ajouter des clefs ne relève pas ce plafond |
| 500 | une erreur interne inattendue | réessayez. Si le refus se répète, écrivez-nous en donnant la valeur de l'en-tête `X-Request-Id` de la réponse |
| 503 | le service qui tient les compteurs de débit est momentanément indisponible | l'appel n'a rien lu. Réessayez plus tard |

Aucun code d'erreur de cette liste ne dépend du contenu du lot. Le contrôle des
refus liés au lot lui-même, taille, colonnes, catégories et quota de votre
offre, a lieu au moment de l'envoi, sur `POST /v1/partner/mint/batch`.

## Voir aussi

- [`POST /partner/mint/batch`](/reference/post-partner-mint-batch/),
  envoyer un lot de lignes de produits, jusqu'à 500 par appel.
- [Créer des produits, à l'unité et en lot](/creer-des-produits/),
  créer un produit, créer une série entière, importer un fichier.
- [Erreurs de l'API](/api-erreurs/),
  reconnaître un code d'erreur et décider s'il faut corriger ou rejouer.
- [Intégrer le SDK TypeScript](/sdk-typescript/),
  installer le SDK, créer le client et reconnaître les deux familles
  d'erreurs.
