How Bot Management scores a request
Bot Management computes the Bot Score at the Cloudflare edge before the origin server sees anything. The inputs are JA4 TLS fingerprint, HTTP/2 SETTINGS frame, IP reputation, ASN type, request rate patterns, and (when a JS challenge has fired previously) the __cf_bm cookie carrying the result. The score is exposed to the customer via the cf.bot_management.score field in Workers and in firewall rules.
The customer chooses what to do with the score. A common configuration is block under 30, challenge 30–60, allow above 60, with allowlists for verified bots (Googlebot, Bingbot — Cloudflare maintains the list and labels them). A scraper that fingerprints as Bot Score 12 will get blocked or challenged on every protected site simultaneously, because the model is shared.
Bot Management vs Turnstile vs Bot Fight Mode
Three Cloudflare products get conflated:
| Product | Tier | What it does |
|---|---|---|
| Bot Fight Mode | Free | Blunt heuristic block of known datacenter / cloud IPs. Easy to detect (blocks before JS runs) and easy to bypass (residential proxy). |
| Bot Management | Enterprise | Continuous ML scoring per request. Hard to bypass without a coherent fingerprint across all four detection layers. |
| Turnstile | Free / managed | A widget you embed on a specific endpoint (login, signup). Issues cf_clearance on solve. Can be invoked by Bot Management as a challenge. |
A protected site can run all three layered: Bot Fight Mode catches the cheap traffic, Bot Management scores the rest, Turnstile is surfaced when the score is borderline.
What works and what doesn't
Doesn't work: Python requests with a Chrome User-Agent (Bot Score ~3), Playwright with default settings (CDP leaks score ~15), datacenter proxies of any flavour, residential proxies with a mismatched timezone.
Works for free-tier (Bot Fight Mode): curl_cffi with Chrome impersonation + residential proxy is usually sufficient.
Works for Bot Management: Camoufox or CloakBrowser with a clean residential or ISP IP, matched Accept-Language, and patient request pacing. Hard deployments require a managed API. The signal a Bot Management deployment is in front of you is the cf-mitigated header on a block — Bot Fight Mode blocks return a plain 403 with no cf-mitigated.
