Age Verification
Age verification confirms that an account holder meets a minimum age threshold for your platform. It's a derived check — Frame uses the date of birth on the account's individual profile, compares it against your platform's threshold, and surfaces the result on the age_verification capability. There's no separate document upload, no additional UX for the account holder beyond supplying DOB.
age_verification is technically independent of KYC at the capability dependency level — you can request age_verification on its own. In practice, you almost always pair it with kyc, because KYC is what verifies the DOB. An unverified DOB the account holder typed into a form is a much weaker signal than a DOB Frame matched against a government-issued ID during KYC. If you skip KYC, age verification runs against unverified data and your platform inherits the risk.
Use age verification when a regulatory or platform policy requires gating activity behind an age (alcohol delivery, cannabis platforms, age-restricted retail, gambling, adult content).
Thresholds
Frame evaluates two thresholds out of the box. Your platform's age_verification request tells Frame which one applies:
| Threshold | Age | Typical use |
|---|---|---|
| Minimum age | 18+ | Financial services, online platforms, adult content |
| Drinking age | 21+ | Alcohol delivery, cannabis, age-restricted retail |
If your platform needs a different threshold, talk to Frame support — the capability surface assumes one of these two by default and custom thresholds are a configuration concern, not an API parameter.
How it works
Age verification runs the moment profile.individual.birthdate is set on the account. In the recommended flow:
- Request
age_verificationalongsidekycwhen creating the account. Both capabilities go on the same account; KYC handles all the data collection through the hosted onboarding flow. - The account holder completes onboarding. They upload an ID, take a selfie, supply the remaining identity fields. Date of birth lands on
profile.individual.birthdate— verified by Frame against the document. - Frame evaluates the threshold. With a DOB now on file, the age check runs and the capability transitions to
activeordisabledbased on the comparison.
If you set birthdate directly via API without running KYC, age verification still evaluates — it just trusts the input. The capability surface is the same; the signal underneath is weaker. The account holder never sees an "age verification" step in either case; it's an internal evaluation, not a screen they interact with.
Required fields
The minimum for age verification itself is date of birth on the account's individual profile. If you've requested KYC alongside (recommended), the full KYC field set is also required for KYC to activate:
- Legal first name + last name
- Phone number
- Date of birth
- Last 4 of SSN
- Residential address
Without DOB, age_verification stays pending. With DOB but no KYC running, it evaluates against the unverified DOB — accept the trade-off only if your platform's policy doesn't need a verified-identity guarantee on the age claim.
Outcomes
The age_verification capability has the same terminal states as any other capability:
active— the account holder meets the threshold. Downstream capabilities or platform features that gate on age verification can proceed.disabled— the account holder does not meet the threshold.disabled_reasonindicates the failure was age-related. Your application should gracefully decline the age-restricted activity per your platform's policy — typically by surfacing a message rather than retrying, since age isn't a remediable field.pending— KYC hasn't resolved yet, or DOB is still missing.
Age is not retriable. Unlike a KYC document-quality failure, a disabled age verification reflects a hard fact — there's nothing the account holder can do to satisfy it. Build the UX accordingly.
Relationship to other capabilities
Age verification on its own is just a math check against DOB. Its value compounds when paired:
- Pair with KYC so the DOB being evaluated is one Frame matched against a government-issued ID, not one the account holder self-reported. KYC isn't a prerequisite at the capability dependency level, but it's the strong-signal pairing.
creator_shielddepends onage_verification— when you requestcreator_shield, Frame automatically expands the request to includeage_verification(andkyc).- Your platform may layer additional business rules on top of
age_verification(for example, only enabling alcohol-delivery checkout for accounts whereage_verificationisactiveAND the destination address is in a licensed jurisdiction). Those higher-level checks are application-side; Frame surfaces the binary age signal.
Gotchas
Symptom: age_verification is stuck pending even though the account holder finished onboarding. Why: most commonly, DOB isn't on the profile yet. If KYC is in flight, DOB lands when kyc settles; if you're not running KYC, you need to set profile.individual.birthdate directly. Fix: check whether DOB is set on the profile; if KYC is running, check its status — DOB arrives with KYC's data collection.
Symptom: an account holder you know is over 21 comes back disabled on age_verification. Why: the threshold was set to 21 in your platform's configuration, but the DOB Frame verified during KYC indicates under 21. The check ran against verified data, not the field the account holder entered — they may have lied on a self-service form earlier. Fix: trust the KYC-verified DOB; the discrepancy points at the account holder's input, not at Frame's check.
Symptom: you want to verify age without running full KYC. Why: in V1, Frame doesn't expose a standalone age-without-identity flow — DOB alone is not a verifiable claim without an identity attached. Fix: if your use case truly doesn't need identity verification (rare for age-gated commerce), talk to Frame support; otherwise plan for the KYC dependency.
Reference
For the full API surface, see POST/v1/accounts.