Cloudflare's 2026 bot stack
Cloudflare went from "CAPTCHA on suspicious requests" to a multi-signal real-time bot management platform. The current stack:
- 1.TLS fingerprinting (JA4 / JA4+). Cloudflare hashes the TLS ClientHello — cipher order, extensions, ALPN, supported groups. Headless Chromium with default settings has a different JA4 than real Chrome. Default Python requests has a JA4 that screams "not a browser."
- 2.IP reputation. Cloudflare maintains a real-time reputation score for every IP based on prior abuse, residential proxy network membership (yes — they actively detect and flag residential proxy pools), and per-customer rule overrides.
- 3.ASN-level signals. Datacenter ASNs (AWS, GCP, Hetzner, OVH, DigitalOcean) get default-low trust. Residential ISP ASNs get baseline trust unless flagged. Mobile carrier ASNs (T-Mobile, Verizon, Vodafone, etc.) get the highest baseline.
- 4.Behavioral analysis. Mouse movement, scroll patterns, dwell time, click jitter. Real users have variance. Bots tend to be too consistent or too random.
- 5.HTTP fingerprinting. Header order, casing, ALPN protocol selection. curl with default settings has a recognizable signature.
All five signals combine into a real-time score. Below the threshold → request gets a CAPTCHA challenge, served a stripped response, or blocked outright.
How Cloudflare detects residential proxies
Residential proxy networks (Bright Data, Smartproxy, Soax, IPRoyal, etc.) source IPs from end-user devices via SDK partnerships — apps install code that turns the user's device into a proxy. Cloudflare detects these networks via:
- →Cross-customer pattern matching. The same IP routes traffic for many different domains/customers in unrealistic ways. Real users hit a small set of sites; proxy IPs hit thousands.
- →Volume signatures. A real residential IP typically generates ~100-500 requests per day. A residential proxy IP can generate 10,000+ requests in a few hours when assigned to a high-volume scraping job.
- →Geographic inconsistency. The IP is registered to one geo (per ISP records) but the User-Agent / Accept-Language / behavior suggests another.
- →SDK partner identification. Cloudflare has, over time, identified which mobile apps participate in proxy network SDKs. IPs of devices running those apps get residual reputation hits.
Once an IP enters Cloudflare's bad-actor lists, it serves degraded responses or hard-blocks. Residential proxy providers rotate IPs to avoid this, but the underlying issue is structural: their entire pool is in cross-customer use, which is the signal Cloudflare looks for.
CGNAT economics — why mobile is different
Mobile carriers use Carrier-Grade NAT. Thousands of real subscribers share each public IP. A T-Mobile IP in Phoenix routes traffic for, say, 5,000 real customers actively browsing. Cloudflare cannot aggressively block that IP without blocking all 5,000 real T-Mobile customers — those are paying customers who go to all kinds of legitimate sites every minute.
The economic math:
If Cloudflare aggressively blocks IP X (mobile carrier CGNAT):
- 5,000 real T-Mobile customers can't reach Cloudflare-fronted sites
- Carrier gets complaints
- Cloudflare customers (the websites) lose real-customer traffic
- Bad UX, real revenue loss for everyone
If Cloudflare aggressively blocks IP Y (residential proxy):
- Maybe 1-2 actual residents are inconvenienced
- The proxy operator notices and rotates
- Net effect: small UX hit, big abuse mitigation
Conclusion: Mobile carrier IPs get the benefit of the doubt
because the cost of false positives is too high.This is a structural property, not a temporary loophole. As long as carriers use CGNAT (which they will — IPv4 exhaustion makes it permanent), mobile carrier IPs will retain higher trust than residential pool IPs.
Are all "mobile" proxies actually mobile?
Critical caveat: many providers sell "mobile proxies" that route through residential or even datacenter IPs with mobile-looking User-Agents. Cloudflare's ASN-level signal is the truth — not what the provider claims. Verify yourself:
curl -x http://USER:PASS@your-provider:7000 https://ipinfo.io/json
# Look for "org": "AS21928 T-Mobile USA, Inc." or similar
# If you see "AS16509 Amazon" or "AS24940 Hetzner", it's not actually mobile.Pool Gateway publicly lists carrier ASNs and you can paste any returned IP into ipinfo.io to confirm. That's the trust anchor for mobile-tier pricing — provable carrier IPs, not residential repackaged.
Switching from residential to mobile
If you're currently using residential proxies and hitting Cloudflare blocks:
# Before: residential proxy provider
proxy_url = "http://user:pass@residential-provider.com:7777"
# After: Pool Gateway mobile proxy
proxy_url = "http://psx_YOUR_ID-mbl-us:YOUR_PASSWORD@gw.proxies.sx:7000"
# Same scraping code, different proxy URL.
# Mobile-tier pricing is higher per-GB but success rate vs Cloudflare
# is dramatically higher — usually cheaper per successful request.For workloads with mixed targets, you can use the username DSL to route different scrape jobs to different tiers. Build the right username with the Username Builder.
Mobile is not magic
Mobile carrier IPs give you ASN trust, but Cloudflare still profiles behavior. A mobile IP making 100 requests per second from one User-Agent is still obviously bot. To preserve mobile IP advantage:
- →Realistic per-IP request rate (1-5/second peak, not 50)
- →Real Chrome/Safari User-Agents, not default Playwright UA
- →Random delays with jitter between requests
- →Rotate IPs aggressively (use -rot-auto5 or -rot-auto10 in your username DSL)
- →For full browser scraping, use Playwright or Camoufox to mimic real browser fingerprints