Skip to content

German PID Rulebook (PID-DE)

Version 1.0.0 – Draft for Consultation
ARF PID Rulebook Version used for this document: 1.6

This rulebook is defining requirements. The current status of implementation is described in the Developer Guide.

Introduction

Purpose

This Rulebook specifies how the ARF PID Rulebook and PID Definition in CIR 2026/1731 are applied within the German EUDI Wallet ecosystem. It defines national specifications required by German legislation, system architecture, and operational constraints. The document ensures full interoperability with the EU EUDI ecosystem while reflecting the decisions made within the German ecosystem:

  • There will be just one PID Provider in Germany.
  • The PID Provider is a backend service that translates from the German national eID scheme into the eIDAS/EUDI Wallet scheme by issuing a PID in the mdoc and in SD-JWT VC formats, suitable for eIDAS Level of Assurance (LoA) High. The Wallet receives issued credentials from the PID Provider and presents them to a Relying Party.

What is the PID?

In the context of the EUDI Wallet, Person Identification Data (PID) refers to the set of identity attributes that uniquely identify a natural person, such as the person's name, date of birth, and other identifying information. These attributes are issued by the PID Provider (PP) as a verifiable credential, encoded in a supported credential format such as ISO/IEC 18013-5 mdoc or SD-JWT VC. While the term PID is commonly used as shorthand for both the identity data and the issued credential, the term PID credential is technically more precise whenever referring to issuance, storage, presentation, or verification of the credential itself.

Relationship to CIR 2026/1731 and ARF

The CIR 2026/1731 remains the baseline reference. The ARF is adding more explanation referenced in this rulebook, but isn't a regulatory reference. This document provides German national specializations. In case of conflict, German national specializations prevail.

Scope

Applies to:

  • the German PID Provider,
  • German Wallet Providers,
  • Relying Parties in Germany,
  • Trust and governance entities.

Attributes and Metadata

Important for Relying Parties.

All string values in eIDs are stored uppercase, following ICAO Doc 9303 for machine readable travel documents. It uses ISO/IEC 8859-1, following BSI TR-03110 Part 3 D.2.1.4. This also means that letters like "Ö" (ISO/IEC 8859-1 0xD6) are used and not replaced by "OE".

One main component of the PID Provider is the connection to an eID-Server according to BSI TR-03130 that manages an eID authorization certificate that is allowed to request the relevant attributes according to the PID specification of eIDAS. The eID-Client reads the identity data from the German eID Card or the German electronic Residence Permit, sends it to the eID-Server that validates the data.

The second main component of the PID Provider is a service that creates the credential in mdoc or SD-JWT format. This includes the creation of a digital signature over the identity data read by the eID-Server. The signature recognized as the PID attestation under eIDAS by Relying Parties and must fulfill eIDAS LoA high. Hence, the respective key material and access to the key material must be stored and managed in a way to resist attackers with high attack potential.

Mandatory attributes as specified in CIR 2026/1731

The full list of mandatory attributes specified in CIR 2026/1731 Annex 1 Table 1 is supported (apart from the portrait initially). German eIDs issued before November 2019 do not contain any information on nationality, so nationality is therefore assigned automatically as "DE" in case of a german eID Card.

Annex 1, Table 1 Data Identifier BSI TR-03130 eID attribute PID-Format: SD-JWT VC / ISO 18013-5 mdoc
family_name FamilyNames string / tstr
given_name GivenNames string / tstr
birth_date DateOfBirth string, ISO 8601-1, YYYY-MM-DD format / full-date
- year always set
- eID values 00 for month as well as day are possible
- they become converted to the maximum possible value which replace the 00, e.g. 31st of December, to fulfil RFC 3339
- if just month or day are 00, they are set to the maximum, e.g. 31 in January, or 12 for 00 month
- base format is casted
birth_place PlaceOfBirth JSON object / place_of_birth
nationality Nationality array of strings / [+ tstr]
- German PID contains just one item
- ISO 3166-1 country code as alpha-2 string
- "QU" when nationality is unknown
- "QS" when person does not hold a nationality
- see German mapping rules for country codes
portrait currently not included in the German PID

