Provero Logo

Age verification API

Identity and age assurance. Provero uses age-verification information available from the subscriber's mobile network to determine whether a chosen age threshold can be confirmed. This is an age check, not an identity or KYC check, and it does not return an exact age or date of birth. The upstream service currently supports Pay Monthly subscribers on the UK's four main mobile networks: EE, O2, Vodafone and Three.
Send a mobile number with either minimum_age or dob (YYYY-MM-DD). At least one is required. A DOB is converted to a whole-year age for the check and takes precedence if both fields are supplied. Use meets_age_requirement as the age-check outcome: status: success means the request completed, not that the requirement was met. Live requests require a Provero API key and Age verification access.

Endpoint

POST
https://api.provero.io/api/validate/age

Headers

Authorization:
Content-Type: application/json
Accept: application/json


Request Body

Field Type Required Description
mobile_number string Yes Mobile number in international format, for example +447700900123 or 447700900123. Send the number with its country code; the leading + is optional.
minimum_age integer No Minimum age to verify, from 0 to 120. For example, use 18 for an 18+ check or 25 for a 25+ check. Provide either minimum_age or dob — at least one is required.
dob string No Date of birth in YYYY-MM-DD format. Provero converts it to a whole-year age and verifies that threshold. If both minimum_age and dob are supplied, dob takes precedence.
Request Payload Example (JSON)
{
    "mobile_number": "+447700900123",
    "minimum_age": 18
}

Request Examples

Choose language Bash (cURL) 5 examples
curl -X POST https://api.provero.io/api/validate/age \
  -H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"mobile_number":"+447700900123","minimum_age":18}'

Response Examples

Choose response example Success - Requirement Met 18 examples
{
    "status": "success",
    "verification_id": "age_123456",
    "mobile_number": "+447746266201",
    "minimum_age": 18,
    "meets_age_requirement": true,
    "identity_verified": true,
    "adult_content_restriction_active": false,
    "parental_controls_active": false,
    "mobile_network_code": "23410"
}

Response Body

Success structure

Field Name Type Always
Returned
Example
status string Yes
verification_id string Yes
mobile_number string Yes
minimum_age integer Yes
meets_age_requirement boolean Yes
identity_verified boolean|null Yes
adult_content_restriction_active boolean|null Yes
parental_controls_active boolean|null Yes
mobile_network_code string|null Yes

Error structure

Field Name Type Always
Returned
Example Description
status string Yes Indicates that the request could not be completed.
error object Yes Contains a stable error.code for integration logic and a human-readable error.message. Some errors intentionally share customer-safe messages.

Understanding the response

Use meets_age_requirement as the primary outcome. A value of false means the requested threshold was not confirmed; it must not be interpreted as the subscriber's exact age or as confirmation that they are below the threshold.

identity_verified, adult_content_restriction_active and parental_controls_active are supporting signals and do not override the age result. Do not treat a null supporting signal as false.

Request examples

Choose a fixed minimum_age for an 18+, 21+, 25+, or 50+ check, or provide dob to check the person's current whole-year age. If you send both, dob takes precedence. Mobile numbers may be sent with or without the leading +, for example 447746266141; the response returns the number in canonical E.164 form with +.

18+ check

{
    "mobile_number": "+447746266141",
    "minimum_age": 18
}

21+ check

{
    "mobile_number": "+447746266141",
    "minimum_age": 21
}

25+ check

{
    "mobile_number": "+447746266141",
    "minimum_age": 25
}

50+ check

{
    "mobile_number": "+447746266141",
    "minimum_age": 50
}

Date of birth check

{
    "mobile_number": "+447746266141",
    "dob": "1990-06-01"
}

Errors and recommended actions

Error responses use the same envelope across Age verification failures. The HTTP status identifies the failure class and error.code is the stable value to branch on in your integration; do not branch on the human-readable message. Automatically retry only request_timed_out (408), rate_limit_exceeded (429) and service_temporarily_unavailable (503), using bounded backoff. Do not retry other responses unchanged.

HTTP statusCodeRecommended action
422 invalid_mobile_number Correct the number, for example +447700900123 or 447700900123. The leading + is optional.
422 invalid_age Supply an integer minimum_age from 0 to 120.
422 invalid_dob Supply a past date of birth in YYYY-MM-DD format that yields an age between 0 and 120.
422 age_verification_not_available Do not infer an age outcome; use another permitted age-assurance route.
404 subscriber_not_found Check the number. If it is correct, use another permitted age-assurance route.
422 network_not_supported Use another permitted age-assurance route.
422 subscriber_opted_out Do not retry unless the subscriber's status changes.
403 age_verification_access_not_enabled Sign in to Provero and request Age verification access from the Playground.
401 invalid_api_key Supply a valid API token.
402 insufficient_balance Add credit before sending another request.
429 rate_limit_exceeded Wait and retry using backoff.
408 request_timed_out Retry with backoff.
503 service_temporarily_unavailable Retry later using exponential backoff.

Ready to go live?

The Playground offers a free demo and, when Age verification is enabled on your account, a live check. Live API checks require a Provero API key.