Idempotence

Certaines écritures ont un effet réel qui ne doit pas se produire deux fois — déclencher une distribution de paie, par exemple. Ces opérations exigent un Idempotency-Key, et l'API garantit que rejouer la même clé renvoie la réponse d'origine au lieu de produire un second effet.

La référence indique quelles opérations exigent l'en-tête.

Envoyer la clé

curl -X POST "https://<hote-api-external>/api/v1/client/app/payroll/distribution/trigger" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: 6f1e8c94-3d5a-4c2b-9f7e-11a2b3c4d5e6" \
  -H "Content-Type: application/json" \
  -d '{ … }'

Générez une clé neuve — un UUID est idéal — pour chaque intention métier distincte, et réutilisez cette même clé à chaque réessai de cette intention. Omettre l'en-tête sur une opération qui l'exige donne un 400 (idempotency/key-required).

Le corps et la réponse ci-dessous sont capturés depuis la suite de tests, pas recopiés : ce que vous voyez est ce que l'API a reçu et renvoyé.

{
  "credentialsLogin": "partner-payroll-login",
  "companySiret": "12345678901234",
  "payrollPeriod": "2026-01-01"
}
{
  "isSuccess": true,
  "errorMessage": null,
  "distributionUrl": "https://staffngo.example.com/payroll/distribution/sample"
}

Ce qui identifie un doublon

Trois choses ensemble : votre identité partenaire, la clé, et une empreinte du corps de la requête, le tout rapporté à la capacité et à la version exactes que vous avez appelées.

Deux conséquences à connaître :

Ce que vous obtenez en retour

Situation Réponse
Premier appel Le handler s'exécute ; sa réponse est renvoyée et mémorisée.
Rejeu après complétion La réponse mémorisée, à l'identique — même statut, même corps. Aucune seconde exécution.
Rejeu pendant que le premier tourne encore 409 avec type = idempotency/in-progress. Attendez, puis réessayez.
Premier appel en échec (non-2xx) ou interrompu La clé est libérée. Réessayer avec la même clé relance l'opération.

C'est cette dernière ligne qu'il faut avoir en tête : seules les écritures réussies sont mémorisées. Une tentative en échec n'empoisonne pas la clé, donc un réessai légitime après erreur n'est pas silencieusement avalé.

En pratique

Jetons legacy

Les appels authentifiés avec un jeton BearerClient déprécié contournent entièrement ce mécanisme — un rejeu n'y est pas dédoublonné. C'est une raison de plus de migrer vers des identifiants OAuth, voir Authentification.