HealthWatch Global
DashboardDiseasesCountriesAlertsCompareReportsPricingAbout
Sign inPilot →Create account
HealthWatch Global·© 2026
AboutData methodologyPrivacy PolicyTerms of ServiceLegal noticeContactInstitutional PilotDPAInstitutionalRSScontact@healthwatch-global.com

We use local storage to remember your preferences and measure audience anonymously (Vercel Analytics — no personal data collected). Privacy Policy

Enterprise · API Reference

API Documentation

Programmatic access to WHO, ECDC, PAHO and Africa CDC outbreak data, updated every hour. Available on the Enterprise plan. Manage your API keys from your account.

Looking for the embeddable widget?

Embed a live outbreak feed on any site — one iframe, no API key required.

Widget embed docs →

Free RSS feed — no API key required

Subscribe to active outbreaks in any RSS reader. https://healthwatch-global.com/api/feed?locale=en&region=africa

View feed
Quick start
bash
curl https://healthwatch-global.com/api/v1/outbreaks \
  -H "X-API-Key: hwg_your_key_here"

Replace hwg_your_key_here with a key generated in your account settings.

Academic or research institution?

Request a 30-day trial API key — no credit card required. We review requests within 24 h.

Request trial key →

Contents

  • Authentication
  • Base URL
  • Endpoints
  • Query parameters
  • Response schema
  • Data quality & source tiers
  • Code examples
  • Rate limits
  • Error codes

Authentication

All API requests must include your API key in the X-API-Key header. Keys are prefixed with hwg_ and can be created and revoked at any time from your account settings.

Do
  • Store keys in environment variables
  • Rotate keys periodically
  • Use one key per environment (prod / staging)
  • Revoke unused keys immediately
Don't
  • Commit keys to source control
  • Expose keys client-side (browser, mobile)
  • Share keys between team members
  • Log raw key values in production

Base URL

https://healthwatch-global.com/api/v1

All endpoints are versioned. The current version is v1. Breaking changes will increment the version.

Endpoints

GET/api/v1/outbreaks

Returns a paginated list of active disease outbreaks sourced from WHO, ECDC, PAHO and Africa CDC, sorted by date descending.

Data is refreshed every hour from WHO, ECDC, PAHO and Africa CDC.

Query parameters

ParameterTypeRequiredDescription
regionstringoptionalFilter by region: africa · asia · americas · europe · oceania
riskstringoptionalFilter by risk level: high · medium · low
limitintegeroptionalNumber of results per page (1–100, default 50)
offsetintegeroptionalPagination offset — number of records to skip (default 0)

Response schema

json
{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "disease": "Ebola virus disease",
      "country": "DR Congo",
      "region": "africa",
      "lat": -4.0,
      "lng": 21.8,
      "risk_level": "high",
      "cases": 381,
      "deaths": 64,
      "date": "2026-06-03",
      "source": "https://www.who.int/emergencies/disease-outbreak-news/item/2026-DON603",
      "description": "As of 3 June 2026, the Ministry of Health DRC...",
      "is_pheic": false,
      "active": true
    }
  ],
  "total": 39,
  "limit": 50,
  "offset": 0
}
FieldTypeDescription
idstringUnique UUID identifier
diseasestringDisease name (English)
countrystringAffected country (English)
regionstringContinent: africa · asia · americas · europe · oceania
lat / lngnumberGeographic coordinates of the country centroid
risk_levelstringRisk level: high · medium · low
casesintegerConfirmed case count (0 = not reported in this bulletin)
deathsintegerConfirmed death count
datestringReport publication date (ISO 8601: YYYY-MM-DD)
sourcestringSource URL — WHO DON bulletin, ECDC, PAHO, or Africa CDC report page
descriptionstringSummary extracted from the source bulletin (≤ 400 chars)
is_pheicbooleanTrue when WHO has declared a Public Health Emergency of International Concern
activebooleanFalse for deactivated / resolved outbreaks

Data quality & source tiers

Every outbreak record carries an implicit source tier derived from its source URL. Use this to decide how to handle the data in your own analysis or citation workflow.

WHO DONWHO Disease Outbreak News

Source URL contains /emergencies/disease-outbreak-news/item/ with a unique reference number (e.g. 2026-DON603). Directly citable in academic and institutional reports. The dashboard's citation copy button generates a ready-to-use reference for these rows.

source: "https://www.who.int/emergencies/disease-outbreak-news/item/2026-DON603"

ECDC / PAHO / Africa CDCOfficial non-DON source

Sourced from an ECDC Rapid Risk Assessment, PAHO Epidemiological Alert, or Africa CDC situation report. Data is authoritative but does not carry a WHO DON reference number. Use for internal monitoring; cite the linked source page directly in publications.

UNVERIFIEDProvisional — not yet matched to a confirmed bulletin

