Avoid > solve. Almost always.
CAPTCHA-solving is a fallback, not a strategy. The 2024–2026 generation of bot detection (Turnstile, reCAPTCHA v3, AWS WAF) rarely shows a challenge UI; instead, it scores every request continuously on JA4 + IP + behaviour + browser internals. A “CAPTCHA” only appears when the score crosses a threshold. The reliable, cheap, fast path is keeping the score below threshold so no challenge ever fires.
js=true + stealth=true + premium_proxy=true + matching proxy_country. On most protected sites this clears below challenge threshold. solve_captcha=true stays on as a safety net — it only costs anything if it actually fires.The CAPTCHAs you’ll meet
Each major family, what triggers it, and how it gets resolved inside a scraping pipeline.
Default mode is fully invisible. Triggered by JA4 mismatch, IP reputation, or behavioural anomalies. Solved server-side by a real Chromium with patched fingerprint.
Continuous score 0.0–1.0. Most pages pass at ≥0.5; sensitive ones want ≥0.7. No challenge UI shown — purely score-driven.
Click-the-traffic-lights and similar grids. Triggered when v3 score is too low or as a fallback. Outsourced to a vetted human-loop service. Median solve ~12s.
Same flow as reCAPTCHA v2 — image grid, human-loop solve.
JS-execution puzzle plus behavioural checks. Solved server-side by headless Chromium with patched anti-detection. Almost always invisible.
Multi-signal scoring; falls back to a slider/puzzle UI on the borderline cases. Server-side handles the score path; UI path needs human-loop.
Stack of TLS, behavioural, account-history scores. Requires residential IPs plus a clean fingerprint to never trigger. UI fallback is rare but supported.
Drag-the-slider puzzle, common on Chinese-origin sites and some financial portals. Server-side path solves with motion modelling.
How CAPTCHAs get solved
Two solve paths. The router picks based on what the site actually serves.
Server-side (free, ~1–3s)
Turnstile, reCAPTCHA v3, AWS WAF, DataDome score-paths, and most GeeTest puzzles all run inside the browser. A real Chromium with patched anti-detection executes the challenge JS and returns the resolved page. No human in the loop, no extra cost, no extra latency budget worth caring about.
Human-loop (1–2 extra credits, ~8–15s)
reCAPTCHA v2 image puzzles, hCaptcha image puzzles, and DataDome’s slider fallback can’t be cleanly automated. When they actually appear, a vetted human-loop service solves them. Server-side is attempted first; humans only get involved if the page genuinely renders the challenge UI.
stealth=true + premium_proxy=true + matching proxy_country reduces challenge frequency dramatically. Don’t pay for solves you could have prevented with three flags.Monitoring your CAPTCHA spend
Every response includes a captcha object so you can audit which sites cost human-loop credits and tune your config per-target. The four metrics below are what we ourselves watch in dashboards; the dashboard exposes them as time-series.
{
"success": true,
"credits_used": 6,
"fetch_path": "premium",
"captcha": {
"encountered": true,
"type": "cloudflare_turnstile",
"method": "browser_solve",
"extra_credits": 0,
"solve_ms": 1840
}
}When NOT to automate CAPTCHAs
We refuse some kinds of CAPTCHA-solving. Not because the technical path is harder, but because the CAPTCHA is doing the job it was designed to do — gating consent, authentication, or rate-limited public goods. Automating past it crosses from data extraction into impersonation.
A CAPTCHA on a login form is the consent gate. Solving it is impersonating the account owner.
Mass signup automation is the canonical abuse case CAPTCHAs were built for. Out of scope.
A challenge before paid content is the merchant gating their own goods. Don’t.
Out of scope, full stop. Not a use case we support at any tier.
Ratchets that depend on one-human-one-vote integrity. Solving the CAPTCHA breaks the protocol.
A CAPTCHA on “contact us” is anti-spam. Don’t solve it to send mass messages.
solve_captcha=false for a hard bounce on any challenge if your compliance program needs the explicit guardrail. Acceptable-use policy →CAPTCHA-related API parameters
Code examples
Avoid CAPTCHAs in the first place (recommended)
import requests
response = requests.get(
'https://api.example.com/scrape',
params={
'url': 'https://target-site.com',
'js': 'true',
'stealth': 'true',
'premium_proxy': 'true',
'proxy_country': 'US',
},
headers={'ApiKey': 'YOUR_API_KEY'},
)
print(response.text)Auto-solve as a safety net
curl -X GET 'https://api.example.com/scrape' \
-H 'ApiKey: YOUR_API_KEY' \
-G \
--data-urlencode 'url=https://protected-site.com' \
--data-urlencode 'js=true' \
--data-urlencode 'stealth=true' \
--data-urlencode 'premium_proxy=true' \
--data-urlencode 'solve_captcha=true'Hard-bounce on any CAPTCHA (compliance mode)
// Returns 403 with captcha.type set if any challenge appears
const res = await fetch('https://api.example.com/scrape?' + new URLSearchParams({
url: 'https://target.com',
js: 'true',
stealth: 'true',
solve_captcha: 'false',
}), { headers: { ApiKey: 'YOUR_API_KEY' } });
if (res.status === 403) {
const meta = JSON.parse(res.headers.get('X-Meta'));
console.log('blocked by', meta.captcha?.type);
}FAQ
Often no. Turnstile is invisible, and with stealth=true + residential proxies it usually never triggers a visible challenge. Enable solve_captcha as a safety net — it costs nothing unless it actually solves.
Server-side: 1–3s, mostly the page reload after the challenge resolves. Human-loop: 8–15s median, capped at 60s before we return a 503 you can retry.
Yes — response.captcha.type and response.captcha.method are in every successful response, plus solve_ms and extra_credits.
Almost always one of three things: (a) datacenter IPs on a site that does IP-reputation scoring, (b) stealth=false, or (c) proxy_country not matching the site’s primary audience. The fingerprinting guide walks through the diagnostic flow.
Cloudflare now scores audio context, deeper plugin enumeration, and a wider canvas variance check. All are handled by stealth=true; we ship patches within ~24h of vendor changes.
Yes. CAPTCHAs on login pages, signup forms, paywalls, banking, KYC, and voting are out of scope. The API returns 422 with a clear refusal message rather than attempting the solve.