Turnstile vs reCAPTCHA: how the two compare
Cloudflare Turnstile and Google reCAPTCHA are both bot-detection widgets: each runs a client-side check, hands your page a token, and expects your server to verify that token against the vendor's API. The practical difference is what happens in between — Turnstile never shows image puzzles and returns a pass/fail verdict, while reCAPTCHA v2 can escalate to an image challenge and reCAPTCHA v3 returns a 0.0–1.0 risk score you threshold yourself.
Cloudflare and Google pricing verified 13 August 2026 from each vendor's public plan and pricing documentation.
What each product is
Turnstile is Cloudflare's CAPTCHA replacement. Cloudflare describes it as a privacy-preserving alternative that can be embedded into any website without sending traffic through Cloudflare, so you do not need your domain on Cloudflare's network to use it. It runs small non-interactive JavaScript challenges — proof-of-work, proof-of-space and browser API probing — and adjusts difficulty per visitor rather than showing a visual puzzle.
reCAPTCHA is Google's long-running equivalent, now folded into Google Cloud Fraud Defense: "reCAPTCHA has become a part of Google Cloud Fraud Defense, a fraud and abuse prevention platform for bot, account, and transaction protection." The classic integrations remain: v2 checkbox, v2 invisible, v2 Android, and v3, which scores traffic in the background. Google Cloud's assessment API returns a risk score from 0.0 to 1.0 plus reason codes.
Both ship several modes, and which one is less intrusive depends entirely on which mode is deployed:
| Product | Mode | What the visitor sees |
|---|---|---|
| Turnstile | Managed (recommended) | Cloudflare picks non-interactive or a checkbox challenge based on assessed risk; interaction only when necessary |
| Turnstile | Non-interactive | A visible widget with a loading spinner; the visitor never interacts with it |
| Turnstile | Invisible | Nothing. No widget, no loading indicator, no interaction |
| reCAPTCHA v2 | Checkbox | An "I'm not a robot" box; the system either passes the visitor or presents a challenge |
| reCAPTCHA v2 | Invisible | Nothing by default. It binds to an existing button or a JavaScript call, and "only the most suspicious traffic will be prompted to solve a captcha" |
| reCAPTCHA v3 | Score only | Nothing. Google states v3 "will never interrupt your users"; you decide what to do with the score |
Do image challenges appear?
Turnstile has no image-puzzle path. Cloudflare's documentation is explicit that Turnstile verifies visitors without displaying visual puzzles, and the most demanding thing managed mode will ask for is a checkbox click. Turnstile is WCAG 2.2 AA compliant on both plans, with WCAG 2.2 AAA support listed under Enterprise.
reCAPTCHA v2 checkbox is the mode most people picture, and it is the one that can escalate to a grid of traffic lights or crosswalks. v2 invisible does the same thing, only triggered by a button or grecaptcha.execute() rather than a checkbox. v3 does not challenge at all — but that also means v3 alone blocks nothing. You get a number, and you build the enforcement.
So the accurate framing is not that Turnstile has no CAPTCHA and reCAPTCHA does. It is that Turnstile's worst case is a click, reCAPTCHA v2's worst case is an image grid, and reCAPTCHA v3's worst case is that your own threshold is wrong and you silently block real users.
Privacy and data handling
reCAPTCHA sets a cookie. Google's FAQ states: "reCAPTCHA sets a necessary cookie (_GRECAPTCHA) when executed for the purpose of providing its risk analysis." Google also documents serving the script from www.recaptcha.net instead of www.google.com for sites that want to avoid additional Google cookies — a workaround that exists because the default behaviour draws compliance complaints in the EU.
Cloudflare positions Turnstile on the opposite footing. Its general-availability announcement says Turnstile "meets ePrivacy Directive, GDPR and CCPA compliance requirements" and that "we don't rely on tracking user data, like what other websites someone has visited, to determine if a user is a human or robot", adding that Cloudflare's business is protecting websites rather than selling ads. Cloudflare publishes a Turnstile Privacy Addendum, and using invisible mode requires you to reference that addendum in your own privacy policy.
Turnstile is not cookie-free in every configuration either. If you enable pre-clearance, "a cf_clearance cookie is issued to the visitor in addition to the default Turnstile token", which lets a visitor bypass subsequent WAF challenges on a matching Cloudflare zone. That is opt-in and functional rather than analytic, but it is a cookie, and your consent copy should say so.
Neither product is a zero-data system: both receive an IP address, both run code in the visitor's browser, and both accept an optional remoteip on server-side verification. The difference is stated purpose and corporate incentive, not the absence of collection.
Free tiers and pricing
This is where the two diverge hardest. Turnstile's free plan is limited by shape — how many widgets and hostnames you configure — not by traffic. reCAPTCHA bills per assessment above a monthly allowance.
| Plan | What you get | Cost |
|---|---|---|
| Turnstile Free | Up to 20 widgets, 10 hostnames per widget, unlimited challenges (traffic or verification requests), 7 days of analytics, all widget types | Free |
| Turnstile Enterprise | Unlimited widgets, up to 200 hostnames per widget, any-hostname widgets, 30 days of analytics, ephemeral IDs, offlabel branding | Contact sales; no published rate |
| reCAPTCHA Essentials | Free up to 10,000 assessments per calendar month; requires a valid billing instrument in Google Cloud; no account, password, SMS or transaction defence | Free within the allowance |
| reCAPTCHA Premium | Enhanced bot, account and transaction protection | 0–10,000 assessments free; 10,001–100,000 a flat $8.00; above 100,000, $1.00 per 1,000 assessments |
| reCAPTCHA Enterprise | Custom policies, advanced analytics, related accounts API, API-only transaction defence | Fixed monthly volume commitment at $1 per 1,000 assessments, 12-month minimum |
Legacy standalone reCAPTCHA keys carry their own ceiling. Google's FAQ states that if you want to make more than 1,000 calls per second or 1,000,000 calls per month you must use reCAPTCHA Enterprise. Exceeding the quota degrades quietly rather than erroring cleanly:
- v3 over quota returns a static score of 0.9 — your risk signal disappears without an exception being raised.
- v2 over quota shows the visitor "This site is exceeding reCAPTCHA quota."
- Both failure modes are worth alerting on, because neither looks like an outage in your own logs.
Integration differences
The two integrations are structurally the same and differ in names, limits and one strictness rule. If you have written one, you can read the other.
| Turnstile | reCAPTCHA | |
|---|---|---|
| Script | https://challenges.cloudflare.com/turnstile/v0/api.js (add ?render=explicit for manual rendering) | https://www.google.com/recaptcha/api.js |
| Container | div with class cf-turnstile and data-sitekey | div with class g-recaptcha and data-sitekey (v2) |
| Auto-created form field | cf-turnstile-response | g-recaptcha-response |
| Verify endpoint | POST https://challenges.cloudflare.com/turnstile/v0/siteverify | POST https://www.google.com/recaptcha/api/siteverify |
| Body formats | application/x-www-form-urlencoded or JSON; POST only | Form-encoded POST |
| Verify parameters | secret, response, optional remoteip, optional idempotency_key | secret, response, optional remoteip |
| Verdict | success boolean, plus challenge_ts, hostname, action, cdata | success boolean; v3 adds score (0.0–1.0) and action |
| Token lifetime | 300 seconds, single use, maximum 2,048 characters | 2 minutes, single use |
| JS API | turnstile.render(), execute(), reset(), getResponse(), remove() | grecaptcha.render(), execute(), reset(), getResponse() |
The error-code vocabulary overlaps almost exactly: both return missing-input-secret, invalid-input-secret, missing-input-response, invalid-input-response, bad-request and timeout-or-duplicate. Turnstile adds internal-error, for which Cloudflare recommends a retry. Turnstile's idempotency_key (a UUID) exists so that retrying a verification of the same token does not trip timeout-or-duplicate; reCAPTCHA has no equivalent, so a retry after a network timeout can burn the token.
# Turnstile: POST only, form-encoded or JSON curl -sX POST https://challenges.cloudflare.com/turnstile/v0/siteverify \ -d "secret=$TURNSTILE_SECRET" \ -d "response=$TOKEN" \ -d "idempotency_key=$(uuidgen)" # {"success":true,"challenge_ts":"2026-08-13T09:12:44.000Z","hostname":"example.com"} # reCAPTCHA v3: same shape, but the verdict is a score you must threshold curl -sX POST https://www.google.com/recaptcha/api/siteverify \ -d "secret=$RECAPTCHA_SECRET" \ -d "response=$TOKEN" # {"success":true,"score":0.9,"action":"login","hostname":"example.com"}
Both vendors ship test credentials so you can exercise pass and fail paths in CI. Turnstile's dummy sitekeys include 1x00000000000000000000AA (always passes, visible), 2x00000000000000000000AB (always fails, visible) and 3x00000000000000000000FF (forces an interactive challenge), paired with dummy secrets such as 1x0000000000000000000000000000000AA (always passes) and 3x0000000000000000000000000000000AA (returns token-already-spent). Test sitekeys emit the token XXXX.DUMMY.TOKEN.XXXX, which production secrets reject.
Migration notes
Cloudflare publishes a reCAPTCHA migration guide and a compatibility shim. Loading the script with ?compat=recaptcha "enables the following features: implicit rendering for reCAPTCHA, g-recaptcha-response input name for forms, register the Turnstile API as grecaptcha". Existing grecaptcha.render() and execute() calls keep working; you swap in your Turnstile sitekey. The guide covers reCAPTCHA v2, including invisible mode.
<!-- Drop-in replacement for reCAPTCHA v2 markup --> <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha" async defer></script> <form method="POST" action="/login"> <!-- class and field name stay as they were; only the sitekey changes --> <div class="g-recaptcha" data-sitekey="0x4AAA..."></div> <button type="submit">Sign in</button> </form>
Server-side, point verification at https://challenges.cloudflare.com/turnstile/v0/siteverify instead of Google's endpoint. One gotcha is called out in Cloudflare's own guide: Turnstile's siteverify "does not support GET requests and only accepts POST requests with a FormData or JSON body". Code that built a query-string GET against Google will fail here.
The migration that breaks is v3 to Turnstile. reCAPTCHA v3 hands you a score and expects you to own the decision; Turnstile hands you success: true or false. If your login flow reads score < 0.5 to trigger step-up authentication, there is no field to port that logic onto — you either move the risk decision to your own signals or re-scope what the widget is responsible for. Migrating v2 is a text substitution; migrating v3 is a design change.
Other things to plan for: token lifetime shortens or lengthens depending on direction (2 minutes versus 300 seconds), Turnstile's free plan caps you at 20 widgets and 10 hostnames per widget so multi-tenant setups need thought, and your privacy policy and cookie banner both reference the old vendor. If you deploy invisible mode, Cloudflare requires you to reference the Turnstile Privacy Addendum in that policy.
Testing your own protected flows
Once a challenge sits in front of a signup, login or checkout, your own automation stops at it too: end-to-end suites in CI, uptime probes, staging smoke tests, and any attempt to verify that a new anti-bot configuration behaves as intended. Vendor test keys cover the CI case where you control the environment. They do not help when you need to exercise a real deployment with real keys.
SolveGate solves Cloudflare Turnstile — managed, non-interactive and invisible — and Turnstile-backed WAF challenge pages. It does not solve reCAPTCHA, and it does not solve hCaptcha, GeeTest, FunCaptcha or AWS WAF. If your stack is on reCAPTCHA, this page is reference material and nothing more; the comparison above is the useful part.
# gate is "turnstile" for widgets, "waf" for Cloudflare challenge pages curl -sX POST https://api.solvegate.io/v1/solve \ -H "Authorization: Bearer $SOLVEGATE_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{ "gate": "turnstile", "sitekey": "0x4AAA...", "url": "https://staging.example.com/login" }' # Poll a queued solve by id (polling is free) curl -s https://api.solvegate.io/v1/solve/sol_123 \ -H "Authorization: Bearer $SOLVEGATE_SECRET_KEY"
Tokens typically return in under 1.5 seconds. Credits are prepaid, from $0.40 per 1,000 solves down to $0.075 at volume, failed solves are never billed, and the first 1,000 solves are free. SDKs are published as solvegate on npm (Node 18+) and PyPI (Python 3.9+). Use this against properties you own or are authorised to test — QA, CI, uptime monitoring, staging and anti-bot configuration testing.
Common questions
No. Cloudflare's documentation states that Turnstile verifies visitors without displaying visual puzzles. The most a visitor is asked to do is click a checkbox, and only in managed mode when the risk assessment calls for it. Non-interactive mode shows a spinner and invisible mode shows nothing. reCAPTCHA v2 is the mode that can escalate to an image grid; reCAPTCHA v3 never interrupts the visitor at all.
Turnstile's free plan includes unlimited challenges and verification requests, capped instead at 20 widgets, 10 hostnames per widget and 7 days of analytics. reCAPTCHA's Essentials tier is free up to 10,000 assessments per calendar month but requires a valid billing instrument in Google Cloud; the Premium tier charges a flat $8.00 for 10,001-100,000 assessments and $1.00 per 1,000 above that. Legacy standalone reCAPTCHA keys must move to Enterprise beyond 1,000 calls per second or 1,000,000 calls per month.
No. Turnstile's siteverify response is a success boolean alongside challenge_ts, hostname, action and cdata. There is no score field. This is the hardest part of migrating off reCAPTCHA v3, whose 0.0-1.0 score is usually wired into step-up authentication or manual review. Enterprise Turnstile adds metadata.ephemeral_id for device correlation, but that is not a score.
For v2, close to a text substitution. Load the Turnstile script with ?compat=recaptcha, which registers the Turnstile API as grecaptcha and keeps the g-recaptcha-response form field, then swap the sitekey and point server-side verification at https://challenges.cloudflare.com/turnstile/v0/siteverify. Note that Turnstile's siteverify accepts POST only, with a form-data or JSON body. For v3, you also have to rebuild whatever logic consumed the score.
Cloudflare makes the stronger public commitment: it says Turnstile meets ePrivacy Directive, GDPR and CCPA requirements and does not rely on tracking which other sites a visitor has been to. reCAPTCHA sets a _GRECAPTCHA cookie for risk analysis, and Google documents serving from www.recaptcha.net to avoid additional Google cookies. Neither is data-free: both see the visitor's IP and run code in the browser, and Turnstile's optional pre-clearance feature issues a cf_clearance cookie.
No. SolveGate handles Cloudflare Turnstile in all three widget modes and Turnstile-backed WAF challenge pages. It does not handle reCAPTCHA, hCaptcha, GeeTest, FunCaptcha or AWS WAF. For automating a reCAPTCHA-protected flow you own, vendor test keys in a controlled environment are the supported route.
Related
More in Glossary
Automating a gate you own or are authorised to test?
// SolveGate clears Cloudflare Turnstile and WAF challenges through one REST call · first 1,000 solves free