Figures are provisional and have not yet been matched to a confirmed WHO, ECDC, PAHO, or Africa CDC report. Treat as early-warning signal only. Do not cite in external reports. HealthWatch upgrades these rows to a higher tier as soon as a matching official bulletin is published.

To filter by tier in the API, check whether the source URL contains disease-outbreak-news/item/ (WHO DON), ecdc.europa.eu, paho.org, or africacdc.org (official), or is empty / a placeholder (unverified).

Code examples

cURL

bash
# All active outbreaks
curl "https://healthwatch-global.com/api/v1/outbreaks" \
  -H "X-API-Key: hwg_your_key_here"

# High-risk outbreaks in Africa, first 10
curl "https://healthwatch-global.com/api/v1/outbreaks?region=africa&risk=high&limit=10" \
  -H "X-API-Key: hwg_your_key_here"

# Paginate: skip first 50, get next 50
curl "https://healthwatch-global.com/api/v1/outbreaks?limit=50&offset=50" \
  -H "X-API-Key: hwg_your_key_here"

Python

python
import requests

API_KEY = "hwg_your_key_here"
BASE    = "https://healthwatch-global.com/api/v1"

def get_outbreaks(region=None, risk=None, limit=50, offset=0):
    params = {"limit": limit, "offset": offset}
    if region: params["region"] = region
    if risk:   params["risk"]   = risk

    resp = requests.get(
        f"{BASE}/outbreaks",
        headers={"X-API-Key": API_KEY},
        params=params,
        timeout=10,
    )
    resp.raise_for_status()
    return resp.json()

# Example: all high-risk outbreaks
result = get_outbreaks(risk="high")
for outbreak in result["data"]:
    print(f"{outbreak['disease']} — {outbreak['country']} ({outbreak['risk_level']})")

JavaScript / TypeScript

typescript
const API_KEY = process.env.HEALTHWATCH_API_KEY; // never expose client-side
const BASE    = "https://healthwatch-global.com/api/v1";

interface Outbreak {
  id: string;
  disease: string;
  country: string;
  region: string;
  lat: number;
  lng: number;
  risk_level: "high" | "medium" | "low";
  cases: number;
  deaths: number;
  date: string;
  source: string; // WHO DON, ECDC, PAHO, or Africa CDC URL
  description: string;
  is_pheic: boolean;
  active: boolean;
}

interface OutbreakResponse {
  data: Outbreak[];
  total: number;
  limit: number;
  offset: number;
}

async function getOutbreaks(params?: {
  region?: "africa" | "asia" | "americas" | "europe" | "oceania";
  risk?: "high" | "medium" | "low";
  limit?: number;
  offset?: number;
}): Promise<OutbreakResponse> {
  const url = new URL(`${BASE}/outbreaks`);
  if (params?.region) url.searchParams.set("region", params.region);
  if (params?.risk)   url.searchParams.set("risk",   params.risk);
  if (params?.limit)  url.searchParams.set("limit",  String(params.limit));
  if (params?.offset) url.searchParams.set("offset", String(params.offset));

  const res = await fetch(url.toString(), {
    headers: { "X-API-Key": API_KEY! },
    next: { revalidate: 3600 }, // cache 1h in Next.js
  });

  if (!res.ok) throw new Error(`API error: ${res.status}`);
  return res.json();
}

// Example
const { data } = await getOutbreaks({ region: "africa", risk: "high" });
console.log(data);

Rate limits

LimitValue
Requests per minute (per key)300
Max results per request100
Max API keys per account5

When a rate limit is exceeded, the API returns HTTP 429 with a Retry-After: 60 header. The X-RateLimit-Remaining response header shows remaining requests in the current window.

Error codes

HTTP StatusMeaning
200Success — response body contains requested data
400Bad request — invalid query parameter value
401Unauthorized — missing or invalid X-API-Key header
403Forbidden — API key valid but Enterprise subscription is not active
429Rate limit exceeded — retry after the value in the Retry-After header
500Internal server error — contact support if this persists

All error responses include a JSON body: { "error": "human-readable message" }

Embeddable widget

Embed a live outbreak feed on any website — no API key required. Copy the snippet below and paste it into your HTML.

Basic embed

html
<iframe
  src="https://healthwatch-global.com/widget?locale=en"
  width="400"
  height="320"
  frameborder="0"
  style="border-radius:12px;overflow:hidden;"
  title="HealthWatch Global — Live outbreak feed"
></iframe>

Parameters

ParamValuesDefault
localefr · en · es · ar · iden
regionafrica · asia · europe · americas · oceania · allall
themedark · lightdark
limit1 – 105

Example — Africa, French, light theme

html
<iframe
  src="https://healthwatch-global.com/widget?locale=fr&region=africa&theme=light&limit=7"
  width="380"
  height="400"
  frameborder="0"
  style="border-radius:12px;"
  title="Foyers épidémiques en Afrique — HealthWatch Global"
></iframe>

Ready to integrate?

Enterprise customers: generate your API key in account settings. Academic / research institution? Request a free trial key.

Go to account settings