Límites de uso
Cuántas peticiones por minuto, qué devuelve un 429 y cómo reintentar bien.
El límite se cuenta por llave, no por IP: si tu servidor comparte salida con otros —cualquier nube lo hace— nadie te gasta tu cuota.
Cuántas peticiones por minuto depende de tu plan. No lo escribas fijo en tu código: léelo de
la cabecera RateLimit-Limit de cualquier respuesta, o de
GET /v1/plan en limits.limit_api_requests_per_minute.
Si tu plan no declara un tope, se aplican 120 por minuto; si dice «sin tope» (null), el techo práctico es de 6.000 por minuto, para proteger la base de una llave en bucle.
Además hay un freno por IP de 300 peticiones por minuto antes de mirar la llave. Solo existe para que una avalancha sin credencial no llegue a la base; una integración normal nunca lo roza.
El asistente conectado por MCP usa la misma cuota que la llave: no son dos bolsas aparte.
Además, tres operaciones tienen un freno propio, porque cada petición es trabajo pesado (una lectura con IA o un extracto entero):
| Qué | Límite | Al pasarlo |
|---|---|---|
| Verificaciones con una llave de prueba | 10 por minuto y 200 cada 24 horas, por llave | 429 RATE_LIMITED / 429 TEST_MODE_LIMIT_REACHED |
| Leer facturas con IA | 20 por minuto y 300 al día, por negocio | 429 RATE_LIMITED |
| Extractos leyéndose a la vez | 3 por negocio | 429 STATEMENT_UPLOADS_IN_PROGRESS |
Toda respuesta trae el estado actual:
RateLimit-Limit: 120
RateLimit-Remaining: 117
RateLimit-Reset: 43Cuando te pasas
HTTP/1.1 429 Too Many Requests
Retry-After: 43{
"error": {
"code": "RATE_LIMITED",
"message": "Demasiadas peticiones. Espera unos segundos y reintenta.",
"requestId": "req_914fc7cb6c4d4192b6616aace5c10c62"
}
}Respeta Retry-After. Reintentar de inmediato solo consume tu propia cuota.
async function conReintentos(fn, maxIntentos = 4) {
for (let i = 1; i <= maxIntentos; i++) {
const res = await fn();
if (res.status !== 429) return res;
const espera = Number(res.headers.get('Retry-After') ?? 2 ** i);
// Un poco de aleatoriedad para que N procesos no reintenten todos a la vez.
await new Promise((r) => setTimeout(r, (espera + Math.random()) * 1000));
}
throw new Error('Verifika: límite de peticiones excedido tras varios reintentos');
}Cómo no llegar al límite
- Pide páginas de 100, no de 10. Diez veces menos peticiones por el mismo dato.
- Filtra por fecha en lugar de traer todo y descartar en tu lado.
- No hagas polling cada segundo. Para enterarte de un pago en el momento, lo que corresponde son los webhooks. Ver Cuando el comprobante llega antes que el banco.
- Cachea lo que casi no cambia, como
/v1/plano la lista de sucursales.