Cloudflare

CDN and WAF

Also known as: Cloudflare Bot Management, Cloudflare WAF, Super Bot Fight Mode

Serves challenges and blocks on 403, rate limits on 429, and puts its own four-digit error code in the body rather than on the status line.

Cloudflare is the most common thing sitting between a client and a site, so its responses are the ones most often misread. The single most useful fact about them is structural: Cloudflare's own error numbers are not status codes. Its documentation is explicit that HTTP errors such as 409, 530, 403, and 429 are returned in the HTTP status header, while 1xxx errors appear in the HTML body. Error 1020 is a 403 whose body says 1020. Reading the status line alone throws away the half of the message that tells you which control fired.

The second thing worth knowing is that a challenge and a block look almost identical on the status line, and both are usually 403. The JavaScript challenge and I'm Under Attack Mode moved from 503 to 403 during 2023, which is why older troubleshooting advice keyed on 503 no longer matches what the edge sends. The reliable separator is a header: every interstitial challenge page carries cf-mitigated: challenge, and Cloudflare documents challenge as the only valid value for it. A 403 with that header is a door with a lock on it. A 403 without it is a wall.

Challenges pay out in a cf_clearance cookie rather than a token. Cloudflare describes that cookie as carrying two things at once: challenge clearance, granted when a challenge is solved, and precursor clearance, which is re-evaluated continuously through the session. Clearance is therefore time-bound and behaviour-bound together, so a session can be re-challenged before the cookie expires if the ongoing assessment sours.

How to identify it

Headers

Cookies

Status codes

403 Interstitial challenge

Challenge. Documented by the vendor.

A challenge page was served in place of the resource. The request was held, not refused.

What triggers it

How to confirm it

What to do about it

HTTP/2 403
server: cloudflare
cf-mitigated: challenge
cf-ray: 8f2a1c4d5e6f7a8b-LHR
content-type: text/html; charset=UTF-8

<!DOCTYPE html><html><head><title>Just a moment...</title>
<script src="/cdn-cgi/challenge-platform/h/b/orchestrate/chl_page/v1"></script>

403 WAF or firewall block, error 1020

Blocked. Documented by the vendor.

A rule denied the request outright. No challenge is offered and there is nothing for the client to solve.

What triggers it

How to confirm it

What to do about it

HTTP/2 403
server: cloudflare
cf-ray: 8f2a1c4d5e6f7a8b-LHR
content-type: text/html; charset=UTF-8

<!DOCTYPE html><html><head><title>Attention Required! | Cloudflare</title>
...
<span class="cf-error-code">1020</span>
<span>Ray ID: 8f2a1c4d5e6f7a8b</span>

403 Browser signature banned, error 1010

Blocked. Documented by the vendor.

The client's browser signature was rejected. Cloudflare's wording is that the owner of the website has banned your access based on your browser's signature.

What triggers it

How to confirm it

What to do about it

403 Client reputation ban, error 1012

Blocked. Documented by the vendor.

Access denied based on activity attributed to the client's address or network rather than to this request.

What triggers it

How to confirm it

What to do about it

429 Rate limited, error 1015

Rate limited. Documented by the vendor.

The site's rate limiting rules were exceeded. The request shape is acceptable; the pace is not.

What triggers it

How to confirm it

What to do about it

HTTP/2 429
server: cloudflare
cf-ray: 8f2a1c4d5e6f7a8b-LHR
retry-after: 60

503 Legacy JavaScript challenge

Challenge. Observed behaviour.

The historic status for the JavaScript challenge and I'm Under Attack Mode, replaced by 403 during 2023.

What triggers it

How to confirm it

What to do about it

530 Origin unreachable, error 1033 and relatives

Allowed. Documented by the vendor.

Not a bot decision at all. Cloudflare reached the edge but could not reach the origin behind it.

What triggers it

How to confirm it

What to do about it

If you run a site behind it

If your traffic is being caught by it

Documentation

See also