WHO Global Health Observatory Scraper avatar

WHO Global Health Observatory Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
WHO Global Health Observatory Scraper

WHO Global Health Observatory Scraper

Scrape WHO health indicators by indicator code, or list all ~980 public indicators of the WHO World Health Data Hub. Extract country, year, value, low/high CI and sex dimension for health analytics, research and dashboards. No API key, no login.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Logiover

Logiover

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

2 days ago

Last modified

Share

WHO Global Health Observatory Scraper — Indicators, Countries, Years & Confidence Intervals

Extract any of the ~980 public WHO health indicators across all countries and years with zero API key or login required.

What does WHO GHO Scraper do?

This actor queries the World Health Organization's keyless World Health Data Hub OData service (https://xmart-api-public.who.int/DATA_/). WHO retired the older Global Health Observatory (GHO) API (ghoapi.azureedge.net, which now answers HTTP 500 on every request) and publishes the same indicators — with the same GHO indicator codes such as WHOSIS_000001 — in the Data Hub. The output fields are unchanged. Requests go direct first and fall back to Apify Proxy if WHO blocks a route.

The actor supports two modes: List all indicators (returning the ~980 public indicator codes and names in one run) and Indicator data (fetching country/year data rows for one or more indicator codes). Pagination is handled automatically in pages of up to 2,000 rows, with smaller requests when maxResults has less remaining. A full, unlimited run (maxResults: 0) on a high-coverage indicator like Life Expectancy (WHOSIS_000001) can return 14,000+ country and aggregate rows spanning 30+ years; the safe default caps output at 5,000 rows. Each completed page is written immediately, so results already fetched are preserved if the WHO service slows down near the run timeout. Each row includes the numeric value, lower/upper confidence interval bounds, the sex or age dimension, spatial code and type, WHO region, and the original formatted value string.

Who is it for?

  • Global health researchers analyzing mortality, disease burden, and health equity trends across countries.
  • Data journalists and NGOs building reports on WHO targets, SDG progress, and pandemic impact.
  • Public health consultants who need structured, machine-readable WHO data for client dashboards.
  • Data engineers feeding WHO indicators into warehouses (BigQuery, Snowflake, Postgres) or BI tools (Tableau, Power BI, Looker).
  • Academics and students doing quantitative analysis on global health datasets without manual CSV downloads.

Use cases

  • Track life expectancy trends by country and sex from 2000 to present for SDG-3 reporting.
  • Compare maternal mortality ratios across WHO regions to identify where interventions are needed.
  • Build a COVID-19 excess mortality dashboard by pulling multiple indicator codes in one run.
  • Export WHO child malnutrition data into Google Sheets for NGO grant proposals.
  • Power an AI agent that answers health questions by retrieving the latest WHO data programmatically.

Why use WHO GHO Scraper?

  • Completely keyless — no WHO account, no API registration, no cookies required.
  • 11 output fields per row, including the indicator, spatial code and type, year, value, confidence interval, primary dimension, region, and raw value.
  • Bulk extraction — set maxResults to 0 and allow a sufficient run timeout for large multi-indicator exports; completed pages are saved progressively.
  • Country and result-count filters — limit to specific ISO3 countries or cap total rows for quick previews.
  • Export to CSV, JSON, or Excel in one click from the Apify dataset viewer.
  • Pay-per-result pricing — you only pay for what you extract.

What data can you extract?

Every data row from the WHO Data Hub is returned with the following fields:

FieldTypeDescription
indicatorCodestringWHO GHO indicator code, e.g. WHOSIS_000001
indicatorNamestringHuman-readable indicator name, e.g. "Life expectancy at birth (years)"
countrystringWHO spatial code. It is ISO3 for country rows, but can also be an aggregate such as GLOBAL, SEAR, or WB_HI
spatialDimensionTypestringDistinguishes COUNTRY, GLOBAL, REGION, WORLDBANKINCOMEGROUP, and other WHO spatial levels
yearstringYear of the observation, e.g. 2019
valuenumberNumeric value of the indicator for that country/year/dimension
lownumberLower bound of the 95% confidence interval
highnumberUpper bound of the 95% confidence interval
dimensionstringDimension of the row (e.g. SEX_BTSX = both sexes, SEX_MLE = male, SEX_FMLE = female). Other breakdowns use WHO Data Hub dimension names, and rows with several dimensions join them with ;
parentLocationstringWHO region name (e.g. "Europe", "South-East Asia")
rawValuestringOriginal formatted string from WHO (e.g. "73.2 [72.8-73.6]")

JSON output example:

{
"indicatorCode": "WHOSIS_000001",
"indicatorName": "Life expectancy at birth (years)",
"country": "USA",
"spatialDimensionType": "COUNTRY",
"year": "2019",
"value": 78.53,
"low": 78.11,
"high": 78.95,
"dimension": "SEX_BTSX",
"parentLocation": "Americas",
"rawValue": "78.5 [78.1-79.0]"
}

