Docs menu
Docs · Error guide

Proxy Error 429 Too Many Requests

A 429 Too Many Requests error means the website (or an API) counted too many requests from you in a given amount of time and refused the rest until the window resets; it is a rate limit, not a broken proxy. Fix it by sending fewer requests per IP: lower your concurrency, add delays, wait as long as the Retry-After header says, and spread the remaining load over rotating IPs. ProxyField rotating residential proxies give every request a new IP from a pool of 412M+ residential IPs, from $1.95/GB, and you can test them on your own target with the Easy Trial: 1 GB for $2.95.

residential IPs
412M+
from, traffic never expires
$1.95/GB
Easy Trial
1 GB for $2.95
On this page 6 sections

What does a 429 error mean when scraping?

A 429 tells you that you hit a limit the site set on purpose. RFC 6585, section 4 defines it as "the user has sent too many requests in a given amount of time" and lets the server add a Retry-After header that says how long to wait. MDN's 429 page gives the same meaning.

What the limit counts depends on the site:

What the site countsWhat you seeWhat helps
Requests per IP address429s start after a burst from one IP, other IPs still passSlower pace per IP, rotating IPs
Requests per account, API key or session cookie429s follow your login or token to any IPSlower pace, more accounts only if the terms allow it
Requests per network (a datacenter range)429s come early, even at low volumeResidential or mobile IPs, slower pace
Concurrent connections429s only when many threads run at onceFewer parallel requests per domain

Who sent the 429 matters. If the response comes from the target site (its branding, its API error format, or a Cloudflare page with error 1015), the site rate-limited you. A 429 in your proxy provider's own format would mean a limit on the proxy side; ProxyField allows unlimited concurrent threads, and its gateway's own responses are 407 (wrong login or an IP not on the allowlist), 402 (no traffic left) and 502 (no exit could be connected).

How to fix 429 Too Many Requests

Work through these in order; most 429s stop after the first two.

1. Read the Retry-After header and wait

If the response carries Retry-After, wait at least that long before the next request to that site. The value is either a number of seconds or an HTTP date (RFC 9110, section 10.2.3). Some APIs add their own headers, such as X-RateLimit-Remaining or RateLimit-Reset; these are not standardized, so read the API's documentation for what they mean.

2. Slow down and back off

Lower the number of requests per second per domain, add a random delay between requests, and double the wait after each 429 (exponential back-off) up to a cap. Retrying at once makes it worse: Cloudflare's Error 1015 page warns that repeated attempts within a short period "may extend the block".

This Python requests loop honors Retry-After, backs off on every 429 and sends each attempt through the ProxyField gateway, so a retry leaves from a new IP:

Python
import random
import time
from email.utils import parsedate_to_datetime

import requests

PROXY = "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000"
PROXIES = {"http": PROXY, "https": PROXY}


def retry_after_seconds(value):
    if not value:
        return None
    if value.isdigit():
        return int(value)
    try:
        return max(0, parsedate_to_datetime(value).timestamp() - time.time())
    except (TypeError, ValueError):
        return None


def get(url, attempts=5):
    delay = 2.0
    for _ in range(attempts):
        r = requests.get(url, proxies=PROXIES, timeout=30)
        if r.status_code != 429:
            return r
        wait = retry_after_seconds(r.headers.get("Retry-After")) or delay
        time.sleep(wait + random.uniform(0, 1))
        delay = min(delay * 2, 120)
    return r


print(get("https://example.com/").status_code)

3. Spread requests over rotating IPs

If the site counts requests per IP, rotation divides your load: with a new IP on every request, each address sends a fraction of the total. ProxyField's rotating proxies can give a new IP on every request, with unlimited concurrent threads and country, region and city targeting. Rotation does not raise a limit that counts your account, API key or cookies, and it does not make an aggressive crawl polite: keep the per-domain pace reasonable.

4. Keep sessions where the site expects them

Some sites tie a session cookie to one IP and rate-limit sessions that jump between addresses. For logged-in or multi-step flows, use a sticky session (30 s to 36 h; presets 1, 5, 10, 30 min, 1, 3 and 6 h) and rotate between sessions, not inside one. The session part of the username is -region-<region>, -session-<id> and -ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default) after the location, as in <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600. See sticky vs rotating proxies for when to use which.

5. Send fewer, lighter requests

Cache pages you already have, skip images, fonts and scripts you don't parse, and request only the pages that changed. If the site offers an official API or a data export, use it within its quota. For Google results, ProxyField's Google SERP API returns the results page as JSON at $1.20 per 1,000 successful results, falling to $0.80 at volume.

6. Stop if the limit is the site's answer

If the 429s continue at a slow, polite pace from many IPs, the site does not want this volume of automated traffic. Read its terms and robots.txt and ask the owner for access or an API key; see how to check if scraping is allowed.

