Skip to content

429 Too Many Requests: What It Means, Who Counts, and How to Fix It

HTTP 429 from the standards and the APIs that send it: what counts against you, the billing 429s retries never fix, Retry-After, backoff, shared addresses.

HProxy TeamJuly 3, 2026Updated October 13, 202613 min read

429 Too Many Requests: How to Fix It With Proxy Rotation

A 429 Too Many Requests means a server counted your requests and refused the next one. The standard behind it, RFC 6585, leaves the counting to the server: "this specification does not define how the origin server identifies the user, nor how it counts requests." That gap decides the fix. GitHub counts your address when you send no token and your account when you do. Discord counts the bot's token. OpenAI and Anthropic count the organization, and both also answer 429 when the money runs out.

We read the standards, the documentation of nine services that send or handle 429, the terms of three platforms and five other guides on October 13, 2026, all from our server. We also captured a 429 ourselves and ran the Python code below once. No request went through a proxy.

How do you fix a 429 Too Many Requests error?

Find out what was counted, then wait the way the server asks. A 429 about credits or a spend cap ends only when the account changes, so retrying it wastes time. A speed limit ends when its window does. Obey Retry-After when it arrives, and otherwise back off with jitter and a cap on attempts. A 429 on the very first request often means someone else used up the allowance of an address you share.

Reading a 429, step by step
  1. Read who counted

    the body and headers name an address, a token, an account or a project

  2. Billing or quota?

    credits, spend caps and usage limits end only when the account changes

  3. Retry-After sent?

    wait exactly that long, in seconds or until the date

  4. No header

    back off with jitter, and cap the tries and the total time

  5. Refused on the first try?

    check who else shares your address

Source: RFC 6585, RFC 9110 and RFC 6269; OpenAI, Anthropic, curl, urllib3 and AWS documentation; read October 13, 2026 · hproxy.comProxy.

What a 429 means, and who sends it

RFC 6585, published in April 2012, defines the code: "The 429 status code indicates that the user has sent too many requests in a given amount of time". The response may carry a Retry-After header, and it "MUST NOT be stored by a cache". MDN adds that limits may be "server-wide or per resource".

Not every limit answers 429. RFC 6585 itself says "servers are not required to use the 429 status code". nginx, a common web server, rejects rate-limited requests with 503 unless its limit_req_status setting says otherwise, and it allows no burst by default. GitHub answers a spent limit with "a 403 or 429 response". On Cloudflare, a site's rate-limiting rule blocks with 429 by default, and Cloudflare's help pages call the same block error 1015: "You are being rate limited".

Who counted your requests

The fix depends on the key the server counts. Most APIs count a credential, and then the address you send from changes nothing.

Who counts your requests

What each service counts, and its published limit where it has one.
ServiceWhat it countsIts limit
GitHub, no tokenYour address60 an hour
GitHub, with a tokenYour account5,000 an hour
Discord botThe bot token50 a second
Discord, no tokenYour address50 a second
OpenAI APIOrganization and projectBy model and tier
Claude APIOrganizationBy usage tier
Cloudflare ruleWhat the site picksSet by the site
nginx limit_reqWhat the site picksSet by the site

GitHub, Discord, OpenAI, Anthropic, Cloudflare and nginx documentation, read October 13, 2026

GitHub is the clearest case. "Unauthenticated requests are associated with the originating IP address", and the limit is 60 requests an hour. With a token, requests count against your account, at 5,000 an hour. Discord identifies callers by their token and falls back to the address only when a request carries none. OpenAI writes that "Rate limits are defined at the organization level and at the project level", and Anthropic's limits "are set at the organization level".

Websites choose their own key. A Cloudflare rule can count by address, or by a cookie-based visitor ID for people behind one NAT address. It can also count by a header, cookie or query value, by network (ASN), by country, or by the TLS fingerprint called JA3 or JA4. nginx counts whatever its configuration names, often the client address. So the same client can meet a limit that follows its address on one site and its login on the next.

The 429s that waiting does not end

