Skip to content

StephenAbbott/opencheck

Repository files navigation

image

OpenCheck

Customer due diligence risk checks powered by the Legal Entity Identifier (LEI), open data and open standards - including the Beneficial Ownership Data Standard (BODS).

Try the demo at https://opencheck.world/

What is OpenCheck?

You paste in a Legal Entity Identifier. OpenCheck queries GLEIF first, derives every cross-source identifier it can (UK Companies House number, Norwegian organisation number, Irish company registration number, Finnish Y-tunnus, Latvian registration number, Lithuanian entity code, Estonian registry code, Czech IČO, Polish KRS number, Austrian Firmenbuchnummer, Slovak IČO, French SIREN, Dutch KvK number, Swedish organisation number, Swiss UID, Canadian corporation number, Belgian enterprise number, Danish CVR number, Croatian MBS, Maltese registration number, Brazilian CNPJ, Australian ACN/ABN, OpenCorporates ID, Wikidata Q-ID, and more), and uses those bridges to fan out across 31 national and international corporate data sources.

Everything maps into BODS v0.4. Cross-source links and risk signals are computed deterministically, and the whole bundle is one click away from a downloadable export (JSON / JSONL / XML / ZIP).

The risk-signal layer mirrors the EU AMLA draft customer due diligence regulatory technical standards conditions for "complex corporate structures" — trust/arrangement, non-EU jurisdiction, nominee, ≥3 ownership layers, plus the composite threshold rule and an advisory mirror of the subjective obfuscation condition.

Status

Latest: Phase 58 — Time Machine: change-over-time timelines (GLEIF + Companies House)

A new Time Machine that reconstructs an entity's notable ownership and identity changes over time and renders them as a timeline — the temporal half of BODS v0.4 (statementDate, the recordId + recordStatus new/updated/closed lifecycle, interest startDate/endDate) that almost no demo surfaces, shown across two sources on one axis.

  1. Two live change streams, one model. Both GLEIF (its per-LEI field-level modification log) and Companies House (typed filing history) expose a live, per-entity change stream — so detection is just a per-source allowlist into one shared, raw-first ChangeEvent codelist, with no snapshot-diffing or data hoarding.
  2. The noise is the product. An allowlist suppresses administrative churn (a GLEIF NextRenewalDate renewal is the twin of a Companies House CS01 "confirmed, no change"), surfacing only material moves — owners added/removed, name / legal-form / status changes, new parents — with a toggle to reveal the rest.
  3. Multi-source, reconciled, honest. Cross-source identity changes are de-duplicated and corroborated (a PLC→Limited rename shows both sources, the Companies House effective date beating GLEIF's recorded date); ownership interest dates come from the relationship period, not the publish date; every event labels whether its date is as filed or as recorded.
  4. Lazy GET /history + a vertical timeline rail. A "See timeline" button on the GLEIF and Companies House source cards opens a rail below them — tier-coloured events, source chips linking back to GLEIF / Companies House, parent + interest dates for ownership changes. GLEIF is key-free; Companies House uses a dedicated COMPANIES_HOUSE_HISTORY_API_KEY and degrades gracefully when it's absent.

Previous: Phase 57 — Securities (ISINs) & the sanctioned-securities overlay

Full development history

Quick start

The backend ships with cache-first dispatch: in stub mode (no API keys, no OPENCHECK_ALLOW_LIVE) every adapter returns deterministic placeholder data. Live mode is opt-in per source via env vars.

Docker

cp .env.example .env
docker compose up --build

Local (without Docker)

Backend:

cd backend
uv sync
uv run uvicorn opencheck.app:app --reload --port 8000

Frontend:

cd frontend
npm install
npm run dev

The first frontend build copies bundled images for @openownership/bods-dagre into public/bods-dagre-images/. If they're missing, run npm run build once.

Documentation

Page Contents
How it works Step-by-step lookup flow, per-adapter detail, Open Ownership BODS bundles, API surface, project structure
Sources Full adapter table — 30 active sources plus inactive bulk-only adapters, license, entry point, description
Risk signals All 12 signal codes: source-derived, AMLA CDD RTS, FATF jurisdiction, cross-source name match, ICIJ Offshore Leaks
Configuration Environment variables, Render deployment, running the test suite
Development history All 54 phases

Licensing

OpenCheck's own code is MIT-licensed. Data retrieved from third-party sources is licensed under each source's own terms — see ATTRIBUTIONS.md. Downloaded exports include a LICENSES.md listing every source that contributed data, with re-use guidance for the most-restrictive licence in the bundle.

The frontend also uses the Beneficial Ownership Visualisation System design tokens and @openownership/bods-dagre, both © Open Ownership and re-used under CC BY 4.0 / Apache 2.0 respectively.

Roadmap

  • Live opentender.eu integration — the adapter is wired but live_available=False for now.
  • A "complex offshore" demo subject that fires every AMLA chip simultaneously.
  • BODS RDF / SPARQL backbone via Oxigraph — load the assembled BODS bundle into a triple store, expose /sparql for the published Open Ownership red-flag queries.

Open issues and discussion live in the GitHub repo.

Related projects

About

Customer due diligence checks powered by the Legal Entity Identifier, open data and open standards including the Beneficial Ownership Data Standard

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors