Age Verification Profile
Verify age attributes using the AV profile with minimal disclosure
The Age Verification (AV) profile is a simplified verification flow designed specifically for age checks. It uses the av:// URL scheme with all parameters inline (no JAR, no request_uri), making it the simplest way to verify that a user meets an age requirement.
Key characteristics
| Property | Value |
|---|---|
| URL scheme | av:// |
| Response mode | direct_post |
| Client ID scheme | redirect_uri |
| Encryption | None (no JARM) |
| Request method | Inline parameters (no JAR) |
The AV profile intentionally avoids complexity. There is no request_uri indirection, no encrypted responses, and the client_id is simply the redirect URI. This makes it easy to implement for merchants and websites that only need a yes/no age check.
Namespace
The AV profile uses the eu.europa.ec.av.1 namespace with a single claim:
| Namespace | Claim | Type | Description |
|---|---|---|---|
eu.europa.ec.av.1 | age_over_18 | boolean | Whether the holder is 18 or older |
You can also request age_over_18 from the PID namespace eu.europa.ec.eudi.pid.1, which wallets may also support. The dedicated AV namespace is preferred because it allows wallets to issue age attestations that contain no other personal data.
Creating an AV request
POST /verifier/request
Set "scheme": "av" in the request body. This is required: the AV profile is only used when the scheme is requested explicitly (there is no auto-detection from the namespace).
POST /verifier/request
Authorization: Bearer oat_your_publishable_key
Content-Type: application/json
{
"version": "v1",
"scheme": "av",
"dcql_query": {
"credentials": [{
"id": "age_check",
"format": "mso_mdoc",
"meta": { "doctype_value": "eu.europa.ec.av.1" },
"claims": [
{ "path": ["eu.europa.ec.av.1", "age_over_18"] }
]
}]
}
}The response URL uses the av:// scheme. The client_id uses the redirect_uri prefix and both it and redirect_uri point to the plain response endpoint for this request, https://api.verifiables.com/verifier/authorization/response/<id>:
{
"url": "av://?response_type=vp_token&client_id=redirect_uri%3Ahttps%3A%2F%2Fapi.verifiables.com%2Fverifier%2Fauthorization%2Fresponse%2F550e8400-e29b-41d4-a716-446655440000&redirect_uri=https%3A%2F%2Fapi.verifiables.com%2Fverifier%2Fauthorization%2Fresponse%2F550e8400-e29b-41d4-a716-446655440000&response_mode=direct_post&dcql_query=...",
"id": "550e8400-e29b-41d4-a716-446655440000",
"version": "v1"
}All request parameters are encoded directly in the URL query string. The wallet does not need to fetch a separate request object.
Response flow
- The wallet parses the
av://URL and extracts the DCQL query. - The user approves sharing the
age_over_18claim. - The wallet sends a
direct_postto theredirect_uriwith the VP token. - Your backend verifies the mDoc and extracts the boolean result.
Verification result
{
"status": "valid",
"presentation": {
"eu.europa.ec.av.1": {
"age_over_18": true
}
}
}The result is a single boolean. No name, date of birth, or any other personal data is disclosed.
Fallback to PID namespace
If the holder's wallet does not have an eu.europa.ec.av.1 credential, you can accept age_over_18 from the PID namespace as a fallback using credential sets:
{
"version": "v1",
"scheme": "av",
"dcql_query": {
"credentials": [
{
"id": "av_credential",
"format": "mso_mdoc",
"meta": { "doctype_value": "eu.europa.ec.av.1" },
"claims": [
{ "path": ["eu.europa.ec.av.1", "age_over_18"] }
]
},
{
"id": "pid_credential",
"format": "mso_mdoc",
"meta": { "doctype_value": "eu.europa.ec.eudi.pid.1" },
"claims": [
{ "path": ["eu.europa.ec.eudi.pid.1", "age_over_18"] }
]
}
],
"credential_sets": [
{ "options": [["av_credential"], ["pid_credential"]], "required": true }
]
}
}The wallet will satisfy whichever credential it has available.
When to use AV
| Scenario | Recommended approach |
|---|---|
| Online age gate (e-commerce, content) | AV profile with av:// scheme |
| In-person age check (bar, shop) | BLE proximity with age_over_18 claim |
| Age check + identity (regulated) | Full PID verification with openid4vp:// |
The AV profile is the right choice when you need a simple, privacy-preserving age check and nothing else.