African public procurement
Helps market-entry teams and DFI analysts read public-spending flows in Zambia, South Africa and Nigeria (federal) by normalizing procurement data across publishers so they can size demand and identify suppliers before competitors do.
Tender, award and party records built directly on the Open Contracting Data Standard (OCDS) — with supplier, buyer and monthly roll-ups, and natural-person parties stripped from every published table.
Proof: 277,821 tenders · 2,253 distinct buyer names · 42,854 awards · organizations only (natural persons structurally excluded) · release dates served as of 2026-10-08: Zambia 2024-02-07 to 2026-06-11, South Africa 2024-06-13 to 2026-10-07, Nigeria (federal) 2021-05-03 to 2026-08-21 · live metrics /v1/quality-metrics/af-tender · 4 provenance guarantees
What buyers do with AF-TENDER.
Demand sizing
A strategy team totals category spend by country before market entry. Output: CSV + report. Value: a defensible TAM in an afternoon.
Supplier & buyer intelligence
Rank counterparties from award and roll-up tables — who wins, who buys, at what cadence. Output: API / Parquet. Value: counterparty maps without manual collation.
Public-spend tracking
Monitor category and buyer flows as tenders publish — reallocation patterns surface in the monthly roll-ups. Output: API / MCP. Value: early reads on spending shifts.
Tenders, awards, parties — and the analytics on top.
Tenders
One row per ocid — title, status, category, value and buyer, sourced from the official OCDS release feed.
Awards & parties
Award values and the organizations behind them. Party records are classified; natural persons are excluded from publication.
Analytics
Pre-built supplier, buyer and monthly roll-ups so you can rank counterparties and track spend over time without rebuilding the joins.
Data dictionary (core tender table).
| Field | Type | Description |
|---|---|---|
ocid | string | Open Contracting ID — globally unique process identifier. |
country | string | ISO country code of the procuring jurisdiction. |
title | string | Tender title as published. |
status | enum | Tender status from the OCDS release. |
category | string | Procurement category (goods / works / services). |
value_amount | number | Tender value exactly as published — NOT normalised. SA eTenders (S007) sends 0 on every release rather than omitting the field, so a 0 here means 'not disclosed', not 'no value'. The roll-up tables apply that reading: they sum only positive amounts and report NULL where a group discloses none. |
value_currency | string | ISO currency of the value, as published; may be stated even where no amount is. In the roll-up tables this column reports 'MIXED' when a group spans more than one currency, and the group's total is NULL — values are never summed across currencies and no FX conversion is applied. |
release_date | date | OCDS release date. |
name | string | Party name exactly as published, in gold_tender_party_published. MAY BE EMPTY: three of 3,831 parties in the SA eTenders feed (S007) carry a party_id and a role but no name, and that is reproduced rather than filled or dropped. An invented name would be fabrication and a dropped row would silently lose an otherwise complete award record, so the blank is carried as the fact it is. Natural persons are excluded from this table entirely — a blank name is a publisher omission, not a suppression. |
buyer_name | string | Procuring entity (organization only). |
source_ref | string | Reference back to the OCDS release package. |
license_class | string | License Register code (OCDS feed is openly licensed). |
value_check | string | How far to trust an award's value_amount. Five flags, on which nothing is removed: shared_contract_value, two or more different suppliers on the tender carry this identical value, usually a panel contract's ceiling repeated per supplier (equal lots also match), so it is left out of every award total; over_10x_tender, more than ten times its own tender's published value; large_share_of_total, 5% or more of all award value in its country and currency; no_tender_value, the tender published no value to compare; consistent_with_tender, otherwise. Ten times is a flag, not proof: many tender values are unit prices. withheld: value_amount is NULL because Certvas withheld it by a recorded decision on the publisher's own record (pipelines/tenders/award_value_withheld.yml); the award, supplier and dates remain. NULL when the award has no value. |
value_withheld | boolean | gold_tender only: true when the tender's value_amount is NULL because Certvas withheld it by a recorded decision on the publisher's own record (pipelines/tenders/award_value_withheld.yml, withheld_tender_values). The tender, its buyer and its dates remain. |
dataco_id | string | Certvas ID of the listed issuer (gold_issuer_award, gold_entity_served); joins AF-FUND's dataco_id. |
match_method | string | How an award's supplier was linked to the issuer: via_lei (the supplier resolves to the issuer's GLEIF-verified LEI), strict_name (the same legal name in the same country), or both joined by '+'. A supplier matching two issuers is not linked. |
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. |
Party tables carry a party_type classification (organization / natural_person / unknown). Only organization parties reach the published product — enforced in the model layer, not by convention.
Validate the OCDS lineage yourself.
Like every Certvas product, AF-TENDER ships with its dictionary, a provenance annex and a measured metrics file. The free sample lets you validate the OCDS lineage and the natural-person exclusion for yourself.
Machine-readable data contract: af-tender.yaml (Data Contract Specification 1.1.0) — the schema, licence terms and release quality floors, generated from the registers that gate every build.