Saltar al contenido principal

Límite de solicitudes

El límite de solicitudes protege a la API del abuso y garantiza un uso justo entre todos los tenants. Cada endpoint impone un límite sobre cuántas solicitudes puede hacer un mismo usuario dentro de una ventana de tiempo dada.

Estrategias

La API usa tres estrategias distintas de límite de solicitudes según el endpoint:

Ventana deslizante

Usada por la mayoría de los endpoints. Una ventana deslizante rastrea las solicitudes a lo largo de un período de tiempo móvil.

  • Si el límite es de 10 solicitudes por 60 segundos, cada solicitud lleva una marca de tiempo.
  • Cuando llega una nueva solicitud, el sistema cuenta cuántas solicitudes se hicieron en los últimos 60 segundos.
  • Si el conteo excede el límite, la solicitud se rechaza con un estado 429.

Esto ofrece una experiencia más suave en comparación con las ventanas fijas — no hay un "abismo de reinicio" donde toda la capacidad se restaura de golpe.

Token bucket

Usado por el endpoint de telemetría para la ingesta de datos GPS. El token bucket permite ráfagas cortas mientras impone una tasa sostenida.

ParámetroGlobalPor IMEI
Capacidad del bucket180 tokens90 tokens
Tasa de recarga30 tokens/seg15 tokens/seg
Costo1 token por 20 puntos GPS1 token por 20 puntos GPS

En la práctica esto significa:

  • Throughput sostenido: ~600 puntos GPS/segundo a nivel global, ~300 puntos/segundo por dispositivo
  • Capacidad de ráfaga: hasta 3.600 puntos GPS en una sola solicitud (180 tokens × 20 puntos)
  • Un lote de 100 puntos GPS cuesta 5 tokens. Si el bucket está vacío, la solicitud se rechaza hasta que se recarguen los tokens

Fuerza bruta en inicio de sesión

Usado exclusivamente por el endpoint de inicio de sesión para prevenir ataques de relleno de credenciales.

  • Límite: 5 intentos por ventana de 30 segundos
  • Duración del bloqueo: 60 segundos después de exceder el límite
  • Durante el período de bloqueo, todos los intentos de inicio de sesión desde la misma fuente se rechazan de inmediato
peligro

Después de 5 intentos fallidos de inicio de sesión dentro de 30 segundos, tu cuenta se bloquea por 60 segundos. No hay forma de evitar este bloqueo — debés esperar a que expire.

Políticas de límite de solicitudes por grupo de endpoints

GrupoEstrategiaLímiteVentana
Loginlogin-bruteforce5 intentosventana de 30s, bloqueo de 60s
Telemetríatoken-bucketcapacidad 180recarga 30/seg
Flota — Dispositivossliding-window30 sol.60 seg
Flota — Conductoressliding-window30 sol.60 seg
Reportes — AVLsliding-window10 sol.60 seg
Reportes — GT Analyticssliding-window10 sol.60 seg
Reportes — GT Operationssliding-window10 sol.60 seg
Reportes — Generalsliding-window10 sol.60 seg
Reportes — CPMsliding-window10 sol.60 seg
Reportes — Portalsliding-window10 sol.60 seg
Cuentassliding-window10 sol.60 seg
Clientessliding-window10 sol.60 seg
Workflow (lectura)sliding-window30 sol.60 seg
Workflow (escritura: start/cancel/complete/reassign)sliding-window10 sol.60 seg
Kanban (lectura)sliding-window30 sol.60 seg
Kanban (escritura)sliding-window10 sol.60 seg
Portal de Proveedores (lectura)sliding-window30 sol.60 seg
Portal de Proveedores (escritura)sliding-window10 sol.60 seg

Encabezados de respuesta

Cada respuesta de la API incluye información del límite de solicitudes en los encabezados:

EncabezadoDescripciónPresente en
X-RateLimit-LimitMáximo de solicitudes permitidas en la ventana actualTodas las respuestas
X-RateLimit-RemainingSolicitudes restantes en la ventana actualTodas las respuestas
X-RateLimit-ResetMarca de tiempo Unix (segundos) en la que se reinicia la ventanaTodas las respuestas
Retry-AfterSegundos a esperar antes de reintentarSolo respuestas 429
nota

El endpoint de inicio de sesión es la excepción: cuando devuelve un 429, envía solo el encabezado Retry-After y ningún encabezado X-RateLimit-*. Todos los demás endpoints incluyen X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset.

Leer los encabezados de forma proactiva

No esperes a un 429 para reaccionar — monitoreá X-RateLimit-Remaining en cada respuesta y regulá tus solicitudes antes de llegar al límite:

const response = await fetch(
`https://${TENANT}/apidev/v1/fleet/devices?limit=25`,
{ headers }
);

const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'), 10);
const resetAt = parseInt(response.headers.get('X-RateLimit-Reset'), 10);

if (remaining <= 2) {
const waitMs = (resetAt - Math.floor(Date.now() / 1000)) * 1000;
console.warn(`Rate limit almost exhausted. ${remaining} left. Pausing ${waitMs}ms...`);
await new Promise((resolve) => setTimeout(resolve, waitMs));
}

Manejo de respuestas 429

Cuando recibís un 429 Too Many Requests, usá el encabezado Retry-After para esperar el tiempo exacto requerido. Para una implementación completa de backoff exponencial que maneja tanto errores 429 como 500, ver la Estrategia de reintentos en Manejo de errores.

Ejemplo rápido en línea:

# Check headers on any response
curl -s -D - \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
"https://$TENANT/apidev/v1/fleet/devices?limit=5" \
| grep -i "x-ratelimit\|retry-after"

# X-RateLimit-Limit: 30
# X-RateLimit-Remaining: 28
# X-RateLimit-Reset: 1743782520

Alcance y concurrencia

Los límites de solicitudes tienen alcance por tenant, por usuario. Reglas clave:

PreguntaRespuesta
¿Distintos usuarios comparten un límite?No. Cada usuario tiene límites independientes.
¿Puedo usar varias claves de API para evadir los límites?No. Los límites están atados al usuario, no a la clave.
¿Puedo usar varias cuentas de usuario para paralelizar?Técnicamente sí, pero esto se considera abuso y puede derivar en una regulación a nivel de tenant. Si necesitás mayor throughput, contactá a tu ejecutivo de cuenta para conversar un plan de límite de solicitudes a medida.
¿Las operaciones de lectura y escritura comparten un límite?Depende del grupo. Para la mayoría de los grupos, GET y POST/PUT/DELETE comparten una ventana. Para Workflow, Kanban y Portal de Proveedores, las lecturas (30 sol./min) y escrituras (10 sol./min) se rastrean como ventanas separadas.