Issue Person Identification Data (PID) as SD-JWT VC

Person Identification Data (PID) is the foundational identity credential of the EU Digital Identity Wallet: a digital equivalent of a national ID card that holds a person’s core identity attributes such as name, date of birth, and nationality. It is defined by the European Commission’s PID Rulebook within the Architecture Reference Framework (ARF), and is issued here as an SD-JWT VC using the credential type urn:eudi:pid:1.
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.
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.
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 sd-jwt-vc credential template , or the Issue credentials guide for more information on creating credential templates.
{
"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": "urn:eudi:pid:1",
"attributes": {
"family_name": {
"type": "string",
"name": "Family Name",
"description": "Current last name(s) or surname(s) of the user",
"required": true,
"alwaysDisclosed": false
},
"given_name": {
"type": "string",
"name": "Given Name",
"description": "Current first name(s), including middle name(s) where applicable",
"required": true,
"alwaysDisclosed": false
},
"birthdate": {
"type": "date",
"name": "Birth Date",
"description": "Date of birth in ISO 8601-1 YYYY-MM-DD format",
"required": true,
"alwaysDisclosed": false
},
"place_of_birth": {
"type": "object",
"name": "Place of Birth",
"description": "Country, region, or locality where the user was born",
"required": true,
"alwaysDisclosed": false,
"properties": {
"country": {
"type": "string",
"name": "Birth Country",
"description": "Alpha-2 country code as specified in ISO 3166-1",
"required": false,
"alwaysDisclosed": false
},
"region": {
"type": "string",
"name": "Birth Region",
"description": "State, province, district, or local area",
"required": false,
"alwaysDisclosed": false
},
"locality": {
"type": "string",
"name": "Birth Locality",
"description": "Municipality, city, town, or village",
"required": false,
"alwaysDisclosed": false
}
}
},
"nationalities": {
"type": "array",
"name": "Nationalities",
"description": "One or more Alpha-2 country codes representing nationality",
"required": true,
"alwaysDisclosed": false,
"items": {
"type": "string"
}
},
"address": {
"type": "object",
"name": "Resident Address",
"description": "Address where the user currently resides",
"required": false,
"alwaysDisclosed": false,
"properties": {
"formatted": {
"type": "string",
"name": "Full Address",
"description": "Complete formatted address",
"required": false,
"alwaysDisclosed": false
},
"street_address": {
"type": "string",
"name": "Street Address",
"description": "Street name where the user resides",
"required": false,
"alwaysDisclosed": false
},
"house_number": {
"type": "string",
"name": "House Number",
"description": "House number including any affix or suffix",
"required": false,
"alwaysDisclosed": false
},
"locality": {
"type": "string",
"name": "City",
"description": "Municipality, city, town, or village",
"required": false,
"alwaysDisclosed": false
},
"region": {
"type": "string",
"name": "State/Region",
"description": "State, province, district, or local area",
"required": false,
"alwaysDisclosed": false
},
"postal_code": {
"type": "string",
"name": "Postal Code",
"description": "Postal code of residence",
"required": false,
"alwaysDisclosed": false
},
"country": {
"type": "string",
"name": "Country",
"description": "Alpha-2 country code as specified in ISO 3166-1",
"required": false,
"alwaysDisclosed": false
}
}
},
"personal_administrative_number": {
"type": "string",
"name": "Personal Administrative Number",
"description": "Unique administrative number assigned by the provider",
"required": false,
"alwaysDisclosed": false
},
"picture": {
"type": "string",
"name": "Portrait",
"description": "Data URL containing base64-encoded portrait in JPEG format",
"required": false,
"alwaysDisclosed": false
},
"birth_family_name": {
"type": "string",
"name": "Birth Family Name",
"description": "Last name(s) at the time of birth",
"required": false,
"alwaysDisclosed": false
},
"birth_given_name": {
"type": "string",
"name": "Birth Given Name",
"description": "First name(s) at the time of birth",
"required": false,
"alwaysDisclosed": false
},
"sex": {
"type": "number",
"name": "Sex",
"description": "Sex classification (0=not known, 1=male, 2=female, 3=other, 4=inter, 5=diverse, 6=open, 9=not applicable)",
"required": false,
"alwaysDisclosed": false
},
"email": {
"type": "string",
"name": "Email Address",
"description": "Electronic mail address in conformance with RFC 5322",
"required": false,
"alwaysDisclosed": false
},
"phone_number": {
"type": "string",
"name": "Mobile Phone Number",
"description": "Mobile telephone number starting with '+' and country code",
"required": false,
"alwaysDisclosed": false
},
"date_of_expiry": {
"type": "date",
"name": "Expiry Date",
"description": "Administrative expiry date in ISO 8601-1 YYYY-MM-DD format",
"required": true,
"alwaysDisclosed": true
},
"issuing_authority": {
"type": "string",
"name": "Issuing Authority",
"description": "Name of the administrative authority that issued the PID",
"required": true,
"alwaysDisclosed": true
},
"issuing_country": {
"type": "string",
"name": "Issuing Country",
"description": "Alpha-2 country code of the issuing country",
"required": true,
"alwaysDisclosed": true
},
"document_number": {
"type": "string",
"name": "Document Number",
"description": "Document number assigned by the provider",
"required": false,
"alwaysDisclosed": false
},
"issuing_jurisdiction": {
"type": "string",
"name": "Issuing Jurisdiction",
"description": "Country subdivision code as specified in ISO 3166-2:2020",
"required": false,
"alwaysDisclosed": false
},
"date_of_issuance": {
"type": "date",
"name": "Issuance Date",
"description": "Date when the PID was issued in ISO 8601-1 YYYY-MM-DD format",
"required": false,
"alwaysDisclosed": false
},
"trust_anchor": {
"type": "string",
"name": "Trust Anchor",
"description": "URL for machine-readable trust anchor information",
"required": false,
"alwaysDisclosed": 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).
{
"credentials": [
{
"credentialTemplateId": "<CREDENTIAL_TEMPLATE_ID>",
"attributes": {
"sex": 2,
"email": "emma.vandenberg@gmail.com",
"birthdate": "1995-03-15",
"given_name": "Emma Charlotte",
"picture": "data:image/jpeg;base64,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",
"family_name": "van der Berg",
"phone_number": "0031612345678",
"date_of_expiry": "2033-08-20",
"nationalities": [
"NL"
],
"place_of_birth": {
"country": "NL"
},
"address": {
"country": "NL",
"street_address": "Prinsengracht",
"house_number": "263",
"postal_code": "1016 GV",
"region": "Noord-Holland",
"locality": "Amsterdam"
},
"document_number": "NL987654321",
"issuing_country": "NL",
"birth_given_name": "Emma Charlotte",
"date_of_issuance": "2023-08-20",
"birth_family_name": "van der Berg",
"issuing_authority": "NL",
"issuing_jurisdiction": "NL",
"personal_administrative_number": "ADM2023080012345"
}
}
]
}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.