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.
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.
Parameters
No parameter.
Answers
200 application/json · {data, meta}
429 rate_limited
beyond 60 requests a minute
- $ curl "https://syliatlas.com/api/v1/areas"
- const res = await fetch("https://syliatlas.com/api/v1/areas");
- const { data, meta } = await res.json();
- console.log(data.length);
- console.log(meta.sources[0]?.attribution.en);
- import requests
- r = requests.get("https://syliatlas.com/api/v1/areas", timeout=10)
- r.raise_for_status()
- body = r.json()
- data, meta = body["data"], body["meta"]
- # spreadsheets read the CSV route
- =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
GET /api/v1/areas/{code}
One area, every series
An area with every series.
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
- $ curl "https://syliatlas.com/api/v1/areas/CIV?from=2020&to=2025"
- const res = await fetch("https://syliatlas.com/api/v1/areas/CIV?from=2020&to=2025");
- const { data, meta } = await res.json();
- console.log(data.period.change_percent.real_gdp_index);
- console.log(meta.sources[0]?.attribution.en);
- import requests
- r = requests.get("https://syliatlas.com/api/v1/areas/CIV?from=2020&to=2025", timeout=10)
- r.raise_for_status()
- body = r.json()
- data, meta = body["data"], body["meta"]
- # spreadsheets read the CSV route
- =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
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.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.share_of_africa_gdp
(number | null)[]
Share of Africa's GDP in current dollars, in %, aligned with years.list. Computed by Syli Atlas.
Unit : %
meta
object
About the answer.
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
- $ curl "https://syliatlas.com/api/v1/compare?codes=CIV,GHA"
- const res = await fetch("https://syliatlas.com/api/v1/compare?codes=CIV,GHA");
- const { data, meta } = await res.json();
- console.log(data.map((a) => a.code));
- console.log(meta.sources[0]?.attribution.en);
- import requests
- r = requests.get("https://syliatlas.com/api/v1/compare?codes=CIV,GHA", timeout=10)
- r.raise_for_status()
- body = r.json()
- data, meta = body["data"], body["meta"]
- # spreadsheets read the CSV route
- =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
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
meta
object
About the answer.
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.
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
- $ curl "https://syliatlas.com/api/v1/ranking?indicator=real_gdp_index"
- const res = await fetch("https://syliatlas.com/api/v1/ranking?indicator=real_gdp_index");
- const { data, meta } = await res.json();
- console.log(data[0].name.fr, data[0].value, meta.unit);
- console.log(meta.sources[0]?.attribution.en);
- import requests
- r = requests.get("https://syliatlas.com/api/v1/ranking?indicator=real_gdp_index", timeout=10)
- r.raise_for_status()
- body = r.json()
- data, meta = body["data"], body["meta"]
- # spreadsheets read the CSV route
- =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
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[].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.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
- $ curl "https://syliatlas.com/api/v1/indicators"
- const res = await fetch("https://syliatlas.com/api/v1/indicators");
- const { data, meta } = await res.json();
- console.log(data.map((i) => i.key + ": " + i.unit));
- console.log(meta.sources[0]?.attribution.en);
- import requests
- r = requests.get("https://syliatlas.com/api/v1/indicators", timeout=10)
- r.raise_for_status()
- body = r.json()
- data, meta = body["data"], body["meta"]
- # spreadsheets read the CSV route
- =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
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[].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.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.
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
- $ curl -O "https://syliatlas.com/api/v1/areas/CIV/csv"
- const res = await fetch("https://syliatlas.com/api/v1/areas/CIV/csv");
- const text = await res.text();
- // line 1: the source; then one row per year
- import pandas as pd
- url = "https://syliatlas.com/api/v1/areas/CIV/csv"
- df = pd.read_csv(url, comment="#")
- print(df[["year", "status", "real_gdp_index"]])
- =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.
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 growthAnnual change of GDP at constant prices. %
percent
points
NGDP_RPCH
gdp_usd_bn
GDP, current dollarsGross domestic product at current prices, in US dollars. billions of current US dollars
usd_billion
percent
NGDPD
gdp_per_capita_usd
GDP per capitaGDP in current dollars divided by the population. current US dollars
usd
percent
NGDPDPC
gdp_per_capita_ppp
GDP per capita, PPPGDP per capita at purchasing power parity (current international dollars): compares living standards. current international dollars (PPP)
intl_dollar
percent
PPPPC
inflation
InflationAverage annual change of consumer prices. %
percent
points
PCPIPCH
public_debt_pct_gdp
Public debtGeneral government gross debt, as % of GDP. % of GDP
percent_of_gdp
points
GGXWDG_NGDP
population_m
PopulationTotal population. millions of people
million_people
percent
LP
fiscal_balance_pct_gdp
Fiscal balanceGeneral government net lending (+) or borrowing (−), as % of GDP. % of GDP
percent_of_gdp
points
GGXCNL_NGDP
current_account_pct_gdp
Current accountBalance of trade in goods, services and income with the world, as % of GDP. % of GDP
percent_of_gdp
points
BCA_NGDPD
unemployment
UnemploymentUnemployed 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).
kindcountry- 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.
regionnorth_africa- North Africa
west_africa- West Africa
central_africa- Central Africa
east_africa- East Africa
southern_africa- Southern Africa
years.statusactual- Observed value.
estimate- IMF estimate: the year is over but the figures are not final.
projection- IMF projection.
unitpercent- %
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
modechange- 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.
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
Names · A text in French and English.
fr
string
In French.
en
string
In English.
Pages · The area's page on the site.
fr
string
Page in French.
en
string
Page in English.
Docs · This documentation.
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).
id
string
Source code.
Values : imf_weo
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.
Years · The years of the series.
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.
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.
from
integer
First year of the period.
to
integer
Last year of the period.
ChangePercent · Changes of levels and of the index, in percent.
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.
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.
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 : %
Position · A place in a ranking.
position
integer
Place, 1 = highest growth.
out_of
integer
Number of countries ranked.
Missing · A gap in a series.
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.
/api/v1/areas
1.9 ms
1.9 ms
1.9 ms
within budget
/api/v1/areas/{code}
1.0 ms
1.0 ms
1.0 ms
within budget
/api/v1/ranking
2.4 ms
2.4 ms
2.4 ms
within budget
/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.
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.
Errors
Always the same shape, with a stable code to test in your programs.
- {
- "error": {
- "code": "unknown_area",
- "message": "Unknown area: XXX",
- "docs": "https://syliatlas.com/en/api#errors"
- }
- }
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