Open market data infrastructure for African stock exchanges. One normalised API across NGX, JSE, GSE, NSE Kenya, EGX, BRVM and 11 more venues — fixed-point prices, provenance on every quote, and a path from free sources to direct exchange feeds.
# African Market Data
**Open market data infrastructure for African stock exchanges.** One normalised
schema across NGX, JSE, GSE, NSE Kenya, EGX, BRVM and twelve more venues — with
fixed-point prices, honest provenance on every quote, and a path from free
public sources to direct exchange feeds.
---
## Why this exists
If you have tried to build anything on African market data, you already know
the problem: every venue publishes differently, half of them publish nothing a
machine can read, symbols do not reconcile across sources, and the vendors that
do aggregate charge for a 30-minute refresh and call it live.
This project is the layer underneath that. It normalises what is available,
tells you honestly how stale it is, and is architected so that swapping a free
polled source for a licensed direct exchange feed is a configuration change
rather than a rewrite.
## What makes it different
**Prices are fixed-point integers, never floats.** MITCH — the protocol JSE,
NSX and NSE Kenya speak — publishes prices as signed `i64` with eight implied
decimal places. That shape is preserved end to end, through the bus, into
ClickHouse, and out of the API. A float creeps in once and reconciliation breaks
silently months later.
```
GHS 7.03 → { minor: 703000000, scale: 8, currency: "GHS" }
```
**Every quote carries its provenance.** Source, exchange timestamp, receive
time, delay class, and whether the timestamp was imputed because the source
publishes none.
```jsonc
{
"instrument": "GSE:MTNGH",
"last": { "minor": 703000000, "scale": 8, "currency": "GHS" },
"provenance": {
"source": "kwayisi",
"as_of": "2026-08-18T02:20:08Z",
"delay": "unknown",
"as_of_imputed": true // this source publishes no timestamp — we say so
},
"staleness_seconds": 0,
"stale": false
}
```
This matters more here than on liquid markets. NGX clears roughly 42,000 deals
across a seven-hour session spread over ~150 tickers, so the long tail prints a
handful of times a day. **A stale price and …