
Cloudflare error 1015 means the site you requested has rate-limited this client. Cloudflare’s own Error 1015 page, titled “You are being rate limited,” says the website received too many requests and temporarily blocked access. The common cause is a rate-limiting rule the website owner configured. When the client crosses that limit, Cloudflare returns 1015. The same page says Cloudflare does not decide which visitors are limited. The site owner does. Checked against that page on 14 October 2026. The page’s last-updated line was 14 May 2026.
That is a different failure from Cloudflare error 1020, which is access denied, and from an HTTP 429, which is the 403 and 429 error guide. A dashboard message that says “Unable to purge” can also carry code 1015. That one is a cache-purge failure inside Cloudflare’s own product, not the visitor page a scraper prints. This article is only the visitor error.
1015, 1020, and 429
Read the response body before you change the proxy. The three codes share a log line and not a fix.
| Code | What it means | First change |
|---|---|---|
| Cloudflare 1015 | The site owner’s rate-limiting rule blocked the client. | Slow down and back off. A new IP does not always clear it. |
| Cloudflare 1020 | Access denied at the edge, before the origin. | Reputation, TLS, or behavior. See the 1020 guide. |
| HTTP 429 | Too many requests. Often the origin, sometimes another vendor. | Pace and concurrency. See the 403/429 solution. |
The longer workflow for a Cloudflare-protected public page is scrape behind Cloudflare. Status 429, including cases that are not Cloudflare, is fix 403 and 429 scraping errors.
A new IP is not the whole fix
Switching the exit IP feels like the obvious move, and it is incomplete. Cloudflare tells a visitor who sees 1015 to wait and try again later, and not to keep requesting the site in a short period, because that can extend the block. A loop that draws a new residential address and fires again is still a burst. If the rule counts something other than the IP — the path, a cookie, an API token, or the TLS fingerprint — the new address inherits the same counter.
A residential exit still belongs in the setup when the address you have now is the thing being counted. A datacenter range shared by many clients can already be over a per-IP threshold before your job starts. A household exit is a different address, so the counter can start clean. It does not raise the site’s limit, and it does not make a tight crawl legal or welcome. Pace the client on that new address the same way you would pace it on the old one.
Premium HTTP on proxy.aethyn.io:2099 is the country pool. Elite HTTP on port 5499 is the pool that adds a supported city or ISP when the job needs that, and the one to try when the destination treats the current network as the problem. Elite does not guarantee the site will accept the session. Both pools are residential. Holding one exit with -session- keeps every retry on the same counter, so leave the session id off unless that page’s own requests have to share an exit.

Pace, then back off
Put a ceiling on in-flight requests for that host before you buy a bigger pool. One worker that waits is quieter than ten workers that rotate. When a response body contains error 1015, or the status is 429, stop and wait. Double the wait each time, and stop after a few attempts instead of rotating through a list of session ids. If the response includes a Retry-After header, honor that interval. Cloudflare’s visitor note is the same idea in plain language: do not hammer the site while you are blocked.
The sample below uses Premium, country us, and no session id. Replace aethyn-XXXXX and PASSWORD from the dashboard. The URL should be a public page you are allowed to request. The sleep is a backoff, not a claim about any site’s real threshold.
Code Snippetimport time import requests proxy = "http://aethyn-XXXXX-country-us:PASSWORD@proxy.aethyn.io:2099" proxies = {"http": proxy, "https": proxy} def fetch(url: str): wait = 2 last = None for _ in range(4): last = requests.get(url, proxies=proxies, timeout=30) body = last.text.lower() if last.status_code != 429 and "error 1015" not in body: return last time.sleep(wait) wait *= 2 return last

After the backoff still returns 1015, the honest next step is a slower schedule or a smaller URL list, not a challenge solver. Error 1015 is not a JavaScript interstitial. Solving a challenge widget does not raise a rate limit the site owner set. If you operate the zone yourself, Cloudflare’s site-owner note is different: review the rate-limiting rule, and if it blocks inside a one-second window, try a longer window such as 10 seconds. That advice is for the person who owns the rule. It is not a bypass for someone else’s site.
Cloudflare error 1015 questions
What does Cloudflare error 1015 mean?
Will a new residential IP fix Cloudflare 1015?
How is 1015 different from 1020 and 429?
Should a 1015 retry use a sticky session?
Guides, integrations & docs
Continue reading

How to Fix Cloudflare Error 1020 When Scraping (2026 Guide)
Cloudflare error 1020 means access denied — usually IP reputation, TLS fingerprint, or behavior scoring. Here is a practical fix order for scrapers in 2026.

Proxy Errors Explained: 403, 429 & How to Fix Them
Debugging proxy issues can be a nightmare. We explain common status codes and how to resolve them instantly.

What Cloudflare Adaptive Intelligence Means for Scrapers (2026)
Cloudflare Adaptive Intelligence scores campaigns across IPs, not one IP’s rate limit. Rotation without a coherent browser is cheaper for Cloudflare to catch — classify the wall before you retry.
Pace the client, then choose the exit
Premium HTTP 2099 for a country household. Elite 5499 when the address itself is the problem. Sticky is optional. Free trial, no card.