Rate limits
Hay dos sistemas distintos y se aplican de forma independiente:
- uno protege el login contra brute force y credential stuffing
- otro protege los endpoints autenticados contra uso desmedido
Rate limit del login
Por usuario
Se cuentan los fallos de las últimas 24 horas y el cooldown sube progresivamente.
| Fallos en 24h | Cooldown | Mensaje |
|---|---|---|
| 1-3 | Sin cooldown | Credenciales inválidas |
| 4-5 | 30 segundos | Demasiados intentos (X). Espere 30 segundos |
| 6-10 | 5 minutos | Demasiados intentos (X). Espere 5 minutos |
| 11-20 | 15 minutos | Demasiados intentos (X). Espere 15 minutos |
| 21-49 | 1 hora | Demasiados intentos (X). Espere 1 hora |
| 50+ | 24 horas | Cuenta bloqueada por 24 horas |
Por IP
La IP solo se evalúa si el usuario no está en cooldown.
| Ventana | Límite | Cooldown al exceder |
|---|---|---|
| 1 minuto | 10 intentos | 60 segundos |
| 15 minutos | 30 intentos | 15 minutos |
| 1 hora | 60 intentos | 1 hora |
| 24 horas | 150 intentos | 24 horas |
Jerarquía:
- evaluá usuario
- si no bloquea, evaluá IP
- si ambos pasan, seguí con el login
Rate limit de endpoints autenticados
Además del login, la API aplica límites sobre requests autenticadas. Hay dos niveles simultáneos:
| Nivel | Qué mide | Límite |
|---|---|---|
| Por usuario | Requests del mismo usuario autenticado | Configurable por código |
| Por IP | Requests desde la misma dirección IP | Configurable por código |
Si cualquiera se excede, la solicitud se rechaza con HTTP 429. Algunas IPs y usuarios pueden entrar en whitelist para casos especiales.
Cada request queda registrado con usuario, IP, endpoint y método HTTP.
Respuestas HTTP
Rate limit por usuario
{
"error": "Demasiados intentos fallidos (8 intentos). Espere 5 minutos antes de reintentar.",
"error_code": "RATE_LIMIT_USER",
"retry_after": 300
}
Rate limit por IP
{
"error": "Demasiados intentos desde su IP. Intente nuevamente en 60 segundos.",
"error_code": "RATE_LIMIT_IP",
"retry_after": 60
}
Cuenta bloqueada
{
"error": "Cuenta bloqueada por seguridad durante 24 horas. Contacte al administrador o espere.",
"error_code": "ACCOUNT_LOCKED",
"retry_after": 86400
}
Endpoints autenticados
{
"success": false,
"message": "Too Many Requests. User rate limit exceeded",
"identifier": 821,
"limit": 100,
"current": 101
}
{
"success": false,
"message": "Too Many Requests. IP rate limit exceeded",
"identifier": "172.19.0.1",
"limit": 200,
"current": 201
}
Cómo manejar 429 desde el cliente
Leé el header Retry-After, esperá el tiempo indicado y recién ahí reintentá. No hagas retries agresivos ni loops cortos.
Ver también Autenticación para el rate limit del login y Errores para el formato general de las respuestas.