African company fundamentals
Helps Africa-mandate PE funds and frontier research desks screen and benchmark African listed companies by providing point-in-time, provenance-documented fundamentals so they can underwrite positions without building an extraction team.
Income-statement, balance-sheet and per-share line items, extracted from published annual reports, normalized to actual units and reporting currency, and keyed to the exact period as reported.
Proof: 170+ issuers across 10 markets · 400+ issuer-periods · 7,000+ line-item facts · extraction confidence ≥0.85 on every published fact · provenance annex in every package · live metrics /v1/quality-metrics/af-fund · 4 provenance guarantees
What buyers do with AF-FUND.
Frontier screening
An analyst filters revenue, profitability and leverage across the covered universe in one query instead of 40 PDF reads. Output: API / Parquet. Value: days → minutes.
Benchmarking
Research desks compare issuers on as-reported, point-in-time figures — no restatement bleed, no unit guessing. Output: CSV / API. Value: defensible comparisons.
Agent grounding
Retrieval and agent pipelines answer with values they can cite — every fact carries source_ref, the URL of the filing it was read from. Output: API / MCP (the release files add the page). Value: answers that survive review.
Deepening issuer by issuer.
Coverage is expanding issuer-by-issuer. The numbers above reflect the current published gold build; live figures are always available from the /v1/quality-metrics/af-fund API endpoint and the get_quality_metrics MCP tool.
Data dictionary.
| Field | Type | Description |
|---|---|---|
dataco_id | string | Stable canonical issuer key (LEI-anchored, or documented seed key for non-LEI issuers). |
period_end | date | Reporting period end date. |
period_type | enum | FY / H1 / Qn — derived from the calendar against the issuer's fiscal year-end. |
statement | enum | IS (income statement) / BS (balance sheet) / CF (cash flow statement). Per-share figures such as eps_basic are filed under IS. |
line_item | string | Taxonomy code, e.g. revenue, net_income, total_assets, eps_basic. |
value_reported | number | Value in actual units (reporting scale applied; EPS left per-share). |
currency_reported | string | ISO currency as printed in the source (NGN, KES, ZAR, USD and others). |
extraction_confidence | number | 0-1 model confidence for the extracted value. Only rows at 0.85 or above are published; lower ones go to review, never to these tables. |
source_ref | string | License Register source id and the document's URL, as S009:<url>. The page is in source_page and the document's SHA-256 in source_doc_hash. |
source_page | integer | Page of the source document the value was read from, counted from the PDF's first page (what a PDF viewer shows), not the number printed on the page. Some older citations name the page's printed number instead, which can differ from its position in the PDF. |
source_doc_hash | string | sha256: followed by the SHA-256 of the source document's bytes as Certvas fetched them. Hash your own copy to confirm it is the same document. |
license_class | string | License Register code governing permitted use of the source. |
observed_at | timestamp | When Certvas captured the value. |
announcement_date | date | AVAILABILITY date — when the filing became public. Null where no evidence tier produced a plausible date; never guessed. |
announcement_source | enum | Evidence tier behind announcement_date, in descending trust: disclosed (publication date stated by the issuer/exchange) / http_last_modified (the host's Last-Modified for the filing) / pdf_creation_date (the PDF's own metadata). Weight or exclude the weaker tiers as you see fit. |
available_at | date | FILTER AS-OF QUERIES ON THIS. coalesce(announcement_date, observed_at); never null. Where the announcement date is unevidenced it falls back to our own capture date, which is always LATER than true publication for a backfilled filing — so the fallback can only exclude a row from a window, never admit one before it was knowable. |
filing_lag_days | integer | announcement_date - period_end. Null where the announcement date is unevidenced — never defaulted to 0, because a lag measured against our capture date would describe when Certvas backfilled, not how fast the issuer reports. Per-market distributions ship in gold_filing_lag_stats. |
record_ref | string | Stable id for this OBSERVATION (vintage), deterministic across rebuilds. |
vintage_seq | integer | 1 = originally filed, 2.. = each later restatement of the same key. |
is_as_reported | boolean | True for the originally filed observation of a key (vintage_seq = 1). gold_fundamentals_as_reported is exactly the rows where this is true. |
restated | boolean | A later vintage carries a DIFFERENT value for this key. Derived by comparing vintages; a re-observation of the same number is not a restatement. |
superseding_record_ref | string | record_ref of the earliest later vintage that changed the value. Resolves within this table. |
was_later_restated | boolean | In gold_fundamentals_as_reported only: a later vintage carries a DIFFERENT value for this key (gold_fundamentals' restated). superseding_record_ref names it. |
valid_from | date | The date Certvas captured this observation (the date part of observed_at). Not when the issuer published it: filter as-of queries on available_at. |
valid_to | date | The date Certvas captured the next observation of the same key, or null while this one is the latest. A capture date, like valid_from. |
value_usd | number | CONVENIENCE ONLY — value_reported converted to USD. Null where no rate is cited. Reconcile and cite against value_reported + currency_reported, which are the as-reported figures; see conversion_ref for the rate used. |
conversion_ref | string | The FX rate behind value_usd — source, rate and date. Null wherever value_usd is null. A converted figure with no citable rate is not published. |
lei | string | ISO 17442 Legal Entity Identifier, where GLEIF confirms one for the issuer; NULL for an issuer with no GLEIF record (common on the smaller African exchanges). |
legal_name | string | The issuer's legal name (GLEIF's where it has an LEI, else the listing's). |
entity_type | string | company, fund, gov_body or other. Sole proprietors are never carried. |
jurisdiction | string | Jurisdiction of registration, ISO 3166 (e.g. ZA, NG, KE-30). |
entity_status | string | Registration status as GLEIF reports it (ACTIVE / INACTIVE); NULL for seed issuers. |
registry_ids | string | JSON object of home-registry identifiers from GLEIF ({authority: id}); NULL when none. |
The sample carries full provenance.
Every tier ships with a data dictionary, a provenance annex, and a measured quality-metrics file — not just the data. The free sample is a 100-row slice with full provenance so you can validate the schema and the citations end-to-end.
- Parquet + CSV, identical schema across tiers
PROVENANCE.md— source-by-source license annexDICTIONARY.md— the table above, versioned with the releasemetrics.json— measured coverage, freshness & accuracyaf-fund.yaml— the machine-readable data contract (Data Contract Specification 1.1.0): schema, licence terms and the quality floors a release must clear