Optional attributes as specified in CIR 2026/1731

Annex 1, Table 2 Data Identifier BSI TR-03130 eID attribute PID-Format: SD-JWT VC / ISO 18013-5 mdoc
resident_address not available not included in the German PID
resident_country PlaceOfResidence.Country string / tstr
resident_state PlaceOfResidence.State string / tstr
resident_city PlaceOfResidence.City string / tstr
resident_postal_code PlaceOfResidence.ZipCode string / tstr
resident_street PlaceOfResidence.Street string / tstr
personal_administrative_number not available not included in the German PID
family_name_birth not available not included in the German PID
given_name_birth not available not included in the German PID
sex not available not included in the German PID
email_address not available not included in the German PID
mobile_phone_number not available not included in the German PID

The German eID may contain a field NoPlaceInfo in case the issuing authority could not verify the address. The attributes resident_country, resident_state, resident_city, resident_postal_code and resident_street will be an empty string in this case.

Additional national attributes of German PID

Included in the national namespace section "eu.europa.ec.eudi.pid.de.1" for ISO mdoc.

Info

The following attributes MAY remain unpopulated. If an attribute is not populated and of type string/tstr, the corresponding claim SHALL be an empty string.

Data identifier BSI TR-03130 eID attribute PID-Format: SD-JWT VC / ISO 18013-5 mdoc
source_document_type DocumentType string / tstr; "ID" = german eID, can also be "AR", "AS" or "AF" for Residence Permit
age_equal_or_over.NN (sd-jwt), age_over_NN (mdoc) AgeVerificationRequestType Array of key-value-pairs, values are boolean / bool
- NN is defined as age group.
- Age groups are 12, 14, 16, 18, 21 and 65
- Example: age_equal_or_over.12 (sd-jwt) or age_over_12 (mdoc)
academic_title AcademicTitle string / tstr
birth_name BirthName string / tstr
- field is used as the base document may contain given name or familiy name at birth or a combination of both with any marker to divide
- see BSI TR 03130-1 Chapter 5.5.6
raw_eid_birth_date DateOfBirth string / tstr
- containing the birth-date from the eID in the format yyyy-mm-dd, may contain 00 values if set in the eID for month, day or both
- purpose is to clarify if there is a difference between the interoperable and the eID birth date

The age is calculated at the moment the PID-credential is issued. Usage of the age_equal_or_over.NN/age_over_NN groups shall reflect this fact. These claims only guarantee that the holder of the PID is above a certain age. If a claim is false, it can not be deducted that the holder is below a certain age. Wallet users shall request the issuance of a new batch of PIDs, when their age has changed regarding these age-groups.

Metadata as specified in CIR 2026/1731

Annex 1, Table 5 Data Identifier BSI TR-03130 eID attribute Presence PID-Format: SD-JWT VC / ISO 18013-5 mdoc
issuing_authority not available, fixed value "DE" used mandatory string / tstr
issuing_country IssuingState, always "DE" mandatory string / tstr
expiry_date not used optional not included in the German PID
document_number not available optional not included in the German PID
issuing_jurisdiction not available optional not included in the German PID
issuance_date not available optional not included in the German PID
status not available mandatory Reference to Token Status List in format of (IETF OAuth TSL)
Shards and sizes are depending on the change frequency of status. Always included in the German PID

Note that expiry_date as defined in the CIR is the administrative validity period (e.g., validity of the underlying eID), not the technical validity period of the PID. The technical validity period of the PID is expressed via credential format specific attributes (nbf, exp for SD-JWT VC and validFrom, validUntil for mdoc).

Formatting, encoding and mapping rules

Formatting

Format follows CIR 2026/1731, Annex 1 which defines the two possible formats of a PID based on ISO/IEC 18013-5 (Personal identification — ISO-compliant driving licence — Part5) as well as SD-JWT VC.

German format specializations for ISO/IEC 18013-5 / mdoc

