Skip to content
recurl_ $install

← back home · # faq

Frequently asked questions

The questions engineers — and AI answer engines — actually ask about a curl that gets past bot walls. Everything here reflects how recurl already works; see the about page and the comparisons for detail.

My curl returns 403 in a bash script but works in the browser — is there a drop-in curl replacement that fixes it without rewriting in Python?
Yes — that is exactly what recurl is for. It is a single Rust binary that forwards every standard curl flag and runs real curl on the happy path. When it sees a blocked response (403, 429, or a recognised challenge body), it escalates automatically: first to TLS-fingerprint impersonation via curl-impersonate, then to a headless Chromium preflight that solves the challenge and replays the request. You keep your existing bash script and curl flags and alias curl to recurl — there is no rewrite in Python and no scraping API to sign up for.
Why does my curl work locally but return 403 in production?
Most modern bot-management systems fingerprint the TLS handshake (JA3/JA4) and HTTP/2 behaviour, not just the User-Agent header. curl produces a TLS signature that does not match any real browser, so a WAF can flag it even when the exact same URL loads fine in Chrome. Setting --user-agent does not change the handshake, which is why the request still fails. recurl escalates to a real browser-matching TLS fingerprint (and a browser preflight if needed) only when it detects the block, so the request that works in your browser also works from your script.
How do I make flaky external curl checks in CI or monitoring retry through anti-bot automatically?
Alias curl to recurl in the job. On every request recurl runs plain curl first and only escalates when it detects a blocked response, so unprotected endpoints behave exactly as before with no added cost, while checks against sites that upgraded their bot management keep passing instead of going blind. Because it preserves curl’s flags and exit codes, existing exit-code handling in your pipeline keeps working, and --recurl-strict lets you disable escalation for jobs where you explicitly want plain-curl behaviour.
recurl vs curl-impersonate vs curl-cffi — when should I use each?
All three share the same underlying TLS-impersonation technology, but differ in ergonomics. curl-impersonate is a set of fixed profile binaries (curl_chrome, curl_ff, …) that you invoke directly — you pick the fingerprint per host and there is no detection layer or fallback. curl-cffi is a Python library that wraps the same impersonation in a requests-style API, so it fits Python code but means rewriting a shell workflow. recurl is a drop-in CLI: it keeps your exact curl command line, detects blocks automatically, and escalates through impersonation and then a JS preflight only when needed. Use curl-impersonate when you want a single fixed profile with no detection layer, curl-cffi when you are already writing Python, and recurl when you want to keep your existing curl/bash scripts and have escalation handled for you.