Skip to main content

dora-lei-check

Check every LEI in your DORA Register of Information against GLEIF before you submit it — on your own machine.

A lapsed LEI is perfectly well-formed. It passes the checksum. It passes offline XBRL validation. And it is a hard rejection when the ESAs run their business checks against GLEIF after you submit.

That is a slow, expensive way to find out. This tool tells you in seconds.

$ dora-lei-check register.zip

LEI                   VERDICT     GLEIF STATUS  LEGAL NAME
--------------------  ----------  ------------  ----------------------
254900ZD9J74PNOI5L11  NOT ISSUED  LAPSED        VARANDO LTD
5493001KJTIIGC8Y1R12  OK          ISSUED        Bloomberg Finance L.P.
5493001KJTIIGC8Y1R13  INVALID     invalid checksum  —
984500914ED4D50AZ405  NOT ISSUED  LAPSED        BONOCAP LTD

4 distinct LEI(s): 1 OK, 3 failing, 0 unverified

These will be rejected at submission:
  254900ZD9J74PNOI5L11  NOT ISSUED  found in b_05.01.csv:LEI of the ICT third-party service provider
  5493001KJTIIGC8Y1R13  INVALID     found in b_05.01.csv:LEI of the ICT third-party service provider
  984500914ED4D50AZ405  NOT ISSUED  found in b_05.01.csv:LEI of the ICT third-party service provider

Exit code 1 when something will be rejected, so it works as a pre-submission gate in CI.

Why this exists

In the ESAs' dry run, 93.5% of submissions carried at least one data error and only 6.5% passed all 116 data-quality checks. In the first live cycle, supervisors reported missing or invalid LEIs in roughly a third of submissions — one of the top hard-rejection causes.

The LEI-versus-GLEIF check is an external lookup. The ESAs run it on their side, after you have submitted. Until then you are guessing.

Your register never leaves your machine

This matters more than it sounds. Your Register of Information is a complete map of your ICT third-party estate — every provider, every contract, every criticality assessment. The other pre-submission validators are hosted web tools: you upload that file to someone else's server.

dora-lei-check reads the register locally. The only thing that goes over the wire is the public 20-character LEI codes, to GLEIF's free public API. With --offline and GLEIF's daily bulk file, nothing goes over the wire at all.

Install

pip install dora-lei-check

Python 3.10+. Zero dependencies — nothing for your security team to vet.

Use

dora-lei-check register.zip              # a submitted xBRL-CSV package
dora-lei-check ./templates/              # a folder of RoI CSV templates
dora-lei-check b_05.01.csv               # a single template

dora-lei-check register.zip --json       # machine-readable, for pipelines
dora-lei-check register.zip --offline gleif-golden-copy.csv   # no network at all
Exit code Meaning
0 every LEI is issued and active
1 at least one LEI will be rejected
2 some LEIs could not be verified (network) — never silently a pass
3 the register could not be read

Results are cached on disk, so re-runs during a correction cycle are instant.

As a library

from pathlib import Path
from dora_lei_check import extract, fetch, judge, Report

candidates = extract(Path("register.zip"))
report = Report([judge(c, fetch(c.lei)) for c in candidates])
print(report.failures)

What it does and does not do

Does: finds every LEI-shaped value anywhere in the register, validates ISO 17442 format and the mod-97 checksum offline, then resolves each one against GLEIF and reports anything that is not ISSUED.

Does not: validate the XBRL itself. Use Arelle for the technical and DPM layers — it is free, excellent, and this tool is not a replacement for it.

To be precise about the overlap, because it matters: Arelle's validate/EBA plugin does check LEIs — but only their format and checksum, entirely offline, and only for context entity identifiers. It contains no GLEIF capability at all. A lapsed LEI passes Arelle and fails your submission. That gap is the whole reason this exists.

License

MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dora_lei_check-0.1.0.tar.gz (12.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dora_lei_check-0.1.0-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file dora_lei_check-0.1.0.tar.gz.

File metadata

  • Download URL: dora_lei_check-0.1.0.tar.gz
  • Upload date:
  • Size: 12.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.9

File hashes

Hashes for dora_lei_check-0.1.0.tar.gz
Algorithm Hash digest
SHA256 54b29b8f082c285f3171c4f340f5e778bc51734c2b0f74e4cfc4fe83a776cbf3
MD5 41058d6a691ca6bfd2a83e372700e082
BLAKE2b-256 4c95de6fe6fe07cbfdc3d08c1fdc2d78283b9c30ae97c81ca2e144f7e53ea202

See more details on using hashes here.

File details

Details for the file dora_lei_check-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: dora_lei_check-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.9

File hashes

Hashes for dora_lei_check-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 72c1f8107a3b1d81d3c708a64e92f5de5deaccf72287d3bb948dcb867bd39936
MD5 06a9898ac38ef79122b1856acdd7d0ea
BLAKE2b-256 ebab398e37c07ea3fd41d8d9da2ff937ff423fc5f658def5e5ff89126e0461ec

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.0

2 files

0.2.0

2 files

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page