Zones & offline resolution
Each country is partitioned into up to 10,000 zones — an adaptive grid sized by population, so central Lusaka zones are under 1 km wide while empty land is covered by zones 190 km across. Zone numbering follows a space-filling curve: numerically adjacent zones are geographically adjacent.
Zone geometry is frozen at publication and never changes — it is derived from population geometry, not administrative boundaries, so redistricting never breaks an address.
Zone tables
The full zone map of a country is a single JSON file, served with an ETag and stable enough to cache aggressively:
curl https://api.adas.africa/v1/zones/ZM
{
"spec": "adas-zones/0.1",
"country": "ZM",
"zones": [
{ "z": "2992", "bbox": [28.245, -15.436, 28.301, -15.38], "centroid": [28.273, -15.408] }
]
}
| Country | Zones | Size (gzip) |
|---|---|---|
| UG | 9,154 | ~110 KB |
| ZM | 5,059 | ~65 KB |
| NG | 5,536 | ~70 KB |
The offline pattern
Ship the zone table inside your app. Then, with zero connectivity:
- Validate any code's check digit locally.
- Look up its zone → bbox and centroid, good enough to route a courier to the right neighbourhood.
- Sync the exact pin from
GET /v1/addresses/{code}when signal returns.
This is how the ADAS mobile apps work, and the pattern is open to yours.
Current zone tables are drafts ("frozen": false) — zone numbers may still
change before each country's launch freeze. Don't print codes until the
country you operate in is frozen.