Skip to content

Cap vs Cloudflare Turnstile ​

Turnstile is Cloudflare's free CAPTCHA replacement, focused on running invisible challenges that lean heavily on Cloudflare's network signals and browser fingerprinting.

Quick verdict ​

Turnstile is genuinely good if you're already on Cloudflare and accept that the verdict is theirs to make. Cap is the better fit when you want self-hosting, deterministic difficulty, no third-party dependency, and the ability to override decisions for your own users.

Where Turnstile makes sense ​

  • You're already routing traffic through Cloudflare and want to stay in one ecosystem.
  • You don't want to host anything; Turnstile is fully managed.
  • You're willing to accept Cloudflare's algorithmic decisions for "suspicious" visitors with no way to override.

Where Cap is the better choice ​

  • Self-hosted. Cap runs on your servers. Turnstile requires every challenge to round-trip through Cloudflare.
  • You own the policy. With Turnstile, if Cloudflare's algorithm decides a user looks suspicious (common for Brave, Librewolf, Tor, or VPN users), there is no override. Cap puts the difficulty knob in your hands.
  • Lower error rate for privacy-conscious users. Turnstile is widely reported to misclassify hardened browsers. Cap's proof-of-work doesn't care about fingerprints.
  • Open source. Apache 2.0 vs Turnstile's closed-source client and server.
  • No telemetry. Cap doesn't phone home and doesn't set cookies. Turnstile's client communicates with challenges.cloudflare.com on every page load.
  • Customizable. Cap exposes CSS variables for colors, size, and shape. Turnstile's iframe is mostly fixed.

Where they're similar ​

Both ship a small (~20-110 KB) client. Both run an "invisible" mode (Cap calls it floating mode or programmatic mode). Both layer behavioral checks on top of a primary challenge: Cap calls those instrumentation challenges, Turnstile calls them "managed challenges."

Migration ​

Cap's /siteverify API shape is compatible with Cloudflare's siteverify, so server-side verification is mostly a URL and secret swap. The client-side change is replacing <div class="cf-turnstile"> with <cap-widget> and pointing it at your Cap instance; see the quickstart for full code.

See also ​