Issue Proof of Age as mDoc
The EU Digital Identity based on eIDAS 2.0 is still in development and will be launched at the end of 2026. We are continuously monitoring the advancements of the European Architecture Reference Framework (ARF) and try to align our infrastructure as the specifications evolve.
Age Verification (AV) is part of the European Digital Identity framework established by the eIDAS 2.0 regulation . The “Proof of Age” attestation lets a holder prove they meet a minimum age threshold (such as being over 18) without disclosing their date of birth or any other personal information.
eIDAS 2.0 requires Member States to offer EU Digital Identity Wallets to all citizens, and Age Verification is one of the first use cases the European Commission is rolling out ahead of the full wallet launch. Because the Proof of Age attestation uses the dedicated doctype and namespace eu.europa.ec.av.1, an age check requires no Personal Identification Data (PID) presentation at all — only the minimal age claims are shared. This makes it a privacy-preserving, standalone alternative to presenting a full identity document, and aligns with the data minimization principles at the core of eIDAS 2.0.
The attestation follows the European Commission’s Age Verification specification , which builds on the same ISO/IEC 18013-5 mdoc format and Architecture Reference Framework (ARF) used across the EU Digital Identity Wallet ecosystem.
Creating issuer root X509 certificate
Before you can create the credential template for AV issuance, you need to set up your issuer root x509 certificate with a P-256 key. The certificates guide contains detailed guidance on creating a certificate. We recommend creating your initial certificate through the dashboard.
Alternatively, if your issuer certificate needs to be signed by an external certificate authority, you can create a certificate signing request and import the externally signed certificate into Paradym.
Creating the credential template
We recommend creating this template through the API, as it allows you to exactly copy the payload as defined below. See Interacting with the API, the API reference for Create mDoc credential template , or the Issue credentials guide for more information on creating credential templates.
AV attestations are intended to be short-lived and issued in batches to limit linkability across presentations. The validUntil below is set to one year for demonstration; consider a shorter validity window. Batch issuance will be supported in the future.
{
"name": "Proof of Age",
"description": "Proof of Age attestation compliant with the EU Digital Identity Wallet Age Verification specification",
"issuer": {
"signer": "certificate",
"keyType": "P-256"
},
"background": {
"color": "#F1F2F0",
"url": "https://i.imgur.com/f7BGK3g.png"
},
"text": {
"color": "#2F3544"
},
"validUntil": {
"start": "issuance",
"future": {
"years": 1
}
},
"type": "eu.europa.ec.av.1",
"attributes": {
"eu.europa.ec.av.1": {
"type": "object",
"properties": {
"age_over_18": {
"type": "boolean",
"name": "Age Over 18",
"description": "Indicates whether the user is 18 years of age or older",
"required": true
},
"age_over_21": {
"type": "boolean",
"name": "Age Over 21",
"description": "Indicates whether the user is 21 years of age or older",
"required": false
},
"age_in_years": {
"type": "number",
"name": "Age in Years",
"description": "The current age of the user in years",
"required": false
},
"age_birth_year": {
"type": "number",
"name": "Year of Birth",
"description": "The year in which the user was born",
"required": false
},
"expiry_date": {
"type": "date",
"name": "Expiry Date",
"description": "Administrative expiry date of the attestation",
"required": true
},
"issuing_authority": {
"type": "string",
"name": "Issuing Authority",
"description": "Name of the administrative authority that issued the attestation",
"required": true
},
"issuing_country": {
"type": "string",
"name": "Issuing Country",
"description": "Alpha-2 country code of the issuing country",
"required": true
}
}
}
}
}Issuing a sample credential
Once you have created the template, you can test the issuance with a sample credential. The creation of the credential template should have returned an id, make sure to set the value of credentialTemplateId to this id in the payload.
You can issue the credential using the Create OpenID4VC credential offer endpoint. You can read more on using a credential template in the issue credentials guide.
To receive the credential, you can use the Paradym Wallet (see Integrating with a Holder Wallet).
{
"credentials": [
{
"credentialTemplateId": "<CREDENTIAL_TEMPLATE_ID>",
"attributes": {
"eu.europa.ec.av.1": {
"age_over_18": true,
"age_over_21": true,
"age_in_years": 30,
"age_birth_year": 1995,
"expiry_date": "2026-09-15",
"issuing_authority": "NL",
"issuing_country": "NL"
}
}
}
]
}Presentation template
If you want to verify a Proof of Age credential, use the presentation template payload, or select it as a pre-made template in the dashboard.