Skip to content

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:

"age_equal_or_over": {
  "12": true,
  "14": true,
  "16": true,
  "18": true,
  "21": true,
  "65": false
}

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
"status": {
  "status_list": {
    "idx": 0,
    "uri": "https://example.com/statuslists/1"
  }
}

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 vct claim identifies this credential as a German PID. Always validate this before trusting any claims.
  • Claims vct, vct#integrity, cnf, and metadata cannot be selectively disclosed — they are always present in the header.
  • iat and exp define the lifetime of the individual PID token (not to be confused with date_of_expiry, which reflects the eID card's expiry).
  • birthdate may take the form 1983-00-00 when the day or month is unknown.
  • nationalities is 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 docType eu.europa.ec.eudi.pid.1 identifies this as a PID. Always verify this before processing.
  • Core attributes are in the eu.europa.ec.eudi.pid.1 namespace; German-specific extensions are in eu.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_date uses the format YYYY-MM-DD but may contain 00 for unknown month or day (e.g., 1983-00-00).
  • place_of_birth is a CBOR map with a locality key. This differs from the ISO mDL standard, where birth_place is a plain string.
  • nationality is 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