Live Demo

See the widget in action

Submit the form below to watch the PoW challenge run in real time. Open your browser's devtools and you'll see captcha.js load and the /challenge and /verify calls fire — the same flow that runs on a real integration. This demo does not sign you in or store submitted form data.

Protected sign in form

Demo only — nothing is submitted.

Challenge starts on your first click, tap, or keystroke.

Total end-to-end time

Varies by device and browser

What happens here

  1. 1

    Challenge fetched

    On your first interaction (click, tap, or keystroke), the widget calls /challenge in the background and receives a token with required difficulty.

  2. 2

    PoW solved in a Web Worker

    The worker iterates nonces, hashing each with the token until the result clears the target.

  3. 3

    Attestation received

    The widget posts the solution to /verify and receives a signed attestation (HMAC-SHA256, signed with your project's secret key).

  4. 4

    Hidden field injected on submit

    On submit, captcha_attestation is appended to your form. Your backend verifies its HMAC locally — no HTTP round-trip to captchaAPI.

Status panel states

idle Fetch started
Preparing protection…
solving Worker running
Verifying form protection…
ready Solution found
Protection active
error Missing key / failure
Verification unavailable
rate_limited 429 from /challenge or /verify
Please try again in {N} seconds

Live countdown driven by the server's retry_after header.

Ready to integrate?

Add data-captcha to your form and load the script. That's it.