Aller au contenu

Rate limits

Pionne applique deux niveaux de rate limit indépendants : côté SDK (anti-runaway loop dans ton app) et côté serveur (anti-abuse en cas de token leaké). Les deux protègent ton quota mensuel.

Tous les endpoints publics authentifiés par X-Pionne-Token (/ingest, /sessions, /feedback, /profiles) sont rate-limités par token, pas par IP.

Sur mobile, l’IP source est un NAT carrier partagé par des milliers d’users. Throttler par IP soit casse les apps légitimes en heure de pointe, soit ne protège rien (un attaquant change d’IP en 4G).

Throttler par token, c’est :

  • L’unité de blast radius réelle : un token leaké = un projet impacté, pas tout l’écosystème.
  • Stable : un user qui passe du Wi-Fi à la 4G garde son token, pas de glitch.
  • Aligné avec le quota mensuel : tu pries le throttle dans la même unité que ton billing.

Au-delà de la limite, l’API répond :

HTTP/1.1 429 Too Many Requests
Retry-After: 42

Le SDK fait silencieusement échouer l’envoi (try/catch interne). Aucune erreur remontée à l’app hôte.

Pour les projets enterprise qui ont besoin de plus, un quota custom sera bientôt configurable par projet via Settings → Project → Rate limit. Si tu en as besoin tout de suite, contacte-nous.

Le SDK lui-même applique un rate limit côté process via l’option maxEventsPerSecond :

Pionne.init({
token: '...',
maxEventsPerSecond: 10, // défaut raisonnable
});

C’est un token bucket : capacité = burst, refill = maxEventsPerSecond/sec, drop silencieux au-delà.

Le cas typique : un useEffect mal écrit qui throw en boucle :

useEffect(() => {
throw new Error('oops');
}, [stateThatChangesEveryRender]);

Sans rate limiter, ton app envoie des dizaines d’events par seconde à Pionne, drain ton quota mensuel en quelques minutes. Le token bucket cap ça, puis drop.

En dev (__DEV__), le SDK warn périodiquement dans la console pour que tu détectes la fuite :

[Pionne] rate-limit reached (250 events dropped). Bump maxEventsPerSecond if intentional.

Pour les apps qui font du batch ou qui ont un legitimate burst :

Pionne.init({
token: '...',
maxEventsPerSecond: 0, // disabled
});
ScénarioLimite clientLimite serveur
Boucle d’erreur dans ton code✅ token bucket✅ backup serveur
Token volé + spammé depuis une autre app❌ (l’attaquant peut désactiver)✅ 429
Test de charge accidentel✅ + ✅
Attaque DDoS volumétrique(peu utile)Cloudflare devant + 429