Early Access — Open for developer integration testing

CAIRL Checkbox

Request an age claim through a supported CAIRL flow

A component surface for supported age checks. Configure the request, direct the person through the applicable flow, and receive the authorized result.

In supported claims-sharing flows, your service can receive a verified claim without receiving the underlying ID document.

In development — this is a design preview

The drop-in script is not yet served, so the snippet on this page does not run today. To integrate identity verification now, use the OAuth quickstart — it is live and supported.

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 — it is not enabled anywhere today. To integrate identity verification now, use the OAuth quickstart.

The intended snippet

Shown for review — the script it loads is not served yet, so this does not run today. Once it ships you will swap pk_sandbox_your_key_here for your publishable key and data-cairl-redirect for your callback URL. Full walkthrough in the integration guide.

Redirect mode (default)

Full-page hand-off to CAIRL, then back to your callback with an OAuth authorization code and your state, which your backend exchanges for claims. 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: validate state, exchange the code server-side at /api/oauth/token (with your client_secret and PKCE code_verifier), then read the boolean claims from /api/oauth/userinfo. The sub is a pseudonymous, per-partner identifier — no name, no document, no selfie. Full reference, error codes, and the sandbox-to-live path are in the 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.

Start your integration — $50 wallet minimum