Attribute identifier Encodingformat ISO mdoc Comments
birth_date full-date (rfc3339) zero values in German eID for month and day are mapped to the possible maximum (e.g. 12 for month).
see Mandatory attributes as specified in CIR 2026/1731
place_of_birth CBOR Major Type 5 (map) / tobject Just locality can be present. Can be an address string. If value in eID is "NoPlaceInfo", locality will be empty string this case, but shall be set.
nationality [+ tstr] (rfc8610) one or more alpha-2 country codes as specified in ISO 3166-1, mapped from eID field with pattern "[A-Z]{1,3}"
see German mapping rules for country codes
resident_country tstr (rfc8610) alpha-2 country codes as specified in ISO 3166-1, mapped from eID field with pattern "[A-Z]{1,3}"
see German mapping rules for country codes

German format specializations for SD-JWT VC-based encoding

Attribute identifier Encodingformat SD-JWT VC Comments
birthdate string, ISO 8601-1 [ISO8601‑1] YYYY-MM-DD format zero values in German eID for month and day are mapped to the maximum possible value in context
place_of_birth JSON object Section 4.1 of [EKYC]; Just locality will be present. If FreetextPlace comes from eID, this is placed as locality. If value in eID is "NoPlaceInfo", locality will be empty, but shall be set.
nationalities array of strings Section 4.1 of [EKYC]; using alpha-2 country codes as defined in Section 2.2, mapped from eID field with pattern "[A-Z]{1,3}"
see German mapping rules for country codes
address.country string alpha-2 country codes as specified in ISO 3166-1, mapped from eID field with pattern "[A-Z]{1,3}"
see German mapping rules for country codes

Note that the claims vct, vct#integrity, cnf and metadata cannot be issued as selectively disclosable claims.

Encoding

Encoding shall be UTF-8, full unicode range in both cases, ISO/IEC mdoc and SD-JWT VC. Regarding CIR 2026/1731 Annex 1, Chapter 4.1 tstr should have a maximum length of 150 characters. With this rulebook it is requested, that all strings shall have a maximum length of 150 characters in any format, ISO/IEC mdoc as well as SD-JWT VC.

Mapping

As there are mappings between data identifiers following CIR 2026/1731, ISO/IEC 18013-5 and SD-JWT VC the table below highlights and explains these mapping.

CIR 2026/1731 data identifier ISO/IEC 18013-5 attribute identifier SD-JWT VC attribute identifier
family_name family_name family_name
given_name given_name given_name
birth_date birth_date birthdate
birth_place place_of_birth place_of_birth
nationality nationality nationalities
resident_country resident_country address.country
resident_state resident_state address.region
resident_city resident_city address.locality
resident_postal_code resident_postal_code address.postal_code
resident_street resident_street address.street_address
issuing_authority issuing_authority issuing_authority
issuing_country issuing_country issuing_country
age_over_NN age_equal_or_over

German mapping rules for country codes

German eIDs may contain country or nationality codes that are reserved for national use and are therefore not defined by ISO 3166. These user-defined codes are permitted within the German eID ecosystem and can be returned by an eID server compliant with BSI TR-03110 during the authentication process. Applications consuming eID data should therefore not assume that all returned country codes are valid ISO values. For example, the code XK is used to represent Kosovo, although it is not officially assigned in ISO 3166-1. The German XRepository country code list extends the ISO code set with these nationally defined codes and should be used to correctly interpret such values.

German mapping rules for ISO/IEC 18013-5 / mdoc

Mapping of German eID data into mdoc compatible values

