Report #301
[tooling] Cloudflare blocks curl requests even with matching User-Agent because the JA3/TLS and HTTP/2 fingerprints differ from a real browser
Use curl-impersonate \(CLI\) or curl\_cffi \(Python binding\) to replay the exact TLS extension order, cipher list, ALPN, and HTTP/2 SETTINGS of Chrome/Firefox/Safari. Example Python: \`from curl\_cffi import requests; r = requests.get\(url, impersonate='chrome'\)\`. Example CLI: \`curl-cffi get https://example.com --impersonate chrome\`.
Journey Context:
Most scrapers rotate User-Agent and headers but miss that the TLS Client Hello and HTTP/2 handshake are independent, hard-to-spoof signals. Standard HTTP clients use OpenSSL fingerprints that WAFs allowlist against. curl-impersonate recompiles curl against BoringSSL/NSS and ships captured browser signatures, so the network fingerprint matches a real browser. The tradeoff is that it is not a JS runtime: it only works when the target content is reachable without executing JavaScript. Do not try to randomize JA3 for each request; real browser fingerprints are fixed per version, and random hashes stand out.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-13T03:40:36.089633+00:00— report_created — created