How to use

Option A — Fetch data for specific indicators

Provide a list of WHO GHO indicator codes (find codes using the indicators mode below). The actor fetches all country/year rows for each code.

Step-by-step:

  1. Open the actor and go to Input.
  2. Set Mode to Indicator Data.
  3. Enter one or more codes in Indicator Codes, e.g. WHOSIS_000001.
  4. Optionally add ISO3 country codes in Country Filter to limit scope.
  5. Keep the safe Max Results default of 5000, choose a smaller number for a preview, or set 0 for an unlimited export and increase the run timeout when needed.
  6. Click Start.
{
"mode": "indicatorData",
"indicatorCodes": ["WHOSIS_000001", "WHOSIS_000002"],
"countryFilter": ["USA", "GBR", "DEU", "FRA"],
"maxResults": 5000,
"proxyConfiguration": { "useApifyProxy": true }
}

Option B — List all available indicators

Use this mode to discover the ~980 public indicator codes and their names before deciding which to fetch.

Step-by-step:

  1. Set Mode to List All Indicators.
  2. Leave all other fields at default.
  3. Click Start — you'll get ~980 rows with indicatorCode and indicatorName filled.
{
"mode": "indicators",
"maxResults": 0
}

Input parameters

ParameterTypeDefaultDescription
modestringindicatorDataindicatorData or indicators
indicatorCodesarray["WHOSIS_000001"]WHO GHO indicator codes to fetch (indicatorData mode only)
countryFilterarray[]ISO3 country codes to filter (empty = all countries)
maxResultsinteger5000Max rows across all indicators; 0 requests all rows and may require a longer run timeout
proxyConfigurationobjectApify Proxy (automatic)Optional proxy settings; failed/slow routes fall back between fresh proxy sessions and direct access

Full input JSON:

{
"mode": "indicatorData",
"indicatorCodes": ["WHOSIS_000001"],
"countryFilter": [],
"maxResults": 5000,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Output example

{
"indicatorCode": "WHOSIS_000001",
"indicatorName": "Life expectancy at birth (years)",
"country": "JPN",
"spatialDimensionType": "COUNTRY",
"year": "2021",
"value": 84.26,
"low": 83.91,
"high": 84.61,
"dimension": "SEX_BTSX",
"parentLocation": "Western Pacific",
"rawValue": "84.3 [83.9-84.6]"
}

Tips for best results

  • Find indicator codes first: Run in indicators mode to get the full list, then search for keywords like "mortality", "tuberculosis", or "obesity" to find the right codes.
  • Use country filter for focused analysis: Pass ISO3 codes (e.g. ["USA", "GBR", "CAN"]) to avoid fetching global data when you only need a few countries.
  • Multiple indicators in one run: Add all your codes to indicatorCodes — the actor processes them sequentially and pushes all rows to one dataset.
  • Check the dimension field: Many indicators have multiple rows per country/year split by sex (SEX_MLE, SEX_FMLE, SEX_BTSX) or other breakdowns; rows with several dimensions join them with ;. Filter in post-processing if needed.
  • rawValue for display: Use rawValue for human-readable strings like "73.2 [72.8-73.6]"; use value, low, high for numeric analysis.
  • Set maxResults to 500 for a quick preview before a full run on a large indicator.
  • Schedule monthly runs: WHO updates data periodically; set up an Apify schedule to keep your dataset fresh.
  • Export to Google Sheets: Use the Apify→Google Sheets integration in the Actors section to automatically write results to a spreadsheet after each run.

Integrations

  • Google Sheets: Use the built-in Apify integration to export dataset rows to a spreadsheet automatically after each run.
  • Slack: Set up Apify webhooks to notify a Slack channel when a scheduled run completes.
  • Zapier / Make (Integromat): Trigger downstream workflows when new WHO data is available — push to databases, send emails, or update dashboards.
  • Webhooks: Configure a webhook URL in Actor settings to POST run metadata to your own API on completion.
  • Schedule: Set up a recurring schedule (weekly/monthly) in Apify Console to keep your WHO data fresh without manual runs.

API usage

cURL:

curl -X POST \
"https://api.apify.com/v2/acts/logiover~who-gho-scraper/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "indicatorData",
"indicatorCodes": ["WHOSIS_000001"],
"countryFilter": [],
"maxResults": 5000
}'

