The user has sent too many requests in a given amount of time (rate limiting).
The user has sent too many requests in a given amount of time ("rate limiting"). The server is rejecting requests to protect itself from being overwhelmed. This response is the standard way servers enforce rate limits, and it should include a Retry-After header indicating how long the client should wait before making another request.
A 429 error occurs when you exceed the server's configured rate limit. Most APIs set limits on how many requests a client can make within a time window (e.g., 100 requests per minute, 1000 requests per hour). Once you exceed this threshold, every subsequent request is rejected with a 429 until the rate limit window resets.
This is a deliberate protective mechanism. Without rate limiting, a single client could overwhelm the server, causing degraded performance for all users. You'll see this when scraping websites, making rapid API calls, or when your application has a bug causing excessive requests.
Platform-Specific Notes:
Nginx Uses limit_req module with limit_req_zone directive. Configure burst and nodelay for flexible rate limiting.
Apache Uses mod_ratelimit or mod_evasive for rate limiting. Configure per-IP or per-session limits.
Cloudflare Rate Limiting rules can be configured in the dashboard. Also triggers automatically via DDoS protection and Bot Management.
Node.js Common middleware: express-rate-limit, rate-limiter-flexible. Configure per route or globally with Redis-backed stores for distributed systems.
# Client exceeds rate limit (101st request in 1 minute) GET /api/data HTTP/1.1 Host: api.example.com Authorization: Bearer eyJhbGciOiJIUzI1NiIs... # Server Response HTTP/1.1 429 Too Many Requests Content-Type: application/json Retry-After: 30 X-RateLimit-Limit: 100 X-RateLimit-Remaining: 0 X-RateLimit-Reset: 1708444800 { "error": "Too Many Requests", "message": "Rate limit exceeded. You've made 101 requests in the last 60 seconds (limit: 100).", "retry_after": 30, "statusCode": 429 } # Exponential backoff pseudocode: # attempt 1: wait 1s + random(0-500ms) # attempt 2: wait 2s + random(0-500ms) # attempt 3: wait 4s + random(0-500ms) # attempt 4: wait 8s + random(0-500ms)
Retry-After header in the 429 response - it tells you exactly how many seconds to wait (e.g., Retry-After: 30 means wait 30 seconds) or provides a specific date/time. If no Retry-After header is present, use exponential backoff: start with 1 second, then double it each retry (2s, 4s, 8s, 16s...) with some random jitter added. Most APIs also include rate limit headers like X-RateLimit-Reset that tell you exactly when your rate limit window resets.Track rate limit usage and detect 429 errors across your APIs. Get alerted when your services are being throttled.
Start Free Monitoring