Certvas
Product · AF-FUND

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

Use-case menu

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.

Coverage today

Deepening issuer by issuer.

170+
Issuers across 10 markets — Nigeria, Kenya, South Africa, Ghana, Egypt, Senegal, Rwanda, Côte d’Ivoire, Uganda, Botswana
400+
Distinct issuer-periods, every one full-year — no interim (H1 / quarterly) periods are served yet
7,000+
Individual line-item facts, each with source reference and extraction confidence
8 yrs
Longest history, unbroken (Co-operative Bank of Kenya, FY2018–FY2025). Served periods run from 2015 to 2026; most issuers carry far fewer years

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.

Schema

Data dictionary.

FieldTypeDescription
dataco_idstringStable canonical issuer key (LEI-anchored, or documented seed key for non-LEI issuers).
period_enddateReporting period end date.
period_typeenumFY / H1 / Qn — derived from the calendar against the issuer's fiscal year-end.
statementenumIS (income statement) / BS (balance sheet) / CF (cash flow statement). Per-share figures such as eps_basic are filed under IS.
line_itemstringTaxonomy code, e.g. revenue, net_income, total_assets, eps_basic.
value_reportednumberValue in actual units (reporting scale applied; EPS left per-share).
currency_reportedstringISO currency as printed in the source (NGN, KES, ZAR, USD and others).
extraction_confidencenumber0-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_refstringLicense 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_pageintegerPage 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_hashstringsha256: 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_classstringLicense Register code governing permitted use of the source.
observed_attimestampWhen Certvas captured the value.
announcement_datedateAVAILABILITY date — when the filing became public. Null where no evidence tier produced a plausible date; never guessed.
announcement_sourceenumEvidence 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_atdateFILTER 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_daysintegerannouncement_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_refstringStable id for this OBSERVATION (vintage), deterministic across rebuilds.
vintage_seqinteger1 = originally filed, 2.. = each later restatement of the same key.
is_as_reportedbooleanTrue for the originally filed observation of a key (vintage_seq = 1). gold_fundamentals_as_reported is exactly the rows where this is true.
restatedbooleanA 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_refstringrecord_ref of the earliest later vintage that changed the value. Resolves within this table.
was_later_restatedbooleanIn gold_fundamentals_as_reported only: a later vintage carries a DIFFERENT value for this key (gold_fundamentals' restated). superseding_record_ref names it.
valid_fromdateThe 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_todateThe 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_usdnumberCONVENIENCE 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_refstringThe 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.
leistringISO 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_namestringThe issuer's legal name (GLEIF's where it has an LEI, else the listing's).
entity_typestringcompany, fund, gov_body or other. Sole proprietors are never carried.
jurisdictionstringJurisdiction of registration, ISO 3166 (e.g. ZA, NG, KE-30).
entity_statusstringRegistration status as GLEIF reports it (ACTIVE / INACTIVE); NULL for seed issuers.
registry_idsstringJSON object of home-registry identifiers from GLEIF ({authority: id}); NULL when none.
Try before you buy

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 annex
  • DICTIONARY.md — the table above, versioned with the release
  • metrics.json — measured coverage, freshness & accuracy
  • af-fund.yaml — the machine-readable data contract (Data Contract Specification 1.1.0): schema, licence terms and the quality floors a release must clear