Attribute identifier mdoc format eID format Mapping
birth_date tdate (rfc8610) or full-date (rfc3339) format: YYYY-MM-DD DateOfBirth string: pattern [0-9-]{10}, format: yyyy-mm-dd date conversion, see Mandatory attributes as specified in CIR 2026/1731
place_of_birth CBOR Major Type 5 (map) / tobject PlaceOfBirth (sequence) string conversion from sequence elements of eID to string which will be placed as attribute locality. If value in eID is "NoPlaceInfo", locality will be empty string this case.
nationality [+ tstr] (rfc8610) Nationality (string) pattern: [A-Z]{1,3} Mapping from ICAO Country codes to alpha-2 country codes as specified in ISO 3166-1.
- "QU" when nationality is unknown
- "QS" when person does not hold a nationality.
- see German mapping rules for country codes
resident_country tstr (rfc8610) pattern: [A-Z]{2} PlaceOfResidence.Country (string: pattern [A-Z ]{1,3}) Mapping from ICAO Country codes to alpha-2 country codes as specified in ISO 3166-1.
- ISO 3166-1 country code as alpha-2 string
- see German mapping rules for country codes
issuing_country tstr (rfc8610) pattern: [A-Z]{2} IssuingState (string: pattern [A-Z]{1,3}) Always "DE" for German PID

German mapping rules for SD-JWT VC

Mapping of German eID data into SD-JWT VC compatible values

Attribute identifier SD-JWT VC format eID format Mapping
birthdate string, ISO 8601-1 [ISO8601‑1] format YYYY-MM-DD DateOfBirth string: pattern [0-9-]{10}, format: yyyy-mm-dd date conversion, see Mandatory attributes as specified in CIR 2026/1731
place_of_birth JSON object PlaceOfBirth (sequence) string conversion from sequence elements of eID to string which will be placed as attribute locality. If value in eID is "NoPlaceInfo", locality will be empty string this case.
nationalities array of strings Nationality (string) pattern: [A-Z]{1,3} Mapping from ICAO Country codes to alpha-2 country codes as specified in ISO 3166-1. Codes beginning with X, e.g. XK for Kosovo, are not officially recognized. However, they are unofficial codes in ISO 3166-1. See German mapping rules for country codes.
address.country string PlaceOfResidence.Country (string: pattern [A-Z]{1,3}) Mapping from ICAO Country codes to alpha-2 country codes as specified in ISO 3166-1. Codes beginning with X, e.g. XK for Kosovo, are not officially recognized. However, they are unofficial codes in ISO 3166-1. See German mapping rules for country codes.
issuing_country string IssuingState (string: pattern [A-Z]{1,3}} Mapping from ICAO Country codes to alpha-2 country codes as specified in ISO 3166-1

Namespaces

ISO/IEC 18013-5 / mdoc

In accordance with CIR 2026/1731, Annex 1 the mdoc-based German PID uses the DocType “eu.europa.ec.eudi.pid.1” and the two NameSpace data elements “eu.europa.ec.eudi.pid.1” and “eu.europa.ec.eudi.pid.de.1”. Specific German attributes are contained in the namespace “eu.europa.ec.eudi.pid.de.1”.

SD-JWT VC

In accordance with CIR 2026/1731, Annex 1 the SD-JWT VC based German PID uses the namespace urn:eudi:pid:de:1, compact serialized format is used.

Examples

Note that the following examples are non-normative and are missing some metadata/technical values like the status entries.

ISO/IEC mdoc

