Rate Limits
Des limites de taux sont appliquées par clé API pour garantir la stabilité de la plateforme pour tous les marchands.
Limites par défaut
| Endpoint | Limite | Fenêtre |
|---|---|---|
POST /payin | 60 requêtes | Par minute |
POST /payout | 30 requêtes | Par minute |
GET /status/{id} | 120 requêtes | Par minute |
| Tous les endpoints | 1 000 requêtes | Par heure |
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...
}