Verbatim flag passthrough
Every standard curl flag — -s, -H, -d, -o, --resolve, exit codes and all — is forwarded unchanged to the wrapped upstream curl. Your Makefiles, CI jobs, and muscle memory keep working.
← back home · # features
recurl is a debugger's curl, not a magic wand. Each capability below maps to one of the four things it actually does: stay compatible, detect blocks, impersonate a browser, and — only if it must — drive a headless browser. See the architecture for how they chain.
# drop-in curl compatibility
recurl wraps a real curl binary and forwards every standard flag verbatim. Aliasing curl to recurl is the whole migration.
Every standard curl flag — -s, -H, -d, -o, --resolve, exit codes and all — is forwarded unchanged to the wrapped upstream curl. Your Makefiles, CI jobs, and muscle memory keep working.
recurl-specific behaviour lives behind a --recurl-* namespace that never collides with a real curl flag, so existing command lines stay valid.
--recurl-strict disables all fallback and gives you pure plain-curl behaviour — same exit code, same body, same headers — when you need the raw signal.
One binary via npm, PyPI, Homebrew, or Cargo. Linux, macOS, and Windows are all supported.
# automatic block detection
The happy path is upstream curl, fast and side-effect free. recurl only pays the bypass cost when it actually sees a block.
A 2xx from plain curl returns immediately — the total overhead is one process boundary. Successful requests never touch impersonation or a browser.
recurl recognises 403, 429, and known challenge response bodies as blocks and escalates automatically, with no per-host configuration.
--recurl-debug prints which layer ran, why it escalated, which fingerprint was used, and what each upstream attempt returned — no more guessing.
When every layer is exhausted, recurl surfaces a real failure instead of pretending success, so your monitoring and pipelines stay trustworthy.
# tls fingerprint impersonation
On Linux and macOS recurl bundles curl-impersonate profiles so the TLS handshake, HTTP/2 SETTINGS frame, and pseudo-header order all match a real browser.
Chrome, Firefox, Safari, and Edge profiles (plus version variants) reproduce the exact handshake a WAF expects from that browser.
recurl picks a fitting profile automatically on escalation. Force a specific one with --recurl-impersonate when a host only accepts a particular fingerprint.
It is not just the User-Agent — the JA3/JA4 TLS signature, HTTP/2 SETTINGS, and header order all line up, which is what a plain curl cannot do.
recurl uses the well-established curl-impersonate as its impersonation layer, then adds detection and fallback on top.
# headless-browser preflight escalation
For JavaScript challenges, recurl spins up headless Chromium via the recurld daemon, solves the challenge, captures cookies, and replays through curl.
The preflight solves the JS challenge, captures cookies and tokens, then replays the original request through curl so your parser sees the expected format.
recurld keeps a warm Chromium instance and reuses it across invocations. The first request pays the boot cost; the next fifty do not.
--recurl-js-wait waits for a CSS selector, --recurl-js-timeout adjusts the default 30s budget, and --recurl-js-rendered returns the rendered DOM when a replay is not enough.
The daemon shuts itself down after a configurable idle timeout, so nothing lingers when you are not calling it.
Walk the escalation architecture, read the use cases, or follow a step-by-step guide.