Comparison

CAPTCHAs vs Arcjet

A CAPTCHA is a per-submit challenge on a page that can render a widget. Arcjet advanced signals persist a cookie and evaluate with server-side bot detection in your request handlers.

9 min read
In short: A CAPTCHA is a per-submit challenge on a page that can render a widget. Arcjet advanced signals persist a cookie and evaluate with server-side bot detection in your request handlers.

How CAPTCHAs work

Looking for a CAPTCHA alternative? Cloudflare Turnstile, Google reCAPTCHA, and hCaptcha challenge a browser form. Arcjet advanced signals detect automation without a widget, layered on server-side bot detection.

They follow the same pattern: a client-side widget runs a challenge, the form submits a token, and the server calls the provider to verify it. If verification passes, then the server allows the request.

Turnstile offers Managed (checkbox only if the visitor looks risky), Non-interactive (spinner while challenges run), and Invisible (no UI). Detection uses proof-of-work, proof-of-space, web API probing, and browser-quirk analysis. Tokens expire after 300 seconds, and you can validate each token only once.

reCAPTCHA v2 is a checkbox or image challenge. v3 is invisible and returns a risk score that you have to turn into a policy. hCaptcha is similar to reCAPTCHA, independent of Google, with visible and invisible modes. Enterprise tiers add bot scoring.

CAPTCHAs are a browser mechanism. They can't protect pure API endpoints, server-to-server calls, native mobile backends without a native CAPTCHA SDK, or any route that can't embed a widget.

How Arcjet advanced bot signals work

Arcjet's answer to the same form-spam problem is advanced client signals, layered on server-side bot detection in your request handlers, not a challenge widget. There's no puzzle and no synchronous verification call on submit.

A small script loads a WebAssembly module on a page that leads into a sensitive route. The module collects environment signals (headless markers, automation fingerprints, browser-quirk anomalies, timing) and stores a continue token in a cookie. On the next server-side request, bot detection reads that cookie alongside user-agent classification, IP reputation, and verified-bot lists. The cookie persists across navigations.

That shape has a few consequences:

  • One bot decision. Arcjet can deny a request because signals look automated, because the user agent matches a known scraper, or because the IP has a poor reputation. The layers compose into one bot decision.
  • No browser, no cookie. A missing signals cookie is itself a signal. A filter rule can deny clients that never loaded the script.
  • Inspectable. Denials distinguish a known bot, a missing-cookie filter, and a signals failure, so your response can differ by failure mode.
  • Safe rollout. Live or dry-run applies to signals, bot detection, and the missing-cookie filter. Operational HTTP rules for bots, Shield, filters, and fixed-window or sliding-window rate limits change in the Arcjet dashboard or through MCP and take effect immediately, still inside the application.
  • Predictable billing. Arcjet charges for bot-detection calls, not script loads.

Bot detection, filters, and signals are HTTP controls in request handlers. Token-bucket, email, PII, and prompt injection stay in code because they need application or body context. The same SDK can also check tool calls and jobs.

Comparison

AreaArcjet advanced signalsCAPTCHAs (Turnstile / reCAPTCHA / hCaptcha)
User challengeNever. No widget.

Turnstile: never (Invisible/Non-interactive) or conditional checkbox (Managed). reCAPTCHA v2: checkbox or image puzzle. v3: never (score only). hCaptcha: image puzzle or invisible.

What it detects

Browser-environment anomalies from a WebAssembly module, composed with server-side bot classification and IP reputation.

Proof-of-work / proof-of-space (Turnstile), risk scoring (v3 / Turnstile), or a human-vs-bot puzzle (v2 / hCaptcha visible).

Layered with server-sideYes. One bot decision in your request handlers.

No. The verifier returns pass/fail (or a score) for one token. Server-side bot logic is yours to write.

Missing-cookie enforcementFilter rule on a missing signals cookie.

A missing token is "verification failed." No persistent script-execution signal.

API / non-browser endpoints

Server-side bot detection and filters work on any HTTP request. Signals complement that for browser traffic.

Can't protect endpoints that don't load a page and render a widget.

Token / cookie lifetimeThe signals cookie persists across requests.

Turnstile tokens expire after 300 seconds and are single-use. Every protected submit needs a fresh token and a verification API call.

RolloutPer-rule live or dry-run. Review would-be denials, then promote.

