Email me

Explainer · 8 min read

Filed under LLMs AI agents

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.

Horizontal bar chart titled Same 100 calls, very different pile of 429s. 429 responses each retry policy drew from a limit of 20 burst plus 10 per second, mean of 3 runs: full jitter with 8 tries 308, backoff with 10% jitter and 8 tries 275, backoff with 10% jitter and 3 tries 219, Retry-After plus full jitter 213, Anthropic SDK policy with 3 tries 210, no retry 80, client-side rate limiter 0.
100 calls fired at once at a token-bucket limit, seven ways to handle the 429s. Only pacing on the client side drew none. Our herd.cpp test, Oct 18 2026, from the backoff article. Chart by Tensorust from our own benchmark.

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
  1. Key numbers
  2. What a 429 actually says
  3. How long to wait
  4. What we found when we asked 17 APIs
  5. Why retrying harder backfires
  6. Common misconceptions
  7. What this means for you
  8. Related
  9. FAQ
  10. Sources

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:

  1. Retry-After. Per RFC 9110, it is either a whole number of seconds (Retry-After: 120 means 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.
  2. A reset header. GitHub sends x-ratelimit-reset as a Unix time in seconds; when x-ratelimit-remaining is 0, wait until then. Anthropic sends anthropic-ratelimit-requests-reset as an RFC 3339 time. Paste a Unix value into our timestamp converter to read it.
  3. A body field. Discord puts retry_after (a float in seconds) in the JSON body as well as the header. Stack Exchange reports quota_remaining in every response body.
  4. 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.

Bar chart titled Most APIs never tell you the limit until you hit it. One GET to each of 17 public APIs with no token on October 25 2026: limit in headers 3, limit in JSON body only 1, no limit info 10, blocked or needs a key 3. 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: 59 and 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: 300 in 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.

Table titled Retry the provider's bad day, never your own bug. 429 with retry-after: a rate limit, retry after the header. 429 without retry-after: monthly spend cap, do not retry. 529 overloaded_error: API busy for everyone, back off and retry. 408 request timeout: retry. 500, 502, 503, 504: retry with back-off. 400, 401, 403, 404: your request or key, do not retry. Your own exception such as bad JSON: do not retry. 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

Myth

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

Myth

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

Myth

"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).

Myth

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

Myth

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

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

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

Back to The Manual →   All articles →

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.

Up next

The article this answer comes fromExponential backoff with jitter: 64 of 100 LLM calls still failed100 LLM calls hit a rate limit at once. Backoff with 10% jitter answered 36. Retry-After answered all in 11.8 s; a client-side limiter in 8.0 s, zero 429s.Read it next →

Get the receipts 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.

Cite this

Free to cite and reuse under CC BY 4.0 with a link back. How it was collected: methods. Spotted an error? Corrections.

Did this answer your question?

Popular in the shop

All 124 tools →

Browse: Bundles and kitsHome, family and schoolMoney and businessAI toolsSports and fitnessMaking and hobbiesFood and drinkIndie dev and launchTrading and quant

Free: Landing page teardown iPhone app cost calculator LLM API cost calculator Paid online: $49 Launch Check App builds Articles FAQ

Disagree, or have a number to add? Discuss this on The Floor →

What are people saying about this? Read and post on The Floor →