Health Care Services · World Health Organization (WHO)
WHO Global Health Observatory Data Repository
Datadory delivers who global health observatory data repository data as analysis-ready rows: over 3,000 health indicators - workforce density, hospital beds, service coverage, mortality by cause, health financing and risk factors - observed across all 194 WHO Member States with sex, age and wealth breakdowns intact, normalized to one typed schema and delivered daily, weekly, or hourly.
API, files, or your warehouse. Daily, weekly, or hourly.
- Where it covers
- 194 WHO Member States plus WHO regions, World Bank income groups and global aggregates - country rows and rollups share one schema
- How far back
- Series commonly span 1990 to present, with selected indicators reaching back to the 1970s; each record carries its own period bounds and last-loaded stamp
- How fine
- Country-year-indicator rows, disaggregated by sex, age, wealth quintile, urban/rural and further dimensions depending on the indicator
What is the WHO Global Health Observatory Data Repository?
The central health-statistics repository of the World Health Organization, resolved by Datadory into typed, join-ready rows. It is organized around three themes - Universal Health Coverage, Health Emergencies and Health and Well-Being - plus roughly 35 topic areas covering malaria, HIV, tuberculosis, noncommunicable diseases, immunization, water and sanitation, tobacco control and the rest of the global-health canon.
This is the evidence base behind the charts everyone quotes: physician and nursing density, hospital beds per 10,000 population, service coverage indices, cause-specific mortality from the Global Health Estimates, health spending by country. Verified during the August 2026 research pass at 3,093 distinct indicator codes, each resolving to observation rows that carry the geography, the year, the sex and age splits, an attributed origin where the indicator distinguishes sources, and the uncertainty bounds around the estimate. As published it is a browsing experience built for humans; as delivered it is a schema built for models.
What do sample rows look like?
Two verified observations from the hospital-bed density indicator, laid out exactly as they arrive:
indicator_code : WHOSIS_000004 indicator_name: Hospital beds per 10,000 population
spatial_type : COUNTRY spatial_dim: AZE parent_location: Europe (EUR)
time_dim : 2016
dim1 : SEX_MLE (male)
value : "143" numeric_value: 143.4084514
indicator_code : WHOSIS_000004 indicator_name: Hospital beds per 10,000 population
spatial_type : GLOBAL spatial_dim: GLOBAL
time_dim : 2004
dim1 : SEX_BTSX (both sexes)
value : "176" numeric_value: 175.9135015Read the shape, not just the numbers. One row per indicator x geography x year x disaggregation, with the display-formatted value, the typed numeric estimate and the last-loaded stamp travelling together. The same code yields sibling rows for each sex split, and world aggregates occupy the same geography dimension as countries - so 143 stays attributable to Azerbaijani male-reported bed density in 2016, forever.
Start with a sample of this dataset cut to the indicators and countries you track.
What fields does the dataset include?
Twenty-four documented fields cover every row, all twenty-four verified during the August 2026 research pass. The locating quartet - IndicatorCode, SpatialDim with its type, TimeDim with its type - pins each row to a concept, a place and a year, and the ParentLocation pair preserves the regional hierarchy so rollups can be rebuilt rather than trusted.
The measurement set carries the published display value, the numeric point estimate and the lower and upper bounds of the uncertainty interval, so a figure never detaches from its error bars. Six disaggregation slots (three dimension-type/value pairs) absorb sex, age, wealth quintile, urban/rural and whatever else a given indicator publishes. Integrity rides along too: the attributed source where an indicator distinguishes origins, free-text comments, the last-loaded stamp, and normalized period keys for clean calendar joins.
How much history does the data cover?
Series commonly span 1990 to the present, giving three decades of comparably-defined context on the flagship indicators, and selected measures reach back to the 1970s. Each record carries its own period bounds and a last-loaded timestamp - the hospital-bed family was observed carrying an October 2024 load stamp - so recency is a queryable attribute of every row rather than a claim about the catalog as a whole.
For panel construction the useful property is stability: a country-year row from 1995 joins cleanly to the same country-year row from 2024, because the indicator codes and dimension structure hold still while the values move. Where an indicator's history runs thinner than its neighbors, the missing years show up as absent rows - data-shaped silence you can measure, not gaps you discover after publication.
Who uses this dataset?
Health economists build the 194-country panels that papers and preprints run on. Policy analysts at ministries, agencies and NGOs benchmark national performance against regional and income-group peers inside the same schema. Insurers and actuaries lean on decades of mortality, capacity and service-coverage series for pricing and market-entry scenarios, pharma and medtech teams size territories from immunization, disease-program and financing denominators, and journalists resolve the famous league-table charts into rows early enough to check them.
See the persona pages for data scientists and journalists and academics working in health care services.
Why get it as a Datadory delivery instead of the repository as published?
Because the published form is a browsing experience over 3,093 indicator codes, each with its own dimension configuration - and the analysis lives in the assembly. Building one multi-country, multi-indicator panel by hand means enumerating codes one by one, harmonizing disaggregations that change per indicator, and separating un-disaggregated rows from sex-split siblings before they silently double-count. Datadory does that work once, upstream, and ships the result as one normalized schema.
Field definitions are verified against the live catalog rather than guessed from documentation, indicator-specific breakdowns fold under additional fields on request, and everything arrives delivered daily, weekly, or hourly over API, files, or your warehouse.
Start with a sample cut to the themes, geographies and years you actually need, then let the panel grow from there.
Field dictionary
Every field below is documented against real records. The full dictionary ships with the sample.
| Field | Type | Definition | Example |
|---|---|---|---|
Id | integer | Numeric row identifier assigned by the Observatory datastore. | 998 |
IndicatorCode | string | GHO indicator code naming the measured concept - the join key that holds still across countries and years while values move. | WHOSIS_000004 |
SpatialDimType | string | Geographic dimension type: COUNTRY for member states, GLOBAL for world aggregates, WHO_REGION and income-group types for the rollups. | COUNTRY |
SpatialDim | string | ISO-3 code of the country or area the observation belongs to, or the aggregate identifier when the row is a rollup. | AZE |
TimeDimType | string | Time dimension type, YEAR for annual indicators. | YEAR |
TimeDim | integer | Reference year of the observation - the panel's time key. | 2016 |
ParentLocationCode | string | Code of the parent geographic location above the row's geography, so regional rollups can be rebuilt from country rows. | EUR |
ParentLocation | string | Human-readable name of that parent location, keeping delivered files legible before any lookup table is joined. | Europe |
Dim1Type | string | First disaggregation dimension type, SEX on demographic indicators. | SEX |
Dim1 | string | First disaggregation value. Sex-coded indicators resolve as separate rows for male, female and both sexes rather than wide columns. | SEX_MLE |
Dim2Type | string | Second disaggregation dimension type where the indicator carries one - age bands, wealth quintiles or setting depending on the code. | (indicator-specific) |
Dim2 | string | Second disaggregation value, populated only on indicators whose configuration defines a second dimension. | (indicator-specific) |
Dim3Type | string | Third disaggregation dimension type where the indicator carries one. | (indicator-specific) |
Dim3 | string | Third disaggregation value, populated only on indicators whose configuration defines a third dimension. | (indicator-specific) |
DataSourceDim | string | Attributed origin of the estimate on indicators that distinguish sources, so provenance travels with the number instead of living in a footnote. | (where distinguished) |
Value | string | Display-formatted value as published, including qualifiers such as ranges or no-data markers. | 143 |
NumericValue | number | Point estimate of the indicator, typed numeric on arrival so no parsing step sits between the row and the model. | 143.4084514 |
Low | number | Lower bound of the confidence or uncertainty interval published with the estimate. | (interval-published estimates) |
High | number | Upper bound of the confidence or uncertainty interval published with the estimate. | (interval-published estimates) |
Comments | text | Free-text note attached to the observation by the publishing team. | (where annotated) |
Date | datetime | Last-loaded timestamp carried on the record, distinguishing a freshly restated estimate from one untouched in years. | 2024-10-31T10:23:48.47+01:00 |
TimeDimensionValue | string | Normalized time key matching TimeDim, handy when joining against calendar tables. | 2016 |
TimeDimensionBegin | datetime | Start of the period the observation covers. | (period bounds) |
TimeDimensionEnd | datetime | End of the period the observation covers. | (period bounds) |
Coverage at a glance
| Dimension | Coverage |
|---|---|
| Geographic | 194 WHO Member States plus WHO regions, World Bank income groups and global aggregates |
| Temporal | Series commonly span 1990 to present, selected indicators reaching the 1970s; per-record period bounds and last-loaded stamps |
| Granularity | Country-year-indicator rows, disaggregated by sex, age, wealth quintile, urban/rural and further dimensions per indicator |
| Themes | Universal Health Coverage, Health Emergencies, Health and Well-Being - roughly 35 topic areas from malaria and HIV to tobacco control |
| Delivery | Normalized rows via Datadory - daily, weekly, or hourly |
What teams do with it
- Cross-country health system benchmarking Put any country's hospital beds, clinician density or service coverage index against 193 peers in one panel instead of a folder of PDFs - the comparisons that anchor white papers become a filter on your side.
- Health workforce capacity modelling Physician and nursing density series stacked across decades and split by sex feed supply projections, training-pipeline planning and hiring-market sizing for providers and staffing firms.
- Universal health coverage tracking The service-coverage family measures whether people actually receive care, not whether facilities exist - the yardstick for program evaluation, impact reporting and donor diligence.
- Burden-of-disease and epidemiology panels Cause-specific mortality joins cleanly against risk-factor and immunization indicators, ready-made response variables for cohort studies and inequality work.
- Health financing analysis Expenditure indicators across 194 economies give payers, ministries and suppliers comparable denominators for market sizing - including the low-income markets national statistics miss.
- Facility and infrastructure demand forecasting Bed density and capacity trends joined against ageing demographics give operators and investors a demand curve per market, not a conference anecdote.
Questions buyers ask
What does the WHO Global Health Observatory Data Repository contain?
Over 3,000 distinct indicator codes - 3,093 verified during the August 2026 research pass - across three themes and roughly 35 topic areas: health workforce, hospital beds, service coverage, cause-specific mortality, health financing, immunization, risk factors and more, delivered by Datadory as typed, joinable rows rather than a browsing interface.
Which countries and geographies does it cover?
All 194 WHO Member States as country-level rows, plus WHO regions, World Bank income groups and global aggregates in the same schema. Depending on the indicator, rows further disaggregate by sex, age band, wealth quintile and urban versus rural setting.
How far back does the data go?
Series commonly span 1990 to the present, with selected indicators reaching back to the 1970s. Every record carries its own period bounds and last-loaded stamp, so the age of any individual figure is queryable rather than assumed from the catalog as a whole.
How granular is one observation?
One row per indicator x geography x year x disaggregation. A single hospital-bed density code resolves separately for each country and for world and regional aggregates, and sex-coded indicators publish male, female and both-sexes rows as siblings rather than wide columns.
How does it differ from other global health datasets?
It is the World Health Organization's own reference collection - the broadest single-institution view of health systems worldwide, and the indicator base shared with the newer WHO data portal. Compared with membership-only datasets it trades depth per member for global reach, bringing low-income countries inside one set of definitions.
Can a sample be cut to specific indicators or countries?
Yes. Name the indicator codes or theme areas, the countries and the year range you need, and the sample arrives shaped to exactly that slice with the verified field dictionary attached - and any indicator-specific disaggregations confirmed against your named scope rather than promised generically.
Notes on this record
- One code, many shapes A single indicator code resolves once per country, year and disaggregation - thousands of codes multiply into millions of rows, and assembling them is exactly the work a normalized delivery absorbs.
- Bounds travel with the estimate Lower and upper uncertainty intervals ride beside each point estimate where published, because a bed-density figure quoted without its interval is a headline pretending to be a measurement.
- The sex split is analytic content Sex-coded indicators exist as separate male, female and both-sexes rows. Treat the dimension as a filter and you keep the numbers but lose the gaps - which are often the story.
- Aggregates sit beside countries Global, WHO-region and income-group rows live in the same geography dimension as member states. Average without filtering by level and you double-count the world inside your own average.
- Freshness is a field, not a promise Every row carries its own last-loaded stamp and period bounds, so a model can weight a recently restated estimate differently from one untouched for a decade.
See the rows before you pay anything.
Name this dataset and we send real records from it — scoped to the fields you asked for.