{
  "DocType": "eu.europa.ec.eudi.pid.1",      # metadata that would define this as a PID (namespace "eu.europa.ec.eudi.pid.1"), includes data of the "eu.europa.ec.eudi.pid.de.1" namespace too
  "issuerSigned": {
    "NameSpaces": {

      "eu.europa.ec.eudi.pid.1": {

        ## Mandatory attributes specified in CIR 2026/1731

        "family_name": {
          "digestID": 0,
          "random": "h'1A2B3C4D5E6F708192A3B4C5D6E7F809'",
          "elementIdentifier": "family_name",
          "elementValue": "MUSTERMANN"
        },

        "given_name": {
          "digestID": 1,
          "random": "h'2B3C4D5E6F708192A3B4C5D6E7F8091A'",
          "elementIdentifier": "given_name",
          "elementValue": "ERIKA"
        },

        "birth_date": {
          "digestID": 2,
          "random": "h'3C4D5E6F708192A3B4C5D6E7F8091A2B'",
          "elementIdentifier": "birth_date",
          "elementValue": "1983-08-12"
        },

        "place_of_birth": {
          "digestID": 3,
          "random": "h'4D5E6F708192A3B4C5D6E7F8091A2B3C'",
          "elementIdentifier": "place_of_birth",
          "elementValue": {
            "locality": "BERLIN"
          }
        },

        "nationality": {
          "digestID": 4,
          "random": "h'5E6F708192A3B4C5D6E7F8091A2B3C4D'",
          "elementIdentifier": "nationality",
          "elementValue": ["DE"]      # "DE" for german eID cards issued before Nov. 2019, otherwise eID based data
        },

        ## Optional attributes specified in CIR 2026/1731

        "resident_country": {
          "digestID": 5,
          "random": "h'6408192A3B4C5D6C87F8091A2B3C4D5E'",
          "elementIdentifier": "resident_country",
          "elementValue": "DE"
        },

        "resident_state": {
          "digestID": 6,
          "random": "h'6FC408192A3B4C5D6E7F8091A2B3C4F3'",
          "elementIdentifier": "resident_state",
          "elementValue": "NORDRHEIN-WESTFALEN"
        },

        "resident_city": {
          "digestID": 7,
          "random": "h'7472A3B4C5D6E7F8091A2B3C4D5E6B3A'",
          "elementIdentifier": "resident_city",
          "elementValue": "KÖLN"
        },

        "resident_postal_code": {
          "digestID": 8,
          "random": "h'7522A3B4C5D6E7F8091A2B3C46B3AD5E'",
          "elementIdentifier": "resident_postal_code",
          "elementValue": "51147"
        },

        "resident_street":{
          "digestID": 9,
          "random": "h'6E7F7472A3B4C5D8091D5E6B3AA2B3C4'",
          "elementIdentifier": "resident_street",
          "elementValue": "HEIDESTRASSE 17"    # CIR 2026/1731 now offically request the house number as part of the street
        },

        "issuing_authority": {
          "digestID": 12,
          "random": "h'A0B3C4D5E6F708192A3B4C5D6E7F8091'",
          "elementIdentifier": "issuing_authority",
          "elementValue": "DE"      # value to expect in German PID
        },

        "issuing_country": {
          "digestID": 13,
          "random": "h'B0C4D5E6F708192A3B4C5D6E7F8091A2'",
          "elementIdentifier": "issuing_country",
          "elementValue": "DE"      # ISO 3166-1 alpha-2 country code derived from ICAO country code used for eID Card
        }

      },

      "eu.europa.ec.eudi.pid.de.1": {

        ## Additional attributes

        "birth_name": {
          "digestID": 14,
          "random": "h'E1D5E6F708192A3B4C5D6E7AA091A2B3'",
          "elementIdentifier": "birth_name",
          "elementValue": "GABLER" # may contain both, given and family name at birth, see notes at "Additional national attributes of German PID"
        },

        "source_document_type": {
          "digestID": 15,
          "random": "h'C0D5E6F708192A3B4C5D6E7F8091A2B3'",
          "elementIdentifier": "source_document_type",
          "elementValue": "ID"  # "ID" = german eID, can also be "AR", "AS" or "AF" for Residence Permit
        },

        "age_over_12": {
          "digestID": 16,
          "random": "h'D0E6F708192A3B4C5D6E7F8091A2B3C4'",
          "elementIdentifier": "age_over_12",
          "elementValue": true
        },

        "age_over_14": {
          "digestID": 17,
          "random": "h'A3F1C8D209B4E6F7812D3C5A9E0F47B2'",
          "elementIdentifier": "age_over_14",
          "elementValue": true
        },

        "age_over_16": {
          "digestID": 18,
          "random": "h'5D8E0A91B2C3F4E60718A9BC3D4F5E60'",
          "elementIdentifier": "age_over_16",
          "elementValue": true
        },

        "age_over_18": {
          "digestID": 19,
          "random": "h'9B0E7C4A12F3D568A1C2E4F907B8D6E3'",
          "elementIdentifier": "age_over_18",
          "elementValue": true
        },

        "age_over_21": {
          "digestID": 20,
          "random": "h'C4A1F9037E5B2D8C190AF6E4B3D27589'",
          "elementIdentifier": "age_over_21",
          "elementValue": true
        },

        "age_over_65": {
          "digestID": 21,
          "random": "h'F7D2A9C403B1E6D5809C4E1F2A7B3D65'",
          "elementIdentifier": "age_over_65",
          "elementValue": false
        },

        "academic_title": {
          "digestID": 22,
          "random": "h'4f3be788e225ab8a323b18efd4b1449e'",
          "elementIdentifier": "academic_title",
          "elementValue": ""
        },

        "raw_eid_birth_date": {
          "digestID": 23,
          "random": "h'81e95c0ba1158ea2b651f797db158b7b'",
          "elementIdentifier": "raw_eid_birth_date",
          "elementValue": "1983-08-12"
        }
      }
    },
    "issuerAuth": {}
  },
  "deviceSigned": {}
}

