Certvas ID
A free, open, publicly-resolvable identifier for African and emerging-market entities. One stable key per entity, openly licensed and resolvable over the web at no cost — modelled on GLEIF’s LEI and OpenFIGI.
The identifier and the core record it resolves to are dedicated to the public domain under CC0 1.0. Enrichment and the identifier crosswalk are separate, licensed layers. This is a technical spec, not a governance charter — no committee, no board, just a documented minting scheme and a stability policy.
Resolve any ID at certvas.com/id/{dataco_id} · JSON by default, HTML in a browser · no key, rate-limited · clean 404 for unknown IDs.
Two shapes, both stable ASCII.
| Anchor | Format | Example |
|---|---|---|
| LEI-backed | DC + first 24 hex of md5(LEI), uppercased | DC549300… |
| Seed (no LEI) | DC + 24 hex of md5("SEED:"+name+"|"+jurisdiction) | DC4C096C3F1B435F911B501106 |
| ULID (no LEI/seed) | Crockford base32 ULID, assigned once at first resolution | 01J9Z8ABCDEFGHJKMNPQRSTVWX |
Every shape is [0-9A-Za-z] only, so a Certvas ID is safe in URLs, filenames, and as a join key. Join your data on dataco_id.
Deterministic — and reproducible in SQL.
Where GLEIF has issued an LEI, that is the anchor: one global legal-entity truth, no re-derivation, and the LEI itself is CC0. The scheme is a pure function, so the same entity always resolves to the same ID across sources and re-runs.
Python : "DC" + md5(LEI).hexdigest()[:24].upper()DuckDB : 'DC' || upper(substr(md5(LEI), 1, 24))- No LEI, but a known public issuer → a
SEED:key over normalised name + jurisdiction (rules below). - No LEI and no seed → a ULID, minted once and then persisted permanently.
- No natural persons. GLEIF
SOLE_PROPRIETORrecords are dropped before an ID is minted — enforced in code and CI.
Name normalisation — the complete rules
The seed form hashes a normalised name, so the normalisation is
part of the identifier and is published here in full. Anyone implementing these rules computes
the same dataco_id we do, without contacting Certvas.
- Uppercase the name.
- Replace every character outside
A–Z,0–9and space with a space (regex[^A-Z0-9 ]+). Punctuation and&are therefore dropped. - Collapse runs of whitespace to a single space and trim.
- Remove any token that is a legal-form suffix. The list is exactly these 19:
AG, CO, COMPANY, CORP, CORPORATION, GMBH, GROUP, HOLDING, HOLDINGS, INC, LIMITED, LLC, LLP, LP, LTD, NV, PLC, SA, THE. - Join the surviving tokens with single spaces. If every token was removed, fall back to the whitespace-collapsed string from step 3 rather than returning empty.
Then key = "SEED:" + normalised_name + "|" + jurisdiction and
id = "DC" + md5(key).hexdigest()[:24].upper(), where jurisdiction is the
uppercase ISO 3166-1 alpha-2 code.
| Input | Normalised |
|---|---|
Safaricom PLC | SAFARICOM |
BUA Cement | BUA CEMENT |
BUA Cement PLC | BUA CEMENT |
ZESCO Limited. | ZESCO |
I&M Holdings Limited | I M |
Note the last two rows: & becomes a space, and
HOLDINGS is a suffix, so I&M Holdings Limited normalises to
I M. Rows two and three show why the rules matter — the same company with and
without its legal suffix must land on one identifier, not two.
IDs are never reassigned.
Never recycled
Once an ID points at an entity, it points at that entity forever. A retired entity keeps its ID; the ID is never reused for a different entity.
Merges recorded
When two IDs are the same entity, the losing ID is kept and marked superseded_by the winner. Lookups on the old ID keep working and carry the pointer.
Scheme frozen at v1
LEI-backed IDs are stable by construction. Any future change would be a new major version with a migration — v1 IDs would not change.
Free to resolve, no key.
Every Certvas ID resolves at https://certvas.com/id/{dataco_id} — JSON by default, a minimal HTML view for browsers. Rate-limited per client (by a hash of the IP; the raw IP is never stored). Unknown IDs return a clean 404. The record carries only entity-only public facts and known public identifiers (LEI — CC0, from GLEIF — and ticker, a public listing fact). No natural-person data, ever.
| Field | Description |
|---|---|
dataco_id | The Certvas ID (the join key). |
name | Legal name of the entity. |
jurisdiction | ISO country / jurisdiction code. |
entity_type | company · fund · gov_body · other. |
status | active · inactive · unknown. |
identifiers.lei | GLEIF LEI where one exists (CC0). |
identifiers.ticker | Public listing ticker where resolved. |
superseded_by | The winning dataco_id if this ID was merged; else null. |
license | Always CC0-1.0. |
Deep where incumbents are thin.
Certvas ID covers African and emerging-market listed and registered entities — the GLEIF spine for the region plus manually-seeded public issuers with no LEI yet. It is not a global registry; it is deliberately deep where LEI / FIGI / national registries are thin. Coverage expands entity-by-entity.
- The identifier and its core record are CC0 1.0 — public domain, free forever, no attribution required (a link back is appreciated).
- Enrichment (fundamentals, tenders, macro) and the crosswalk (
dataco_id ↔ LEI / ISIN / registry, with history) are separate, licensed layers.
Cite it as: “Entities keyed by Certvas ID — free, open identifier: certvas.com/certvas-id.html”.