---
title: Idempotence
description: Réessayez un achat en toute sécurité, sans acheter deux fois.
sidebar:
  order: 4
---
Après une erreur réseau, vous ne savez pas toujours si un achat a abouti. C’est pourquoi chaque requête `POST /offsets` exige un en-tête `Idempotency-Key` : une valeur unique par achat, par exemple un UUID.

```txt
Idempotency-Key: 7f8d0c6e-2b1a-4e9f-9d3c-5a6b7c8d9e0f
```

## Ce qui se passe en cas de nouvelle tentative [#what-happens-on-a-retry]

| Vous envoyez | Vous recevez |
| --- | --- |
| Une nouvelle clé | Un nouvel achat (`201`). |
| La même clé et le même corps | Le premier achat, à nouveau (`201`), avec `Idempotent-Replayed: true`. Rien n’est acheté deux fois. |
| La même clé et un corps différent | `409 idempotency_key_reused`. Utilisez une nouvelle clé pour un nouvel achat. |

La réponse rejouée renvoie l’achat dans son état actuel : son `status` peut donc être passé de `processing` à `placed`.

## Bon à savoir [#good-to-know]

- Une clé compte de 1 à 255 caractères ASCII imprimables. Nous conservons les clés définitivement, pour chaque mode.
- L’ordre des clés et les espaces dans le corps n’ont pas d’importance : `{"kg":1,"reference":"a"}` et `{ "reference": "a", "kg": 1 }` sont la même requête.
- Un achat qui échoue (par exemple avec `402 insufficient_balance` ou une erreur de validation) n’enregistre rien. Après avoir approvisionné votre solde, vous pouvez réessayer avec la même clé.
- Deux requêtes simultanées avec la même clé ne posent aucun problème : l’une effectue l’achat, l’autre reçoit la réponse rejouée.
