Límits de peticions
Quotes per minut i mensuals segons el tier. Capçaleres X-RateLimit-* i back-off recomanat.
L'API pública aplica dos nivells de quota per garantir l'equitat entre tenants i protegir el backend davant de pics:
- Quota per minut (finestra lliscant).
- Quota mensual (calendari natural, es reinicia el dia 1 a les 00:00 Europe/Madrid).
Els límits depenen del tier de la teva API key. El tier per defecte en crear
una clau es controla des de Developers > API Keys > Settings > Default tier, i es pot sobreescriure per clau des del dashboard.
Nivells
| Tier | Per minut | Per mes | Cost |
|---|---|---|---|
| Free | 10 rpm | 100 requests | Inclòs en qualsevol pla. |
| Starter | 30 rpm | 5,000 | Add-on developer_api Starter (€4.90/mes). |
| Pro | 300 rpm | 50,000 | Add-on developer_api Pro (€19.90/mes). |
| Scale | Personalitzat | Personalitzat | Contacta amb vendes. |
Els tiers són acumulatius: un cop esgotada la quota mensual reps
429 rate_limit_exceeded fins al dia 1 del mes següent. La quota per
minut es reinicia amb una finestra lliscant.
Finestra lliscant
El cub per minut no és una finestra fixa de "60 segons des de les 12:00".
És una finestra lliscant: en qualsevol moment, l'API compta quantes
peticions acceptades hi ha en els darrers 60 segons per a la teva clau. Quan el
comptador iguala el límit, les peticions següents responen 429 fins que
passa prou temps perquè les primeres peticions "surtin" de la finestra.
Per què: no hi ha cap "minut de gràcia" cada 60 segons en què poguessis enviar el doble del límit. Més just i més estable sota trànsit real.
Capçaleres de resposta
Tota resposta (inclòs 429) inclou:
| Capçalera | Significat |
|---|---|
X-RateLimit-Limit | Límit per minut del teu tier. |
X-RateLimit-Remaining | Peticions restants a la finestra actual. |
X-RateLimit-Reset | Timestamp UNIX en què s'allibera un lloc (una petició surt de la finestra). |
Retry-After | Només en 429. Segons fins que pots reintentar. |
Exemple de capçaleres en una resposta 200:
HTTP/1.1 200 OK
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
X-RateLimit-Reset: 1747314060I en un 429:
HTTP/1.1 429 Too Many Requests
Retry-After: 7
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1747314007Codi d'error
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Has superado el límite de peticiones. Vuelve a intentarlo en unos segundos.",
"request_id": "req_..."
}
}Superar la quota per minut o la mensual respon 429 amb
type: rate_limit_error i code: rate_limit_exceeded. La capçalera
Retry-After (i el missatge) t'indiquen quant has d'esperar.
Els errors d'autenticació repetits es limiten per separat amb
code: too_many_auth_failures.
Bones pràctiques
1. Respecta Retry-After
import time, requests
def call_with_retry(url, **kwargs):
while True:
resp = requests.get(url, **kwargs)
if resp.status_code != 429:
return resp
sleep = int(resp.headers.get('Retry-After', 1))
time.sleep(sleep)2. Back-off exponencial amb jitter
Per a 5xx, on no hi ha Retry-After:
import random, time
def backoff(attempt):
return min(60, (2 ** attempt) * 0.1 + random.uniform(0, 0.5))
for attempt in range(5):
resp = requests.get(url)
if resp.status_code < 500:
break
time.sleep(backoff(attempt))3. Monitoritza X-RateLimit-Remaining
Si la teva integració s'acosta de manera consistent al 10% del límit, considera:
- Pujar de tier.
- Agrupar en lots: en comptes de N POSTs, agrega i fes 1 POST.
- Cachejar lectures freqüents (productes, impostos, sèries).
- Subscriure't a webhooks en comptes de fer polling.
4. Webhooks > polling
Si fas polling de /v1/invoices?status=paid cada minut per detectar pagaments
consumeixes 30 rpm només per a això. Subscriu-te a l'esdeveniment invoice.paid
i redueix-ho a 0 peticions.
5. Tier per integració
Si tens dues integracions (un dashboard intern + un cron d'exportació), crea dues claus diferents amb tiers dimensionats per a cadascuna. Així un cron pesat no esgota el pressupost d'un dashboard interactiu.
Quotes administratives
Alguns endpoints tenen quotes addicionals independents del rate limit principal:
| Endpoint | Quota |
|---|---|
POST /v1/webhook_endpoints | Nombre limitat d'endpoints per empresa. |
POST /v1/invoices/{id}/send | Limitat per factura per evitar emails duplicats. |
GET /v1/invoices/{id}/pdf | Generacions de PDF limitades per minut. |
Aquests límits responen 429 amb type: rate_limit_error i un missatge
específic.
Pujada de tier
Canviar de tier no requereix rotar claus. Després de subscriure't a un add-on superior:
- Les noves quotes apliquen immediatament.
- La quota mensual consumida al tier anterior no es reinicia: només creix el topall mensual.
- Les claus existents conserven el seu
idi el seu tier; gestiona els tiers des del dashboard (Developers > API Keys).