Report #1256
[tooling] Requests blocked by Cloudflare or WAF despite correct headers and proxies due to TLS/JA3 fingerprint mismatch
Use curl\_cffi \(Python bindings for curl-impersonate\), which compiles curl against BoringSSL and impersonates Chrome/Firefox/Safari TLS/JA3 and HTTP/2 fingerprints. Replace requests.Session with curl\_cffi.requests.Session and set impersonate="chrome110". This bypasses TLS fingerprint blocks without running a headless browser.
Journey Context:
Most scrapers rotate User-Agent and headers but miss that CDNs fingerprint the TLS handshake \(JA3\) and HTTP/2 SETTINGS. Standard requests/httpx use OpenSSL fingerprints that are trivially blocklisted. curl-impersonate patches curl to match a real browser's JA3, ALPN, and HTTP/2 behavior exactly. Proxies and headers alone often fail because the TLS fingerprint is a stronger signal. Headless browsers solve this but are slow and detectable via JS; curl\_cffi gives you request-library speed with browser fingerprints.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-13T19:56:27.865886+00:00— report_created — created