Checkbox, floating or invisible
Show the checkbox, hide it until a button is pressed, or solve in the background from your own code.
Cap stops scrapers, AI agents and headless browsers with proof-of-work and browser checks. Nobody clicks on buses, and nothing goes to Google.
jsDelivr served 4,695,114,711 Cap requests in the past year.
Most abuse now comes from automated browsers, not curl. Turn on browser checks and Cap tests for Playwright, Puppeteer, Selenium, Camoufox and stealth plugins. The verdict happens on your server, so a patched browser can't vouch for itself.
How detection works{
"success": false,
"reason": "instr_automated_browser",
"blockedBy": [
"webdriver_true",
"headless_token"
]
}webdriver_truewebdriver_strippedheadless_tokenchrome_object_missinggeometry_quantizedjuggler_packagegecko_contradictionwindow_exceeds_screenviewport_overrideworker_mismatchStandalone comes with a dashboard for every site key. It shows challenges, solves and failures over time, where they come from and which networks they use. Country and network lookups run against a database on your own server.

Everything here ships in the open-source release. There is no paid tier holding features back.
Show the checkbox, hide it until a button is pressed, or solve in the background from your own code.
HashWX builds a new hash function for every challenge, so a GPU solves it about 2x faster than a CPU instead of 150x.
HashWXCap how many challenges one IP can ask for in a window, for the whole instance or one site key.
Nothing goes to a third party, so the privacy review is short in most jurisdictions.
ComplianceThe widget weighs about 20 kB minified and gzipped. reCAPTCHA weighs about 500 kB.
Verify a token with one POST to /siteverify from any language. The response matches reCAPTCHA's.
Cap has been a good fit for AdGuard Temp Mail. We use it as an invisible, self-hosted CAPTCHA layer with proof-of-work and browser instrumentation challenges, which helps us add abuse protection while keeping the experience lightweight and unobtrusive for regular users.
Run one Docker container, create a site key, and drop the widget into your form.
<script src="https://cdn.jsdelivr.net/npm/@cap.js/widget"></script>
<form action="/signup" method="POST">
<input name="email" />
<cap-widget
data-cap-api-endpoint="https://cap.example.com/<site-key>/"
></cap-widget>
<button>Sign up</button>
</form>