Documentation
StatCite is a free remote MCP server and REST API serving official economic statistics where every number carries a full citation, plus verification and conversion utilities. Base URL: https://statcite.com.
1. Connecting
MCP endpoint: https://statcite.com/mcp, Streamable HTTP, stateless, no authentication. Protocol revisions 2026-07-28 / 2025-11-25 / 2025-06-18 / 2025-03-26, served dual-era on the one endpoint: 2026-07-28 clients send per-request _meta and the standard Mcp-Method/Mcp-Name headers and may call server/discover; session-era clients keep using initialize exactly as before. The server has never minted a session id, so nothing about this endpoint was stateful to begin with.
- Claude (web/desktop/mobile): open StatCite in Claude's connector directory and click Connect. If the directory does not work for you, add a custom connector instead: Settings → Connectors → Add custom connector → paste the URL. All plans (Free: one custom connector).
- Claude Code:
claude mcp add --transport http statcite https://statcite.com/mcp - ChatGPT: enable Developer mode, then add the MCP server with “No Authentication”. Availability varies by plan: full MCP apps are in beta on Business/Enterprise/Edu; Pro can connect MCP servers with read/fetch permissions in developer mode. StatCite is read-only, so that suffices. OpenAI no longer requires the
search/fetchtool pair for connected servers, but StatCite implements it anyway. It remains the interface used by deep research and company knowledge. - Cursor:
{"mcpServers":{"statcite":{"url":"https://statcite.com/mcp"}}}inmcp.json. - VS Code:
{"servers":{"statcite":{"type":"http","url":"https://statcite.com/mcp"}}}in.vscode/mcp.json. - stdio-only clients:
npx -y mcp-remote@0.14.3 https://statcite.com/mcp(pinned, so a client restart never pulls a new release).
Make your agent use it without being asked
Connecting the server puts the tools on the shelf. It does not make an agent reach for them, and a model that is confident about a figure will usually answer from memory. One standing rule fixes that. Paste it into CLAUDE.md or AGENTS.md, into Cursor Settings → Rules, or into your ChatGPT project instructions:
Before stating any country-level economic figure, get it from StatCite (get_indicator) or check it (verify_stat), even if you think you know it, and include the citation_text it returns.
2. Core concepts
Registry indicators are friendly keys (inflation_cpi, gdp_growth, govt_debt_gdp, …) curated by an economist and mapped to authoritative series with fallbacks: World Bank WDI for cross-country annual data, the IMF DataMapper API (current-vintage WEO/Fiscal Monitor, with DBnomics as a vintage-pinned fallback) for fiscal series and gap-filling. A handful of US-only high-frequency registry keys (us_fed_funds_rate and similar) exist for FRED but are permanently disabled, see §8.
Explicit series ids address any supported series directly: worldbank/NY.GDP.MKTP.KD.ZG (needs country), imf/NGDP_RPCH (needs country; current-vintage IMF data), dbnomics/IMF/WEO:latest/BRB.NGDP_RPCH.pcent_change (a specific dated DBnomics edition, e.g. WEO:2025-04, is the reproducibility instrument for pinning an exact vintage). fred/… ids are recognized but always decline, FRED is disabled (§8).
Projections are labeled. IMF forward-year values carry a per-observation note and a series-level note; “latest” semantics prefer the latest value not marked as a projection (which may itself be a staff estimate). The projection boundary is a heuristic derived from each response's own data horizon (the IMF's actual/projection cutoff for a given country and series isn't a field this data exposes), so some earlier observations may also be IMF staff estimates. The notes say so, and a series that ends before the boundary year gets an explicit note rather than silently reading as a confirmed outturn.
Vintages, and what happens when they change mid-response. The primary IMF path (DataMapper) serves the IMF's current edition, with its own verbatim edition label passed through unrewritten. It is never rephrased or inferred where the label is available. If that path is unavailable, StatCite falls back to the newest edition DBnomics has ingested, which can trail the IMF's own April/October release calendar; every IMF-backed response cites the resolved vintage, and a fallback that crosses editions carries an explicit disclosure. Because a substitute source can differ by vintage (a GDP rebasing moves fiscal series by whole points for identical historical years) or by statistical definition (World Bank and IMF current-account figures for the same country-year have differed by nearly two percentage points), verify_stat/verify_claims treat a registry verify served from a transient-failure fallback as cannot_verify. The fallback value is reported as indicative rather than judged, since the primary may recover and serve a different number for the same query. When the primary permanently lacks the series or country (e.g. Taiwan in WDI), the fallback is that country's stable serving source and the verdict is judged normally. See the fallback_used flag and citation for exactly which source and vintage was served.
Errors are advice. Failed calls return actionable messages (closest country matches, available year ranges, alternative series) as tool errors, never bare stack traces.
3. The citation object
Every numeric payload includes:
{
"source": "World Bank",
"dataset": "World Development Indicators",
"series_id": "FP.CPI.TOTL.ZG",
"series_name": "Inflation, consumer prices (annual %)",
"source_url": "https://data.worldbank.org/indicator/FP.CPI.TOTL.ZG?locations=BB",
"api_url": "…exact API call for reproducibility…",
"license": "CC BY 4.0",
"attribution": "The World Bank: World Development Indicators: Inflation, consumer prices (annual %)",
"retrieved_at": "2026-07-25",
"citation_text": "World Bank, World Development Indicators, series FP.CPI.TOTL.ZG (…), data last updated 2026-07-13. Retrieved 2026-07-25 via StatCite (https://statcite.com). https://…",
"notices": ["…source-mandated disclaimers when applicable…"]
}
Agents should reproduce citation_text (or construct a citation from the fields) whenever presenting the number. These fields are stable API surface.
4. MCP tools reference
get_indicator
Official values for a registry indicator, any country. Params: indicator (required), country (required, ISO3/ISO2/name), start_year, end_year, transform (none|yoy|pct_change|index), latest_only (bool), strict_source (bool, reproducibility mode: if the primary source fails, error instead of serving the fallback source). Returns observations + citation + notes. When a transient primary failure did trigger fallback, the response carries fallback_used: true, a disclosure note naming both sources, and is served no-store so it never lingers in shared caches after the primary recovers.
verify_stat
Verdict on a claimed figure vs. the official series. Params: indicator (registry key or series id), country, period (usually a year, "2024"; quarters accepted as "2024-Q1", "2024Q1", or "2024 Q1", months as "2024-05" or "202405"), claimed_value (number), optional tolerance_abs (series units) / tolerance_pct (relative %) / strict_source (bool, never verify against a fallback source; error instead). Without strict_source, a fallback-sourced verify returns cannot_verify with the fallback value as indicative (fallback_used: true) rather than a match/mismatch verdict. Responses also carry observation_status (actual | modeled_estimate | estimate_or_actual | projection | unknown) and status_method. For IMF series the actual/estimate boundary is a horizon heuristic, so estimate_or_actual means exactly that, never a confirmed outturn; modeled_estimate flags series that are model outputs rather than direct measurements (e.g. ILO-modelled unemployment), for which "actual" would overclaim.
Verdicts: match (within rounding: ≤0.06 pp or ≤0.5% relative for percent-kind series, ≤0.5% relative for levels), close (≤0.3 pp or ≤2% relative for percent-kind, ≤5% relative for levels), mismatch, cannot_verify (no observation for that period, response lists the available range and nearby values, or the value was served from a transient-failure fallback and is reported as indicative, see §2). When the official observation is a zero, only the absolute band applies. Responses include is_projection: true when the matched official observation is an IMF WEO/Fiscal Monitor estimate/projection, in which case the explanation is qualified accordingly, plus the finer-grained observation_status/status_method fields (see the OpenAPI schema). Diagnostics flag year misattribution (claim matches an adjacent year), percent-vs-decimal slips (~100× ratio), scale confusion (10³/10⁶/10⁹/10¹² ratios), and sign flips (claim ≈ −official, the classic fiscal-balance sign-convention slip). Live verification responses repeat the revision caveat that the official value is the source's currently published figure; historical as_of results instead carry a vintage-specific caveat naming the WEO edition the verdict was judged against (see below).
Historical IMF-vintage verification (as_of). Pass an optional as_of date (e.g. "2019-04", "2019") to check a claim against a dated IMF WEO edition instead of today's live data. Two honesty bounds, both disclosed in every response. First, resolution is a conservative month calendar, not the IMF's exact release days: editions flip on 1 May and 1 November, but the IMF publishes in early-to-mid April and October (the April 2019 WEO was released 9 April 2019), so an as_of date inside a release month resolves to the previous edition even if the new one already existed. The response says so (as_of.resolution: "conservative_month_calendar" plus a note), and the exact-pinning escape hatch is get_series with a dated id like dbnomics/IMF/WEO:2019-04/…. Second, the source may change: only IMF WEO editions carry dated vintages, so as_of always verifies against WEO even for indicators whose live primary is World Bank WDI (gdp_growth, current_account_gdp) or the IMF Fiscal Monitor database (govt_revenue_gdp, govt_expenditure_gdp). A claim originally made from the live primary can differ from the WEO edition for methodological reasons, not only because of revisions, and as_of.source_changed_for_as_of flags exactly this. Since 1.9.0 the dated-vintage chain is IMF-first: editions the IMF publishes as first-party dated dataflows (api.imf.org, SDMX 3.0) are served from the IMF directly, with DBnomics's dated WEO editions as the deep archive (confirmed back to at least 2010-04), the citation names which one served. Only the six WEO-dated registry indicators support as_of; anything else rejects with advice, as do impossible calendar dates (2019-02-31 is rejected, never silently normalized). observation_status/is_projection are computed against that historical edition's own vintage year, not today's.
Revision probe (automatic). On a mismatch for any of the six WEO-dated indicators, the response also carries revision_check: the claim is re-judged against the previous IMF WEO edition. matches_previous_vintage: true means the figure was likely accurate when written and has since been revised. That is a revision event, not necessarily an author error. When the previous edition cannot be retrieved, status: "unavailable" is returned and no judgment is offered. next_edition_expected carries the calendar-expected next WEO release ("expected" phrasing only). Suppressed under as_of and strict_source.
verify_claims
Batch verification: fact-check a whole draft in one call instead of calling verify_stat once per figure. Workflow: extract every checkable macro claim from the text (indicator + country + period + claimed value), then submit them together. Params: claims, an array of 1–15 objects, each { indicator, country?, period, claimed_value, tolerance_abs?, tolerance_pct?, as_of? } (the same fields as verify_stat). An optional call-level strict_source applies verify_stat's reproducibility mode to every claim in the batch. The 15-claim cap exists because each claim costs upstream subrequests within the free-tier budget; split larger drafts into batches of up to 15 and call once per batch.
Each claim runs through the same verdict engine as verify_stat, including its optional per-claim as_of field (see §4 verify_stat) for revision-aware verification. The response is { summary, results, note? }: summary counts verdicts across the batch (total, match, close, mismatch, cannot_verify, error); results come back in input order. Each result is either { ok: true, claim, verification }, where verification is the full verify_stat payload (verdict, official value, difference, diagnostics, is_projection, citation), or { ok: false, claim, error }. Errors are isolated per claim: an unresolvable claim (unknown indicator or country, upstream trouble) reports its error in place and counts under summary.error without sinking the rest of the batch. When any judged claim matched an IMF WEO/Fiscal Monitor projection-period observation, a top-level note says how many.
Over REST this is the API's only non-GET route, POST /v1/verify_claims with a JSON body:
curl -X POST "https://statcite.com/v1/verify_claims" \
-H "content-type: application/json" \
-d '{"claims":[
{"indicator":"inflation_cpi","country":"USA","period":"2023","claimed_value":4.1},
{"indicator":"govt_debt_gdp","country":"JPN","period":"2024","claimed_value":250}
]}'
A GET on the endpoint returns 405 with usage advice; a non-JSON content-type returns 415; an unknown top-level body key or a non-boolean strict_source returns 400; a malformed body or invalid claims array returns 422.
get_series
Raw series by explicit id. Params: series_id (required), country (for worldbank/*), start_year, end_year, transform. fred/… ids are recognized but always declined. FRED is disabled on this server (§8), with cross-country alternatives suggested.
Registry keys served from SDMX sources (not tools): policy_rate, euro_area_hicp
Two registry keys are served from SDMX APIs rather than the World Bank/IMF chain. policy_rate returns the BIS central-bank policy rate (monthly; the 49 economies the BIS compiles, economies outside that set return an honest no-published-data response rather than a substitute). euro_area_hicp returns monthly euro-area harmonised inflation from the ECB Data Portal, and is a euro-area aggregate only: request it with country="euro area"; a national country is rejected rather than silently answered with the aggregate. Both carry an upstream freshness check. If the newest published observation is older than the expectation for its frequency, the response carries a disclosure note, because a stalled dataflow returns HTTP 200 with well-formed but stale data rather than an error.
compare_sources
One indicator for one country fetched from every official source in its chain independently, e.g. World Bank WDI and the IMF WEO/Fiscal Monitor. Each value comes with its own citation, plus spread statistics. Params: indicator (registry key), country, optional period (year; default is the latest period every responding source shares). Differences between sources are methodological or vintage differences (central vs general government coverage, calendar vs fiscal years, edition lags), never "source X is wrong". Cite the source whose definition matches your claim. A source that is down reports its error in place without sinking the comparison. REST: GET /v1/compare?indicator=&country=&period=.
search_indicators
Free-text search over the registry, plus DBnomics dataset discovery (IMF, OECD, Eurostat, BIS…). Param: query.
country_snapshot
Headline picture in one call: GDP, growth, GDP per capita, inflation, unemployment, population, current account, trade, FDI, life expectancy (World Bank, single batched request) + general government debt (IMF WEO). Param: country. Items each carry their own citation; unavailable indicators are listed in missing.
inflation_adjust
Params: amount, from_year, to_year, country (default USA). Method: CPI ratio on World Bank FP.CPI.TOTL (base-invariant); formula and both index values are disclosed. Annual-average precision, with the CPI-vs-deflator caveat noted.
fx_convert
Params: amount, from, to (ISO 4217), date (YYYY-MM-DD daily / YYYY annual / omit for latest). Rails: ECB daily reference rates (~30 currencies, since 1999) via Frankfurter; World Bank official annual-average rates (PA.NUS.FCRF) for ~90 more currencies via a USD bridge. precision field reports daily, annual_average, or mixed; the method string shows the arithmetic.
list_sources
Sources, coverage, licences and required attribution lines. It is also a full licence ledger: every source carries license_verdict (served | flow_through | refused), license_note (the basis for the verdict), and license_verified_on. Refused sources (FRED, UN Comtrade) are listed with the reason each was declined. The ECCB and the Central Bank of Barbados are served, on written permission obtained by the operator, and their ledger entries state that basis. Human-readable version: the sources page.
search / fetch
Deep-research compatibility pair (OpenAI connector schema). search(query) returns {results:[{id,title,url}]} with ids like indicator/inflation_cpi/BRB; fetch(id) returns {id,title,text,url,metadata} where text contains recent observations and the full citation.
Also on every citation: export_formats, an object with bibtex and apa strings, ready to paste. They are derived from this citation's own fields, so they can never disagree with citation_text. You do not have to build a reference entry by hand:
"export_formats": {
"bibtex": "@misc{worldbank_FP.CPI.TOTL.ZG_BRB, title = {{Inflation, consumer prices (annual %)}}, author = {{World Bank}}, ...}",
"apa": "World Bank. (2026). Inflation, consumer prices (annual %) [Data set]. World Development Indicators. Retrieved ..."
}
Prompts and resources
Beyond the twelve tools, the server exposes three prompts and three resources. In clients that support them (Claude among them) the prompts appear as slash commands as soon as you connect, so this is usually the quickest way to see the server working:
| Prompt | What it does |
|---|---|
fact_check | Paste a draft. Every macro claim in it is extracted and checked against the official series, with a verdict and citation per claim. |
country_brief | A headline economic picture of one country, every figure carrying its own citation. |
cite_this_stat | Turn one figure into a properly formatted, verified citation. |
| Resource URI | Contents |
|---|---|
statcite://registry/indicators | The full 48-key registry in one read, so an agent never has to page through search results to learn what exists. |
statcite://registry/sources | The licence ledger: verdict, basis and verification date per source. |
statcite://registry/sids | The curated 39-state small-island developing states grouping. |
5. REST API
The same engine over plain GET, for scripts, notebooks, spreadsheets and Custom GPT Actions. Machine-readable spec: /openapi.json. CORS: open. Responses are cacheable (Cache-Control: public).
GET /v1 → endpoint index
GET /v1/indicators → the indicator registry (48 keys, 42 active)
GET /v1/indicator/{key}?country=BRB&start_year=2015&transform=yoy&latest_only=true
GET /v1/series?id=worldbank/NY.GDP.MKTP.KD.ZG&country=USA
GET /v1/search?q=government+debt
GET /v1/snapshot/{country}
GET /v1/verify?indicator=inflation_cpi&country=USA&period=2023&value=4.1
POST /v1/verify_claims → JSON body { claims: [...] }, 1–15 claims (the only non-GET route)
GET /v1/inflation?amount=100&from_year=1995&to_year=2024&country=USA
GET /v1/fx?amount=100&from=USD&to=BBD&date=2024
GET /v1/compare?indicator=govt_debt_gdp&country=BRB&period=2023
GET /v1/status → version + live upstream probes (for a poller or badge)
GET /v1/series?id=caribstat/ECCB/total-public-sector-debt/AIA.a&row=Total Public Sector Debt
GET /v1/sources
GET /health
Errors: 400 missing/invalid parameters, 422 resolvable-but-failed requests (unknown country, out-of-range year, message includes suggestions), 502 upstream source trouble, 404 unknown endpoint. On /v1/verify_claims: 405 for GET (use POST), 415 for a non-JSON content-type, 400 for an unknown top-level body key or a non-boolean strict_source, 422 for a malformed body. Every error body is {"error": {"code", "message", "details"}}, and code is the field to branch on.
Unknown parameter names are refused, not ignored. Every /v1 GET route that takes query parameters returns 400 for one it does not accept, or for a name given twice. The message lists the parameters the route accepts and suggests the closest one. This matters because a dropped name changes the answer: a misspelled tolerance on /v1/verify would otherwise fall back to the lenient default and turn a mismatch into a match. On GET /v1/verify, claimed_value is accepted as an alias of value, since that is the name verify_stat and verify_claims use. verify_claims applies the same rule to claim objects, over MCP and on POST /v1/verify_claims. A claim with a key outside indicator, country, period, claimed_value, tolerance_abs, tolerance_pct and as_of refuses the call (422 on REST), naming the closest accepted key.
6. Indicator registry
48 registry keys, of which 42 are active. The six US-only FRED-reserved keys are recognized but permanently decline (§8). Machine surfaces say so too: GET /v1/indicators entries and search_indicators results carry active (and disabled_reason on the six disabled keys), so an agent never has to discover a dead key by calling it. Keys are stable; new indicators are added without breaking existing ones.
| Key | Series | Unit | Sources (order = fallback chain) |
|---|---|---|---|
gdp_growth | GDP growth (annual %) | % (annual, real) | World Bank WDI; IMF DataMapper; IMF WEO (DBnomics fallback) |
gdp_current_usd | GDP (current US$) | current US$ | World Bank WDI |
gdp_per_capita_usd | GDP per capita (current US$) | current US$ | World Bank WDI |
gdp_per_capita_ppp | GDP per capita, PPP (current international $) | current international $ (PPP) | World Bank WDI |
gni_per_capita_atlas | GNI per capita, Atlas method (current US$) | current US$ | World Bank WDI |
inflation_cpi | Inflation, consumer prices (annual %) | % (annual average) | World Bank WDI |
cpi_index | Consumer price index (2010 = 100) | index, 2010 = 100 | World Bank WDI |
gdp_deflator_growth | Inflation, GDP deflator (annual %) | % | World Bank WDI |
unemployment_rate | Unemployment, total (% of labor force, modeled ILO estimate) | % of labor force | World Bank WDI |
labor_force_participation | Labor force participation rate (% of population 15+, modeled ILO) | % of population ages 15+ | World Bank WDI |
population | Population, total | people | World Bank WDI |
population_growth | Population growth (annual %) | % | World Bank WDI |
current_account_gdp | Current account balance (% of GDP) | % of GDP | World Bank WDI; IMF DataMapper; IMF WEO (DBnomics fallback) |
govt_debt_gdp | General government gross debt (% of GDP) | % of GDP | IMF DataMapper; IMF WEO (DBnomics fallback); World Bank WDI |
fiscal_balance_gdp | General government net lending/borrowing (% of GDP) | % of GDP | IMF DataMapper; IMF WEO (DBnomics fallback) |
govt_revenue_gdp | General government revenue (% of GDP) | % of GDP | IMF DataMapper (Fiscal Monitor); IMF WEO (DBnomics fallback) |
govt_expenditure_gdp | General government total expenditure (% of GDP) | % of GDP | IMF DataMapper (Fiscal Monitor); IMF WEO (DBnomics fallback) |
tax_revenue_gdp | Tax revenue (% of GDP) | % of GDP | World Bank WDI |
trade_gdp | Trade (% of GDP) | % of GDP | World Bank WDI |
exports_gdp | Exports of goods and services (% of GDP) | % of GDP | World Bank WDI |
imports_gdp | Imports of goods and services (% of GDP) | % of GDP | World Bank WDI |
fdi_inflows_gdp | Foreign direct investment, net inflows (% of GDP) | % of GDP | World Bank WDI |
remittances_gdp | Personal remittances, received (% of GDP) | % of GDP | World Bank WDI |
gross_capital_formation_gdp | Gross capital formation (% of GDP) | % of GDP | World Bank WDI |
gross_savings_gdp | Gross savings (% of GDP) | % of GDP | World Bank WDI |
official_fx_rate | Official exchange rate (LCU per US$, period average) | LCU per US$ | World Bank WDI |
reserves_months_imports | Total reserves in months of imports | months of imports | World Bank WDI |
reserves_total_usd | Total reserves (includes gold, current US$) | current US$ | World Bank WDI |
lending_rate | Lending interest rate (%) | % | World Bank WDI |
deposit_rate | Deposit interest rate (%) | % | World Bank WDI |
real_interest_rate | Real interest rate (%) | % | World Bank WDI |
broad_money_gdp | Broad money (% of GDP) | % of GDP | World Bank WDI |
gini | Gini index | index (0–100) | World Bank WDI |
poverty_headcount_intl | Poverty headcount ratio at $3.00 a day, 2021 PPP (% of population) | % of population | World Bank WDI |
life_expectancy | Life expectancy at birth, total (years) | years | World Bank WDI |
urban_population_share | Urban population (% of total population) | % of population | World Bank WDI |
us_fed_funds_rate | US federal funds effective rate (monthly, %) | % | FRED (US), disabled |
us_10y_treasury | US 10-year Treasury constant maturity yield (daily, %) | % | FRED (US), disabled |
us_cpi_monthly | US CPI for all urban consumers (monthly index, 1982–84 = 100) | index, 1982–84 = 100 | FRED (US), disabled |
us_unemployment_monthly | US unemployment rate (monthly, %) | % | FRED (US), disabled |
us_nonfarm_payrolls | US total nonfarm payrolls (monthly, thousands of persons) | thousands of persons | FRED (US), disabled |
us_real_gdp | US real GDP (quarterly, chained 2017 dollars, SAAR) | billions of chained 2017 US$ | FRED (US), disabled |
debt_service_exports_pct | Total debt service (% of exports of goods, services and primary income) | % of exports | World Bank WDI |
euro_area_hicp | Euro area HICP inflation (annual rate) | % | ECB Data Portal |
external_debt_service_usd | Total debt service on external debt (TDS, current US$) | current US$ | World Bank WDI |
external_debt_stock_usd | External debt stocks, total (DOD, current US$) | current US$ | World Bank WDI |
policy_rate | Central bank policy rate | % per annum | BIS statistics |
tourism_receipts_exports | International tourism, receipts (% of total exports) | % of total exports | World Bank WDI |
govt_debt_gdp, fiscal_balance_gdp, govt_revenue_gdp, govt_expenditure_gdp) intentionally use IMF general-government series as primary. The World Bank WDI central-government debt series has far patchier coverage. govt_revenue_gdp/govt_expenditure_gdp are served from the IMF's Fiscal Monitor database (the same general-government concept as the WEO database, at full precision); the other two are served from the WEO database itself (values rounded to one decimal by the DataMapper API). US-prefixed keys are reserved for FRED-backed high-frequency series; FRED is permanently disabled (§8) because its terms of use prohibit AI/ML use and caching/redistribution, so these keys always decline.7. Countries & aggregates
Pass ISO3 (USA, BRB), ISO2 (US, BB), or English names. Common aliases resolve (UK, South Korea, Ivory Coast, Türkiye). Aggregates: WLD (world), EUU (EU), EMU (euro area), OED (OECD), income groups (HIC, LIC, LMC, UMC), and World Bank regions. Unresolvable names return suggestions.
8. Sources & licensing
StatCite does not originate the underlying statistical observations; derived values (transforms, inflation adjustment, FX bridging) and verification verdicts are calculated transparently from cited source data, with the method and inputs disclosed in each response. The underlying licences are as follows. World Bank data is CC BY 4.0. Published IMF statistical data may be copied, redistributed and used (including in derivative works) under the IMF's special terms for data: attribute as "Source: International Monetary Fund, <database>, <link>" (each citation supplies this line), do not alter the data in ways affecting its accuracy, communicate these terms to your own downstream users, and where the data is sold as a standalone product disclose that it is available free of charge from the IMF. BIS statistics may be reproduced and redistributed with attribution. ECB Data Portal content may be reproduced with attribution. ECB reference rates are informational and are reused with attribution. Eurostat data is CC BY 4.0 via DBnomics. FRED is not served: its Services Terms of Use (clauses (p) and (q), fred.stlouisfed.org/legal) reserve FRED content from AI/ML/LLM and generative-AI use, and from being stored, cached or redistributed to third parties. The license and attribution fields in each citation state what applies to that exact number.
9. Fair use & caching
- Free, no key. Please keep sustained automated load reasonable; the service may throttle abuse.
- Responses carry cache headers; repeated identical queries are served from edge cache. Upstream sources are queried at most once per cache window per query.
- Need volume, SLAs, or invoicing? Use the metered Apify actor, StatCite: Economic Data & Stat Verification, or email hello@statcite.com.
10. Changelog
- 1.17.0:
stale_latestcarries the age of a latest-only value.stale_primary, which fires beside it, now names the other registry sources StatCite did not query, read from a newstale_primary_unqueriedfield, and leaves the gap tostale_latest. - 1.16.0: Two codes join the
limitationslist.stale_latestmarks a latest-only value more than 3 years older than the year it was retrieved, from any source, so a single-source series such as the Gini index is covered. Ordinary lags of 1 or 2 years never fire it.outturn_unconfirmedmarks IMF values before the projection boundary StatCite infers, because the IMF data StatCite reads does not mark which years are outturns and which are staff estimates. - 1.15.0: Every
get_indicatorandget_seriesresult carries alimitationslist, codes for what the figure is not:projection,fallback_source,stale_primary,modeled_estimate,rounded_sourceandcomputed_values, each with a one-linedetail. Each code is read from a structured field of the result or from the indicator registry, and an empty list means none of those conditions was detected. The README gains a side-effect table, and the stdio install line pinsmcp-remote@0.14.3. - 1.14.2: The Eastern Caribbean Central Bank stopped printing its "Data as at" stamp in late September 2026. An ECCB figure collected since then says the bank gave no currency date, and its citation names the date StatCite collected the copy served, labelled as StatCite's own. Stamped ECCB citations and Barbados citations are unchanged.
- 1.14.1: A World Bank outage now costs
country_snapshotone retry series instead of two, about 1.2 seconds less waiting per snapshot. A single blip is still retried and recovered. - 1.14.0: An outage now answers 502 on every route rather than 422 on four of them, a snapshot shortened by an unreachable source says so instead of claiming the economy publishes nothing, and a malformed upstream document is no longer reported as a StatCite crash.
poverty_headcount_intladvertises the $3.00 a day, 2021 PPP line the World Bank actually serves,tourism_receipts_exportsstates that its series ends in 2020, and a "latest" value more than three years behind the clock names the sources StatCite did not consult. Prompts declare arguments andprompts/getuses them,server/discovercarries identity at the top level, and tool results are no longer pretty-printed on the wire. Tables scroll on a phone, the Connect panels and the verifier form work without JavaScript, and the CaribStat pipeline refuses to publish a table whose period labels it could not read. - 1.13.0: Verdicts say what they mean: a claim with the opposite sign to the official figure is no longer a "match" near zero, and the adjacent-year diagnostic no longer tells correct claims their year may be wrong. Anguilla and Montserrat return
cannot_verifywith the ECCB's related figures rather than an error. A year window withyoykeeps its first year. A bridgedfx_convertrate is dated to its stalest leg and lists both legs.searchno longer returns idsfetchwould refuse, each failed claim inverify_claimscarries an error code, every /v1 message names an HTTP call rather than an MCP tool, and/v1/seriesacceptsrow=for Caribbean tables. Identical upstream requests in flight are shared and a dead host is retried once per request, so one outage no longer starves a batch. - 1.12.3: A security pass. The API and MCP endpoint redirect plain HTTP to HTTPS, and every response carries HSTS and nosniff. Request bodies over 262,144 bytes get a 413, query values are capped at 200 characters, and one batch may ask for at most the upstream work of a 15-claim
verify_claimscall. Upstream responses are capped at 5 MB with a timeout that covers the body. Caribbean series ids can no longer reach other paths, andseries_idis built from the parsed id. Control characters are stripped from every citation, and the BibTeX export can no longer be broken by a brace. - 1.12.2: MCP tool arguments are checked against each tool's published schema, so a misspelled tolerance can no longer turn a mismatch into a close verdict. Caribbean answers say which table row they served, a row label containing % no longer fails, and Anguilla and Montserrat point to the Eastern Caribbean Central Bank series with its definition. Every error carries a
code, an absence is claimed only when every source reports it, and outages are codedupstream_unavailable. Cloudflare invocation logs, which kept request URLs, are switched off. - 1.12.1: The country resolver no longer serves one country's figures for another. "American Samoa" had been answered with Samoa's data and "Northern Ireland" with Ireland's.
verify_claimsnow refuses unknown claim keys, so a misspelled tolerance can no longer turn a mismatch into a match. Server instructions now say when to call StatCite, not only how, and every citation links back to statcite.com. - 1.12.0: Fixes from an adversarial sweep of the live service.
GET /v1/verifyrefuses unknown parameter names instead of dropping them, acceptsclaimed_valueas an alias ofvalue, and honoursstrict_source=1. Search results reporttotal_indicator_matchesandtruncated,/sourcesis server-rendered for crawlers, and structured data covers /docs, /bench, /sources, /privacy and /terms as well as the homepage. - 1.11.3: Registry metadata. The MCP registry description now names the Caribbean central banks; the registry rejects same-version republishes, so the corrected line ships as a version. No behaviour change.
- 1.11.2: Discovery pass. A bare
GET /mcpstays 405 but now returns a JSON descriptor (name, version, protocol versions, docs, REST and llms.txt links) instead of zero bytes, so an agent sniffing the endpoint gets a working start. The homepage JSON-LD gains aDataCatalogof six publisher-attributed datasets with live example URLs, and its description now names BIS and both Caribbean central banks./.well-known/security.txtpublished. The Apify actor bundle is rebuilt from current core, picking up this week's search, catalogue and territory fixes. - 1.11.1: Second audit pass, live-verified. Search no longer recommends a series the caller cannot use: a query naming a country now drops fixed-geography series it cannot serve, so
euro_area_hicpstopped ranking for Barbados and Jamaica queries that returned 422 when followed./docsno longer scrolls sideways on a phone, where two inline code spans widened the page to 465px in a 375px viewport.openapi.jsonnow documents thecaribstat/id form and the row and occurrence selectors, which it had never mentioned. The licence ledger is stated correctly on this page and inllms-full.txt: ECCB and the Central Bank of Barbados are served, not refused. The country_snapshot description no longer claims a fixed indicator count, which varies from 5 to 11 by economy. - 1.11.0: Audit of the live service. A transform no longer leaves the SOURCE unit on transformed values:
transform=yoyreturned 5.18 labelled “current US$” where the real figure is 7,597,571,450, and an index rebase kept the source’s base year beside a note naming a different one. Transforms now return their own unit and the citation discloses that values are computed rather than as-published. Query booleans accept1/yes/onand reject anything unparseable with a 400, sostrict_source=1can no longer silently downgrade a reproducibility guarantee. 19 real economies, Montserrat and Anguilla among them, were missing from the country table, which meant a made-up three-letter code could be described as an economy the World Bank does not cover; that distinction is now explicit. Also: HEAD supported withAllowon every 405,/v1/fxrejects future dates itself instead of blaming the ECB,/v1/statusmarks cached probes,compare_sourcesno longer misses overlaps spanning decades, and the BIS coverage claim corrected to the 49 economies actually served. - 1.10.1: One honest-absence contract for both World Bank coverage shapes. The World Bank signals “not a reporting economy” two ways, an empty result set or a parameter-validation message; the second was passed through raw and read as a StatCite fault. Both now return the same shape with
no_published_data: true, so an agent branches on a field instead of parsing prose. - 1.10.0: MCP protocol revision 2026-07-28 supported, served dual-era on the same endpoint. That revision removes the
initializehandshake, sessions andpingin favour of per-request metadata; StatCite now answers both eras, choosing per request from the version the request declares. New for modern clients: mandatoryserver/discover,resultTypeon every result,ttlMs/cacheScopeon cacheable results, and enforced agreement between theMCP-Protocol-Version/Mcp-Method/Mcp-Nameheaders and the request body (mismatch is refused with -32020). Session-era clients are unaffected. That no-change guarantee has its own regression tests. - 1.9.1: Correction release from a full health audit: the retired IMF licence claim (that commercial reuse of IMF data might need the IMF's permission, a rule belonging to IMF publications, not statistical data) was still live on this site and the README after the 1.8.2 correction reached the code; a regression test now bans that wording from every public prose surface. Also: homepage tool count and sources table corrected,
as_ofprovenance now names the source that actually served, and the DBnomics ledger note corrected. - 1.9.0: New source: the IMF's own dated WEO vintage dataflows (api.imf.org, SDMX 3.0), served ahead of DBnomics in the
as_of/revision-probe chain. Fixes a live degradation where the revision probe reported the previous edition unavailable purely because the aggregator had not yet ingested it. Licence-ledger entryimf_sdmx_vintageadded and verified; two silent-failure guards (SDMX-JSON 2.0.0value-keyed periods; HTTP-200-with-no-series treated as a malformed key, never as absence of published data) covered by mutation-verified tests. - 1.8.2: IMF licence text corrected against the IMF's verbatim terms: the earlier wording applied the IMF Content regime's commercial-permission rule to statistical Data, which the IMF governs under separate, permissive special terms (redistribution and derivative use with attribution, downstream communication of terms, free-of-charge disclosure where sold). IMF attribution now carries the database name and dataset link the terms specify.
- 1.8.0–1.8.1: Two new SDMX sources: BIS central-bank policy rates (
policy_rate, 49 economies, explicit code allowlist after a live BIS-code/ISO2 collision) and ECB Data Portal euro-area HICP (euro_area_hicp); per-response staleness assertion on SDMX flows; live smoke hardened with transient-retry. - 1.7.0: Automatic revision probe: a
mismatchon a WEO-dated indicator is re-judged against the previous IMF edition and the response says whether the claim matched the prior vintage (revision event vs author error). - 1.6.0:
compare_sourcestool +/v1/compare(one indicator, every publishing source, side by side with per-source citations and the spread); licence ledger onlist_sources/GET /v1/sources(verdict, basis note and verification date per source, including refused sources with reasons); citationexport_formats(BibTeX/APA); machine-readable honest absence (no_published_datavsavailable_range); typo-tolerant country resolution; four new debt/tourism registry keys; SIDS resource. - 1.5.0: MCP prompts (
fact_check,country_brief,cite_this_stat) and MCP resources (registry + source/licence tables, generated from the serving constants so they cannot drift); structured output on the verify tools; merged/v1/statusendpoint with live upstream probes; scheduled CI smoke against production. - 1.4.2: Doc-drift and disclosure pass (fourth external review response): the six permanently-disabled FRED-reserved keys are now disclosed on the machine surfaces too,
GET /v1/indicatorsentries andsearch_indicatorsresults carryactive+disabled_reason, a disabled key's search result says "do not call" instead of a normal usage instruction, and theget_seriestool description no longer implies a server FRED key could enablefred/…ids. Documentation drift fixed:modeled_estimateadded to the docs'observation_statuslist, the revision-caveat sentence now distinguishes live from historicalas_ofresults,llms-full.txtshows the full six-fieldas_ofobject in the verify_stat return contract and addsas_ofto the REST parameter list. Site: Tow Center statistic reworded to describe what the study measured (source-identification failures), the 2026 deep-research study labelled as an arXiv preprint, "SLA-backed platform" replaced with a plain statement that Apify's own terms govern the metered offering, connect tabs now include accessible tab semantics and a test prompt, plus a live try-it verifier backed byGET /v1/verify. (Also reviewed and rejected: the claim that custom connectors are unavailable on Claude's Free plan, Anthropic's current documentation confirms Free includes one custom connector, so the site's wording stands.) - 1.4.1:
as_ofhonesty pass (third external review response): the feature is now described everywhere as historical IMF-vintage verification, never exact date-sensitive "truth at the time". The vintage resolver is a conservative month calendar (editions flip 1 May / 1 Nov), not the IMF's actual release days, and the response now discloses this (as_of.resolution) plus a release-month ambiguity note with an exact-pinning escape hatch. Impossible calendar dates (2019-02-31) are rejected instead of silently normalized to a different date. Historical results no longer carry the contradictory "reflects the current published figure" note (a vintage-specific caveat replaces it). Newas_of.source_changed_for_as_of+ note disclose when the archive source differs from the indicator's live primary (World Bank WDI or IMF Fiscal Monitor). Newobservation_status: "modeled_estimate"for the ILO-modeled unemployment/participation indicators, "actual" was too strong a claim for model outputs.fallback_reasonadded to the OpenAPI schema; public indicator counts corrected to "42 active" (six FRED-reserved keys always decline). - 1.4.0: Revision-aware verification:
verify_stat/verify_claimsgain an optionalas_ofdate that pins the verdict to the IMF WEO/Fiscal Monitor edition current on that date (resolved via the April/October release calendar and fetched from that dated DBnomics edition directly) instead of today's live data, "was this true when it was made?" Scoped to the six registry indicators with a dated IMF DBnomics definition; anything else rejects with advice. Response carriesas_of: { requested, resolved_vintage }. - 1.3.2: FRED permanently disabled (not just unconfigured by default): its Services Terms of Use (clauses (p) and (q)) prohibit AI/ML use and caching/redistribution of its content, which conflicts with this service's architecture. The
fred/…series id and the six US-only FRED-backed registry keys remain recognized but always decline, pointing to World Bank/IMF alternatives; the underlying key check no longer treats a configuredFRED_API_KEYas sufficient to enable it. - 1.3.1: Verification honesty pass: a registry verify served from a transient-failure fallback now returns
cannot_verifywith the fallback value as indicative (generalizing 1.3.0’s vintage-crossing rule, World Bank↔IMF substitution differs by definition, not just vintage; a fallback for a series the primary permanently lacks is judged normally with disclosure); newobservation_status/status_methodfields distinguishactualfromestimate_or_actual(IMF pre-boundary values may be staff estimates) and disclose the heuristic;latest_onlynote no longer claims "outturn" for IMF series; country snapshots propagatefallback_usedand are served no-store when any item was fallback-sourced; IMF citation license text aligned with the IMF's terms as then understood (that wording conflated the IMF's Content and Data regimes and was corrected in 1.8.2, see above); doc-version and stat-source-link corrections. - 1.3.0:
gdp_growth,current_account_gdp,govt_debt_gdp,fiscal_balance_gdp,govt_revenue_gdp,govt_expenditure_gdpnow serve from the IMF DataMapper API (current WEO/Fiscal Monitor edition) as primary, with DBnomics as a vintage-pinned fallback, closing the WEO-vintage-lag limitation from 1.2.0; newimf/<CODE>explicit series id; the actual/projection boundary is now derived from each response's own data horizon rather than the served edition label, so it survives cache skew;verify_stat/verify_claimsreturncannot_verify(not a match/mismatch verdict) when a fallback crosses IMF vintages, since a vintage change can move a value by more than rounding even for identical historical years. - 1.2.0:
strict_sourcereproducibility mode onget_indicator/get_series/verify_stat/verify_claims;fallback_usedflag + no-store caching on fallback-sourced responses; deeper transient-failure retries before any fallback; WEO stale-vintage disclosure notes; more precise IMF/FRED licensing language; honest WEO estimate-boundary caveat. - 1.1.0:
verify_claimsbatch verification (MCP +POST /v1/verify_claims), FRED end-to-end test coverage. - 1.0.0: Initial release: 10 tools, 42-indicator registry, World Bank + IMF WEO + ECB, REST mirror, OpenAPI, llms.txt. (This release also shipped an optional FRED path, retired permanently in 1.2.0 on the terms-of-use grounds set out in §8.)
© 2026 StatCite · Home · OpenAPI · llms.txt · llms-full.txt · Privacy · Terms · hello@statcite.com