World Bank Indicators — GDP, Inflation, Population & 16k More
Pricing
from $0.35 / 1,000 result items
World Bank Indicators — GDP, Inflation, Population & 16k More
World Bank macro data for any country: GDP, growth, inflation, population, unemployment, trade, FDI, debt, digital, climate — 16,000+ indicators, 217 economies + aggregates. Presets, latest-value ranking tables with YoY change, wide comparison tables, indicator search. No API key.
Pricing
from $0.35 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Country × indicator × year data straight from the World Bank Indicators API v2: GDP, GDP per capita, inflation, population, unemployment, trade, FDI, debt, interest rates, internet users, CO2, poverty… for any of 217 economies and 78 aggregates (World, EU, OECD, income groups, regions). Built for analysts, researchers and AI agents that need clean macro data with units, latest-value tables, YoY change and wide comparison tables. No API key, no proxy, no browser.
Use cases
- Country due diligence — pull GDP, growth, inflation, debt, reserves and FX rate for a market before entering it (
indicatorPreset: "finance"). - Market sizing — population, urbanisation, internet users, GDP per capita PPP for a region (
region: "ECS",incomeLevel: "UMC"). - Country ranking tables — one row per country with latest value and YoY change (
mode: "latest",countries: ["all"]). - Trade & export research — exports/imports % GDP, merchandise trade, tariffs, FDI for a set of partners as one wide table (
indicatorPreset: "trade",wide: true). - ESG / climate screening — CO2 per capita, renewables share, PM2.5, forest area (
indicatorPreset: "energyClimate"). - Monthly macro monitoring — CPI, industrial production, exchange rates from the Global Economic Monitor (
source: 15,frequency: "M"). - Indicator discovery for agents — search the 1,500 WDI (or 29,500 total) indicators by text and topic, read definitions (
mode: "indicators",mode: "indicatorMeta").
Input
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
mode | string | data | data time series · latest one row per country×indicator · indicators catalogue search · countries country metadata · sources database list · indicatorMeta definitions |
countries | string[] | — (required for data/latest unless a filter is set) | ISO2 (KZ), ISO3 (KAZ), English names (Kazakhstan), all (every economy; aggregates only with includeAggregates: true), aggregate codes (WLD, EUU, OED, HIC, ECS…). Case, accents, spaces and punctuation do not matter. An unknown value → warning + SUMMARY.errors with a "did you mean" (not a dataset row, not billed); the other countries are still read. No known value at all → the run stops with that message |
indicators | string[] | macro set | Any World Bank indicator codes. Empty = indicatorPreset |
indicatorPreset | string | custom | macro, trade, demographics, finance, digital, energyClimate, social, business, custom (see Reference) |
years | integer | 5 | Most recent N periods (API mrv), 1–60. Not used by mode: latest |
startYear / endYear | integer | — | Explicit range (API date=start:end), overrides years/mrnev. With mode: latest: the latest value inside the range |
mrnev | integer | — | N most recent non-empty values per country (skips missing years), overrides years. Not used by mode: latest (it always takes latest + previous non-empty value) |
gapfill | boolean | false | With years only: API fills missing years with last value |
frequency | string | Y | Y, Q, M — sub-annual only for sources 15 (GEM, monthly) and 20/22/23 (quarterly debt) |
source | integer | 2 | World Bank database id (2 = WDI). List with mode: "sources" |
includeNulls | boolean | false | Keep rows with value: null |
includeChange | boolean | false | Add yoyChangePct, previousYear, previousValue per row (vs previous non-null period) |
wide | boolean | false | One row per country × period, indicator codes as columns (saved after the last indicator is read) |
fields | string[] | — (all columns) | Keep only these columns, in this order; id is always kept. Columns per mode: see Output. Case, spaces, _ and - do not matter; a name that is not a column of the mode is skipped and named in the status and SUMMARY.warnings; if none is a column, the run stops before any request with the list of valid columns |
maxItems | integer | 1000 | Cap on dataset rows (1–50,000); pagination is automatic and stops once the cap is reached |
query | string | — | mode: indicators: text to match in code, name, definition |
topic | string | — | mode: indicators: topic id 1–21 (see Reference) |
searchAllSources | boolean | false | mode: indicators: search all ~29,500 indicators instead of only source |
region | string | — | EAS, ECS, LCN, MEA, NAC, SAS, SSF, NA (aggregates) — selects countries in data/latest modes when countries is empty or all; filters mode: countries |
incomeLevel | string | — | HIC, UMC, LMC, LIC |
lendingType | string | — | IBD, IDX, IDB, LNX |
includeAggregates | boolean | false | Include the aggregates (World, EU, regions, income and lending groups — region "Aggregates" in the World Bank country metadata) in countries: ["all"], mode: countries and region/income selections. Aggregate codes you list explicitly (WLD, EUU…) are always returned. Every data row has isAggregate. |
Backward compatible: { "countries": [...], "indicators": [...], "years": N } works exactly as before.
mode, indicatorPreset, frequency, topic, region, incomeLevel and lendingType are fixed lists (values above and in Reference): Apify refuses any other value before the run starts, with the list of allowed values.
Reference
Indicator presets (all codes verified against the API in September 2026)
| Preset | Codes |
|---|---|
macro (default) | NY.GDP.MKTP.CD GDP US$ · NY.GDP.PCAP.CD GDP per capita · FP.CPI.TOTL.ZG CPI inflation % · SP.POP.TOTL population · SL.UEM.TOTL.ZS unemployment % |
trade | NE.EXP.GNFS.ZS NE.IMP.GNFS.ZS NE.TRD.GNFS.ZS (% GDP) · TX.VAL.MRCH.CD.WT TM.VAL.MRCH.CD.WT merchandise US$ · BX.KLT.DINV.CD.WD FDI inflows · BN.CAB.XOKA.GD.ZS current account % GDP · TM.TAX.MRCH.WM.AR.ZS tariff % |
demographics | SP.POP.TOTL SP.POP.GROW SP.URB.TOTL.IN.ZS SP.POP.65UP.TO.ZS SP.DYN.LE00.IN SP.DYN.TFRT.IN SM.POP.NETM SL.TLF.TOTL.IN |
finance | FR.INR.LEND FR.INR.RINR FM.LBL.BMNY.GD.ZS FS.AST.PRVT.GD.ZS FB.AST.NPER.ZS PA.NUS.FCRF FI.RES.TOTL.CD GC.DOD.TOTL.GD.ZS GC.TAX.TOTL.GD.ZS DT.DOD.DECT.CD |
digital | IT.NET.USER.ZS IT.CEL.SETS.P2 IT.NET.BBND.P2 IT.NET.SECR.P6 TX.VAL.TECH.CD GB.XPD.RSDV.GD.ZS |
energyClimate | EG.USE.PCAP.KG.OE EG.ELC.ACCS.ZS EG.FEC.RNEW.ZS EG.ELC.RNEW.ZS EN.GHG.CO2.PC.CE.AR5 EN.GHG.CO2.MT.CE.AR5 EN.ATM.PM25.MC.M3 AG.LND.FRST.ZS |
social | SE.PRM.ENRR SE.TER.ENRR SE.ADT.LITR.ZS SH.XPD.CHEX.GD.ZS SH.MED.PHYS.ZS SI.POV.DDAY SI.POV.GINI SI.DST.10TH.10 |
business | IC.BUS.NREG IC.BUS.NDNS.ZS LP.LPI.OVRL.XQ GC.TAX.TOTL.GD.ZS BX.KLT.DINV.WD.GD.ZS FS.AST.PRVT.GD.ZS IP.PAT.RESD VC.IHR.PSRC.P5 |
The built-in dictionary (src/lib.ts, ~110 codes) also carries a unit for each of these plus GDP PPP, GNI per capita, GDP deflator, sector value added, remittances, external debt ratios, military spending, reserves in months of imports, market cap, youth unemployment, labour participation, infant mortality, tourism, air passengers, container traffic, cereal production/yield, agricultural land, health spending per capita, hospital beds, national poverty line, women in parliament, R&D researchers, patents, journal articles, CPIA ratings. For any other code the unit is parsed from the indicator name ("… (% of GDP)" → % of GDP).
Archived codes that return no data (the actor warns): EN.ATM.CO2E.PC / EN.ATM.CO2E.KT (use EN.GHG.CO2.PC.CE.AR5 / EN.GHG.CO2.MT.CE.AR5), Doing Business IC.BUS.EASE.XQ, IC.REG.DURS, IC.REG.COST.PC.ZS, IC.TAX.TOTL.CP.ZS (discontinued 2021). Sparse series: FR.INR.LEND / FR.INR.RINR / FR.INR.DPST (IMF coverage, no KZ; DPST no US), SI.POV.*, SE.ADT.LITR.ZS, LP.LPI.OVRL.XQ (survey years only) — use mrnev for these.
Regions, income levels, lending types
| Region | Income level | Lending type |
|---|---|---|
EAS East Asia & Pacific | HIC High income | IBD IBRD |
ECS Europe & Central Asia | UMC Upper middle income | IDX IDA |
LCN Latin America & Caribbean | LMC Lower middle income | IDB Blend |
MEA Middle East, North Africa, Afghanistan & Pakistan | LIC Low income | LNX Not classified |
NAC North America | ||
SAS South Asia | ||
SSF Sub-Saharan Africa |
Common aggregate codes (usable in countries)
WLD World · HIC UMC LMC LIC MIC LMY income groups · OED OECD · EUU European Union · EMU Euro area · ARB Arab World · EAS ECS LCN MEA NAC SAS SSF regions · ECA EAP LAC MNA SSA regions excl. high income · CEB Central Europe & Baltics · LDC least developed · HPC HIPC · SST small states · IDA IBD lending groups. All 78 aggregates: {"mode":"countries","region":"NA"}.
Topics (topic for indicator search)
1 Agriculture & Rural Development · 2 Aid Effectiveness · 3 Economy & Growth · 4 Education · 5 Energy & Mining · 6 Environment · 7 Financial Sector · 8 Health · 9 Infrastructure · 10 Social Protection & Labor · 11 Poverty · 12 Private Sector · 13 Public Sector · 14 Science & Technology · 15 Social Development · 16 Urban Development · 17 Gender · 18 MDGs · 19 Climate Change · 20 External Debt · 21 Trade
Most useful sources (source)
| id | Database | Frequency |
|---|---|---|
| 2 | World Development Indicators (default) | annual |
| 3 | Worldwide Governance Indicators | annual |
| 6 | International Debt Statistics | annual |
| 14 | Gender Statistics | annual |
| 15 | Global Economic Monitor (CPI, IP, FX, stock indices…) | monthly / quarterly |
| 16 | Health Nutrition and Population Statistics | annual |
| 20 / 22 / 23 | Quarterly Public Sector Debt / External Debt (SDDS, GDDS) | quarterly |
| 27 | Global Economic Prospects (forecasts) | annual |
| 28 | Global Findex | survey years |
| 31 | CPIA | annual |
| 46 | Sustainable Development Goals | annual |
| 66 | Logistics Performance Index | survey years |
| 75 | ESG Data | annual |
Full list of 71 databases: {"mode":"sources"}. Indicator codes differ per source — find them with {"mode":"indicators","source":15,"query":"cpi"}.
Examples
Default — macro snapshot of three countries, last 5 years (74 rows)
{ "countries": ["KZ", "US", "CN"] }
Central Asia trade table 2015–2025, one row per country × year (55 rows, 8 indicator columns)
{ "countries": ["KZ", "UZ", "KG", "TJ", "TM"], "indicatorPreset": "trade", "startYear": 2015, "endYear": 2025, "wide": true }
World ranking of GDP per capita with YoY change (~214 economies with data; add "includeAggregates": true for ~47 more rows of World/regional/income-group aggregates, flagged isAggregate: true)
{ "mode": "latest", "countries": ["all"], "indicators": ["NY.GDP.PCAP.CD"], "maxItems": 300 }
Upper-middle-income Europe & Central Asia — digital market sizing, latest non-empty values
{ "mode": "latest", "region": "ECS", "incomeLevel": "UMC", "indicatorPreset": "digital" }
Sparse series done right — poverty & Gini, 3 most recent available observations
{ "countries": ["KZ", "UZ", "IN", "BR"], "indicators": ["SI.POV.GINI", "SI.POV.DDAY"], "mrnev": 3 }
Monthly CPI from the Global Economic Monitor with month-over-month change
{ "countries": ["US", "KZ", "TR"], "indicators": ["CPTOTNSXN"], "source": 15, "frequency": "M", "years": 24, "includeChange": true }
Find indicators about inflation, read one definition
{ "mode": "indicators", "query": "inflation", "maxItems": 20 }{ "mode": "indicatorMeta", "indicators": ["FP.CPI.TOTL.ZG", "NY.GDP.DEFL.KD.ZG"] }
Output
Data row (mode: data):
{"id": "KAZ:NY.GDP.MKTP.CD:2025","country": "Kazakhstan","countryCode": "KAZ","countryIso2": "KZ","indicator": "NY.GDP.MKTP.CD","indicatorName": "GDP (current US$)","year": 2025,"period": "2025","value": 306239209650.024,"unit": "current US$","obsStatus": null,"decimal": 0,"source": "World Development Indicators","sourceId": "2","lastUpdated": "2026-07-13","fetchedAt": "2026-09-12T23:40:59.004Z","sourceUrl": "https://api.worldbank.org/v2/country/KAZ;USA;CHN/indicator/NY.GDP.MKTP.CD?format=json&mrv=5&source=2&per_page=1000&page=1"}
| Field | Description |
|---|---|
id | ISO3:indicator:period (stable) |
country, countryCode, countryIso2 | Name, ISO3, ISO2 |
isAggregate | true for World/regional/income-group/lending-group aggregates (region "Aggregates" in the World Bank country metadata) — filter on it instead of on names |
indicator, indicatorName | Code and official name |
year, period | Year (number) and raw period (2025, 2026M07, 2024Q3) |
value | Number or null (only with includeNulls) |
unit | From the built-in dictionary, else parsed from the name, else null |
obsStatus, decimal | API observation status (e.g. E estimate) and suggested decimals |
source, sourceId, lastUpdated | Database name/id and its last update date |
yoyChangePct, previousYear, previousValue | With includeChange — % change vs previous non-null period of the same series |
fetchedAt, sourceUrl | Fetch time and the exact API URL |
mode: latest rows: country, countryCode, countryIso2, indicator, indicatorName, unit, latestYear, latestPeriod, latestValue, previousYear, previousValue, yoyChangePct, source, isAggregate, fetchedAt, sourceUrl.
wide: true rows: id (ISO3:period), country, countryCode, countryIso2, year, period, isAggregate, <indicator code>: value…, fetchedAt, sourceUrl.
mode: indicators / indicatorMeta: indicator, indicatorName, unit, sourceId, source, topics, topicIds, sourceNote, sourceOrganization, inDictionary (+ dictionaryNote).
mode: countries: countryCode, countryIso2, country, isAggregate, region, regionName, adminRegion, incomeLevel, incomeLevelName, lendingType, lendingTypeName, capitalCity, latitude, longitude.
mode: sources: sourceId, code, name, lastUpdated, dataAvailability, metadataAvailability.
Every row also has id, fetchedAt and sourceUrl. With fields, a row keeps id plus the listed columns in your order, e.g. "fields": ["country", "year", "value"] → { "id": …, "country": …, "year": …, "value": … }.
Problems are not dataset rows (every row is charged): the SUMMARY record in the key-value store lists errors ([{ "input": "FOO.BAR", "error": "World Bank API error 120 Invalid value: …" }], { "input": "Kazakstan", "error": "Unknown country \"Kazakstan\" (did you mean KAZ Kazakhstan?) …" }), errorCount, notFound (indicators with no data for the selection, unknown indicator codes in indicatorMeta), notFoundCount, indicatorsNotRead / indicatorsReadInPart (a stop at maxItems, at your spending limit or before the run timeout), warnings and the run counts (delivered, stoppedBy). The status message sums them up and each is logged as a warning. The run does not fail because of one bad code — only when nothing could be fetched at all.
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~world-bank-indicators/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"mode":"latest","countries":["KZ","UZ","KG"],"indicatorPreset":"macro"}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/world-bank-indicators').call({countries: ['KZ', 'US', 'CN'], indicators: ['NY.GDP.MKTP.KD.ZG'], startYear: 2010, endYear: 2025, includeChange: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/world-bank-indicators").call(run_input={"mode": "latest", "countries": ["all"], "indicators": ["SP.POP.TOTL"], "maxItems": 300})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: add https://mcp.apify.com to your agent (Claude, Cursor, custom) and call the yadroo/world-bank-indicators tool with the same JSON input — the input schema descriptions are written for agents.
Pricing
Pay-per-event: $0.001 per run start + $0.0005 per dataset item.
| Run | Items | Cost |
|---|---|---|
| Default (3 countries × 5 indicators × 5 years) | 74 | ≈ $0.038 |
| Trade table, 5 countries × 11 years, wide | 55 | ≈ $0.029 |
World ranking, 1 indicator, latest | ~214 | ≈ $0.108 |
| All countries × 5 indicators × 5 years | ~6,600 | ≈ $3.30 |
Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the row price; the start event is the same on every plan; platform usage is included. Unknown codes and indicators without data are never rows, so they cost nothing. Use wide/latest to get more information per row.
Your Maximum cost per run is respected: the run stops at it and ends with "Stopped at your spending limit: N rows delivered" (the indicators left unread are named in SUMMARY).
Limits & FAQ
- Rate limits / politeness — one request per indicator (per 60-country batch, per 1,000-row page) with a 250 ms pause, up to 3 attempts with backoff on 429/5xx/timeouts (Retry-After honoured). The World Bank API is free and public; a typical run is 1–15 requests.
- Freshness — WDI is refreshed a few times a year (the
lastUpdatedfield tells you when); GEM (source 15) monthly. Data is not real time — for FX use our fx-rates actor, for yields us-treasury-yields. - Empty results — nulls are dropped by default, so a country with no data simply produces no rows; an indicator with no rows at all is listed in
SUMMARY.notFound(free, not a dataset row). Usemrnevfor sparse series,includeNulls: trueto see the gaps. - Invalid codes — invalid indicator → the API error is logged and listed in
SUMMARY.errors; unknown country → validated locally against the live country list (the API would silently drop it) and reported the same way with a "did you mean" (never swapped for another country). Neither costs anything. yearsvsstartYearvsmrnev— the API accepts only one; the actor picks range > mrnev > years and warns about the ignored ones.mode: latesttakes the latest non-empty value of each series (withstartYear/endYear: the latest inside that range) and warns whenyearsormrnevare set.- maxItems — counts final dataset rows. Rows are saved as they arrive (per API page in
mode: data, per indicator inmode: latestor withincludeChange), and reading stops oncemaxItemsrows are saved — nothing is fetched ahead; the indicators left unread are named in the status andSUMMARY.indicatorsNotRead.widetables need every indicator, so they are saved after the last one. - Run timeout — a run near its timeout stops starting new requests, saves what it has read and ends SUCCEEDED with "Stopped before the run timeout: N rows saved". A typical run takes seconds;
all× 10 indicators × 60 years is ~170 requests (a few minutes). - Memory — 256 MB is enough;
all× many indicators × 60 years can be tens of thousands of rows — raisemaxItemsand expect a longer run. - Licence — World Bank Open Data, CC BY 4.0; cite "World Bank, World Development Indicators".
- Roadmap — per-capita/ratio calculators across two indicators, CAGR over the range, CSV-friendly column naming for
wide.
Made by Yadroo. Pairs with fx-rates, us-treasury-yields, sec-company-financials, sec-edgar-filings, public-holidays, openalex-works and wikipedia-search.