One REST API over 54 countries and 207 indicators, plus markets, trade and government records. Every figure comes with four facts: the year it describes, who published it, whether it was reported or modelled, and when we fetched it. Your product never has to guess what a number is worth.
curl "https://api.africa-api.com/v1/data?country_codes=KE&metric_keys=internet_users_pct&latest=true" \
-H "Authorization: Bearer $AFRICA_API_KEY"{
"country_code": "ke",
"country_name": "Kenya",
"metric_key": "internet_users_pct",
"metric_name": "Internet Users",
"year": 2024,
"period": "annual",
"as_of_period": null,
"location_name": null,
"value": 34.97622513,
"unit": "percent",
"source": "world_bank_wdi",
"value_status": "reported",
"estimate_low": null,
"estimate_high": null,
"dataset_version": null,
"retrieved_at": "2026-10-15T04:21:41.643403Z"
}The part of the response that lets you use a figure without writing to ask us about it.
{
"country_code": "ke",
"country_name": "Kenya",
"metric_key": "internet_users_pct",
"metric_name": "Internet Users",
"year": 2024,
"period": "annual",
"as_of_period": null,
"location_name": null,
"value": 34.97622513,
"unit": "percent",
"source": "world_bank_wdi",
"value_status": "reported",
"estimate_low": null,
"estimate_high": null,
"dataset_version": null,
"retrieved_at": "2026-10-15T04:21:41.643403Z"
}country_codeISO 3166-1 alpha-2, upper case. The key you filter and join on.country_nameThe country's name as the record holds it.metric_keyThe measure's stable key. Same key on every route, in the catalogue and in the docs.metric_nameThe measure's name as the catalogue holds it.yearThe year the figure describes, which is not always the year you asked for.periodThe period the figure covers: a year, a quarter, a month, or a date.as_of_periodFor a stock figure, the point in time it was taken at. Null when it is a flow over the period.location_nameSet when the figure is for a place within the country rather than the whole of it; null otherwise.valueThe figure itself. Where we hold nothing there is no row; a zero here is a real zero.unitThe unit, as the source states it. Percentages say what they are a share of.sourceThe body that published it. The site's source pages describe each one.value_statusThe provider's own word on the figure: a plain reported value, or an estimate, projection, model output or imputation. The site reads the second kind as modelled.estimate_lowThe provider's lower bound around an estimate, where it publishes one; null otherwise.estimate_highThe provider's upper bound around an estimate, where it publishes one; null otherwise.dataset_versionThe provider's dataset release the figure came from, where it names one; null otherwise.retrieved_atWhen our platform retrieved this value from the source. The run that wrote it.Three decisions we made that most data APIs do not.
value_status, the provider’s own word on whether the figure was reported for that period or modelled between observations. The reported and modelled shares you see on every page come from that field, not from us.retrieved_at, the run that wrote it, and /v1/platform/etl-status lists each source’s last successful refresh and next run. There is no revision webhook yet; poll the status route and re-pull what moved.The routes most products start with. All GET, all JSON, all behind one bearer key.
api.africa-api.com/v1/v1/countriesEvery country, with its codes and names./v1/countries/{code}/profileOne country's reference record with selected indicators, where available./v1/dataObservations by country, measure and year, each with its source and period./v1/indicatorsThe catalogue: every measure, its unit and its sources./v1/markets/tickersListings on the exchanges we follow, with the session each price came from./v1/government/structure/{code}A country's offices and office-holders, each term with the record's own status.Everything you need after the first call.
Metered by request, never by row. Over the ceiling you get a 429, never a bill.