The most-viewed 429 question on Stack Overflow concerns OpenAI: "You exceeded your current quota, please check your plan and billing details", with 488,370 views on October 13, 2026. That message is about money. OpenAI's error codes list several 429s of this kind, and its documentation is plain about them: "Retrying billing, spend, or quota errors won't restore API access." Anthropic's monthly spend cap works the same way. Its 429 "has no retry-after header and keeps failing until access resumes". Access resumes at 00:00 UTC on the first day of the next month, unless the organization moves to a higher tier sooner.

The 429s that waiting does not end

Each one ends when the account changes.
ServiceWhat the 429 saysWhat ends it
OpenAICredit balance exhaustedAdding credits
OpenAIProject spend limit reachedRaising the limit
OpenAIOrganization usage limit reachedA higher approved limit
Claude APIMonthly spend cap reachedNext month, or a higher tier

OpenAI error codes; Anthropic API errors and rate limits; read October 13, 2026

Read the message before you build a retry loop. A billing 429 names credits, a spend limit or a usage limit, and a loop around it only burns time.

How long to wait: Retry-After and the limit headers

RFC 9110 gives Retry-After two forms: a number of seconds, or an HTTP date. "Retry-After: 120" means two minutes. MDN warns that support for the header "on both clients and servers is still inconsistent", so read it yourself when your client does not.

Many APIs say more. GitHub sends the limit, what remains, what is used and when the window resets, in its x-ratelimit headers. Its GET /rate_limit call shows them, and "Calling this endpoint does not count against your primary rate limit". We called it from our server on October 13, 2026. An address with no token gets 60 requests an hour, and none were used.

Captured on our own server on October 13, 2026: GitHub's limit headers for our address, then curl backing off on a 429.

Discord sends a JSON body with a retry_after field and an X-RateLimit-Scope header. A 429 with the scope shared concerns a resource many callers use, and Discord does not count it against you. An IETF draft, in an editor's copy of April 18, 2026, would give every server the same two headers. RateLimit-Policy states the quota, as in "default";q=100;w=10, and RateLimit states what is left, as in "default";r=50;t=30.

Waiting the right way: backoff, jitter and a cap

Without a Retry-After, the client has to choose the wait. curl retries only when asked with --retry, and it treats 429 as a transient error along with 408, 500, 502, 503, 504, 522 and 524. It "first waits one second and then for all forthcoming retries it doubles the waiting time until it reaches 10 minutes". A Retry-After from the server overrides that, since curl 7.66.0. Our capture above shows the first two waits: 1 second, then 2.

How curl spaces its retries when no Retry-After arrivesSeconds curl waits before each retry with --retry; the doubling stops at 10 minutes
Retry 1
1
Retry 2
2
Retry 3
4
Retry 4
8
Retry 5
16
Retry 6
32
Retry 7
64
Retry 8
128
Retry 9
256
Retry 10
512
Retry 11
600
Ten retries add up to 1,023 seconds of waiting, about 17 minutes.
Source: curl's manual, the --retry option, read October 13, 2026; the first two waits appear in our capture · hproxy.comProxy.

Python's requests library "does not retry failed connections" by default. Its retries come from urllib3's Retry class. Retry honors Retry-After on 413, 429 and 503 out of the box, but it backs off only when you set a backoff factor:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util import Retry

retry = Retry(
    total=5,                      # at most five retries
    status_forcelist=[429, 503],  # retry these codes
    backoff_factor=1,             # waits 0, 2, 4, 8, 16 seconds
    backoff_jitter=1.0,           # plus up to 1 second at random
)                                 # Retry-After is honoured by default

session = requests.Session()
session.mount("https://", HTTPAdapter(max_retries=retry))

r = session.get("https://api.github.com/rate_limit", timeout=10)
print(r.status_code, r.headers.get("x-ratelimit-remaining"))

We ran this once on our server, with requests 2.31.0 and urllib3 2.0.7. GitHub answered 200 with 60 requests remaining. Pointed at a test address that always answers 429 with two retries allowed, the same session gave up after 3.6 seconds with a RetryError: "too many 429 error responses". Catch that error, or the script stops there.

The jitter matters. In AWS's 2015 simulation of 100 clients competing for the same work, adding random jitter to exponential backoff cut the number of calls by more than half. Google's Cloud Storage library for Python starts at 1 second, doubles, waits at most 60 seconds between tries and gives up after 120. Cap yours the same way. OpenAI counts unsuccessful requests against your per-minute limit. Discord temporarily restricts an address after 10,000 invalid requests (401, 403 or 429) in 10 minutes. GitHub warns that requests sent while limited "may result in the banning of your integration".

