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.
Limite serveur — par token
Section intitulée « Limite serveur — par token »Tous les endpoints publics authentifiés par X-Pionne-Token (/ingest, /sessions, /feedback, /profiles) sont rate-limités par token, pas par IP.
Pourquoi par token et pas par IP ?
Section intitulée « Pourquoi par token et 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.
Réponse en cas de dépassement
Section intitulée « Réponse en cas de dépassement »Au-delà de la limite, l’API répond :
HTTP/1.1 429 Too Many RequestsRetry-After: 42Le SDK fait silencieusement échouer l’envoi (try/catch interne). Aucune erreur remontée à l’app hôte.
Override par projet (à venir)
Section intitulée « Override par projet (à venir) »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.
Limite client — token bucket
Section intitulée « Limite client — token bucket »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à.
Anti-runaway loop
Section intitulée « Anti-runaway loop »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.Désactiver
Section intitulée « Désactiver »Pour les apps qui font du batch ou qui ont un legitimate burst :
Pionne.init({ token: '...', maxEventsPerSecond: 0, // disabled});Ce que ça protège
Section intitulée « Ce que ça protège »| Scénario | Limite client | Limite 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 |
Voir aussi
Section intitulée « Voir aussi »- Tokens & rotation — régénère ton token si tu suspectes une fuite.
- Bundle ID binding — couche orthogonale qui rejette les events d’un autre bundle.
- API Ingest — détails du endpoint.