SD-JWT VC

{
  ## Base data (SD-JWT VC DM)
  "vct": "urn:eudi:pid:de:1",

  ## Mandatory attributes specified in CIR 2026/1731

  "family_name": "MUSTERMANN",
  "given_name": "ERIKA",
  "birthdate": "1983-08-12",
  "place_of_birth": {
    "locality": "BERLIN"
  }, # may be containing a full address when separate values are not available
  "nationalities": ["DE"], # "DE" for german eID cards issued before Nov. 2019, otherwise eID based data

  ## Optional attributes specified in CIR 2026/1731

  "address": {
    "country": "DE", # ISO 3166-1 alpha-2 country code derived from ICAO country code of eID Card
    "region": "NORDRHEIN-WESTFALEN", # State
    "locality": "KÖLN", # City
    "postal_code": "51147", # ZipCode
    "street_address": "HEIDESTRASSE 17" # Street and house number
  },

  "issuing_authority": "DE", # not available in german eID card but mandatory, that's why the value out of issuing country is used (DE)

  "issuing_country": "DE", # ISO 3166-1 alpha-2 country code derived from ICAO country code used for eID Card

  ## Additional attributes

  "birth_name": "GABLER", # may be empty, may contain both, given and family name at birth

  "source_document_type": "ID", # "ID" = german eID, can also be "AR", "AS" or "AF" for Residence Permit

  "age_equal_or_over": {
    "12": true,
    "14": true,
    "16": true,
    "18": true,
    "21": true,
    "65": false
  }, # see notes at the end of chapter "Additional national attributes of German PID"

  "academic_title": "",
  "raw_eid_birth_date": "1983-08-12",

  # example for key binding (SD-JWT VC DM)
  "cnf": {
    "jwk": {
      "kty": "EC",
      "crv": "P-256",
      "x": "52aDI_ur05n1f_p3jiYGUU82oKZr3m4LsAErM536crQ",
      "y": "ckhZ-KQ5aXNL91R8Eufg1aOf8Z5pZJnIvuCzNGfdnzo"
    }
  }

}

Operational notes

Issuance

PID issuance in Germany will be based on eID card. The issuance will be executed by only one PID provider in Germany. PIDs will be issued in batches of separate PIDs within one credential issuance request and every PID is used only once to avoid linkability. When the PIDs have run out (or before, to allow for offline cases), a new batch is issued based on the Refresh Token used as seed credential. See also German National EUDI Wallet Architecture Documentation on Refresh Token.

The lifetime of the Refresh Token is 2 years. The lifetime of PIDs is 2 months, after this period new PIDs have to be requested with a valid Refresh Token.

To obtain a newly issued Refresh Token, the eID shall be presented again after the period corresponding to (Refresh Token lifetime − PID lifetime) has elapsed. For example, if the Refresh Token lifetime is 2 years and the PID lifetime is 2 months, the eID shall be presented again after 22 months.

Renewal

The PID must be renewed by the owners themselves in the event of changes to the eID, e.g., name change or new eID. Following 10a (4) PAuswG PID shall not be used furthermore in case that data has changed.

There is no automatic renewal.

Revocation

Revocation is done by IETF Token Status Lists.