Complete breakdown of Cloudflare errors 1003, 1006, 1010, 1015, and 1020 — what each one means, what caused it, and exactly how to fix it.
Daniel K.
Apr 15, 2026
Cloudflare error codes all look similar — a four-digit number on a gray page that blocks you from the site you wanted. But each code tells a different story, and each has a different fix. Guessing which one you're hitting is the fastest way to waste hours on the wrong solution.
This guide breaks down the five most common Cloudflare error codes you'll encounter: 1003, 1006, 1010, 1015, and 1020. For each one, you'll get a plain-English explanation of what triggered it and the exact steps to resolve it.
| Error | Meaning | Who Fixes It | Typical Cause |
|---|---|---|---|
| 1003 | Direct IP access not allowed | You | Hitting an IP address instead of the domain |
| 1006 | Banned from this site | You or site owner | Your IP is on the site's blocklist |
| 1010 | Browser signature denied | You | Automated browser or bad fingerprint detected |
| 1015 | Rate limited | You | Too many requests from your IP |
| 1020 | Access denied by firewall rule | You or site owner | Triggered a WAF rule (ASN, country, behavior) |
The key distinction is whether the fix is on your side or the site owner's. Errors 1003, 1010, 1015, and some 1020s are within your control. Hard 1006 bans and site-owner WAF rules require contacting the website.
Error 1003 appears when you try to reach a Cloudflare-protected site by its IP address instead of its domain name.
Example message: "Access denied. Please use your domain name instead of the IP address."
Cloudflare sits on the domain layer. When a request comes in with a Host header pointing to Cloudflare's IPs (without a matching domain), Cloudflare has no way to route it and returns 1003.
Common scenarios:
curl https://1.2.3.4 instead of curl https://example.comipconfig /flushdns. On macOS: sudo dscacheutil -flushcache. On Linux: sudo systemd-resolve --flush-caches./etc/hosts file. Remove any hardcoded IP entries for the domain.curl -H "Host: example.com" https://example.com/.If you're the site owner and seeing 1003 for legitimate users, it's usually a stale A record. Update your DNS to point to the Cloudflare-assigned IPs.
Error 1006 means the site owner has explicitly banned your IP. Not rate-limited, not challenged — banned.
Example message: "Access denied. Your IP address has been blocked."
Unlike 1015 (automatic rate limit) or 1020 (automated firewall rule), 1006 is typically the result of an explicit block — either from the site owner directly or from Cloudflare's Super Bot Fight Mode with aggressive settings.
Common causes:
If multiple IPs keep getting 1006'd from the same scraper, the issue is almost certainly your behavior, not the IPs. Cloudflare correlates behavioral signals across IPs — slow down, randomize patterns, rotate user agents, and retry.
Error 1010 fires when Cloudflare's browser integrity check detects automated or modified browser signatures.
Example message: "Access denied. The owner of this website has banned your access based on your browser's signature."
Cloudflare inspects browser fingerprints — user agent string, TLS handshake (JA3/JA4), HTTP/2 frame order, headers, and JavaScript signatures. If any of these look fake or match a known bot library, you get 1010.
Common triggers:
requests, axios, httpx, or urllib without TLS fingerprint matchingfrom curl_cffi import requests
response = requests.get(url, impersonate="chrome124", proxies=proxies)
playwright-stealth and apply it to every page. This removes the navigator.webdriver flag and normalizes canvas/WebGL fingerprints.requests does not match this — use curl_cffi or httpx with custom TLS config.For sustained scraping against 1010 errors, combine curl_cffi with residential proxies — solves both the fingerprint and IP reputation vectors at once.
Error 1015 means your IP is sending too many requests too fast. It's not a ban — it's a cap.
Example message: "You are being rate limited. Error code 1015."
Site owners configure rate limits in Cloudflare — typical settings are 30-100 requests per minute per IP. Exceed that threshold and you get 1015 for the duration of the cooldown window (usually 1-10 minutes).
Common scenarios:
Retry-After headers. Cloudflare often returns a Retry-After header with 1015 responses. Parse it and wait that long before retrying.At large scale, a proxy pool with 100+ IPs paired with 2-8 second pacing per IP gives you effective throughput of thousands of requests per minute without triggering 1015.
Error 1020 is the most common Cloudflare block you'll hit. It means you triggered a firewall (WAF) rule — could be from the site owner, could be from Cloudflare's default protections.
Example message: "Access denied. This website is using a security service to protect itself from online attacks."
Error 1020 covers a huge range of rule-based blocks:
/.env, /admin, or other sensitive paths.python-requests/2.28 or curl/7.68.Beyond the top five, you may also encounter:
| Error | Meaning | Fix |
|---|---|---|
| 1001 | DNS resolution error | Check domain DNS, clear cache |
| 1016 | Origin DNS error | Site owner — check DNS pointing to origin |
| 1018 | Can't resolve domain | Site misconfiguration |
| 1019 | Compute server error | Usually transient — retry |
| 1033 | Argo Tunnel error | Site owner — restart tunnel |
| 520 | Web server returned unknown error | Site owner — origin issue |
| 521 | Web server is down | Site owner — origin down |
| 522 | Connection timed out | Site owner — origin slow/firewalled |
| 524 | Origin took too long | Site owner — long-running request |
The 520-series errors are almost always the site owner's problem, not yours — they indicate Cloudflare can reach the visitor but not the origin server.
Avoiding these errors is cheaper than fixing them. A few habits that eliminate most Cloudflare blocks:
Start with rotating residential proxies or mobile proxies — not free proxies, not datacenter IPs. Clean IP reputation is the foundation everything else rests on.
Use curl_cffi for HTTP clients or stealth-patched Playwright for browser automation. Default Python libraries have TLS/HTTP signatures that are instantly flagged.
Random delays of 2-8 seconds between requests per IP eliminates almost all 1015 errors. Longer pauses (30-60 seconds) every few dozen requests make the pattern look human.
For stateless pages, rotate on each request. For logged-in sessions or shopping carts, stay on one sticky IP — changing IPs mid-session is itself a block trigger.
cf_clearance CookiesOnce you pass a Cloudflare challenge, the response sets a cf_clearance cookie valid for 30-60 minutes. Reuse it on subsequent requests from the same IP and you skip the challenge entirely.
On 1015 — wait and back off. On 1020 — rotate IP and retry. On 1006 — cycle IPs and investigate behavior. Never retry the same request on the same IP with the same headers.
Error 1015 is rate limiting — you sent too many requests from your IP too fast. It's temporary and clears after a cooldown. Error 1020 is a firewall (WAF) rule block — your IP, country, ASN, or behavior matched a rule the site owner configured. 1020 requires changing something about your request; 1015 usually just requires waiting or slowing down.
Typically 1-10 minutes from when you stop making requests. The exact duration is configured by the site owner and is returned in the Retry-After header. For persistent scrapers, rotating IPs through a proxy pool eliminates the problem entirely because each IP stays well below the per-IP threshold.
Sometimes — depends on the rule. If the site blocks by country, a VPN in a permitted country works. If the site blocks by ASN and your VPN uses a datacenter ASN, you'll still get 1020. Residential proxies work better than VPNs because they use real ISP IPs.
Several possibilities: the site blocks your country or region, another user on your shared IP (some ISPs use CGNAT) triggered a block, your browser is sending a flagged fingerprint, or you hit a URL pattern that triggered a WAF rule. Note the Ray ID and contact the site — that tells you exactly which rule fired.
Effectively yes. Error 1010 specifically means your browser signature (TLS, HTTP/2, or JS fingerprint) was flagged. It's the error you see when you try to scrape with default Python requests, plain Puppeteer, or unpatched Selenium. Fix it by matching a real browser's fingerprint — curl_cffi for HTTP, playwright-stealth for browsers.
For 1006, 1015, and most 1020 errors — yes, clean residential or mobile proxies resolve them immediately. For 1010 errors, you also need to fix your client's browser fingerprint. For 1003, the issue is client-side configuration (using a domain, not an IP), so proxies don't help. See our proxy plans for the right tier for your use case.