agentsclimarketplace

Igrantio eu age verification

Skill L3-iGrant/skills/workflows/igrantio-eu-age-verification

EU Age Verification on the iGrant.io Organisation Wallet Suite: issue an age verification attestation as an ISO/IEC 18013-5 mdoc (doctype eu.europa.ec.av.1, boolean age_over_NN claims) via OpenID4VCI InTime, then verify a selectively disclosed age_over_18 proof via OpenID4VP + DCQL - no birthdate or identity revealed. Implements the EU Age Verification solution profile for EUDI Wallet (EUDIW) under eIDAS 2.0. Use for age-restricted content, products, or services.From its SKILL.md

Install
npx -y skills add L3-iGrant/skills --skill igrantio-eu-age-verification

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 26 days oldThe repository was created 26 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

3.3 KB, 657 tokens by cl100k_base, as published. Nobody here has run it

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):

  1. Create a credential definition: format mso_mdoc, doctype eu.europa.ec.av.1, claims such as age_over_18, age_over_21, age_over_65.
  2. Issue InTime with the boolean claim values, e.g. { "age_over_18": true, "age_over_21": false, "age_over_65": false }. The response carries CredentialExchangeId + the openid-credential-offer:// QR/deeplink (render with igrantio-qr-code). Completion signal: webhook openid.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_NN claims 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-code for 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.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,851. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.