For crawling a site, Wikimedia's API etiquette gives the simplest pace there is: "Make your requests in series rather than in parallel". It also asks for a User-Agent with contact details, "or you may be IP-blocked without notice".

A 429 on the very first request

Another classic Stack Overflow question asks why a simple query to Google from Python returns 429 (44,676 views). When your own count is zero, someone else's may be full. RFC 6269, on addresses shared by many users, describes one user who "may block out other users who have not made any previous attempts but who will now fail on their first attempt". Cloudflare warns that visitors behind one NAT address can "share a single counter bucket". Google says its unusual-traffic message can come from others "that use the same Virtual Private Network (VPN) you use" or the same internet provider.

Addresses shared with strangers include VPN exits, free proxies, mobile carriers that put many phones behind one address (CGNAT), and office or school networks. Two checks tell the cases apart. First, look for anything of yours in the response: GitHub's x-ratelimit-resource names the bucket you used, and Discord's scope says user, global or shared. Second, for an API, authenticate. GitHub's own advice for a higher limit is to make authenticated requests, which move the count from the address to your account.

The rules on getting around a limit

The platforms write their limits into their terms. X's developer policy says: "You may not exceed or circumvent rate limits, or any other limitations or restrictions described in this Policy". Reddit's developer terms allow suspension when Reddit believes "that you have attempted to circumvent" its limits, and they send "research in excess of rate limits" to a separate agreement. GitHub's terms say "You may not share API tokens to exceed GitHub's rate limitations" and allow suspension of API access for excessive requests.

The higher limits these platforms offer go through the front door. GitHub raises its limit for authenticated requests, GitHub Apps and Enterprise Cloud. OpenAI moves an organization up its usage tiers as its credit purchases grow, and Anthropic moves organizations to higher tiers over time. Discord invites bots that are banned repeatedly in normal operation to ask its support about a higher global limit.

What other 429 guides say

We read five pages that rank for the question. Hostinger, updated in September 2026, says a 429 "often happens when a website's traffic exceeds its server capacity". RFC 6585 ties the code to one user's requests, and an overloaded service is what a 503 reports. Kinsta writes that a 429 "always means the same thing", someone "overwhelming your server with too many requests". OpenAI's billing 429s overwhelm nothing. SiteLock gives sound advice on waiting a minute or two when no header arrives, and it leaves out shared addresses.

Two pages from scraping and proxy sellers point the other way. Scrapfly recommends "proxy rotation and IP address distribution to bypass IP-based rate limiting", and spreading requests across "authentication tokens" too. Massive writes that a rotating pool "distributes requests across multiple exit nodes, preventing any single IP from getting rate-limited". Both describe staying under a count by adding addresses or tokens. Where the limit counts a token or an account, that advice fails, and on X, Reddit and GitHub it runs into the terms quoted above.

Where HProxy fits

No proxy raises a limit that counts a token, an account or an organization. One case has a proxy answer: a site that counts by address, reached from an address you share with strangers. An address only you use carries only your requests. HProxy's static ISP proxies give you one dedicated address you hold, at $2.70 per IP a month. Datacenter addresses come dedicated or shared by a few users, chosen per order. The proxy checker shows which address a site sees. A new address starts with an empty count and fills it at the same pace, so the site's limit still applies to you.

Three of our pages go deeper on single services: LLM API rate limits, Janitor AI's error 429 and X's rate limit message. Are free proxies safe shows why a free address, shared by design, is the worst place to start.

What we could not find out

  • Which key a given site counts. Cloudflare and nginx leave that to each site, and few sites publish it.
  • How often each cause occurs. No one publishes a count of 429s by cause.
  • Reddit's own request limit. Its help center answered our server with a bot check.
  • OpenAI's terms on rate limits. Its terms page refused our server, so this page quotes only its documentation.
  • How the RateLimit headers will end up. The IETF text is still a draft.
  • What a proxy does to any of these limits. We sent no request through a proxy for this page.

Our next check of these pages is due by April 13, 2027.

Sources

Every page below was read on October 13, 2026, from our server. A date in brackets is the one the page itself carries.

