← back home · # compare
recurl vs curl-impersonate
Patched curl with browser TLS fingerprints
recurl uses curl-impersonate as its impersonation layer. The difference is operational: curl-impersonate is a fixed set of profile binaries that you invoke directly, with no detection layer and no fallback. recurl wraps it with automatic block detection, escalates to a headless-browser preflight when impersonation is not enough, and falls back to plain curl on success. Same TLS layer underneath; different ergonomics on top.
| Feature | recurl | curl-impersonate | Advantage |
|---|---|---|---|
| TLS fingerprint mimicry | Yes — uses curl-impersonate internally | Yes — this is the core feature | Tie |
| Browser profiles | chrome, firefox, safari, edge + version variants | chrome, firefox, safari, edge + version variants | Tie |
| Automatic block detection | Yes — detects 403 / 429 / challenge and escalates | No — you pick the profile, request fails or succeeds | recurl |
| JS challenge handling | Headless Chromium preflight + cookie replay | Not available — TLS layer only | recurl |
| Warm browser daemon | recurld keeps Chromium hot across invocations | N/A | recurl |
| Behaviour on already-working sites | Runs plain curl, no impersonation overhead | Always uses the patched binary | recurl |
| Invocation | Single binary: recurl | One binary per profile: curl_chrome, curl_ff, etc | recurl |
| Platform coverage | Linux, macOS, Windows (Windows skips to JS layer) | Linux, macOS | recurl |
| Debug output | --recurl-debug surfaces escalation decisions | Standard curl -v | recurl |
| Licence | MIT | MIT | Tie |
| Project maturity | Newer, smaller surface area | Established, widely used in scraping stacks | curl-impersonate |
Pick recurl when
- ▸You want automatic detection of blocked responses, not manual profile selection per host
- ▸You want a JS preflight fallback for sites where TLS impersonation alone is not enough
- ▸You want a warm Chromium daemon so JS preflight is fast across many requests
- ▸You want one binary name (recurl) in your scripts instead of a fleet of curl_chrome / curl_ff variants
- ▸You want plain curl behaviour on the happy path and impersonation only when needed
Pick curl-impersonate when
- ▸You always want the same fixed TLS profile applied to every request, no detection layer in between
- ▸You are integrating into a system that already speaks the curl_chrome / curl_ff binary convention
- ▸You explicitly do not want a JS preflight layer or any browser involvement
- ▸You want the minimal possible dependency surface — just the patched curl, nothing else
Still deciding?
recurl is MIT-licensed and runs locally. Install it next to your existing toolchain, alias it for one project, and decide if it stays.