You are offline. Figures shown are the ones saved on this device.

Data by MansaAPI · end of day

Public API · read only

Syli Atlas API

Economic indicators of the 54 African countries, the 5 regions and the continent, from 2015 to 2030, in JSON or CSV. Free, without signing up, and every answer cites its source.

Base URL https://syliatlas.com/api/v1
Authentication
none
Formats
json · csv
Limit
60 req/min · IP
Data
imf_weo · 2026-10

GET /api/v1/areas

Every area

Every area: countries, regions, the continent, IMF aggregates.

server time p50 1.9 ms p99 1.9 ms

Parameters

No parameter.

Answers

200 application/json · {data, meta}

429 rate_limited beyond 60 requests a minute

Language of the example
  1. $ curl "https://syliatlas.com/api/v1/areas"
  1. const res = await fetch("https://syliatlas.com/api/v1/areas");
  2. const { data, meta } = await res.json();
  3. console.log(data.length);
  4. console.log(meta.sources[0]?.attribution.en);
  1. import requests
  2. r = requests.get("https://syliatlas.com/api/v1/areas", timeout=10)
  3. r.raise_for_status()
  4. body = r.json()
  5. data, meta = body["data"], body["meta"]
  1. # spreadsheets read the CSV route
  2. =IMPORTDATA("https://syliatlas.com/api/v1/areas/CIV/csv")

Answer 200 OK application/json max-age=3600

Real answer from the data online, shortened (…).

Answer schema · 5 fields
Field Type Description
data AreaRef[] Every area: countries, regions, the continent, IMF aggregates.
meta object About the answer.
meta.sources Source[] Sources of the figures in data. Empty when data holds no figure.
meta.docs Docs This documentation.
meta.count integer Number of areas.

GET /api/v1/areas/{code}

One area, every series

An area with every series.

server time p50 1.0 ms p99 1.0 ms

Parameters

code string path required

Area code: ISO 3 for a country, a region code, africa, or an IMF aggregate (see /areas).

values : CIV, west_africa, africa…

from integer query

First year of the period.

values : 2015 – 2030 · default : 2020

to integer query

Last year of the period, after from.

values : 2015 – 2030 · default : 2025

Answers

200 application/json · {data, meta}

400 invalid_period years outside 2015–2030, or from ≥ to

404 unknown_area unknown area code

429 rate_limited beyond 60 requests a minute

Language of the example
  1. $ curl "https://syliatlas.com/api/v1/areas/CIV?from=2020&to=2025"
  1. const res = await fetch("https://syliatlas.com/api/v1/areas/CIV?from=2020&to=2025");
  2. const { data, meta } = await res.json();
  3. console.log(data.period.change_percent.real_gdp_index);
  4. console.log(meta.sources[0]?.attribution.en);
  1. import requests
  2. r = requests.get("https://syliatlas.com/api/v1/areas/CIV?from=2020&to=2025", timeout=10)
  3. r.raise_for_status()
  4. body = r.json()
  5. data, meta = body["data"], body["meta"]
  1. # spreadsheets read the CSV route
  2. =IMPORTDATA("https://syliatlas.com/api/v1/areas/CIV/csv")

Answer 200 OK application/json max-age=3600

Real answer from the data online, shortened (…).

