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.
What it costs
Not yet priced
Checkbox is in development, and CAIRL has not set a price for an age check through it yet.
When it is priced, each check will be charged from a prepaid balance under metered pricing, with no subscription and no per-seat minimum. See metered pricing.
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://app.cairl.co/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://app.cairl.co/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
Neither key prefix is issued for the drop-in yet — there is no sandbox key to obtain and no wallet to fund for it. The two-prefix model is published here so the integration contract can be reviewed before it ships. For keys you can use today, the OAuth quickstart is the live path.
Going live, when issuance opens
Live publishable-key issuance for the drop-in is not activated yet, so there is nothing to fund for it today. When it opens, going live is self-serve: create a business facet, load your prepaid wallet, and issue API keys under the same metered model.
Integrate with OAuth today