Docs
Verification

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

PropertyValue
URL schemeav://
Response modedirect_post
Client ID schemeredirect_uri
EncryptionNone (no JARM)
Request methodInline 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:

NamespaceClaimTypeDescription
eu.europa.ec.av.1age_over_18booleanWhether 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

  1. The wallet parses the av:// URL and extracts the DCQL query.
  2. The user approves sharing the age_over_18 claim.
  3. The wallet sends a direct_post to the redirect_uri with the VP token.
  4. 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

ScenarioRecommended 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.