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