Ir al contenido

Límites de uso

La API tiene un presupuesto de llamadas por minuto. Es de la empresa, no de la clave.

PlanAPILlamadas por minutoClaves activas
GratisNo00
StartSí603
PlenoSí18010
SupraSí60025

Esta tabla se genera del código que decide de verdad: es la misma función que la API llama en cada solicitud para saber si la llamada pasa.

El tope que vale para su empresa ahora viene en la respuesta de GET /public/v1/me, en limits.requests_per_minute. Léalo de ahí en vez de fijar el número en su código: la empresa puede cambiar de plan, y el panel también permite ajustar el valor de una empresa en particular.

Un cambio de plan tarda hasta un minuto en valer en la API, porque el plan resuelto queda en memoria por ese tiempo.

Toda respuesta que pasa por el contador trae tres encabezados:

EncabezadoQué esCómo usarlo
RateLimit-LimitEl tope por minuto de la empresaCompárelo con lo que planea disparar
RateLimit-RemainingCuántas llamadas todavía caben en la ventanaPor debajo de un margen suyo, baje el ritmo antes de recibir un 429
RateLimit-ResetEn cuántos segundos se abre el próximo lugarÚselo como intervalo mínimo cuando RateLimit-Remaining llegue a cero

En el 429 entra un cuarto:

EncabezadoQué es
Retry-AfterCuántos segundos esperar antes de intentar de nuevo

La ventana es deslizante: mira los últimos 60 segundos a partir de ahora, no el minuto del reloj. Por eso el RateLimit-Reset baja de a poco en vez de volver a cero de una vez.

Una empresa sin tope en la aplicación no pasa por el contador, y entonces esos encabezados no aparecen. En ese caso limits.requests_per_minute viene null en GET /public/v1/me.

{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Se alcanzó el límite de llamadas por minuto. Intente de nuevo en unos instantes.",
"request_id": "3d81b6ac-2f45-4a0e-9c7b-1e5f8a2d4c60",
"doc_url": "https://docs.fatureihoje.com/es/errors#rate_limit_exceeded"
}
}
  1. Espere lo que dice el Retry-After. Viene en segundos y se calcula sobre la ventana real, no es una estimación.
  2. Retroceda progresivamente. Si el segundo 429 llega enseguida, duplique la espera en cada intento, hasta un tope suyo.
  3. Disperse un poco. Sume algunos milisegundos aleatorios a la espera. Sin eso, varias colas que recibieron 429 en el mismo instante vuelven juntas en el mismo instante.
  4. Nunca repita en un bucle apretado. Repetir al instante no sirve y además atrasa las llamadas buenas de la misma empresa, que comparten el mismo contador.

Una llamada rechazada por permiso es distinta: el 403 ocurre después del contador y sí gasta presupuesto, a propósito. Sondear una ruta que la clave no puede usar no sale gratis.

Ventana de terminal
curl -sS -D - -o /dev/null https://api.fatureihoje.com/public/v1/me \
-H "Authorization: Bearer $FH_API_KEY"

-D - imprime los encabezados y -o /dev/null descarta el cuerpo.

El presupuesto por minuto no es el único contador. La autenticación tiene un tope propio de fallas por IP: una clave equivocada repetida muchas veces en el mismo minuto pasa a recibir 429 incluso antes de que la clave sea verificada. Ese contador solo cuenta lo que salió mal, así que el uso normal no lo roza. Está descrito en Autenticación.

Los dos usan el mismo code, rate_limit_exceeded, y los dos traen Retry-After. La diferencia aparece en el contexto: si sus llamadas están siendo aceptadas y de repente llega un 429, es el presupuesto de la empresa; si están siendo rechazadas con 401 y después se convierte en 429, es el tope de fallas.

La tabla de arriba también trae cuántas claves activas permite cada plan. Una clave revocada y una clave vencida no cuentan; una clave en convivencia de rotación sí cuenta, porque todavía autentica.

Pasar de ese número devuelve plan_limit_reached, con estado 403. Rotar una clave existente no choca con ese límite; crear una más, sí.

  • Errores: el catálogo completo, con rate_limit_exceeded y plan_limit_reached.
  • Paginación: recorrer una lista larga es lo que más consume presupuesto.