How to handle 429 in Scrapy

Scrapy retries 429 by default: 429 is in the default RETRY_HTTP_CODES list of the retry middleware. Add pacing so the retries don't hit the same limit:

Python
# settings.py
AUTOTHROTTLE_ENABLED = True          # adapts the delay to the server's response times
AUTOTHROTTLE_START_DELAY = 2
AUTOTHROTTLE_MAX_DELAY = 60
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
DOWNLOAD_DELAY = 1                   # base delay per domain, randomized by default
CONCURRENT_REQUESTS_PER_DOMAIN = 4
RETRY_TIMES = 5

Set the proxy per request with request.meta["proxy"] = "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000"; the full setup is on the Scrapy proxy page. AutoThrottle and DOWNLOAD_DELAY are documented in the Scrapy docs.

429 vs 403 vs Cloudflare 1015

ResponseWhat it meansWill it clear by itself?
429 Too Many RequestsA rate limit: too many requests in a time windowUsually, once the window resets or after Retry-After
Cloudflare error 1015A Cloudflare rate limiting rule on the site fired ("You are being rate limited")Usually, after a wait; retrying soon can extend it
403 ForbiddenThe site refuses the request: headers, IP reputation or a firewall ruleNo: change what the rule checks

A 403 that appears right after a run of 429s often means the site escalated from slowing you down to blocking you. The 403 Forbidden when scraping doc and the Cloudflare access denied errors doc cover those cases.

When a proxy does not fix 429

A new IP fixes a 429 only when the limit counts IPs. It does not help when:

  • the limit counts your API key, account or session cookie;
  • the site's quota is global (for example, a fixed daily quota on an API plan);
  • you send so many requests that every IP in your rotation hits the limit.

In those cases, slow down, buy a higher quota from the site, or ask for access. Retries that keep failing also move data through the proxy, so back-off saves bandwidth as well as the target's patience.

Proxy Error 429 Too Many Requests FAQ

How do I fix HTTP 429 Too Many Requests when scraping through proxies?

ProxyField rotating proxies spread requests over 412M+ residential IPs, but to fix HTTP 429 Too Many Requests through proxies, first wait as long as Retry-After says, lower your requests per second per domain and back off exponentially on each 429. Then spread what is left over rotating IPs. Rotation helps only when the site counts requests per IP; a limit on your account or API key needs a slower pace.

What does a 429 error mean when scraping?

The site counted too many requests from you in a time window and is refusing the rest until the window resets. It is a deliberate rate limit, not a proxy failure.

Can proxies fix 429 errors?

Yes, when the site counts requests per IP address: rotating proxies divide your traffic so each IP stays under the limit. No, when it counts your account, API key or cookies; then only a slower pace or a higher quota helps.

How long does a 429 error last?

As long as the site's rate-limit window, which can be seconds, minutes or hours. If the response has a Retry-After header, it tells you how long to wait; without one, back off and retry with growing delays.

Is a 429 error my fault or the website's?

The website sets the limit, but your request pattern triggered it. Slowing down, spreading requests out and honoring Retry-After is the way to stay under it.

What happens if you ignore a 429 error and keep sending requests?

The limit usually gets longer or turns into a block: a 403, a Cloudflare 1015 page or a ban on the IP or account. Cloudflare's own docs warn that retrying within a short period can extend a rate-limit block.

Should a 429 response trigger proxy rotation?

Rotate for the retry, but also slow down. On per-request rotation the next request already leaves from a new IP; on a sticky session, end that session and wait before you start a new one.

What is rate limiting in web scraping?

A cap a site puts on how many requests one client may send in a time window, counted per IP, account, API key or session. Requests over the cap get a 429, a challenge page or a block.

How do I find out a server's rate limit?

Check the site's API documentation and response headers first; some APIs publish limits and send headers such as RateLimit-Remaining. Otherwise start slow, raise the pace step by step and note where the 429s begin, then stay well below that point.

How do I handle 429 Too Many Requests in Scrapy?

Scrapy already retries 429 through its retry middleware; add pacing so the retries don't fail too. Turn on AutoThrottle, set a DOWNLOAD_DELAY, lower CONCURRENT_REQUESTS_PER_DOMAIN and raise RETRY_TIMES.

Show 2 more questionsShow fewer questions

What is the difference between a 429 and a 403?

A 429 says you are sending too fast and usually clears after a wait. A 403 says the site refuses the request outright, because of your headers, IP reputation or a firewall rule, and it does not clear until you change what the rule checks.

Is 429 a retryable error?

Yes, after a wait: retry once the Retry-After time has passed, or with exponential back-off if there is no header. Retrying immediately only adds to your count.

Easy Trial: 1 GB for $2.95.

Try for the price of 1 GB, no subscription, traffic never expires.