# wf.23signs.org > Public finances on a world map, 1995 to 2025. For every country: GDP, real growth, GDP per head, exports, imports and trade balance; public spending split by function (COFOG from Eurostat for the EU, Iceland, Norway and Switzerland, the IMF central government split elsewhere); population by age group; value added by sector; and where the government's money comes from and goes, as % of GDP. Numbers come from the World Bank Indicators API and Eurostat, fetched on demand and cached at the edge for 12 hours; nothing is stored. No authentication, no API keys, free. JSON responses carry HATEOAS `_links`; errors are RFC 9457 problem+json. The same operations are tools on a hosted MCP server at `POST /mcp` (Streamable HTTP, stateless, no auth). A 23signs site. Base URL: https://wf.23signs.org ## Endpoints - `GET /v1/countries?q=` lists every country with data: `iso3`, `iso2`, `name`, `region`, `income_group`, with links to the country document, its series and the map. `q` filters by part of a name or by code. - `GET /v1/countries/{iso3}?year=2023` is one country in one year, the blocks the map's card shows: `economy` (gdp_usd, gdp_growth_pct, gdp_per_head_usd, exports_usd, imports_usd, trade_balance_pct_gdp, trade_balance_usd), `spending` (basis, total_pct_gdp, items with key, name, share_pct of total spending and pct_gdp), `population` (total, over_65_pct, under_15_pct, old_age_dependency_ratio, fertility_rate, life_expectancy_years, net_migration, age_groups with share_pct), `sectors` (basis, items with share_pct), `flows` (revenue_pct_gdp, expenditure_pct_gdp, balance_pct_gdp, revenue[] and spending[] with pct_gdp; a `kind` of borrowing or surplus marks the gap). Each block carries its own `year`; when the requested year has no data yet it is the latest within two years, and a `note` says so. A block is `null` when the source has nothing for the country. `_links.previous` and `_links.next` step through the years, `_links.page` opens the map on the same country and year. - `GET /v1/countries/{iso3}/series` is every yearly series behind the card, 1990 to 2025: `series..values` keyed by year for the World Bank indicators (gdp_usd, gdp_growth_pct, gdp_per_head_usd, exports_usd, imports_usd, trade_balance_pct_gdp, central government expense, revenue and net lending as % of GDP, expense by economic type and revenue by tax as % of the total, value added and employment by sector, high-tech exports, population by sex and age shares, old-age dependency, fertility, life expectancy, net migration, population growth), each with its World Bank `indicator` code; and `cofog.functions` (Eurostat gov_10a_exp, % of GDP, every COFOG code with its label) where the country is covered. - `GET /v1/metrics` lists the three map metrics. `GET /v1/metrics/{tb|gr|pc}?year=2023` is one of them for every country in one year, ranked: `tb` external balance on goods and services (% of GDP), `gr` GDP growth (% a year), `pc` GDP per head (current US$). `ranked[]` has rank, iso3, name, value. - `GET /v1/status` is years covered, sources and licences, limits. - `POST /mcp` is the MCP server (Streamable HTTP, stateless): tools `wf_country`, `wf_series`, `wf_metric`, `wf_countries`, each returning exactly the JSON the HTTP route returns. Years: the card and the map cover 1995 to 2025 (default year 2023); series start in 1990 where the source has them. Eurostat publishes COFOG with a lag of about ten months, the World Bank revises WDI twice a year, so the latest year is often missing for a block: read the block's `year`. Example: `curl -s https://wf.23signs.org/v1/countries/FIN?year=2023` returns Finland's 2023 card; `spending.items[0]` is the largest function (pensions and incapacity), `share_pct` its share of all general government spending, `pct_gdp` the same in % of GDP. ## Errors `application/problem+json` with `type` `https://wf.23signs.org/errors/`: `INVALID_PARAMETER` (400, bad iso3, year or metric), `NOT_FOUND` (404, no World Bank data for the code, or no such route; `availableEndpoints` lists the routes), `UPSTREAM_ERROR` (502, the World Bank or Eurostat answered with an error; retry later), `INTERNAL_ERROR` (500). ## Discovery `/.well-known/api-catalog` (RFC 9727 linkset; `Accept: application/json` for the catalog form), `/.well-known/ai-catalog.json`, `/.well-known/mcp/server-card.json`, `/openapi.yaml` and `/openapi.json` (OpenAPI 3.1), `/SKILL.md` (agent skill file). Every response carries a `Link` header pointing at these. `GET /` with `Accept: application/json` redirects to the catalog; with `Accept: text/markdown` it returns this file. ## Sources and attribution World Bank World Development Indicators (CC BY 4.0): GDP, trade, central government finance (IMF GFS as republished), sectors, population. Eurostat gov_10a_exp (COFOG), nama_10_a10 (value added by NACE section), gov_10a_main (revenue and expenditure by ESA category), general government, reuse with attribution. Trade balance is the external balance on goods and services (balance of payments basis), so it includes services and differs from goods-only customs figures. The spending split follows the figure by the Centro Ruth Richardson: pensions and incapacity, family, unemployment and other social protection; health, education, general public services, debt interest, economic affairs, transport, R&D, defence, public order, culture, environment, housing. Contact: hello@23signs.org. Map for people: https://wf.23signs.org/?c=FIN&y=2023&m=tb (c country, y year, m metric).