DCQL query: Person Identification Data (PID)
When to use
Use this skill when you ask a wallet for identity data. The PID holds the name, the birth date, the address, the contact data and the age statements of the holder. It is the base identity credential of the EUDI Wallet.
Common needs:
- Prove a name:
family_nameandgiven_name. - Prove an age without a birth date:
is_over_18,is_over_21oris_over_65fordc+sd-jwtandjwt_vc_json, andage_over_18,age_over_21orage_over_65formso_mdoc. - Prove a place of residence: the
addressobject, or theresident_*data elements of the mDoc.
Ask only for the claims that your use case needs. An age check needs one boolean claim, not the birth date.
This template follows the earlier PID rules. For the PID of EU ARF 2.8.0,
read igrantio-dcql-query-pid-v2.
Registry facts
| Fact | Value |
|---|---|
| Title | Person Identification Data (PID) |
| Purpose | Person Identification Data (PID) |
| Registry version | 2025.7.1 |
| Formats | dc+sd-jwt, jwt_vc_json, mso_mdoc |
dc+sd-jwt vct |
urn:eu.europa.ec.eudi:pid:1 |
jwt_vc_json type |
urn:eu.europa.ec.eudi:pid:1 |
mso_mdoc doctype |
eu.europa.ec.eudi.pid.1 |
mso_mdoc namespace |
eu.europa.ec.eudi.pid.1 |
The registry holds two metadata files for the mDoc format. The file for
version_01, mso_mdoc.schema.metadata.v1.json, gives the credential type
eu.europa.ec.eudi.pid.1. Use that value as doctype_value. It agrees with
the namespace of the claim paths. The older file gives the URN form, which is
the vct of the SD-JWT VC and not an mDoc doctype.
Claims
Format dc+sd-jwt
The registry file is 2025.7.1/dc+sd-jwt.schema.json.
{
"claims": [
{ "path": ["address"] },
{ "path": ["address", "country"] },
{ "path": ["address", "locality"] },
{ "path": ["address", "region"] },
{ "path": ["address", "street_address"] },
{ "path": ["birthdate"] },
{ "path": ["email"] },
{ "path": ["family_name"] },
{ "path": ["given_name"] },
{ "path": ["is_over_18"] },
{ "path": ["is_over_21"] },
{ "path": ["is_over_65"] },
{ "path": ["phone_number"] }
]
}
Format jwt_vc_json
The registry file is 2025.7.1/jwt_vc_json.schema.json.
{
"claims": [
{ "path": ["credentialSubject", "address"] },
{ "path": ["credentialSubject", "address", "country"] },
{ "path": ["credentialSubject", "address", "locality"] },
{ "path": ["credentialSubject", "address", "region"] },
{ "path": ["credentialSubject", "address", "street_address"] },
{ "path": ["credentialSubject", "birthdate"] },
{ "path": ["credentialSubject", "email"] },
{ "path": ["credentialSubject", "family_name"] },
{ "path": ["credentialSubject", "given_name"] },
{ "path": ["credentialSubject", "is_over_18"] },
{ "path": ["credentialSubject", "is_over_21"] },
{ "path": ["credentialSubject", "is_over_65"] },
{ "path": ["credentialSubject", "phone_number"] }
]
}
Format mso_mdoc
The registry file is 2025.7.1/mso_mdoc.schema.v1.json. This is the form for
version_01.
{
"claims": [
{ "path": ["eu.europa.ec.eudi.pid.1", "age_over_18"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "age_over_21"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "age_over_65"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "birth_date"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "email"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "family_name"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "given_name"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "phone_number"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "resident_address"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "resident_city"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "resident_country"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "resident_state"] },
{ "path": ["eu.europa.ec.eudi.pid.1", "resident_street"] }
]
}
The registry also holds 2025.7.1/mso_mdoc.schema.json. That file gives the
same claims in an older shape, with a namespace key and a claim_name key
instead of a path array. Do not send that shape with version_01.
The claim names are not the same in every format. The SD-JWT VC uses
birthdate and is_over_18, and holds the address as one nested object. The
mDoc uses birth_date and age_over_18, and holds each address part as a
separate flat data element.
How to read the path arrays
- For
dc+sd-jwt, the path walks the JSON payload of the credential. One element names a top-level claim.["address"]asks for the whole address object, and["address", "locality"]asks for the city only. Ask for the member, not the parent, when you need one part. - For
jwt_vc_json, the path starts at the root of the credential, so the first element is alwayscredentialSubject. - For
mso_mdoc, the first element is the namespace and the second element is the data element identifier. Here the namespace iseu.europa.ec.eudi.pid.1, and it carries the same text as the doctype. An mDoc path always holds exactly two elements. An mDoc has no nesting, so there is no way to ask for one part of an address object.
Use with the iGrant.io API
Store the query as a presentation definition, then send the verification request.
Step 1. Create the presentation definition with
POST /v2/config/digital-wallet/openid/sdjwt/presentation-definition.
Put one entry in dcqlQuery.credentials. Give it an id, the format, the
meta that the format allows, and the claims that you need. Set version
to version_01.
dc+sd-jwt takes vct_values:
{
"label": "Prove age over 18",
"version": "version_01",
"responseType": "vp_token",
"responseMode": "direct_post",
"dcqlQuery": {
"credentials": [
{
"id": "pid",
"format": "dc+sd-jwt",
"meta": { "vct_values": ["urn:eu.europa.ec.eudi:pid:1"] },
"claims": [
{ "path": ["is_over_18"] }
]
}
]
}
}
mso_mdoc takes doctype_value only:
{
"id": "pid",
"format": "mso_mdoc",
"meta": { "doctype_value": "eu.europa.ec.eudi.pid.1" },
"claims": [
{ "path": ["eu.europa.ec.eudi.pid.1", "age_over_18"] }
]
}
jwt_vc_json takes type_values only. The value is an array of type sets,
so it is an array of arrays:
{ "type_values": [["urn:eu.europa.ec.eudi:pid:1"]] }.
Step 2. Send the request with the V3 send operation,
POST /v3/config/digital-wallet/openid/sdjwt/verification/send. Send the
presentationDefinitionId of the record from step 1. Read vpTokenQrCode
for the deep link and presentationExchangeId for the correlation id.
label must hold 3 to 100 characters. The server refuses the labels that
extensions reserve, for example Age Verification. Give an age check a
different label, such as Prove age over 18.
For the full operation reference, the transport fields and the response
shape, read the igrantio-api-verifier skill.
Source is the registry
This skill mirrors the iGrant.io verifiable data registry. If this skill and the registry file disagree, the registry wins. Check the source before you rely on a claim path:
- Directory: https://github.com/decentralised-dataexchange/verifiable-data-registry/tree/main/presentationDefinitions/dcqlQuery/pid
- Raw file, for example:
https://raw.githubusercontent.com/decentralised-dataexchange/verifiable-data-registry/main/presentationDefinitions/dcqlQuery/pid/2025.7.1/dc+sd-jwt.schema.json
A newer version directory can appear next to 2025.7.1. Always take the
latest one.