Aller au contenu
Chargement des API keys…

Limites de requêtes

Quotas, en-têtes X-RateLimit et la bonne stratégie d'attente progressive.

Wajub limite le débit sur plusieurs axes à la fois : votre équipe, la clé utilisée, l'IP appelante et quelques endpoints sensibles. Une requête doit passer toutes ces limites. La première qui se déclenche décide de votre 429.

Les limites de la plateforme sont ailleurs

Cette page traite de la limitation des requêtes. Pour la taille des fichiers envoyés, le plafond des payloads de webhook et les quotas d'équipe, consultez Plafonds et quotas.

Les limites

PortéePlafond par tranche de 60 secondesCompté par
Non authentifié30IP appelante
ÉquipeSelon le plan, 120 et plusVotre équipe, toutes clés confondues
API key100La valeur exacte d'Authorization
IP120IP appelante, authentifiée ou non
Endpoint30 paiements, 20 transferts, 10 remboursements, 50 clients, multipliés par le palier de votre planÉquipe et endpoint
Écritures de payout20POST /transfers et POST /beneficiaries, par équipe

Lisez la limite, ne la codez pas en dur

Votre quota d'équipe dépend de votre plan et de tout plafond personnalisé que le support a défini pour vous. Plutôt que de recopier un tableau qui peut changer sans prévenir, relisez-le dans chaque réponse :

En-têtes de réponse
X-RateLimit-Limit: 360
X-RateLimit-Remaining: 357
X-RateLimit-Reset: 1748083260
X-RateLimit-Limitintegerfacultatif
Le plafond de votre équipe pour la fenêtre de 60 secondes en cours.
X-RateLimit-Remainingintegerfacultatif
Requêtes restantes dans cette fenêtre avant que la limite d'équipe ne se déclenche.
X-RateLimit-Resetunix timestampfacultatif
Moment où la fenêtre se renouvelle.

Ces trois en-têtes ne décrivent que le compteur de l'équipe. Les compteurs par clé, par IP et par endpoint ne sont pas exposés : un 429 peut donc arriver alors que X-RateLimit-Remaining semble encore confortable. Le champ type du corps indique lequel s'est déclenché.

Pas d'en-têtes, pas de plafond

Un compte sur un plan illimité ne reçoit aucun en-tête X-RateLimit-*, plutôt qu'un chiffre fictif. Interprétez leur absence comme « pas de limitation au niveau de l'équipe », jamais comme zéro.

À quoi ressemble un 429

Réponse · 429 Too Many Requests
{
"code": 429,
"status": "Too Many Requests",
"message": "Too many requests",
"type": "team",
"retry_after": 42,
"retry_after_human": "00:00:42"
}
typestringfacultatif
Le limiteur qui s'est déclenché : team, api_key, ip ou endpoint.
retry_afterintegerfacultatif
Nombre de secondes à attendre. Également envoyé dans l'en-tête Retry-After.
retry_after_humanstringfacultatif
Le même délai au format HH:MM:SS, pour les logs et les tickets de support.

Lisez type avant de réagir. Un 429 de type team ou ip signifie qu'il faut ralentir partout ; un 429 de type endpoint signifie que seule cette ressource est saturée et que le reste de votre trafic peut continuer ; un 429 de type api_key signifie que c'est cet identifiant précis qui bloque, pas votre compte.

Les limitations plus strictes sur les écritures de payout répondent avec un corps plus court, sans type. Traitez tout 429 de la même façon : lisez Retry-After, attendez, réessayez.

Réponse · 429 sur une écriture de payout
{
"code": 429,
"status": "Too Many Requests",
"message": "Too Many requests. Merchant limit : 360",
"retry_after": 17
}

Attente progressive

Respectez Retry-After quand il est présent, et rabattez-vous sur une attente exponentielle avec une part d'aléa (jitter) quand il ne l'est pas. Le jitter compte : sans lui, tous les workers limités à la même seconde réessaient à la même seconde.

async function withRetry(send, max = 3) {
for (let attempt = 0; ; attempt++) {
  const res = await send();

  if (res.status !== 429 || attempt >= max) return res;

  const header = Number(res.headers.get('retry-after'));
  const wait = Number.isFinite(header) && header > 0
    ? header
    : 2 ** attempt * (0.5 + Math.random() * 0.5);

  await new Promise((r) => setTimeout(r, wait * 1000));
}
}

L'exemple PHP réutilise les mêmes $options, donc la même clé d'idempotence : la nouvelle tentative ne peut pas créer un second paiement. Consultez Idempotence.

Le SDK réessaie déjà

Les SDKs officiels réessaient deux fois les 429, 500, 502, 503 et 504 avant de lever une erreur, en respectant Retry-After et sinon avec une attente exponentielle et du jitter. N'ajoutez votre propre boucle de nouvelles tentatives qu'autour d'une opération métier complète, jamais autour de chaque appel.

Que pensez-vous de ce contenu ?