Usually one mode per site key. Safe rollout typically means a parallel monitor key and your own logging.

Decision detail

Structured reason: known bot, missing-cookie filter, or signals failure.

Boolean, or a score from 0.0 to 1.0 that you turn into policy.
AccessibilityNo user interaction.

Turnstile: WCAG 2.2 AAA. reCAPTCHA v3: no interaction. v2 image puzzles have accessibility concerns.

BillingCharged per bot-detection call, not per script load.

Turnstile: free within usage limits. reCAPTCHA: free for 10,000 assessments per month (reCAPTCHA Essentials), with paid tiers above. hCaptcha: free tier plus paid Pro and Enterprise.

Scope beyond the form

Same SDK: rate limiting, Shield WAF, email validation, sensitive-info, and separate checks on tool and job inputs. Bot detection is an HTTP control.

Bot challenge for protected forms and pages only. No rate limiting, WAF, or tool-path controls.

AI agent runtime: forms vs the tool path

A CAPTCHA protects a browser-rendered form. That's inbound bot management: stop automated clients that submit a signup or target /login. It isn't a control on the agents that you run.

Arcjet bot detection, filters, Shield WAF, email, and IP checks run in your request handlers. Token-spend budgets, prompt-injection detection, and in-process sensitive-info run on tool handlers, MCP servers, and queue consumers, and you pass the input directly. Sensitive-info detection uses a built-in local engine, plus an optional on-device ML model for names, addresses, and government or financial identifiers. Bot detection is an HTTP control in request handlers.

Labeled tool-call policies let a security team change the policy for a labeled action without changing the tool; that's separate from site-wide HTTP remote rules. The SDK names those two surfaces protect() (HTTP request handlers) and guard() (tool calls and jobs).

When a security check can't finish (a timeout, a transport issue, or an incomplete policy), you choose what happens next. A direct Guard call returns allow with error codes rather than treating the incomplete check as a denial. Vercel AI SDK and LangChain wrappers fail closed unless you opt into continuing on error. HTTP request checks can fail open when your application can't reach the Cloud API; that behavior is configurable too. For more information about the error codes, see the Guards reference.

A buyer question for any runtime control: can it use prior actions in a run when deciding the next one? A correlation ID ties Arcjet decisions to a run so that the sequence is reconstructable for investigation.

If the thing that you're protecting is an MCP tool or a background job, then a CAPTCHA can't see it. If the thing that you're protecting is a public form, then signals plus server-side bot detection are the Arcjet alternative to embedding a widget.

When to use which

Use Arcjet advanced signals if

You need to protect API endpoints as well as forms; you want no visible widget; you want the cookie to persist across requests; you want layered detection in one bot decision; you want dry-run before enforcement; you want inspectable reasons; or you also need rate limiting, Shield WAF, and tool-path rules in the same SDK.

Use a CAPTCHA if

You need a free, client-side-only starting point for form spam; you want your users to see an explicit verification step (account recovery, high-value confirmation); or every protected action goes through a browser form and you have no API surface.

They can run together. A common split is a visible CAPTCHA on account recovery, with Arcjet on APIs, rate limits, and the tool path.

Compare: Cloudflare vs Arcjet · Vercel BotID vs Arcjet · All comparisons

Frequently asked questions

Can I use a CAPTCHA and Arcjet together?

Yes. You might use a CAPTCHA for an explicit high-value step such as account recovery, and Arcjet for API protection, rate limiting, bot detection on HTTP routes, Shield WAF, and checks on agent tool calls and jobs. They operate independently.

Do Arcjet advanced signals replace CAPTCHA entirely?

For HTTP bot protection without a widget, yes: signals plus server-side bot detection classify automation without a widget. For a visible, deliberate human checkpoint such as a high-value account action, a CAPTCHA still makes sense as an explicit step the user sees.

What happens if a user has JavaScript disabled?

If JavaScript is disabled, the signals script will not run and the aj_signals cookie will not be set. A filter rule can block requests missing the cookie, which would block non-JavaScript clients. Alternatively, do not require the cookie for already-authenticated users. The right policy depends on your audience and risk tolerance.

Bot detection without a widget

Protect your application with Arcjet

Get advanced signals plus server-side bot classification in your request handlers, with no puzzle on submit.