Parcourir la documentation

Limites de débit et idempotence

Limites de débit

Six compteurs, en fenêtres fixes d'une minute. Un appel les traverse tous ; le premier plein répond 429 API_RATE_LIMITED avec Retry-After.

CompteurPlafondCompté parS'applique à
Adresse1 200 / minadresse IP appelantetout appel /v1, avant même la lecture de la clé
Lectures600 / mincléGET, HEAD, OPTIONS
Écritures60 / mincléPOST, PATCH, DELETE
Alimentation20 / minclé et servicePOST /services/{code}/power
Réinstallation2 / minclé et servicePOST /services/{code}/reinstall
Compte1 200 / mincomptetout appel, toutes clés confondues

Trois détails qui changent le comportement d'une boucle de reprise :

  • Un appel refusé compte. Une rafale de 400 consomme le budget d'écriture comme des appels réussis. Corrigez le corps avant de réessayer.
  • Renouveler une clé remet ses compteurs à zéro. Les compteurs par clé sont indexés sur l'identité du secret, et un renouvellement en crée une nouvelle.
  • Les compteurs sont locaux à chaque serveur. Derrière plusieurs répliques, le plafond réellement atteint peut monter jusqu'au double du plafond nominal.

Lire les en-têtes

En-têteValeur
X-RateLimit-Limitle plafond du compteur le plus serré des six
X-RateLimit-Remainingce qu'il reste sur ce compteur
X-RateLimit-Resethorodatage en secondes epoch de la fin de la fenêtre, pas un délai
Retry-Aftersur 429 seulement : secondes à attendre, minimum 1

Ces en-têtes décrivent le compteur le plus serré du moment, qui n'est pas toujours le même d'un appel à l'autre.

Idempotence

Quatre routes engagent de l'argent et exigent un en-tête Idempotency-Key :

  • POST /orders
  • POST /orders/{orderNumber}/pay
  • POST /invoices/{code}/pay
  • POST /services/{code}/renew
Clé d'idempotenceDétail
Formatchaîne non vide, 128 caractères au plus. Un UUID convient
Absent400 IDEMPOTENCY_KEY_REQUIRED
Vide ou trop long400 IDEMPOTENCY_KEY_INVALID
Portéela clé d'API. Deux clés peuvent utiliser la même chaîne sans se gêner
Conservation24 heures

Ce qui définit « la même requête »

L'empreinte porte sur la méthode, le chemin concret et le corps. La même clé d'idempotence sur un autre numéro de commande est donc une requête différente.

SituationRéponse
Rejeu à l'identique après succèsla réponse enregistrée, avec Idempotent-Replayed: true. Rien n'est refait
Même clé, requête différente409 IDEMPOTENCY_KEY_REUSED
Même clé pendant que le premier appel tourne409 IDEMPOTENCY_IN_PROGRESS avec Retry-After

Les refus se rejouent aussi

Un refus est un résultat : il est enregistré et rejoué. Un 402 PAYMENT_DENIED rejoué reste un 402, sans nouvel appel à la banque.

Font exception les refus levés avant toute écriture et tout débit. Ceux-là libèrent la clé : corrigez la condition et réessayez avec la même.

Libèrent la cléNe la libèrent pas
INSUFFICIENT_BALANCEPAYMENT_DENIED
NO_PAYMENT_METHODPAYMENT_RECORDED_MISMATCH
PAYMENT_METHOD_ID_REQUIREDAPI_KEY_SPENDING_CAP_EXCEEDED
PAYMENT_METHOD_NOT_FOUNDPAYMENT_FAILED
PAYMENT_METHOD_NOT_ACTIVEtoute erreur 500
PAYMENT_METHOD_DECRYPTION_FAILED
PAYMENT_METHOD_VAULT_ID_MISSING
PAYMENT_IN_PROGRESS
RENEWAL_IN_PROGRESS
RENEWAL_TOO_FREQUENT

API_KEY_SPENDING_CAP_EXCEEDED est dans la colonne de droite bien qu'aucun débit n'ait eu lieu : sur POST /orders, la vérification qui fait autorité tourne après l'écriture de la commande, et libérer la clé permettrait à une reprise d'en créer une seconde. Relevez le plafond, puis réessayez avec une nouvelle clé d'idempotence.

En pratique

  • Générez la clé d'idempotence avant le premier envoi, et gardez-la avec la tâche, pas en mémoire.
  • Réutilisez-la telle quelle pour chaque reprise de la même tâche.
  • Changez-en dès que la tâche change, ne serait-ce que d'un centime.