EN

Limites de débit

Capturia émet les headers RFC 9331 (`RateLimit-*`) sur toutes les responses, doublés des headers legacy `X-RateLimit-*` (sunset 2027-05-03). Body 429 enrichi avec un `limit_type` actionnable.

Politique

ScopeFenêtreLimiteViolation
Par clé API1h rolling100 requêtes

429 rate_limit_exceeded avec details.limit_type: per_key et Retry-After

Brute force par IP5 min10 tentatives clé invalide

429 too_many_attempts avec details.limit_type: brute_force et Retry-After: 300

Headers RFC 9331 (émis sur toutes les responses)

HeaderFormatExempleDescription
RateLimit-Limitint100Quota actuel
RateLimit-Remainingint87Requêtes restantes dans la fenêtre
RateLimit-Resetint (delta-seconds)2415Secondes avant reset (entier)
RateLimit-Policystructured100;w=3600Quota structuré (limite + fenêtre en secondes)

Headers legacy (sunset 2027-05-03)

Maintenus en parallèle des RFC 9331 pour ne pas casser les intégrations existantes. À retirer en /v2/.

HeaderFormatExempleDescription
X-RateLimit-Limitint100Quota actuel
X-RateLimit-Remainingint87Requêtes restantes
X-RateLimit-ResetISO 86012026-05-04T11:00:00ZTimestamp absolu du reset

Body 429 enrichi

Le body d'un 429 rate_limit_exceeded contient un details.limit_type qui indique précisément quelle limite a été dépassée — utile pour ajuster ton retry strategy :

{
  "error": {
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded",
    "message": "Rate limit dépassé pour cette clé.",
    "hint": "Attends 2415 secondes avant de réessayer, ou réduis la fréquence des requêtes.",
    "doc_url": "https://capturia.io/fr/developers/api/v1/rate-limits",
    "request_id": "req_01J9X8Z3F4K2M5N7P9Q1R3S5T7",
    "details": {
      "limit_type": "per_key",
      "limit": 100,
      "count": 100,
      "retry_after_seconds": 2415
    }
  }
}

Header Retry-After

Header HTTP standard (RFC 7231) en secondes sur 429 et 503. Toujours respecter cette valeur avant de réessayer — un retry agressif peut prolonger ou amplifier le block.

503 Service Unavailable

Maintenance ou dégradation temporaire d'un service amont. Le header Retry-After est également présent. Aucune route v1 ne retourne 503 aujourd'hui — réservé pour cas futur (circuit-breaker, dépendance externe down).

Bonnes pratiques

  • Respecte Retry-After — ne retry pas avant la valeur indiquée.

  • Backoff exponentiel sur retry après 429 (e.g. 1s, 2s, 4s, 8s avec jitter).

  • Lis RateLimit-Remaining sur tes responses 200 pour anticiper le block (si < 10, slow down).

  • Distingue per_key vs brute_force — un brute_force = clé invalide, donc l'IP est blockée et changer de clé ne suffit pas.

  • Ne contourne pas via plusieurs IPs — Capturia détecte les patterns d'abus et peut suspendre la clé.