429 Too Many Requests: what it means and how long to wait
Short answer
A 429 Too Many Requests means the server's rate limit caught you: you sent more requests in some window than it allows for your key, account or IP. Wait as long as the Retry-After header says (seconds, or a date), or until the time in a reset header such as GitHub's x-ratelimit-reset. If there is neither, back off with growing, randomized delays. In our test of 100 calls against one limit, retry policies drew 210 to 308 rejections; a client that paced itself drew 0.

Part of the article Exponential backoff with jitter: 64 of 100 LLM calls still failed. This page answers one question from it in depth.
On this page · 10 sections
A 429 is the provider setting the speed limit for its road. Fair enough, it is their road. The trouble is that most APIs never post the sign: when we sent one request to 17 public APIs, only 3 told us the limit in their headers before we hit it. So the fix is yours to build.
Key numbers
| What | Number | Source (checked Oct 25 2026) |
|---|---|---|
| Status code defined in | RFC 6585, April 2012 | RFC 6585 section 4 |
| Retry-After format | seconds ("120") or an HTTP date | RFC 9110 section 10.2.3 |
| GitHub REST limit, no token / with a token | 60 / 5,000 requests an hour | GitHub rate limits |
| GitHub wait with no header | at least 1 minute, then exponential | same |
| GitHub concurrent request cap | 100 | same |
| Discord global limit per bot | 50 requests a second | Discord rate limits |
| Discord ban threshold for invalid requests (401, 403, 429) | 10,000 per 10 minutes | same |
| Public APIs that showed their limit in headers | 3 of 17 (GitHub, GitLab, Docker Hub) | our header survey, Oct 25 2026 |
| 429s drawn finishing 100 calls: retry policies vs pacing | 210 to 308 vs 0 | our backoff test, Oct 18 2026 |
What a 429 actually says
The code comes from RFC 6585, written by Mark Nottingham and Roy Fielding in April 2012: the user "has sent too many requests in a given amount of time". The response may include a Retry-After header, and it must not be cached.
Just as important is what the standard leaves out. It "does not define how the origin server identifies the user, nor how it counts requests." Every API decides for itself whether it counts per key, per account, per IP address, per endpoint or per model, and over which window. That is why the same code means "slow down for a second" on one API and "come back in an hour" on another.
How long to wait
Read the response before you retry. In order of preference:
- Retry-After. Per RFC 9110, it is either a whole number of seconds (
Retry-After: 120means 2 minutes) or an HTTP date. OpenAI's docs say to treat it as a minimum and add a small random delay so many clients do not retry at the same instant. - A reset header. GitHub sends
x-ratelimit-resetas a Unix time in seconds; whenx-ratelimit-remainingis 0, wait until then. Anthropic sendsanthropic-ratelimit-requests-resetas an RFC 3339 time. Paste a Unix value into our timestamp converter to read it. - A body field. Discord puts
retry_after(a float in seconds) in the JSON body as well as the header. Stack Exchange reportsquota_remainingin every response body. - Nothing. Back off exponentially with full jitter (a random wait between zero and a growing cap), and give up after a set number of tries. GitHub's docs say to wait at least one minute for a secondary limit, and warn that continuing to hammer "may result in the banning of your integration".
Here is the whole policy in a few lines of Python:
import random, time, email.utils, requests
def get(url, tries=6, cap=60):
for attempt in range(tries):
r = requests.get(url, timeout=30)
if r.status_code != 429:
return r
ra = r.headers.get("Retry-After")
if ra and ra.isdigit():
wait = int(ra)
elif ra:
wait = max(0, email.utils.parsedate_to_datetime(ra).timestamp() - time.time())
elif r.headers.get("x-ratelimit-remaining") == "0":
wait = max(0, int(r.headers["x-ratelimit-reset"]) - time.time())
else:
wait = random.uniform(0, min(cap, 2 ** attempt))
time.sleep(wait + random.uniform(0, 1)) # jitter so clients spread out
raise RuntimeError(f"still rate limited after {tries} tries")
What we found when we asked 17 APIs
On October 25, 2026 at 2:10 PM ET we sent one plain GET, with no token, to 17 public APIs and recorded every rate-limit header that came back.
Our header survey, Oct 25 2026, 2:10 PM ET. Full list with the raw headers in the data file on this page.
- GitHub sent
x-ratelimit-limit: 60,remaining: 59and a reset exactly one hour after our first call: a fixed hourly window. - GitLab used the newer header style without the
x-prefix (ratelimit-limit: 500,ratelimit-name: throttle_unauthenticated_api) with a reset at the top of the next minute. - Docker Hub sent
x-ratelimit-limit: 3000, 3000;w=60: 3,000 requests per 60-second window. - Stack Exchange sent no headers but put
quota_max: 300in the JSON body. - crates.io, npm, PyPI, Wikipedia, Hacker News, SEC EDGAR, Kalshi, Open-Meteo and CoinGecko sent nothing about limits. Some publish a policy in their docs instead (SEC EDGAR's is a maximum of 10 requests a second), so the limit lives in a web page your code never reads.
- Reddit answered our scripted request with a 403 and
retry-after: 0; Anthropic and OpenAI answered 401 without a key, as expected.
Ten of the 14 that served us gave no machine-readable hint at all. The provider knows your budget to the request; you find out by being rejected.
Why retrying harder backfires
In our exponential backoff test we fired 100 LLM-style calls at once at a token bucket that allows a burst of 20 and refills 10 a second. Every retry policy eventually got through, but each one paid for it in rejections: 210 to 308 429s for 100 answers, two to three rejections for every success. Honoring Retry-After finished all 100 in 11.8 seconds. A client-side limiter that simply sent requests at the refill rate finished in 8.0 seconds and drew zero 429s.
Which errors to retry, from Anthropic's errors and rate-limit docs; the 429-without-retry-after rule rechecked Oct 25 2026. From our backoff article, Oct 18 2026.
The lesson generalizes: if you know the limit, pace to it. Retries are for the surprises.
Common misconceptions
"A 429 means the server is down."
The recordIt means you are over your limit; the service is fine for everyone else. A server-wide problem is a 503, or on Anthropic a 529 overloaded_error.
"Retry-After is always in seconds."
The recordThe standard allows an HTTP date too. Code that does int(header) crashes the first time a server sends Fri, 31 Dec 1999 23:59:59 GMT.
"Every 429 is temporary."
The recordAnthropic returns a 429 with no retry-after when an organization reaches its monthly spend limit, and retries fail until access resumes. Check the error body (its error_code is enforced_spend_limit_reached).
"More retries fix it."
The recordMore retries add load to the limit that rejected you. Discord temporarily bans clients that make 10,000 invalid requests (401, 403 or 429) in 10 minutes, and GitHub warns it may ban integrations that keep going.
"The API will tell you the limit."
The recordOnly 3 of the 17 APIs we checked did, in headers, before we hit it.
What this means for you
Treat rate limits as a budget you manage, not an error you catch. Read the provider's published limits, put a limiter in front of your own requests at that pace, honor Retry-After and reset headers, and cap your retries. For LLM apps, the backoff deep dive has the full test and the circuit breaker results, and the LLM proxy benchmark covers what sits between your app and the provider. Before you ship an AI feature, our $14 AI App Ship Kit prices your API bill per request across 26 models and runs an 18-point deploy risk check; we keep fixing it at no extra cost until it does what it promises.
Related
- Exponential backoff with jitter: 64 of 100 LLM calls failed: the parent test.
- What is prompt caching?: the other lever on the LLM bill.
- Claude Code vs Codex outages.
- Unix timestamp converter and LLM API cost calculator.
FAQ
What does 429 Too Many Requests mean?
It is the HTTP status code a server sends when you have made too many requests in a given amount of time, which is called rate limiting. It was defined in RFC 6585 in April 2012. The server may add a Retry-After header saying how long to wait. Nothing is broken on your side except the pace.
How long should I wait after a 429?
If the response has a Retry-After header, wait at least that long: it is either a number of seconds or an HTTP date. If it has a reset header instead (x-ratelimit-reset on GitHub, a Unix time in seconds), wait until that time. If it has neither, back off exponentially with random jitter; GitHub's docs say to wait at least one minute for its secondary limits.
Is a 429 error my fault?
It means you sent requests faster than the server allows for your key, account or IP address. Sometimes the cause is other traffic sharing your IP or key. Retrying immediately makes it worse: in our test, aggressive retries drew up to 308 rejections to finish 100 calls, while pacing requests on the client drew 0.
What is the difference between 429 and 503?
A 429 says you are over your own limit. A 503 says the server is unavailable for everyone. Both can carry Retry-After. Some APIs use their own codes: Anthropic returns 529 overloaded_error when the whole API is busy.
Should I retry every 429?
No. Some 429s are not temporary. Anthropic returns a 429 with no retry-after header when an organization hits its monthly spend limit, and retrying fails until access resumes. Read the error body before retrying, and cap the number of attempts.
Sources
All checked October 25, 2026.
Standards
- IETF, RFC 6585: Additional HTTP Status Codes, section 4, by Mark Nottingham and Roy T. Fielding, April 2012: the 429 definition, the optional Retry-After header, no caching, and that the RFC does not define how servers identify users or count requests.
- IETF, RFC 9110: HTTP Semantics, section 10.2.3, June 2022: Retry-After as an HTTP date or delay-seconds.
- MDN, 429 Too Many Requests.
Provider docs
- GitHub, Rate limits for the REST API: 60 requests an hour unauthenticated, 5,000 with a token, 100 concurrent requests, 403 or 429 on a limit, retry-after then x-ratelimit-reset then at least one minute, the banning warning.
- Anthropic, Rate limits and Errors: token bucket, retry-after and anthropic-ratelimit headers, the spend-cap 429 with no retry-after and error_code enforced_spend_limit_reached, 529 overloaded_error.
- OpenAI, Rate limits: x-ratelimit headers, treat Retry-After as a minimum and add a small random delay.
- Discord, Rate limits: retry_after in the body, 50 requests a second global limit, 10,000 invalid requests per 10 minutes.
- SEC, Accessing EDGAR data: maximum 10 requests a second.
Our data
- Header survey: one unauthenticated GET to each of 17 public APIs (GitHub, Reddit, crates.io, npm, PyPI, Hacker News Firebase, HN Algolia, Wikipedia REST, Stack Exchange, GitLab, Docker Hub auth, Open-Meteo, CoinGecko, Kalshi, SEC EDGAR, Anthropic, OpenAI) on October 25, 2026 at 2:10 PM ET with a descriptive User-Agent, recording status and every rate-limit header. Raw results in data.csv on this page.
- Retry test: herd.cpp from Exponential backoff with jitter, 100 calls against a token bucket with burst 20 and 10 per second, 3 runs per policy, October 18, 2026 7:14 to 7:17 PM ET.
Images
- Charts by Tensorust from the data above; the what-to-retry table is from the backoff article (Oct 18 2026).
Next question
Every number on this page links to its source and was checked on Oct 25, 2026. Spot an error or a newer figure? Email matt@tensorust.com and it gets fixed. Related: Unix timestamp converter (read x-ratelimit-reset), LLM API cost calculator.
Read next
- Article · Oct 18, 2026Exponential backoff with jitter: 64 of 100 LLM calls still failed
- Article · Oct 18, 2026LLM proxy benchmark: 200 duplicate calls became 1 (and a 30 s bug)
- Article · Oct 19, 2026Theo's 60% stat is an outage chart: 43 hours of Codex incidents
Get the next one by email.
What my AI agents tried this week, with the real numbers: what worked, what flopped, what made money. One email when there is something worth reading.
No spam, never sold. Every email has a one-click unsubscribe.