Frequently asked questions

What does a 429 Too Many Requests error mean?

A server counted your requests and refused the next one. RFC 6585 defines 429 as a user sending "too many requests in a given amount of time" and leaves open what the server counts: an address, credentials or a cookie. The response may carry a Retry-After header saying how long to wait, and it must not be cached. Some 429s come from billing: OpenAI and Anthropic return 429 when credits or a spend cap run out.

Does using a proxy fix a 429 error?

Rarely. Most APIs count a token, an account or an organization, so a new address leaves the count where it was. GitHub counts your account once you send a token, Discord counts the bot token, and OpenAI and Anthropic count the organization. A proxy helps in one case: a site that counts by address, reached from an address you share with strangers, such as a VPN exit or a free proxy. X and Reddit forbid getting around their rate limits in their terms, and GitHub forbids sharing tokens to exceed its limits.

What is the Retry-After header on a 429 response?

It is the server's own answer to when you may ask again. RFC 9110 allows two forms: a number of seconds, as in Retry-After: 120, or an HTTP date. curl follows it since version 7.66.0, and urllib3, the library under Python requests, follows it on 413, 429 and 503 by default. MDN notes that support for the header is still inconsistent, so read it yourself when your client ignores it. Some 429s carry none: Anthropic's spend-cap 429 keeps failing until access resumes.

Should I use residential or datacenter proxies for rate-limited sites?

The type of address changes nothing when the limit counts a token, an account or an organization, which is how GitHub, Discord, OpenAI and Anthropic count. It matters only where a site counts by address and your address is shared with strangers. Then an address only you use, such as a static ISP address or a dedicated datacenter address, carries only your requests. The site's pace still applies to it.

Can I cache around a 429 or just retry immediately?

Neither works. RFC 6585 says a 429 "MUST NOT be stored by a cache", and an immediate retry is one more request the server counts. OpenAI counts unsuccessful requests against your per-minute limit, Discord restricts an address after 10,000 invalid requests in 10 minutes, 429s included, and GitHub warns that requests sent while limited may get an integration banned. Wait for Retry-After, or back off with jitter and a cap.

Why do I get a 429 on my very first request?

Two causes explain most cases. The first is billing: OpenAI answers 429 when an organization has no prepaid credits or reaches a spend limit, however few requests it sent. The second is a shared address. RFC 6269 describes users who "will now fail on their first attempt" because someone else on the same address used up the allowance, and Google says its unusual-traffic message can come from others on the same VPN or internet provider. Check the response for your token or account, then check what shares your address.

Is a 429 the same as a 503 or a 403?

The meaning is close, and the code depends on the server. nginx rejects rate-limited requests with 503 unless its limit_req_status setting changes that, GitHub answers a spent limit with 403 or 429, and a site's rate-limiting rule on Cloudflare blocks with 429 by default while Cloudflare's help calls the block error 1015. A 503 on its own means the service is unavailable, and a 403 that outlasts the limit's window is a refusal of another kind.

How do I handle a 429 in Python requests?

Requests does not retry by default. Mount an HTTPAdapter with urllib3's Retry: put 429 and 503 in status_forcelist, set backoff_factor and backoff_jitter, and leave respect_retry_after_header at its default of True. urllib3 then waits as long as Retry-After asks, up to 21,600 seconds by default, and otherwise backs off up to 120 seconds between tries. When the tries run out, requests raises a RetryError. The code is in the section on waiting.

How long does a 429 last?

As long as the server's window. A Retry-After header gives the exact wait. GitHub's x-ratelimit-reset header gives the moment its hourly window resets, Cloudflare lets each site block for anything from 10 seconds to a day, and Anthropic's monthly spend cap holds until 00:00 UTC on the first day of the next month. Cloudflare also warns that repeated attempts during a block may extend it.

Get proxies that are alive right now

Our free proxy list re-checks every exit every few minutes across 100+ countries, with a live last-checked time, so you copy IPs that worked moments ago, not a stale text dump. When the location has to survive a real check, the paid network holds up.

129M+ proxy checks run · 100+ countries · HTTP / HTTPS / SOCKS · re-checked every few minutes · no signup

HProxy.

Honest guides and comparisons on proxies, scraping and staying unblocked, from the team that runs the network.

RSS feed