Saltar al contenido

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

nginx
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

python
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
HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0

Herramientas 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.

Códigos relacionados

Ver todos los códigos de estado HTTP