Rule · MAJOR

COMMON.LEI_CHECK_DIGITS

Legal Entity Identifier format and check digits (ISO 17442, ISO/IEC 7064 MOD 97-10)

Citation
Annex I, Part A, point 5, Part B, point 5, Part C, point 5, Annex II, Part A, point 5, Annex III, Part A, point 5 MiCAR
Canonical form
Anhang I Teil A Nr. 5, Teil B Nr. 5, Teil C Nr. 5, Anhang II Teil A Nr. 5, Anhang III Teil A Nr. 5 MiCAR
Runs for
Annex I · other crypto-assets; Annex II · asset-referenced tokens; Annex III · e-money tokens
Severity if open
MAJOR
Section key
all sections; anchored to issuer
Minimum words
0
Listed terms (English)
none
Listed terms (German)
none
Package version
1.2.1, built from source that may include unreleased changes
Source
rules/common.py

How the status is set

Legal basis

Annex I, Part A, point 5, Part B, point 5, Part C, point 5, Annex II, Part A, point 5, Annex III, Part A, point 5 MiCAR

Checked on 2026-10-27 against the Official Journal text in English and German: point 5 of Annex I Parts A, B and C and of Annex II and III Part A names the legal entity identifier or another identifier required pursuant to applicable national law, and Art. 2(1)(b) and (c) of Implementing Regulation (EU) 2024/2984 ask for the LEI where available.

Synthetic examples

Each example is linted when this page is generated. The build fails if a result differs.

MissingNo LEI and no party section

Without an LEI there are no check digits to verify, and no party section says who the parties are, so the rule fails closed.

{
  "title": "Synthetic rule example",
  "type": "other",
  "sections": {
    "summary": "Synthetic summary of a fictional token."
  }
}
ReviewParty section without an LEI

Point 5 of each party Part allows another identifier required pursuant to applicable national law in place of the LEI, so a reviewer checks which one the draft gives.

{
  "title": "Synthetic rule example",
  "type": "other",
  "sections": {
    "issuer": "Synthetic Issuer AG."
  }
}
ReviewCheck digits do not match

The last two digits do not satisfy ISO/IEC 7064 MOD 97-10, which usually means a typo.

{
  "title": "Synthetic rule example",
  "type": "other",
  "sections": {
    "issuer": "Synthetic Issuer AG. LEI: 9999SYNTH0000ZZQ0167."
  }
}
ReviewMalformed LEI next to a valid one

The offeror section names an LEI and gives a code of 19 characters, one short of an LEI, so the code is malformed. The valid issuer LEI does not let the rule pass.

{
  "title": "Synthetic rule example",
  "type": "other",
  "sections": {
    "issuer": "Synthetic Issuer AG, a fictional company. LEI: 9999SYNTH0000ZZQ0166.",
    "offeror": "Synthetic Offeror GmbH. LEI: 9999SYNTH0000ZZQ026."
  }
}
ReviewMalformed LEI in a section that names no LEI

The draft names an LEI, so every section is read, this one too, though it is no party section and names no LEI label. In a PDF, DOCX, Markdown, XHTML or HTML file the text outside the sections is read as well: headings, tables and text in no section.

{
  "title": "Synthetic rule example",
  "type": "other",
  "sections": {
    "issuer": "Synthetic Issuer AG, a fictional company. LEI: 9999SYNTH0000ZZQ0166.",
    "offer_or_admission": "Synthetic Admission GmbH (9999SYNTH0000ZZQ026) seeks admission to trading."
  }
}
PassCheck digits match

The code is well formed. The check does not ask a registry whether the LEI exists or belongs to the named entity.

{
  "title": "Synthetic rule example",
  "type": "other",
  "sections": {
    "issuer": "Synthetic Issuer AG, a fictional company. LEI: 9999SYNTH0000ZZQ0166."
  }
}

Limitations

Disagree with this rule, or missing one? Propose a rule change.