Issue Person Identification Data (PID) 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. All protocols and credential templates are subject to change and are mostly for demonstration and testing purposes. We’re interested in hearing any feedback on making Paradym better aligned with the European Digital Identity.
Creating issuer root X509 certificate
Before you can create the credential template for PID issuance, you need to set up our 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.
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.
PID mDoc credential template payload
{
"name": "Person Identification Data",
"description": "Person Identification Data (PID) compliant with EU Digital Identity Wallet framework",
"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.eudi.pid.1",
"attributes": {
"eu.europa.ec.eudi.pid.1": {
"type": "object",
"properties": {
"family_name": {
"type": "string",
"name": "Family Name",
"description": "Current last name(s) or surname(s) of the user",
"required": true
},
"given_name": {
"type": "string",
"name": "Given Name",
"description": "Current first name(s), including middle name(s) where applicable",
"required": true
},
"birth_date": {
"type": "date",
"name": "Birth Date",
"description": "Day, month, and year on which the user was born",
"required": true
},
"place_of_birth": {
"type": "object",
"name": "Place of Birth",
"description": "Country, region, or locality where the user was born",
"required": true,
"properties": {
"country": {
"type": "string",
"name": "Birth Country",
"description": "Alpha-2 country code as specified in ISO 3166-1",
"required": false
},
"region": {
"type": "string",
"name": "Birth Region",
"description": "State, province, district, or local area",
"required": false
},
"locality": {
"type": "string",
"name": "Birth Locality",
"description": "Municipality, city, town, or village",
"required": false
}
}
},
"nationality": {
"type": "array",
"name": "Nationalities",
"description": "One or more Alpha-2 country codes representing nationality",
"required": true,
"items": {
"type": "string"
}
},
"resident_address": {
"type": "string",
"name": "Resident Address",
"description": "Full address of the place where the user resides or can be contacted",
"required": false
},
"resident_country": {
"type": "string",
"name": "Resident Country",
"description": "Alpha-2 country code where the user currently resides",
"required": false
},
"resident_state": {
"type": "string",
"name": "Resident State",
"description": "State, province, district, or local area of residence",
"required": false
},
"resident_city": {
"type": "string",
"name": "Resident City",
"description": "Municipality, city, town, or village of residence",
"required": false
},
"resident_postal_code": {
"type": "string",
"name": "Resident Postal Code",
"description": "Postal code of the place of residence",
"required": false
},
"resident_street": {
"type": "string",
"name": "Resident Street",
"description": "Street name where the user resides",
"required": false
},
"resident_house_number": {
"type": "string",
"name": "Resident House Number",
"description": "House number including any affix or suffix",
"required": false
},
"personal_administrative_number": {
"type": "string",
"name": "Personal Administrative Number",
"description": "Unique administrative number assigned by the provider",
"required": false
},
"portrait": {
"type": "binary",
"name": "Portrait",
"description": "Facial image of the wallet user",
"required": false
},
"family_name_birth": {
"type": "string",
"name": "Birth Family Name",
"description": "Last name(s) at the time of birth",
"required": false
},
"given_name_birth": {
"type": "string",
"name": "Birth Given Name",
"description": "First name(s) at the time of birth",
"required": false
},
"sex": {
"type": "number",
"name": "Sex",
"description": "Sex classification using the PID rulebook numeric values",
"required": false
},
"email_address": {
"type": "string",
"name": "Email Address",
"description": "Electronic mail address in conformance with RFC 5322",
"required": false
},
"mobile_phone_number": {
"type": "string",
"name": "Mobile Phone Number",
"description": "Mobile telephone number starting with '+' and country code",
"required": false
},
"expiry_date": {
"type": "date",
"name": "Expiry Date",
"description": "Administrative expiry date of the PID",
"required": true
},
"issuing_authority": {
"type": "string",
"name": "Issuing Authority",
"description": "Name of the administrative authority that issued the PID",
"required": true
},
"issuing_country": {
"type": "string",
"name": "Issuing Country",
"description": "Alpha-2 country code of the issuing country",
"required": true
},
"document_number": {
"type": "string",
"name": "Document Number",
"description": "Document number assigned by the provider",
"required": false
},
"issuing_jurisdiction": {
"type": "string",
"name": "Issuing Jurisdiction",
"description": "Country subdivision code as specified in ISO 3166-2:2020",
"required": false
},
"issuance_date": {
"type": "date",
"name": "Issuance Date",
"description": "Date when the PID was issued",
"required": false
},
"trust_anchor": {
"type": "string",
"name": "Trust Anchor",
"description": "URL for machine-readable trust anchor information",
"required": false
},
"attestation_legal_category": {
"type": "string",
"name": "Attestation Legal Category",
"description": "Indicates that this attestation is a PID",
"required": false
}
}
}
}
}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).
Sample credential payload
{
"credentials": [
{
"credentialTemplateId": "cmf5e55470016s601ejynzfzc",
"attributes": {
"eu.europa.ec.eudi.pid.1": {
"family_name": "van der Berg",
"given_name": "Emma Charlotte",
"birth_date": "1995-03-15",
"place_of_birth": {
"country": "NL",
"region": "Noord-Holland",
"locality": "Amsterdam"
},
"nationality": [
"NL"
],
"resident_address": "Prinsengracht 263, 1016 GV Amsterdam",
"resident_country": "NL",
"resident_state": "Noord-Holland",
"resident_city": "Amsterdam",
"resident_postal_code": "1016 GV",
"resident_street": "Prinsengracht",
"resident_house_number": "263",
"personal_administrative_number": "ADM2023080012345",
"portrait": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB",
"family_name_birth": "van der Berg",
"given_name_birth": "Emma Charlotte",
"sex": 2,
"email_address": "emma.vandenberg@gmail.com",
"mobile_phone_number": "0031612345678",
"expiry_date": "2033-08-20",
"issuing_authority": "NL",
"issuing_country": "NL",
"document_number": "NL987654321",
"issuing_jurisdiction": "NL",
"issuance_date": "2023-08-20",
"trust_anchor": "https://example.org/trust-anchor.json",
"attestation_legal_category": "pid"
}
}
}
]
}Presentation template
If you want to verify a PID credential, use the presentation template payload, or select it as a pre-made template in the dashboard.