Early Access — Open for developer integration testing

CAIRL Checkbox

Verify age without ever touching an ID

A copy-paste age gate for any website. One script tag, a boolean result, and zero ID custody on your side.

You receive verified claims — not names, document images, or selfies. The document and the biometrics stay on CAIRL’s side of the consent boundary.

Self-serve. No sales call. Sandbox is free.

What it costs

Typical age check, per verification. No subscription tiers — prepaid wallet, metered pricing.

~$0.10

per age check — a fraction of typical document-upload identity verification.

Per age check, typical claim bundle. Self-serve metered pricing — no per-seat minimums and no enterprise contract.

See it run

The live embed demo activates when the checkbox widget is enabled in this environment. Use the 15-minute quickstart to integrate against sandbox keys today.

Copy-paste quickstart

Two lines. Swap pk_sandbox_your_key_here for your publishable key and data-cairl-redirect for your callback URL. Full walkthrough in the 15-minute guide.

Redirect mode (default)

Full-page hand-off to CAIRL, then back to your callback with a signed result token. Simplest and most robust.

<!-- 1. Drop a checkbox host where the verification should appear -->
<div
  data-cairl-checkbox
  data-cairl-key="pk_sandbox_your_key_here"
  data-cairl-redirect="https://yourstore.example/age-callback"
  data-cairl-profile="age-gate-21"
  data-cairl-mode="redirect"
></div>

<!-- 2. Load the CAIRL widget once, anywhere on the page -->
<script src="https://cairl.app/v1/checkbox.js" async></script>

Iframe mode

The verification opens in a CAIRL-hosted overlay; the visitor never leaves your page. Your page receives the result via cairl:complete / cairl:error DOM events.

<div
  data-cairl-checkbox
  data-cairl-key="pk_sandbox_your_key_here"
  data-cairl-redirect="https://yourstore.example/age-callback"
  data-cairl-profile="age-gate-21"
  data-cairl-mode="iframe"
></div>
<script src="https://cairl.app/v1/checkbox.js" async></script>

<script>
  // The widget dispatches DOM events you can listen for in iframe mode.
  document.addEventListener("cairl:complete", function (e) {
    // e.detail = { canonicalClaimIds, sessionRef, modeType, profileLabel }
    console.log("verified", e.detail);
  });
  document.addEventListener("cairl:error", function (e) {
    console.warn("verification error", e.detail);
  });
</script>

What your server receives

On the callback, verify the signed JWT against /.well-known/jwks.json and read the boolean claims. sub is always null — the result is anonymous by construction. Full reference, error codes, and the sandbox-to-live path are in the 15-minute quickstart.

Sandbox vs. live

pk_sandbox_* keys are safe for public docs and testing — they return deterministic fixtures and never touch real biometric providers. Live publishable keys (pk_live_*) activate when production issuance opens; fund your wallet ($50 minimum) and swap the key prefix — same integration contract, no sales call.

Go live self-serve

Create a business facet, load your prepaid wallet, and issue API keys. No implementation review required for sandbox; live keys follow the same metered wallet model.

Fund your wallet — $50 minimum