Identity · Age verification
An age gate backed by a document, not a checkbox.
The age check uses the date of birth extracted from the MRZ, the Indian card or the signed Aadhaar record, and compares it with the minimum age in the workflow. When only a birth year is known, it says so.
- default minimum age, configurable
- 18
- outcomes: passed, failed, review
- 3
- age estimates from faces
- 0
What it checks
Age verification, check by check.
Each rule below is what the engine actually runs. The result is written as a age check with its score and warnings.
Full date of birth
The age is computed on today's date. Below the minimum fails as
underage.Year only
Aadhaar can carry only a birth year. If the person is old enough on any day of that year, it passes; if not on any day, it fails; otherwise it goes to review as
age_uncertain.No date
No extracted date of birth sends the session to review with
dob_missing.
Try it
Three kinds of birth date, three honest answers.
A full date gives an exact age. A year alone gives an age range, and the range decides whether the answer is yes, no, or a person's call.
- The rules are ported line for line from the Rust engine, and the page names the file.
- Everything runs locally in this tab. No request is made while you type.
- Reset puts the example back; nothing is saved.
Age check: what the engine decides
Aadhaar artefacts sometimes carry only the year.
Whole years, set per workflow.
Reading your clock
Logic ported from backend/crates/kyc-api/src/engine/submit.rs. Nothing you type leaves this page.
How it works
What happens, in order.
- 1
Extract
The document or Aadhaar step records the date (or year) of birth and its source.
- 2
Compare
At submit, the age is computed and compared with
min_age.
Configuration
The workflow keys and their defaults.
"age": { "enabled": true, "min_age": 18 }| Key | Default | Meaning |
|---|---|---|
| min_age | 18 | Minimum age in whole years. |
Reference
Where the date of birth comes from.
| Source | Precision | Recorded as |
|---|---|---|
| Passport, ID card, residence permit MRZ | Full date | date_of_birth, source mrz |
| Indian card OCR (Aadhaar, PAN, voter ID, licence) | Full date when printed | date_of_birth, source ocr |
| Aadhaar Secure QR or Offline e-KYC | Full date, or the year only | date_of_birth or year_of_birth, source aadhaar |
Reasons and warnings
Exact codes, as they appear in the check's data and warnings, so you can branch on them.
| Code | Outcome | When |
|---|---|---|
| age_below_minimum | failed | The person is younger than min_age (warning underage). |
| age_uncertain | review | Only the birth year is known and the range straddles min_age. |
| age_unknown | review | No date of birth was extracted (warning dob_missing). |
API
Age is decided at submit.
The age check uses what the document or Aadhaar step extracted, so it runs inside a session. The console refuses an age check in a workflow without a document or Aadhaar step.
Age is decided at submit.
# 1. Create a session on a workflow that has a document or Aadhaar step and the age check on
curl -X POST https://kycverify.me/api/v1/sessions \
-H "x-api-key: $KYC_API_KEY" \
-H "content-type: application/json" \
-d '{ "workflow_id": "wf_…", "vendor_data": "user-42" }'
# 2. After the session.status_updated webhook, read the decision
curl https://kycverify.me/api/v1/sessions/ses_…/decision \
-H "x-api-key: $KYC_API_KEY"decision.checks[] · age
{
"kind": "age",
"status": "review",
"score": null,
"data": { "min_age": 18, "age_range": [17, 18], "reason": "age_uncertain" },
"warnings": [
{ "code": "age_uncertain", "message": "Only the birth year (2008) is known; the minimum age cannot be confirmed", "severity": "warn" }
]
}Limits
What it does not do.
Stated up front, so you can decide what to pair it with.
- No facial age estimation. The check needs a document or Aadhaar step that yields a date of birth.
FAQ
Age verification: questions.
Can I run age verification without keeping the date of birth?
The identity keeps the date of birth with the session until your retention period purges it. Shorten retention_days on the app to minimise how long it is held.
Try it in the sandbox today.
Every check is available from the first sign-up, with test keys and a default workflow. Talk to us when you are ready to verify real people.