ADAPTIVE HUMAN VERIFICATION

Human by design.Automation denied.

NexaCAPTCHA keeps verification clear for legitimate users while increasing the time, computation, and uncertainty required for automated solving.

  • Designed for human readability
  • 0% model success in our Horizon test
  • Two attempts before expiry

CAPTCHA MODULES

Choose a verification.

Gravity presents four distorted characters in a static image. Horizon reveals information through a GIF animation. Both use the same integration and server-side verification flow.

LIVE DEMO

Try NexaCAPTCHA Gravity

Ready

Follow the hollow characters through the gravitational distortion, then enter all four.

Open the full Gravity demo
Your result will appear here.

LIVE DEMO

Try NexaCAPTCHA Horizon

Ready

Follow each color through the animation. Enter the four characters when you're ready.

Open the full Horizon demo
Your result will appear here.
Integrate NexaCAPTCHA Choose a module and add it to your site.

VERIFICATION TEST

Verification performance, measured.

For the Horizon result, the agent began with no prior attempts or context, wrote its analysis scripts during the test, and improved them as it went.

Tested build
Verification system Human GPT 5.6 Sol - Medium
NexaCAPTCHA Horizon 18.3 seconds average 0% success rate · 60.3 seconds average
NexaCAPTCHA Gravity 4.7 seconds average 35.3% success rate · 31.6 seconds average
Google reCAPTCHA 1.9 seconds average 99% success rate · 7.6 seconds average
hCaptcha 11.8 seconds average 85.7% success rate · 49.6 seconds average

This is a recorded test, not a promise that every model or every run will behave the same way.

INTEGRATION

Connect NexaCAPTCHA.

Choose a module, add it to your page, then pass the completed result to your backend.

01

Frontend setup

Choose a module below. The callback name and submission logic are yours to change.

Module loaders
Gravity loader https://nexacaptcha.zone.id/captcha/gravity.js
Horizon loader https://nexacaptcha.zone.id/captcha/horizon.js
HTML · page markup
<script
  src="https://nexacaptcha.zone.id/captcha/gravity.js"
  defer
></script>

<div
  class="nexa-captcha"
  data-callback="onCaptchaComplete"
></div>

Choose your own callback name if you prefer. Use exactly the same name in the HTML and JavaScript.

JavaScript · frontend
function onCaptchaComplete(result) {
  if (!result.success) return;

  yourSubmitFunction({
    verificationId: result.verificationId,
    responseToken: result.responseToken
  });
}

The callback is a frontend handoff, not final proof. Accept the form only after /api/siteverify returns success: true.

02

Callback parameters

The callback receives one result object with these fields.

result
The object passed into your callback function.
result.success
A boolean. It is true when the verification has been completed.
result.verificationId
The 16-character verification ID. Send it to your backend.
result.responseToken
The 64-character one-time token. Send it to your backend without changing it.

BACKEND VERIFICATION

Validate every response server-side.

Before accepting a form submission, registration, or login, send both values to NexaCAPTCHA.

POST/api/siteverify

Request

{
  "verificationId": "<verificationId>",
  "responseToken": "<responseToken>"
}

Response · success

{
  "success": true,
  "verifiedAt": "2026-08-07T12:30:00.000Z"
}

Response · failure

{
  "success": false,
  "errorCode": "invalid-or-expired-verification"
}
Node.js · backend
const response = await fetch(
  "https://nexacaptcha.zone.id/api/siteverify",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      verificationId,
      responseToken
    })
  }
);

const result = await response.json();
if (!result.success) {
  return res.status(403).send("Verification failed");
}