Methodology
This is a reference site; trust is the entire product. This page documents exactly where every number comes from, how often it refreshes, and how we separate live figures from the frozen CIA archive. Last data change: August 12, 2026.
Two layers, clearly labeled
Historical layer. The complete final edition of the CIA World Factbook (data as of January 2026), preserved verbatim inside every country profile. It is a US Government work in the public domain (17 U.S.C. § 105). We label it as historical everywhere it appears and never silently edit it.
Live layer. Statistics fetched from primary sources and merged in on each rebuild. Every live figure carries its source and observation year inline, because a number without a year is a guess dressed up as a fact.
We run no refresh on a fixed timetable, and we would rather say so than publish a cadence we do not keep. In practice this matters less than it sounds: only one field here moves on its own schedule — heads of state and government, which change whenever a government does. The statistical sources publish rarely, the World Bank a few times a year, the IMF each April and October, the UN Population Division roughly every two years, Our World in Data annually, and area does not come from a live feed at all. So rather than ask you to trust a schedule, we date every figure and every page, and you can read the age off the site directly.
Do not take the schedule on trust: take the date. The "last data change" stamp above, the updated date on every country profile, and the lastmod in our sitemaps all come from the same content hash, and none of them moves unless the underlying data moved. If a page's date looks old, the data behind it has not changed since that date, or the refresh has not run. Either way the date is the truth and the schedule is only an intention.
Field-by-field sources
| Field | Source | Refresh |
|---|---|---|
| Population | World Bank World Development Indicators (SP.POP.TOTL), which draws on the UN Population Division and national offices. IMF WEO fills gaps such as Taiwan. | The World Bank refreshes WDI roughly quarterly; we take the latest observation on each rebuild. |
| Area | The mledoze/countries reference dataset (ODbL 1.0) supplies the figure for most entities; the CIA Factbook archive supplies it where the reference dataset has none, and for seven countries where the reference figure is measured on a basis that would corrupt a ranking. As the data stands, 236 of our 261 entities carry the reference figure and 25 carry the archive figure. Every profile records which of the two it used, so the choice is auditable rather than hidden. | Static. It is not fetched on the refresh at all, and it carries no observation year; it changes only when a border moves, a survey is revised, or we re-vendor the reference dataset. |
| GDP (nominal) | World Bank WDI (NY.GDP.MKTP.CD); IMF World Economic Outlook for Taiwan, Kosovo, and forecasts. | World Bank quarterly refreshes; IMF WEO editions in April and October. We take the latest on each rebuild. |
| GDP per capita | World Bank WDI (NY.GDP.PCAP.CD); IMF WEO for gaps. | Same as GDP: World Bank quarterly; taken on each rebuild. |
| GDP growth | World Bank WDI (NY.GDP.MKTP.KD.ZG); IMF WEO for gaps and forecasts. | Annual observations, revised as national accounts finalize. Taken on each rebuild. |
| Inflation rate | World Bank WDI (FP.CPI.TOTL.ZG); IMF WEO for gaps. | Annual averages in our tables; taken from the latest source data on each rebuild. |
| Unemployment rate | World Bank WDI (SL.UEM.TOTL.ZS, ILO modeled); IMF WEO where missing. | Annual; taken on each rebuild. |
| Life expectancy | World Bank WDI (SP.DYN.LE00.IN), drawing on UN Population Division estimates. | Annual; taken on each rebuild. |
| Median age | UN World Population Prospects 2024, medium variant. | UN WPP revisions are biennial; we track the latest revision. |
| Fertility rate | UN World Population Prospects 2024, medium variant. | Biennial UN revisions. |
| Population growth | World Bank WDI (SP.POP.GROW). | Annual; taken on each rebuild. |
| Population density | Computed here, not fetched: the live World Bank population divided by the area figure described on the area page (mledoze/countries under ODbL for most entities, CIA archive for the rest). Because one input is live and the other is static, the density figure carries the population’s observation year. | Follows the population refresh; the denominator effectively never changes. |
| Urban population share | World Bank WDI (SP.URB.TOTL.IN.ZS). | Annual; taken on each rebuild. |
| Internet users share | World Bank WDI (IT.NET.USER.ZS), ITU data. | Annual; taken on each rebuild. |
| CO2 emissions | Our World in Data, CO2 and Greenhouse Gas Emissions (CC BY 4.0), built on the Global Carbon Budget. It covers 215 entities against the World Bank’s 203 and runs a year ahead, so the World Bank series (EN.GHG.CO2.MT.CE.AR5) is kept only as a fallback. | Annual, roughly one-year lag; taken on each rebuild. |
| CO2 emissions per capita | Our World in Data, CO2 and Greenhouse Gas Emissions (CC BY 4.0), with the World Bank series as fallback. | Annual; taken on each rebuild. |
| Military expenditure | World Bank WDI (MS.MIL.XPND.CD), derived from SIPRI. | Annual, with a one-to-two-year lag; taken on each rebuild. |
| Military expenditure share of GDP | World Bank WDI (MS.MIL.XPND.GD.ZS). | Annual; taken on each rebuild. |
| Armed forces personnel | World Bank WDI (MS.MIL.TOTL.P1). | The global series has not updated since 2020; every figure shows its observation year. |
| Price level (US = 100) | Computed from World Bank PA.NUS.PPP and PA.NUS.FCRF. | Annual PPP updates; exchange rates lag differently by country. Taken on each rebuild. |
| Average monthly earnings | ILOSTAT (EAR_EMTA_SEX_CUR_NB_A), CC BY 4.0. Where the ILO publishes a country only in local currency, we convert at the World Bank exchange rate for that observation’s own year. | Country vintages vary widely (2019-2025); every figure shows its year. |
| Monthly minimum wage | ILOSTAT (EAR_INEE_CUR_NB_A), CC BY 4.0. | Annual, and unusually current: most countries carry a 2024 or 2025 figure. |
| Heads of state and government | Wikidata (CC0), queried by ISO code; each change is diffed against the previous snapshot and listed in the refresh log | Pulled on each refresh; Wikidata itself tracks changes within hours |
| Capitals, languages, currencies, borders, flags | mledoze/countries reference dataset (ODbL 1.0), vendored into this repository at a pinned revision | Static; changes only when we re-vendor the dataset by hand |
| Geography, history, government prose | CIA World Factbook final edition (public domain) | Frozen; labeled historical |
The pipeline
- 01 Fetch. A scheduled job pulls all live sources (35 HTTP requests for a clean run) and stores dated snapshots in our repository. A source that fails keeps its last good snapshot and the run exits with an error, so nothing downstream can publish a half-updated mix of vintages.
- 02 Validate. Sanity gates run before any snapshot is accepted. Each indicator is measured against the previous snapshot and may not quietly lose more than 5% of its entities; the twenty largest populations may not move more than 5% between runs; and reference values are asserted outright (if India’s population comes back under 1.3 billion, the run stops). A gate that trips aborts the source rather than overwriting good data with bad.
- 03 Normalize. CIA GEC codes are joined to ISO codes through a hand-verified 261-entity mapping (the CIA’s "ch" is China, not Switzerland). Every value is stored with its source, observation year, and retrieval date. Normalize refuses to run on a snapshot that is missing, hollow, or flagged as failed by the fetch step.
- 04 Publish. The site rebuilds from the committed snapshots. A page’s "updated" date changes only when its underlying data actually changed, never because the site redeployed. Sitemap lastmod dates follow the same rule.
There is no human approval step in that chain. Once the gates pass, the refresh commits and the site rebuilds without anyone signing it off. We think that is worth stating plainly rather than implying an editorial desk that does not exist. What we do instead is make the machine's work inspectable: the run writes a per-source status file, and every leadership change it found in Wikidata is listed in the refresh job's log so a change of head of state is visible as an event rather than appearing silently. The gates above are the real defence against a bad upstream value, and the source-and-year label on every figure is what lets you check ours against the publisher's.
Known limitations
- 38 of our 254 countries and territories have no live source for population or GDP. Some (the Paracel Islands, Akrotiri, the Coral Sea Islands) have no ISO code and so no join at all; others (Jersey, Vatican City, Western Sahara, the Cook Islands) have a code but sit outside the World Bank's country list. A few of them still pick up UN population-structure or CO2 figures. Where nothing live exists, the profile is the archive and says so.
- Armed forces personnel data has not been updated globally since 2020; we show it with its observation year rather than hide it.
- Observation years differ across countries within the same table. We print per-row years instead of pretending a single "2026" vintage exists.
- Four Factbook entities are parts of a single ISO territory: the Gaza Strip and West Bank both map to PSE, Svalbard and Jan Mayen both map to SJM. Live feeds report the combined territory, so we use the archive's genuine per-part figures and omit these entities from tables where only a combined figure exists.
- Where no live source covers an entity, ranked tables carry its final Factbook value and mark the row archive. Defence spending in dollars has no archived equivalent, since the Factbook reported only a share of GDP, so those rows are computed from that share and marked derived.
- Some crisis-economy official statistics (inflation in particular) are contested; we show the international series and note disputes on field pages.
Found an error? Tell us. We fix what we can verify, and the fix reaches the site on the next refresh that runs after it lands.