4xx · Errores del cliente
Error 429 Too Many Requests: qué significa y cómo solucionarlo
El error 429 Too Many Requests significa que has enviado demasiadas peticiones en poco tiempo y el servidor te limita temporalmente (rate limiting). La cabecera Retry-After indica cuántos segundos esperar. Es habitual en APIs, en formularios de login y cuando un script o bot hace peticiones en bucle.
Qué significa el código 429
Los servidores limitan las peticiones por IP, por usuario o por API key para protegerse de abusos, ataques de fuerza bruta y picos que podrían tumbarlos. Al superar el límite responden 429 hasta que pasa la ventana de tiempo.
Un cliente bien hecho respeta Retry-After y, si no existe, reintenta con espera exponencial (1 s, 2 s, 4 s, 8 s…) en lugar de insistir a toda velocidad, que solo alarga el bloqueo.
Causas habituales del error 429
- Scripts o integraciones que llaman a una API en bucle sin pausa.
- Varias personas detrás de la misma IP pública (oficina, universidad, CGNAT del operador móvil).
- Intentos de login repetidos.
- Googlebot rastreando muy deprisa una web con rate limiting estricto.
Si eres visitante de la web
- Espera unos minutos y vuelve a intentarlo.
- Si usas VPN, prueba sin ella: comparte IP con mucha gente.
Cómo solucionar el error 429
- Respeta la cabecera Retry-After e implementa backoff exponencial con jitter.
- Cachea las respuestas que no cambian en lugar de pedirlas una y otra vez.
- Como administrador, ajusta el límite (limit_req en nginx) y deja un margen de ráfaga con burst.
- Excluye del límite a los rastreadores verificados si están recibiendo 429.
Configuración y comandos
nginx: 10 peticiones por segundo por IP con ráfagas de 20
http {
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_status 429;
}
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend:8001;
}
}Python: reintentos con backoff
import time, httpx
def get_con_reintentos(url, intentos=5):
for i in range(intentos):
r = httpx.get(url)
if r.status_code != 429:
return r
espera = int(r.headers.get("Retry-After", 2 ** i))
time.sleep(espera)
r.raise_for_status()Ejemplo de respuesta
HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0Herramientas para comprobarlo
Preguntas frecuentes
¿Cuánto dura un error 429?
Depende del servidor. La cabecera Retry-After lo indica en segundos; si no aparece, suele bastar con esperar entre uno y quince minutos.
¿El 429 afecta al SEO?
Si Googlebot recibe 429 de forma continuada, reduce la velocidad de rastreo y puede tardar más en indexar páginas nuevas. Conviene que el límite no afecte a los rastreadores legítimos.