Answer schema · 19 fields
Field Type Description
data object An area with every series.
data.code string Code: ISO 3 for a country (CIV), otherwise the area's code (west_africa, africa, SSA).
data.kind string What the area is. Values : country | region | continent | imf_aggregate
data.region string | null African Union region of a country; null otherwise. Values : north_africa | west_africa | central_africa | east_africa | southern_africa | null
data.name Names Name of the area.
data.slug Names Slug of the area's page addresses.
data.pages Pages | null null for IMF aggregates, which have no page.
data.members string[] Country codes making up a region or the continent. Empty for a country and for IMF aggregates (their composition is the IMF's).
data.years Years The years of the series.
data.series Series One list per indicator, aligned with years.list.
data.share_of_africa_gdp (number | null)[] Share of Africa's GDP in current dollars, in %, aligned with years.list. Computed by Syli Atlas. Unit : %
data.missing Missing[] Gaps in the series, as published by the IMF.
data.period Period Changes over the asked period. null when a year has no value.
data.rank Rank | null null for regions, the continent and IMF aggregates.
meta object About the answer.
meta.sources Source[] Sources of the figures in data. Empty when data holds no figure.
meta.docs Docs This documentation.
meta.from integer First year used.
meta.to integer Last year used.

GET /api/v1/compare

Several areas side by side

The areas found, in the asked order.

Parameters

codes string query required

2 to 6 area codes, separated by commas. Unknown codes are left out of data.

values : CIV,GHA,SEN…

from integer query

First year of the period.

values : 2015 – 2030 · default : 2020

to integer query

Last year of the period, after from.

values : 2015 – 2030 · default : 2025

Answers

200 application/json · {data, meta}

400 invalid_period years outside 2015–2030, or from ≥ to

429 rate_limited beyond 60 requests a minute

Language of the example
  1. $ curl "https://syliatlas.com/api/v1/compare?codes=CIV,GHA"
  1. const res = await fetch("https://syliatlas.com/api/v1/compare?codes=CIV,GHA");
  2. const { data, meta } = await res.json();
  3. console.log(data.map((a) => a.code));
  4. console.log(meta.sources[0]?.attribution.en);
  1. import requests
  2. r = requests.get("https://syliatlas.com/api/v1/compare?codes=CIV,GHA", timeout=10)
  3. r.raise_for_status()
  4. body = r.json()
  5. data, meta = body["data"], body["meta"]
  1. # spreadsheets read the CSV route
  2. =IMPORTDATA("https://syliatlas.com/api/v1/areas/CIV/csv")

Answer 200 OK application/json max-age=3600

Real answer from the data online, shortened (…).

Answer schema · 16 fields
Field Type Description
data CompareItem[] The areas found, in the asked order.
data[].code string Code: ISO 3 for a country (CIV), otherwise the area's code (west_africa, africa, SSA).
data[].kind string What the area is. Values : country | region | continent | imf_aggregate
data[].region string | null African Union region of a country; null otherwise. Values : north_africa | west_africa | central_africa | east_africa | southern_africa | null
data[].name Names Name of the area.
data[].slug Names Slug of the area's page addresses.
data[].pages Pages | null null for IMF aggregates, which have no page.
data[].years Years The years of the series.
data[].series Series One list per indicator, aligned with years.list.
data[].period Period Changes over the asked period. null when a year has no value.
meta object About the answer.
meta.sources Source[] Sources of the figures in data. Empty when data holds no figure.
meta.docs Docs This documentation.
meta.from integer First year used.
meta.to integer Last year used.
meta.codes string[] The codes asked.

GET /api/v1/ranking

Countries ranked on an indicator

Countries, highest value first; without a value last.

server time p50 2.4 ms p99 2.4 ms

Parameters

indicator string query

Indicator to rank (see /indicators).

values : real_gdp_index | real_gdp_growth | gdp_usd_bn | gdp_per_capita_usd | gdp_per_capita_ppp | inflation | public_debt_pct_gdp | population_m | fiscal_balance_pct_gdp | current_account_pct_gdp | unemployment · default : real_gdp_index

mode string query

change: change between from and to; value: value in the year to.

values : change | value · default : change

region string query

Keep the countries of one region.

values : north_africa | west_africa | central_africa | east_africa | southern_africa

from integer query

First year of the period.

values : 2015 – 2030 · default : 2020

to integer query

Last year of the period, after from.

values : 2015 – 2030 · default : 2025

Answers

200 application/json · {data, meta}

400 invalid_period years outside 2015–2030, or from ≥ to

429 rate_limited beyond 60 requests a minute

Language of the example
  1. $ curl "https://syliatlas.com/api/v1/ranking?indicator=real_gdp_index"
  1. const res = await fetch("https://syliatlas.com/api/v1/ranking?indicator=real_gdp_index");
  2. const { data, meta } = await res.json();
  3. console.log(data[0].name.fr, data[0].value, meta.unit);
  4. console.log(meta.sources[0]?.attribution.en);
  1. import requests
  2. r = requests.get("https://syliatlas.com/api/v1/ranking?indicator=real_gdp_index", timeout=10)
  3. r.raise_for_status()
  4. body = r.json()
  5. data, meta = body["data"], body["meta"]
  1. # spreadsheets read the CSV route
  2. =IMPORTDATA("https://syliatlas.com/api/v1/areas/CIV/csv")

Answer 200 OK application/json max-age=3600

Real answer from the data online, shortened (…).

Answer schema · 18 fields
Field Type Description
data RankingItem[] Countries, highest value first; without a value last.
data[].code string Code: ISO 3 for a country (CIV), otherwise the area's code (west_africa, africa, SSA).
data[].kind string What the area is. Values : country | region | continent | imf_aggregate
data[].region string | null African Union region of a country; null otherwise. Values : north_africa | west_africa | central_africa | east_africa | southern_africa | null
data[].name Names Name of the area.
data[].slug Names Slug of the area's page addresses.
data[].pages Pages | null null for IMF aggregates, which have no page.
data[].position integer | null Place, 1 = highest value; null when the country has no value.
data[].value number | null The ranked value, in meta.unit.
meta object About the answer.
meta.sources Source[] Sources of the figures in data. Empty when data holds no figure.
meta.docs Docs This documentation.
meta.from integer First year used.
meta.to integer Last year used.
meta.indicator string Indicator ranked. Values : real_gdp_index | real_gdp_growth | gdp_usd_bn | gdp_per_capita_usd | gdp_per_capita_ppp | inflation | public_debt_pct_gdp | population_m | fiscal_balance_pct_gdp | current_account_pct_gdp | unemployment
meta.mode string change or value. Values : change | value
meta.unit string Unit of value: the indicator's unit (mode value) or its change unit (mode change). Values : percent | percent_of_gdp | percent_of_labour_force | usd_billion | usd | intl_dollar | million_people | index_2015 | points
meta.region string | null Region kept, or null for all. Values : north_africa | west_africa | central_africa | east_africa | southern_africa | null

GET /api/v1/indicators

The indicators: unit, meaning, source

Every indicator, in the order of the series.

Parameters

No parameter.

Answers

200 application/json · {data, meta}

429 rate_limited beyond 60 requests a minute

Language of the example
  1. $ curl "https://syliatlas.com/api/v1/indicators"
  1. const res = await fetch("https://syliatlas.com/api/v1/indicators");
  2. const { data, meta } = await res.json();
  3. console.log(data.map((i) => i.key + ": " + i.unit));
  4. console.log(meta.sources[0]?.attribution.en);
  1. import requests
  2. r = requests.get("https://syliatlas.com/api/v1/indicators", timeout=10)
  3. r.raise_for_status()
  4. body = r.json()
  5. data, meta = body["data"], body["meta"]
  1. # spreadsheets read the CSV route
  2. =IMPORTDATA("https://syliatlas.com/api/v1/areas/CIV/csv")

Answer 200 OK application/json max-age=3600

Real answer from the data online, shortened (…).

Answer schema · 16 fields
Field Type Description
data Indicator[] Every indicator, in the order of the series.
data[].key string Key used in series and parameters. Values : real_gdp_index | real_gdp_growth | gdp_usd_bn | gdp_per_capita_usd | gdp_per_capita_ppp | inflation | public_debt_pct_gdp | population_m | fiscal_balance_pct_gdp | current_account_pct_gdp | unemployment
data[].name Names Name of the indicator.
data[].description Names What it measures.
data[].unit string Unit of the values (labels in the documentation). Values : percent | percent_of_gdp | percent_of_labour_force | usd_billion | usd | intl_dollar | million_people | index_2015 | points
data[].kind string rate: already a percentage; level: an amount; index: 100 in 2015. Values : rate | level | index
data[].change_unit string Unit of its changes: points for rates, percent otherwise. Values : percent | points
data[].source object Where it comes from.
data[].source.id string Source. Values : imf_weo
data[].source.code string | null Code of the series at the source (IMF DataMapper); null when computed by Syli Atlas.
meta object About the answer.
meta.sources Source[] Sources of the figures in data. Empty when data holds no figure.
meta.docs Docs This documentation.
meta.years object Years covered.
meta.years.first integer First year.
meta.years.last integer Last year.

GET /api/v1/areas/{code}/csv

One area as CSV

Line 1 is a comment (#) naming the source. Then a header and one row per year from 2015 to 2030. Columns: year, status, real_gdp_index, real_gdp_growth, gdp_usd_bn, gdp_per_capita_usd, gdp_per_capita_ppp, inflation, public_debt_pct_gdp, population_m, fiscal_balance_pct_gdp, current_account_pct_gdp, unemployment. status is actual, estimate or projection; empty cell = no value. Units: see /indicators.

server time p50 0.8 ms p99 1.3 ms

Parameters

code string path required

Area code: ISO 3 for a country, a region code, africa, or an IMF aggregate (see /areas).

values : CIV, west_africa, africa…

Answers

200 text/csv

404 unknown_area unknown area code

429 rate_limited beyond 60 requests a minute

Language of the example
  1. $ curl -O "https://syliatlas.com/api/v1/areas/CIV/csv"
  1. const res = await fetch("https://syliatlas.com/api/v1/areas/CIV/csv");
  2. const text = await res.text();
  3. // line 1: the source; then one row per year
  1. import pandas as pd
  2. url = "https://syliatlas.com/api/v1/areas/CIV/csv"
  3. df = pd.read_csv(url, comment="#")
  4. print(df[["year", "status", "real_gdp_index"]])
  1. =IMPORTDATA("https://syliatlas.com/api/v1/areas/CIV/csv")

Answer 200 OK text/csv max-age=3600

Real answer from the data online, shortened (…).

Indicators

Every key of series, change_percent and change_points, with its unit. Rates change in percentage points, levels and the index in percent. Same list in GET /api/v1/indicators.

Key Indicator Unit Change IMF code
real_gdp_index Real GDP (index)
GDP volume, 100 in 2015, chained from the IMF real growth rates. Computed by Syli Atlas.
index, 100 in 2015
index_2015
percent —
real_gdp_growth Real GDP growth
Annual change of GDP at constant prices.
%
percent
points NGDP_RPCH
gdp_usd_bn GDP, current dollars
Gross domestic product at current prices, in US dollars.
billions of current US dollars
usd_billion
percent NGDPD
gdp_per_capita_usd GDP per capita
GDP in current dollars divided by the population.
current US dollars
usd
percent NGDPDPC
gdp_per_capita_ppp GDP per capita, PPP
GDP per capita at purchasing power parity (current international dollars): compares living standards.
current international dollars (PPP)
intl_dollar
percent PPPPC
inflation Inflation
Average annual change of consumer prices.
%
percent
points PCPIPCH
public_debt_pct_gdp Public debt
General government gross debt, as % of GDP.
% of GDP
percent_of_gdp
points GGXWDG_NGDP
population_m Population
Total population.
millions of people
million_people
percent LP
fiscal_balance_pct_gdp Fiscal balance
General government net lending (+) or borrowing (−), as % of GDP.
% of GDP
percent_of_gdp
points GGXCNL_NGDP
current_account_pct_gdp Current account
Balance of trade in goods, services and income with the world, as % of GDP.
% of GDP
percent_of_gdp
points BCA_NGDPD
unemployment Unemployment
Unemployed as % of the labour force. The IMF does not publish it for every country.
% of the labour force
percent_of_labour_force
points LUR

Possible values

Every closed list of the API. The same, with their labels, in GET /api/v1 (values).

kind
country
One of the 54 African countries.
region
One of the 5 African Union regions; totals computed by Syli Atlas.
continent
Africa as a whole; totals computed by Syli Atlas.
imf_aggregate
An aggregate published as is by the IMF: the World, sub-Saharan Africa.
region
north_africa
North Africa
west_africa
West Africa
central_africa
Central Africa
east_africa
East Africa
southern_africa
Southern Africa
years.status
actual
Observed value.
estimate
IMF estimate: the year is over but the figures are not final.
projection
IMF projection.
unit
percent
%
percent_of_gdp
% of GDP
percent_of_labour_force
% of the labour force
usd_billion
billions of current US dollars
usd
current US dollars
intl_dollar
current international dollars (PPP)
million_people
millions of people
index_2015
index, 100 in 2015
points
percentage points
mode
change
Change between from and to.
value
Value in the year to.

Shared schemas

Objects found in several answers. Complete, machine-readable description: /api/v1/openapi.json (OpenAPI 3.1).

AreaRef · An area.
Field Type Description
code string Code: ISO 3 for a country (CIV), otherwise the area's code (west_africa, africa, SSA).
kind string What the area is. Values : country | region | continent | imf_aggregate
region string | null African Union region of a country; null otherwise. Values : north_africa | west_africa | central_africa | east_africa | southern_africa | null
name Names Name of the area.
slug Names Slug of the area's page addresses.
pages Pages | null null for IMF aggregates, which have no page.
Names · A text in French and English.
Field Type Description
fr string In French.
en string In English.
Pages · The area's page on the site.
Field Type Description
fr string Page in French.
en string Page in English.
Docs · This documentation.
Field Type Description
fr string Documentation in French.
en string Documentation in English.
Source · A source of the figures, with the attribution to copy (attribution.fr or attribution.en).
Field Type Description
id string Source code. Values : imf_weo
name Names Name of the source.
publisher Names Who publishes it.
edition string Edition, YYYY-MM.
label string Edition's title at the source.
url string The source's page.
licence string Terms of reuse.
licence_url string The terms.
attribution Names The sentence to copy under the figures.
Years · The years of the series.
Field Type Description
first integer First year of the series.
last integer Last year of the series.
estimate_from integer First year estimated by the IMF.
projection_from integer First year projected by the IMF.
list integer[] Every year; position i of each series is year list[i].
status string[] Status of each year, aligned with list. Values : actual | estimate | projection
Series · One list per indicator, aligned with years.list.
Field Type Description
real_gdp_index (number | null)[] Real GDP (index), index, 100 in 2015, one value per year of years.list (null: no value). Unit : index, 100 in 2015
real_gdp_growth (number | null)[] Real GDP growth, %, one value per year of years.list (null: no value). Unit : %
gdp_usd_bn (number | null)[] GDP, current dollars, billions of current US dollars, one value per year of years.list (null: no value). Unit : billions of current US dollars
gdp_per_capita_usd (number | null)[] GDP per capita, current US dollars, one value per year of years.list (null: no value). Unit : current US dollars
gdp_per_capita_ppp (number | null)[] GDP per capita, PPP, current international dollars (PPP), one value per year of years.list (null: no value). Unit : current international dollars (PPP)
inflation (number | null)[] Inflation, %, one value per year of years.list (null: no value). Unit : %
public_debt_pct_gdp (number | null)[] Public debt, % of GDP, one value per year of years.list (null: no value). Unit : % of GDP
population_m (number | null)[] Population, millions of people, one value per year of years.list (null: no value). Unit : millions of people
fiscal_balance_pct_gdp (number | null)[] Fiscal balance, % of GDP, one value per year of years.list (null: no value). Unit : % of GDP
current_account_pct_gdp (number | null)[] Current account, % of GDP, one value per year of years.list (null: no value). Unit : % of GDP
unemployment (number | null)[] Unemployment, % of the labour force, one value per year of years.list (null: no value). Unit : % of the labour force
Period · Changes over the asked period. null when a year has no value.
Field Type Description
from integer First year of the period.
to integer Last year of the period.
change_percent ChangePercent Changes of levels and of the index, in percent.
change_points ChangePoints Changes of rates, in percentage points.
ChangePercent · Changes of levels and of the index, in percent.
Field Type Description
real_gdp_index number | null Change of Real GDP (index) between from and to, in %. Unit : %
gdp_usd_bn number | null Change of GDP, current dollars between from and to, in %. Unit : %
gdp_per_capita_usd number | null Change of GDP per capita between from and to, in %. Unit : %
gdp_per_capita_ppp number | null Change of GDP per capita, PPP between from and to, in %. Unit : %
population_m number | null Change of Population between from and to, in %. Unit : %
ChangePoints · Changes of rates, in percentage points.
Field Type Description
real_gdp_growth number | null Change of Real GDP growth between from and to, in percentage points. Unit : percentage points
inflation number | null Change of Inflation between from and to, in percentage points. Unit : percentage points
public_debt_pct_gdp number | null Change of Public debt between from and to, in percentage points. Unit : percentage points
fiscal_balance_pct_gdp number | null Change of Fiscal balance between from and to, in percentage points. Unit : percentage points
current_account_pct_gdp number | null Change of Current account between from and to, in percentage points. Unit : percentage points
unemployment number | null Change of Unemployment between from and to, in percentage points. Unit : percentage points
Rank · The country's place by real GDP growth over the default period, in Africa and in its region. Computed once per edition, so independent of from and to.
Field Type Description
from integer First year of the ranking period (fixed).
to integer Last year of the ranking period (fixed).
indicator string Indicator ranked. Values : real_gdp_index
change_percent number | null Real GDP growth over the period, in %. Unit : %
africa Position A place in a ranking.
region Position A place in a ranking.
Position · A place in a ranking.
Field Type Description
position integer Place, 1 = highest growth.
out_of integer Number of countries ranked.
Missing · A gap in a series.
Field Type Description
indicator string Indicator. Values : real_gdp_index | real_gdp_growth | gdp_usd_bn | gdp_per_capita_usd | gdp_per_capita_ppp | inflation | public_debt_pct_gdp | population_m | fiscal_balance_pct_gdp | current_account_pct_gdp | unemployment
years integer[] Years without a value.

Performance

Time spent in the server for each route, from the request's arrival to the answer being sent, without the network. Measured on every request and by an hourly probe, so that a route seldom called still has its measure. Budget: 10 ms at the 99th percentile. Every answer also gives its own time in the Server-Timing header.

Route p50 p95 p99 Last 24 hours (p95) Budget
GET /api/v1/areas 1.9 ms 1.9 ms 1.9 ms within budget
GET /api/v1/areas/{code} 1.0 ms 1.0 ms 1.0 ms within budget
GET /api/v1/ranking 2.4 ms 2.4 ms 2.4 ms within budget
GET /api/v1/areas/{code}/csv 0.8 ms 1.3 ms 1.3 ms within budget

last hour measured : 2026-11-12 08:00 UTC

Total time: it depends on the country

Total time = network round trip + server time. The server is in the Netherlands. Answers are cached by Cloudflare, which has points of presence in many African cities: when the answer is already there, it leaves from the nearest city and the trip to Europe is gone. The cache is emptied whenever new data is published.

From Without cache (to Europe) With Cloudflare's cache
Europe ≈ 5 – 20 ms A point of presence in every large city
North Africa ≈ 50 – 100 ms Casablanca, Algiers, Tunis, Cairo
West Africa ≈ 90 – 120 ms (Lagos) Lagos, Dakar, Abidjan
East Africa varies, often through Europe Nairobi, Kigali, Addis Ababa, Dar es Salaam
Southern Africa ≈ 160 – 250 ms Johannesburg, Cape Town, Durban, Lusaka

Published orders of magnitude (Cloudflare, Hats Network, OpenMetal); they vary with the operator. A country without a point of presence goes through the nearest city.

Cite the source

Figures keep the licence of their source. For IMF data, cite: “Source: International Monetary Fund, World Economic Outlook (October 2026)”, with the link, then “via Syli Atlas”. Line 1 of each CSV and the Method page give the exact source. What Syli Atlas computes (totals, ranks, changes) is under CC BY 4.0: free reuse, commercial included, with credit to Syli Atlas.

Method and sources →

Errors

Always the same shape, with a stable code to test in your programs.

  1. {
  2. "error": {
  3. "code": "unknown_area",
  4. "message": "Unknown area: XXX",
  5. "docs": "https://syliatlas.com/en/api#errors"
  6. }
  7. }

Limits and cache

Requests a minute per IP address
60
Quota left
ratelimit-limit · ratelimit-remaining
Over the limit
429 · retry-after
Cache
max-age=3600 · etag
Server time
server-timing

The data changes at most once a day: send If-None-Match, a 304 answer costs almost nothing.

Out of scope

No stock prices. They come from MansaAPI, whose licence allows display on the site but not redistribution. They stay on the stock exchange pages and will join the API exchange by exchange, once an official source allows it. See the exchanges