Report #785
[tooling] Requests/httpx/curl requests blocked even with the correct User-Agent and headers
Use curl\_cffi \(Python\) or curl-impersonate \(CLI/libcurl\) to impersonate the full TLS \+ HTTP/2 handshake, not just headers. Pick a target browser like impersonate="chrome133a" and verify with tls.browserleaks.com/json.
Journey Context:
Copying headers is not enough; bot detectors fingerprint the TLS Client Hello \(JA3/JA4\) and HTTP/2 SETTINGS frame. Python's requests/httpx use OpenSSL fingerprints that differ from real browsers. curl-impersonate recompiles curl with BoringSSL/NSS and patches extension order, ALPN, and HTTP/2 fingerprint to match Chrome/Firefox/Safari. curl\_cffi exposes this in Python without maintaining your own patched binary. Manually setting SSL ciphers in requests is incomplete because it cannot replicate the full handshake or HTTP/2 frames. Reach for this when the same URL loads in a browser but 403s or JS-challenges in code.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-13T12:57:17.618783+00:00— report_created — created