German PID Reference for Relying Parties¶
This page provides a practical reference for Relying Parties integrating with the German Personal Identification Data (PID) credential. It summarises the key technical details from the German PID Rulebook (PID-DE) that you need to understand in order to successfully request, receive, and verify a PID.
Overview¶
The German PID is issued by a single, nationally designated PID Provider. It is based on the German eID card (Personalausweis), electronic Residence Permit, or eID Card for Union Citizens. The PID is available in two credential formats:
- SD-JWT VC
- ISO mDoc (ISO/IEC 18013-5)
Both formats carry the same underlying identity data.
Special Characters
All string values in the German PID are stored in UPPERCASE, following ICAO Doc 9303. Special characters such as Ö are represented in their ISO/IEC 8859-1 form and are not transliterated (e.g., Ö is not replaced with OE).
Credential Identifiers¶
When matching a received credential against the expected type, use the following identifiers:
| Format | Identifier |
|---|---|
| SD-JWT VC | vct: urn:eudi:pid:de:1 |
| mDoc | docType: eu.europa.ec.eudi.pid.1 |
German-specific extension attributes in the mDoc format are in the namespace eu.europa.ec.eudi.pid.de.1.
PID Attributes¶
Mandatory Attributes (CIR 2024/2977)¶
These attributes are always present in a German PID.
| SD-JWT VC claim | mDoc identifier | Description | Example value |
|---|---|---|---|
family_name |
family_name |
Holder's surname | MUSTERMANN |
given_name |
given_name |
Holder's given name(s) | ERIKA |
birthdate |
birth_date |
Date of birth (YYYY-MM-DD). Unknown month or day encoded as 00 |
1983-08-12 or 1983-00-00 |
place_of_birth |
place_of_birth |
JSON object / CBOR map with at least locality. If no place is recorded, no_place_info: true is set |
{"locality": "BERLIN"} |
nationalities |
nationality |
Array of ISO 3166-1 alpha-2 codes. If eID was issued before Nov. 2019, automatically set to ["DE"] |
["DE"] |
Optional Attributes (CIR 2024/2977)¶
These attributes are included when available from the holder's eID. Note that resident_address and resident_house_number are not available in the German PID.
| SD-JWT VC claim | mDoc identifier | Description | Example value |
|---|---|---|---|
address.country |
resident_country |
ISO 3166-1 alpha-2 country code of residence | DE |
address.region |
resident_state |
Federal state or region of residence | NORDRHEIN-WESTFALEN |
address.locality |
resident_city |
City of residence | KÖLN |
address.postal_code |
resident_postal_code |
Postal code | 51147 |
address.street_address |
resident_street |
Street name and house number combined | HEIDESTRASSE 17 |
Note
Residential address fields are only present if the eID returns a StructuredPlace. They may be absent even when a holder has a registered address.
Mandatory Metadata (CIR 2024/2977)¶
| SD-JWT VC claim | mDoc identifier | Description | Example value |
|---|---|---|---|
date_of_expiry |
expiry_date |
PID expiry date (YYYY-MM-DD) | 2035-01-01 |
issuing_authority |
issuing_authority |
Set to the issuing country code (no separate authority available in German eID) | DE |
issuing_country |
issuing_country |
ISO 3166-1 alpha-2 country code, always DE for German IDs |
DE |
Germany-Specific Additional Attributes¶
These attributes are defined by the German PID Rulebook and extend the base EU specification. In mDoc, they are found in the eu.europa.ec.eudi.pid.de.1 namespace.
| SD-JWT VC claim | mDoc identifier | Description | Example value |
|---|---|---|---|
source_document_type |
source_document_type |
Type of source document. ID = German eID card, AR/AS/AF = Residence Permit, IC = EU Citizen ID Card |
ID |
age_equal_or_over (object) |
age_over_NN (individual fields) |
Boolean age thresholds. SD-JWT groups these under one object; mDoc has individual claims per threshold | See below |
birth_name |
birth_name |
Birth name (may include both given and family name at birth); may be empty | GABLER |
also_known_as |
also_known_as |
Artistic or stage name | (optional) |
academic_title |
academic_title |
Academic title | (optional) |
Age Verification Thresholds¶
The PID supports age verification without revealing the holder's exact date of birth. Available thresholds are 12, 14, 16, 18, 21, and 65.
In SD-JWT VC, these are grouped under the age_equal_or_over object:
In mDoc, each threshold is an individual claim (e.g., age_over_18) in the eu.europa.ec.eudi.pid.de.1 namespace.
When implementing an age-gate (e.g., 18+ access), you should request only the relevant threshold rather than the holder's birthdate, in line with the principle of data minimisation.
Revocation Status Attribute¶
| SD-JWT VC claim | mDoc identifier | Description |
|---|---|---|
status |
status |
Reference to a Token Status List (IETF OAuth Status List draft) for revocation checking |
Complete Example PIDs¶
SD-JWT VC Example¶
The decoded payload of a German PID issued as SD-JWT VC looks as follows. In practice the credential is delivered as a compact serialized SD-JWT, with selectively disclosable claims hidden until disclosed by the holder.
{
"vct": "urn:eudi:pid:de:1",
"family_name": "MUSTERMANN",
"given_name": "ERIKA",
"birthdate": "1983-08-12",
"place_of_birth": {
"locality": "BERLIN"
},
"nationalities": ["DE"],
"address": {
"country": "DE",
"region": "NORDRHEIN-WESTFALEN",
"locality": "KÖLN",
"postal_code": "51147",
"street_address": "HEIDESTRASSE 17"
},
"birth_name": "GABLER",
"date_of_expiry": "2031-08-01",
"issuing_authority": "DE",
"issuing_country": "DE",
"source_document_type": "ID",
"age_equal_or_over": {
"12": true,
"14": true,
"16": true,
"18": true,
"21": true,
"65": false
},
"status": {
"status_list": {
"idx": 0,
"uri": "https://example.com/statuslists/1"
}
},
"cnf": {
"jwk": {
"kty": "EC",
"crv": "P-256",
"x": "52aDI_ur05n1f_p3jiYGUU82oKZr3m4LsAErM536crQ",
"y": "ckhZ-KQ5aXNL91R8Eufg1aOf8Z5pZJnIvuCzNGfdnzo"
}
}
}
Key points for SD-JWT VC:
- The
vctclaim identifies this credential as a German PID. Always validate this before trusting any claims. - Claims
vct,vct#integrity,cnf, andmetadatacannot be selectively disclosed — they are always present in the header. iatandexpdefine the lifetime of the individual PID token (not to be confused withdate_of_expiry, which reflects the eID card's expiry).birthdatemay take the form1983-00-00when the day or month is unknown.nationalitiesis always an array, even when only one nationality is present.
mDoc Example¶
The following is the decoded logical structure of a German PID in mDoc format (ISO/IEC 18013-5). In practice the data is CBOR-encoded and the attributes are individually integrity-protected using digest IDs and random salts to enable selective disclosure.
{
"docType": "eu.europa.ec.eudi.pid.1",
"issuerSigned": {
"nameSpaces": {
"eu.europa.ec.eudi.pid.1": {
"family_name": "MUSTERMANN",
"given_name": "ERIKA",
"birth_date": "1983-08-12",
"place_of_birth": {
"locality": "BERLIN"
},
"nationality": ["DE"],
"resident_country": "DE",
"resident_state": "NORDRHEIN-WESTFALEN",
"resident_city": "KÖLN",
"resident_postal_code": "51147",
"resident_street": "HEIDESTRASSE 17",
"expiry_date": "2035-01-01",
"issuing_authority": "DE",
"issuing_country": "DE"
},
"eu.europa.ec.eudi.pid.de.1": {
"source_document_type": "ID",
"birth_name": "GABLER",
"age_over_12": true,
"age_over_14": true,
"age_over_16": true,
"age_over_18": true,
"age_over_21": true,
"age_over_65": false,
"status": {
"status_list": {
"idx": 0,
"uri": "https://example.com/statuslists/1"
}
}
}
},
"issuerAuth": { ... }
},
"deviceSigned": { ... }
}
Key points for mDoc:
- The
docTypeeu.europa.ec.eudi.pid.1identifies this as a PID. Always verify this before processing. - Core attributes are in the
eu.europa.ec.eudi.pid.1namespace; German-specific extensions are ineu.europa.ec.eudi.pid.de.1. - Each attribute is individually salted and hashed, allowing the holder to selectively disclose only the claims you have requested.
birth_dateuses the formatYYYY-MM-DDbut may contain00for unknown month or day (e.g.,1983-00-00).place_of_birthis a CBOR map with alocalitykey. This differs from the ISO mDL standard, wherebirth_placeis a plain string.nationalityis always an array of alpha-2 country codes.
Attribute Mapping Reference¶
The same underlying data is labelled differently across formats. Use this table when writing queries or parsing responses across both credential types.
| CIR 2024/2977 identifier | SD-JWT VC claim | mDoc identifier (namespace) |
|---|---|---|
family_name |
family_name |
family_name (pid.1) |
given_name |
given_name |
given_name (pid.1) |
birth_date |
birthdate |
birth_date (pid.1) |
birth_place |
place_of_birth |
place_of_birth (pid.1) |
nationality |
nationalities |
nationality (pid.1) |
resident_country |
address.country |
resident_country (pid.1) |
resident_state |
address.region |
resident_state (pid.1) |
resident_city |
address.locality |
resident_city (pid.1) |
resident_postal_code |
address.postal_code |
resident_postal_code (pid.1) |
resident_street |
address.street_address |
resident_street (pid.1) |
expiry_date |
date_of_expiry |
expiry_date (pid.1) |
issuing_authority |
issuing_authority |
issuing_authority (pid.1) |
issuing_country |
issuing_country |
issuing_country (pid.1) |
| (German extension) | age_equal_or_over.NN |
age_over_NN (pid.de.1) |
| (German extension) | source_document_type |
source_document_type (pid.de.1) |
| (German extension) | birth_name |
birth_name (pid.de.1) |
What Is and Is Not Available¶
Several attributes defined in the EU specification are not available in the German PID due to limitations of the source eID document. Plan your integration accordingly and do not assume these fields will be present.
| Attribute | Available? | Notes |
|---|---|---|
family_name |
✅ Always | |
given_name |
✅ Always | |
birthdate |
✅ Always | May contain 00 for unknown month/day |
place_of_birth |
✅ Always | Only locality populated |
nationalities |
✅ Always | Defaults to ["DE"] for pre-Nov 2019 cards |
expiry_date |
✅ Always | |
issuing_country |
✅ Always | Always DE |
issuing_authority |
✅ Always | Populated with DE (no separate authority field exists) |
source_document_type |
✅ Always | German extension |
| Residential address fields | ⚠️ Conditional | Only present if eID returns a structured address |
birth_name |
⚠️ Conditional | May be empty |
age_equal_or_over / age_over_NN |
⚠️ Conditional | Present when requested; reflects thresholds supported by the PID Provider |
academic_title, also_known_as |
⚠️ Conditional | Optional German extensions |
resident_address (combined) |
❌ Not available | |
resident_house_number |
❌ Not available | House number is part of resident_street |
portrait |
❌ Not available | |
document_number |
❌ Not available | |
sex |
❌ Not available | Set to 9 (other) in Residence Permit PIDs only |
email_address |
❌ Not available | |
mobile_phone_number |
❌ Not available | |
personal_administrative_number |
❌ Not available |