Writing

429 Too Many Requests

Published 22 September 2026

Of all the errors in this series, HTTP 429 is the one where the answer is genuinely you. You reached the server, it understood you perfectly, and it is asking you to slow down. The useful question is not whose fault it is: it is which counter you tripped, and what resets it.

What it proves

The server is healthy and working exactly as designed. A 429 is not a failure: it is a service protecting itself, which is better behaviour than accepting work it cannot complete and timing out instead.

It also proves the network is fine. You got a status code, so the name resolved, a connection opened, your request arrived and a reply came back. Nothing here is worth escalating to a network team.

Rate limit or quota? They are not the same

Both return 429 and the difference decides what you do next.

Rate limitQuota
CountsRequests per second or minuteRequests per day or month
ResetsSeconds. Often a rolling window.At a fixed boundary: midnight UTC, the billing date
What to doWait and retry, slowerRetrying will not help at all
Typical wording"rate limit exceeded", "slow down""quota exceeded", "monthly limit reached"

This is the distinction that wastes the most time. A script that backs off politely and retries for an hour against a monthly quota is doing nothing but generating more 429s. Read the body: providers usually say which one you hit, even when the code cannot.

The header that answers the question

Retry-After: 30                               # seconds
Retry-After: Wed, 23 Sep 2026 00:00:00 GMT    # a date

If Retry-After is present, that is the answer and you should honour it exactly. Retrying sooner is how a rate limit becomes a ban.

Many APIs also send their own counters, and these are more useful than the status code:

Watching Remaining and slowing down before it reaches zero is the difference between a client that works and one that is permanently half-blocked.

Who is actually being counted

"Too many requests" implies you sent them. Often you did not. The counter is keyed on something, and it is worth knowing what:

Keyed onWhich means
API key or tokenGenuinely yours. Your code, or another process using the same key.
User accountYours, across every device and script signed in as you.
Source IP addressShared. Everyone behind the same NAT, office egress or CI runner counts as one caller.
EndpointOne expensive route is limited harder than the rest of the API.

The IP row is the one that surprises people. If a limit is per-IP and your whole office leaves through one address, a colleague's script can rate-limit you while you have sent almost nothing. The tell is that it happens on a schedule you do not control, or clears when you move to another network.

A 429 in a browser usually is not you

Rate limits are an API problem. Seeing 429 while simply loading a page in a browser usually means bot protection decided you were automated: a WAF, a scraping defence, or a shared address with a bad reputation. Browsing more slowly will not help. The fix is to look like a person, or to ask the site to stop blocking your address range.

See the headers, not just the number. The HTTP status checker fetches a URL and shows the response headers: including Retry-After and the X-RateLimit-* family, which tell you what you tripped and when it clears.

Check a URL

Backing off properly

The instinct (retry immediately, then keep retrying) is the one behaviour guaranteed to make it worse. Every client doing that against a service under load produces a retry storm, and the service stays down longer than the original problem warranted.

If you are the one returning 429

Where 429 sits among the rest

CodeWhose problem
429Yours: you reached them and sent too much
404Either. The path is wrong, or it is gone.
502 / 504Theirs, always. Two of their servers failed to talk.
503Theirs, and often deliberate.
no status codeThe only case where the network is a fair suspect