EU Age Verification (EUDI Wallet)
When to use
Prove an age threshold (18, 21, 65, any age_over_NN) without revealing
birthdate or identity. The attestation is an ISO/IEC 18013-5 mdoc,
doctype eu.europa.ec.av.1, with boolean age_over_NN claims and
selective disclosure.
Before you build: run the integrator intake in igrantio-ows-overview - environment, API key, tenancy, backend host, webhooks, frontend - one question at a time, a recommended default with each.
Workflow
Issuer side (once per user):
- Create a credential definition: format
mso_mdoc, doctypeeu.europa.ec.av.1, claims such asage_over_18,age_over_21,age_over_65. - Issue InTime with the boolean claim values, e.g.
{ "age_over_18": true, "age_over_21": false, "age_over_65": false }. The response carriesCredentialExchangeId+ theopenid-credential-offer://QR/deeplink (render withigrantio-qr-code). Completion signal: webhookopenid.credential.credential_acked.
Verifier side (per check):
3. Create a presentation definition (DCQL) for mso_mdoc /
eu.europa.ec.av.1 requesting only the needed boolean, e.g.
age_over_18.
4. Send the verification request (v3) with that
presentationDefinitionId; render the openid4vp:// QR / deeplink.
5. Wallet discloses only the boolean; done on
openid.presentation.presentation_acked.v3 with verified === true.
Endpoints, payload shapes, and response fields: igrantio-ows-overview
api-reference §1 and §2.
Adjust for your deployment
- Pick the
age_over_NNclaims your use case needs; request exactly one boolean per verification - requesting more defeats data minimisation. - Same-device flows can use the Digital Credentials API instead of a QR:
see
igrantio-dcapi-android/igrantio-dcapi-ios. - If you only verify (a national issuer provides the attestation), skip the issuer steps and keep 3-5.
Cross-references
igrantio-dcql-claim-sets- age check with a birthdate fallback when the wallet lacks a boolean claim.igrantio-verifier-frontend- QR + DC API rendering;igrantio-qr-codefor the QR panel.
Source of truth
This workflow mirrors https://docs.igrant.io/docs/eu-age-verification/. Before implementing, fetch that page; if it disagrees with this skill (doctype, claim names, endpoints), the documentation wins - follow it and report the drift so the skill can be updated.