Limitation de débit
L'API Facturino impose une limitation de débit par clé API pour protéger la plateforme contre les abus et garantir la stabilité du service. Chaque requête retourne des headers indiquant votre quota restant — surveillez-les pour anticiper un dépassement.
Limites par plan
| Plan | Débit (req/min) | Quota mensuel | Webhooks | Stockage |
|---|---|---|---|---|
| Gratuit | 100 | 1 000 | — | 100 Mo |
| Essential | 300 | 10 000 | 5 | 1 Go |
| Pro | 1 000 | 50 000 | 20 | 10 Go |
Les limites s'appliquent par clé API et par minute glissante. En mode test
(fac_test_), les requêtes GET sont
exemptées de la limite par minute, et
toutes les requêtes test sont exemptées du quota mensuel —
le bac à sable (sandbox) est illimité. Les appels internes de warmup et de
santé sont également exemptés.
Headers retournés
Chaque réponse inclut trois headers pour suivre votre consommation :
HTTP/1.1 200 OK
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1709891260
X-Request-Id: req_8a3b9f2e1d | Header | Signification |
|---|---|
X-RateLimit-Limit | Limite nominale de la fenêtre courante (60 secondes) |
X-RateLimit-Remaining | Requêtes restantes avant blocage |
X-RateLimit-Reset | Timestamp Unix (secondes) à partir duquel le compteur sera réinitialisé |
X-Request-Id | Identifiant unique de la requête (à fournir au support) |
Réponse 429
Au dépassement, l'API retourne 429 Too Many Requests avec un header Retry-After :
HTTP/1.1 429 Too Many Requests
Retry-After: 24
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1709891260
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry after 24 seconds.",
"hint": "Slow down your request rate or upgrade your plan.",
"request_id": "req_..."
}
}
Le header Retry-After indique le nombre de secondes à attendre. C'est une consigne ferme — ne retentez pas avant la fin du délai,
sinon vous risquez un blocage prolongé.
Stratégie de retry recommandée
Respectez le header Retry-After en priorité ; à défaut (situation rare), utilisez un backoff exponentiel avec jitter aléatoire pour éviter les tempêtes de retry simultanées.
Node.js :
async function withRetry(fn, attempts = 5) {
for (let i = 0; i < attempts; i++) {
try {
return await fn()
} catch (err) {
if (err.type !== 'rate_limit_error') throw err
// Respecter Retry-After ; fallback à un backoff exponentiel
const delay = (err.retryAfterMs ?? 2 ** i * 1000) + Math.random() * 200
await new Promise(r => setTimeout(r, delay))
}
}
throw new Error('Max retries exceeded')
}
await withRetry(() => facturino.invoices.create({ ... })) Python :
import time, random
def with_retry(fn, attempts=5):
for i in range(attempts):
try:
return fn()
except RateLimitError as e:
delay = (e.retry_after or 2 ** i) + random.uniform(0, 0.2)
time.sleep(delay)
raise Exception("Max retries exceeded") Limites spécifiques par endpoint
Certains endpoints coûteux ont des quotas dédiés, indépendants de la limite globale.
Ces limites ne s'appliquent qu'en mode production (fac_live_) ; le bac à sable (sandbox) en est exempté.
| Endpoint | Limite | Raison |
|---|---|---|
POST /v1/invoices/:id/finalize | 10 / min | Réservation atomique de numéro |
POST /v1/exports/fec | 5 / jour | Génération FEC sur plages longues |
POST /v1/customers/import | 2 / heure | Import CSV en lot (max 10 000 lignes) |
Calls PA send | 1 / facture (idempotence) | Évite les doublons sur le portail DGFiP |
Augmenter les limites
Si votre intégration nécessite un débit supérieur au plan Pro,
contactez le support en précisant :
- Le pattern de trafic attendu (pic / heure, total / jour)
- Le cas d'usage (intégration ERP, marketplace, plateforme SaaS…)
- Le volume mensuel de factures
Étapes suivantes
- Idempotence — sécuriser les retries
- Gestion des erreurs — interpréter
429et les autres codes - Webhooks — alternative au polling, sans quota