Age Verification

Age verification confirms that an account holder meets the minimum age requirements for your platform or product. frameOS evaluates age against the identity information collected during KYC — no separate document upload or additional flow required.

Age verification depends on KYC having been completed for the account. The date of birth collected during KYC is used as the basis for the age check.

How it works

Once KYC is complete, frameOS evaluates the account holder's date of birth against the minimum age thresholds for your platform. The check is run internally — there's no additional step for the account holder to complete.

frameOS evaluates two thresholds:

ThresholdAgeCommon use cases
Minimum age18+Financial services, online platforms, adult content
Drinking age21+Alcohol delivery, cannabis, age-restricted retail

If the account holder does not meet the minimum age requirement, the verification fails and the associated capabilities are not enabled.

Required information

Age verification requires a complete individual profile. The following fields must be present on the account before the check can run:

FieldDescription
First nameLegal first name
Last nameLegal last name
Phone numberAccount holder's phone number
Date of birthUsed to calculate current age
Last 4 of SSNRequired as part of KYC
AddressFull residential address including street, city, state, postal code, and country

Relationship to KYC

Age verification is downstream of KYC — it uses the identity data collected during the KYC flow rather than collecting anything new. For this reason, kyc should always be requested alongside age_verification.

Create an account with age verification

Parameters
typestring

Must be individual. Age verification is only supported for individual accounts.

capabilitiesarray

Include age_verification alongside kyc. KYC must complete before age verification can run.

profile.individual.emailstringoptional

The account holder's email address.

profile.individual.name.first_namestringoptional

The account holder's first name.

profile.individual.name.last_namestringoptional

The account holder's last name.

profile.individual.phoneobjectoptional

Object containing number and country_code for the account holder's phone.

POST/v1/accounts
curl --request POST \
  --url https://api.framepayments.com/v1/accounts \
  --header 'Authorization: Bearer API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "type": "individual",
  "capabilities": ["kyc", "age_verification"],
  "profile": {
    "individual": {
      "email": "marcia@example.com",
      "name": {
        "first_name": "Marcia",
        "last_name": "Longo"
      },
      "phone": {
        "number": "3107484186",
        "country_code": "1"
      }
    }
  }
}'
RESPONSE
{
  "id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
  "object": "account",
  "type": "individual",
  "status": "pending",
  "external_id": null,
  "capabilities": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567891",
      "object": "capability",
      "name": "kyc",
      "status": "pending",
      "disabled_reason": null,
      "currently_due": [],
      "disabled": null
    },
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567892",
      "object": "capability",
      "name": "age_verification",
      "status": "pending",
      "disabled_reason": null,
      "currently_due": [],
      "disabled": null
    }
  ],
  "profile": {
    "individual": {
      "email": "marcia@example.com",
      "ssn_last_four": null,
      "name": {
        "first_name": "Marcia",
        "middle_name": null,
        "last_name": "Longo",
        "suffix": null
      },
      "phone": {
        "number": "3107484186",
        "country_code": "1"
      },
      "birthdate": null,
      "address": null
    }
  },
  "terms_of_service": null,
  "metadata": {},
  "livemode": false,
  "created": 1721010605
}

Complete onboarding

Create an onboarding session to collect the required identity information. Once KYC completes and all required fields are present, frameOS runs the age check automatically — the account holder does not need to take any additional action.

REQUEST
curl --request POST \
  --url https://api.framepayments.com/v1/onboarding_sessions \
  --header 'Authorization: Bearer API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "account_id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
  "return_url": "https://example.com/onboarding/complete"
}'

After onboarding completes, retrieve the account to check the age_verification capability status. A status of active means the account holder passed the age check. A status of failed means they did not meet the minimum age requirement and the capability will not be enabled.