Rate Limits
Des limites de taux sont appliquées par clé API pour garantir la stabilité de la plateforme pour tous les marchands. Si vous utilisez plusieurs clés API, chacune dispose de son propre quota.
Limites par défaut
Les limites ci-dessous s'appliquent indépendamment à chaque clé API.
| Endpoint | Limite | Fenêtre | Par |
|---|---|---|---|
POST /payin | 60 requêtes | Par minute | Clé API |
POST /payout | 60 requêtes | Par minute | Clé API |
GET /transactions/{id} | 120 requêtes | Par minute | Clé API |
Limites personnalisées
Pour des volumes supérieurs, contactez-nous. Des limites personnalisées peuvent être configurées pour les comptes Enterprise.
Headers de réponse
Chaque réponse inclut des headers pour suivre votre consommation :
| Header | Description |
|---|---|
X-RateLimit-Limit | Nombre de requêtes autorisées sur la fenêtre |
X-RateLimit-Remaining | Requêtes restantes sur la fenêtre courante |
X-RateLimit-Reset | Timestamp Unix de réinitialisation du compteur |
Retry-After | Présent uniquement sur les réponses 429 — secondes à attendre |
Gestion du code 429
json
Réponse 429 Too Many Requests
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please wait before retrying.",
"retry_after": 42
}
}
Bonnes pratiques
- Lisez les headers
X-RateLimit-Remainingà chaque réponse - Implémentez un backoff exponentiel sur les erreurs 429
- Utilisez l'idempotency pour éviter les doublons lors des retries
- Évitez les boucles de polling serrées — utilisez les webhooks à la place
- En cas de pics prévisibles (promos, salaires), contactez-nous à l'avance
php
Respect du Retry-After
$response = Http::withHeaders([...])->post('/api/v1/merchant/payin', $payload);
if ($response->status() === 429) {
$retryAfter = $response->json('error.retry_after', 60);
Log::warning("Rate limited. Retrying in {$retryAfter}s");
sleep($retryAfter);
// Retentons...
}