Private age checks

Check age.Keep identity outof your database.

Your site receives a signed age result. The verifier handles the identity check.

18+ confirmedSigned result · fictional example
Demo

Try every outcome.

Choose a fictional person and threshold. Your demo selections stay in this browser.

Browser sessionreq_7fd2a1
Demo provider · sandbox
1 Request2 Verify3 Decide
DEMO PROVIDER

Ready to run the check?

The verifier returns an age band. Your site never sees the document.

Requested proofover 15 · no date of birthready
Nothing sensitive is stored here.Start the simulation to see the signed result.

↳ Try cancelled, expired, and provider-error states to see the recovery paths.

Data boundary

Your site gets the answer.
The verifier keeps the ID.

Store the signed decision, not the document behind it.

Traditional approach
IDPassport / DOBfull identity data
→
DBWebsite databaselong-lived exposure
×

More data to secure, delete and explain.

Privacy-preserving approach
PExternal providerdocument stays there
→
✓Signed yes / noage band only
✓

Store a non-identifying decision record.

What your site stores

Enough to explain the decision. No identity database required.

verification_result.json
{
  "age_verified": true,
  "threshold": 15,
  "provider": "demo_provider",
  "verified_at": "timestamp",
  "verification_id": "non-identifying reference"
}
How it works

A small handoff, kept separate.

Your site calls the connector. The connector handles the verifier and returns signed age proof.

Website requests proofThreshold is set by the client.
Provider verifies the userDocuments stay at the provider.
Signed result returnsOnly the requested age proof.
Access is decidedAllow, block or recover.
Operations

Monitor checks,
not people.

This fictional view tracks outcomes and provider health. It contains no names, birth dates, or document data.

AgeHandoff / demo workspace
Demo dataAC
OVERVIEW / LAST 30 DAYS

Verification activity

Last 30 days · demo data
Total attempts0↑ 12.4% vs last period
Approval rate0%↑ 3.1% vs last period
Failed sessions0↓ 8.7% vs last period
Cancelled0↓ 4.2% vs last period
OUTCOME MIX

Approved vs. rejected

Approved Rejected
100%75%50%25%0%
01 Jul
08 Jul
15 Jul
22 Jul
CURRENT POLICY

Access rule

Active
over15years
Provider status Healthy
Last eventreq_7fd2a1
Identity data stored0 fields
Integration

One connector.
Clear provider boundaries.

This sample shows the handoff, not a live provider API. Endpoints and payloads will vary.

CONNECTOR SURFACE

Keep provider logic in one connector. Future verifier changes stay manageable.

Create a verification sessiondemo only
// Ask the connector for a provider session
const session = await fetch('/verification/session', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({
    threshold: 15,
    return_url: '/signup/age-check/complete'
  })
});

const { redirect_url } = await session.json();
window.location.href = redirect_url;
Mock response · no live provider connectedJSON / HTTPS
Portfolio project

A demonstration,
not a paid service.

I built AgeHandoff to explore age-verification flows, privacy boundaries, and recovery states. This employment-portfolio project uses synthetic examples; no identity provider is connected.

Explore the demo No audit service, identity verification, legal certification, or compliance guarantee is offered.
Synthetic scenarios Privacy boundaries Recovery states Example integration

Explore other projects

Copied to clipboard