Node.js (Apify Client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('logiover/who-gho-scraper').call({
mode: 'indicatorData',
indicatorCodes: ['WHOSIS_000001', 'WHOSIS_000002'],
countryFilter: ['USA', 'GBR'],
maxResults: 5000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("logiover/who-gho-scraper").call(run_input={
"mode": "indicatorData",
"indicatorCodes": ["WHOSIS_000001"],
"countryFilter": [],
"maxResults": 5000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Use with AI agents (MCP)

This actor is compatible with Apify's Model Context Protocol (MCP) integration, allowing AI agents to call it directly. An agent can discover available WHO indicators and then fetch structured health data for downstream reasoning — for example: "Fetch life expectancy and maternal mortality for all Sub-Saharan African countries from 2010 to 2023 and identify the three countries with the greatest improvement." Connect the actor via the Apify MCP server and pass structured inputs; the agent receives paginated JSON rows ready for analysis.

FAQ

Does this actor require an API key or WHO account?

No. The WHO World Health Data Hub OData service (xmart-api-public.who.int) is keyless. WHO retired the older GHO endpoint (ghoapi.azureedge.net), and this Actor now reads the Data Hub; an upstream outage fails explicitly instead of producing a successful empty dataset.

How many indicators does WHO GHO cover?

The WHO Data Hub catalogue lists about 980 public indicator codes (checked on 2026-11-01), including every GHO health-statistics indicator such as WHOSIS_000001. The catalogue changes over time. The indicators span mortality, disease burden, nutrition, mental health, tobacco, alcohol, and health-system performance.

How many rows does one indicator return?

It varies. An unlimited Life Expectancy (WHOSIS_000001) run returns roughly 14,000 rows (all countries × years × sex breakdowns), while the default run stops at 5,000. Niche indicators may return only a few hundred. Set maxResults to 0 and allow a longer run timeout when you need the complete high-volume dataset.

What if I get zero results?

Check that the indicator code exists by running in indicators mode first. Only codes that exist in the WHO Data Hub catalogue return rows; legacy alias codes from the retired GHO API are not resolved. Also verify your country filter uses valid ISO3 codes.

Why are some value, low, or high fields null?

WHO data is not always complete. Some country/year combinations have aggregate text values but no numeric breakdown — in those cases value will be null and you should check rawValue for the formatted string.

Why does country sometimes contain GLOBAL, SEAR, or WB_HI?

country is the Actor's legacy name for WHO's SpatialDim field. Check spatialDimensionType: COUNTRY rows contain ISO3 country codes, while other values identify global, WHO-region, or World Bank income-group aggregates.

Can I export to Excel or CSV?

Yes. In the Apify dataset viewer, click the download button and select CSV, XLSX, or JSON. You can also use the Apify API to download programmatically.

How fast does the actor run?

Runtime depends on the WHO Data Hub's latency, selected indicators, filters, and proxy route. The Actor requests only the remaining row count (up to 2,000), writes every completed page immediately, and stops cleanly before the platform deadline. Use a country filter and a small maxResults for the most predictable preview; unlimited exports remain dependent on WHO service availability.

WHO data is published under the Creative Commons Attribution 4.0 International license (CC BY 4.0), which permits free use, redistribution, and adaptation with attribution. Always cite WHO as your data source in publications.

How often does WHO update the data?

WHO typically updates GHO data annually or when new country estimates are published. The Actor's year is the observation year and rawValue is the formatted observation value; neither should be interpreted as the upstream record-update timestamp.

What other health data actors are available?

Can I filter by WHO region instead of country?

Not directly in the input. The parentLocation field in the output contains the WHO region name. Fetch all countries and filter by parentLocation in post-processing (e.g. using pandas or Google Sheets).

Does the actor handle rate limits?

The actor makes up to four bounded attempts per data request (direct first, then fresh proxy sessions), honours 429 back-off, and never lets retries run through the Actor shutdown reserve. The optional human-readable indicator-name lookup gets one short attempt and falls back to the indicator code, so metadata latency cannot block the actual data request.

This actor queries the official WHO World Health Data Hub public OData service. All data is openly published by the World Health Organization and licensed under CC BY 4.0. No authentication bypass, scraping of protected content, or terms-of-service violation occurs. Users are responsible for citing WHO as the data source in any derivative work or publication and for complying with the WHO data use policy. This actor does not collect, store, or redistribute any personal data.

This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by WHO Global Health Observatory; WHO Global Health Observatory and all other trademarks mentioned here are the property of their respective owners.

How to scrape WHO Global Health Observatory without an API

WHO Global Health Observatory has no public bulk export for this data, which normally leaves copy-and-paste or a custom crawler. This Actor is the second one, already built and maintained: it reads the public pages, follows the pagination, and hands back clean rows.

  1. Fill in the input below — the example is prefilled, so Start works straight away.
  2. Watch the log name each page it walks and how many rows each one returned.
  3. Export from Storage, or pull the dataset over the API into your own pipeline.

No API key, no account, no browser extension, no manual copying.

📝 Changelog

2026-11-01

  • Moved to the World Health Data Hub OData service because WHO's legacy GHO API (ghoapi.azureedge.net) now answers HTTP 500 on every request.
  • Output fields are unchanged: country codes stay ISO3 or the familiar GLOBAL/AFR/SEAR/WB_HI aggregates, and sex splits stay SEX_BTSX, SEX_MLE and SEX_FMLE.
  • List All Indicators now reads the Data Hub catalogue (about 980 public indicators, including every WHO health-statistics indicator such as WHOSIS_000001) instead of the retired 3,000-entry GHO list.
  • Indicators that have several breakdowns now put every dimension into the dimension field, separated by semicolons.
  • Indicator codes that are not in the WHO Data Hub catalogue now end the run with a clear status message instead of an empty result.
  • A run that cannot reach WHO now fails with WHO's actual HTTP status instead of finishing successfully with zero rows.
  • README refreshed: independence disclaimer added.

2026-10-15

  • Every request now has a hard time limit, so a proxy connection that stalls can no longer hold up the run or push it past its timeout.
  • A run that reaches its maximum cost per run now stops cleanly with its results saved and a status message, instead of ending as aborted.
  • A proxy group your account cannot use no longer stops the run at start-up; it falls back to the default Apify Proxy.
  • Runs with a short timeout (API and AI-agent calls) now finish inside it with what they collected, instead of being cut off.
  • Memory is managed within the run's own limit, which removes a rare out-of-memory crash on large pages.

2026-09-23

  • Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
  • Run reliability reviewed: 100.0% of public runs succeeded in the last 30 days.
  • Input schema, output schema and pricing configuration reviewed.

2026-09-01

  • Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
  • Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
  • No change to input, output fields or scraping logic.

2026-08-11

  • Maintenance release: refreshed the build and dependencies.
  • Re-verified live execution, non-empty structured output and dataset field/type integrity.
  • Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

2026-08-01

  • Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
  • Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.
  • Changed WHO pagination to persist every completed 1,000-row page immediately, preventing a slow final page or platform timeout from discarding thousands of already-fetched records.
  • Made request retries aware of the actual Actor deadline, reserved time for a clean exit, and bounded each data request to one proxy attempt followed by one direct attempt.
  • Bounded the default output to 5,000 rows, documented the timeout requirements for unlimited exports, and made zero-record upstream failures fail explicitly instead of reporting a misleading successful empty run.
  • Added spatialDimensionType and relabeled the legacy country column as a spatial code so WHO aggregate rows such as GLOBAL, SEAR, and WB_HI are no longer misrepresented as ISO3 countries.
  • Declared all 11 emitted fields as nullable and restored spatialDimensionType, fixing the live indicators-mode schema-validation failure.
  • Kept country filtering inside the WHO OData query and reduced capped pages to the exact remaining row count instead of downloading a full 1,000-row page for small runs.
  • Made indicator-name enrichment a single short best-effort request with indicator-code fallback, so deprecated metadata latency cannot block the actual data fetch.
  • Verified WHO's official migration notice and documented that the GHO endpoint is deprecated while the advertised WHDH OData replacement link still has no usable URL; avoided a speculative migration.

2026-08-01 — Health-check remediation

  • August 2026 monthly health-check remediation is in progress; this build contains fixes verified from empty/default, Console-default, targeted live probes, or field-level semantic review.
  • Changed WHO pagination to persist every completed 1,000-row page immediately, preventing a slow final page or platform timeout from discarding thousands of already-fetched records.
  • Made request retries aware of the actual Actor deadline, reserved time for a clean exit, and alternated fresh proxy sessions with direct WHO access so one degraded route cannot consume the whole run.
  • Bounded the default output to 5,000 rows, documented the timeout requirements for unlimited exports, and made zero-record upstream failures fail explicitly instead of reporting a misleading successful empty run.
  • Added spatialDimensionType and relabeled the legacy country column as a spatial code so WHO aggregate rows such as GLOBAL, SEAR, and WB_HI are no longer misrepresented as ISO3 countries.
  • Verified WHO's current official migration notice: the old GHO OData endpoint is deprecated, while the advertised WHDH OData link still has no usable URL. Kept the last documented contract and documented this upstream risk instead of shipping a speculative endpoint.
  • Reduced each capped request to the exact remaining result count, retained server-side country filtering, limited data fetches to two bounded routes, and made the non-critical indicator-name lookup a single short attempt with code fallback.
  • Restored the nullable spatialDimensionType dataset field required by real indicators-mode output, eliminating the schema-validation failure observed after a successful live WHO response.
  • The final four-input matrix verdict will be appended after post-build cloud revalidation.

*Maintained: last verified 2026-11-01 — checked end-to-end against live run history (reliability, output fields and types, and time/memory budgets).