Healthcare Facility and Workforce (SEA)

HLTHFC921· 6.0M records · 27 tables · v1.0.0 · Updated 2026-08-10
Healthcare Hospitals & Care Providers Dataset API
CSV JSON SQLfacility-registryworkforcestaffinghospital-tierssoutheast-asiaseacovid-19time-serieshealthcare

Overview

A registry-grade model of six national health systems. The national classification schemes (Indonesia's Kelas A to D, the Philippine DOH hospital levels, Thailand's regional, general and community tiers, and their Malaysian, Singaporean and Vietnamese counterparts) are modelled faithfully and normalised onto five cross-country tiers, populated with regions, districts and facilities down to village clinic level. 9,000 facilities carry ten years of annual capacity, department, accreditation, staffing and utilisation history, a specialist staffing matrix that covers every hospital-tier facility against all 42 specialties so that a zero is a finding rather than a missing row, and district-level disease burden joined to the same geography as the facilities. The 2019 to 2022 period is monthly: COVID bed conversions, admissions, ventilator use, oxygen status, service disruption and vaccination coverage for every facility for every month, with wave timing that differs by country and a 2022 that does not return cleanly to the 2019 baseline. The tables reconcile by construction: workforce density is exactly reproducible from facility staffing, specialist counts never exceed physician headcounts, catchment populations sum to district populations, and every declared relationship is a real foreign key. It is operational and workforce data about facilities, built for health-system analytics, capacity planning models, ETL pipelines and reporting logic. The licence and disclosure sections state the provenance of the data.

Analytics

Select a country on the map to see the figures the dataset records for it.

IndonesiaMalaysiaSingaporeThailandPhilippinesVietnam

Select a country on the map to see the figures the dataset records for it.

Row Counts by Table

Counted from the files that ship, not estimated.

TableRows
facilities9,000
facility_capacity90,000
facility_departments25,894
facility_accreditations6,579
facility_staffing911,860
specialist_staffing1,146,180
workforce_density2,760
catchments11,671
facility_utilisation90,000
referral_flows102,010
facility_covid_capacity432,000
covid_admissions432,000
service_disruption432,000
vaccination_coverage6,622
covid_waves24
disease_burden2,280,000
population_health_indicators2,760
condition_codes95
hf_countries6
hf_admin_regions276
hf_districts2,400
facility_tiers5
facility_classes33
ownership_types12
accreditation_bodies8
hf_specialties42
staff_categories18

Table Relationships

One parent record and seven child tables, each joined back on the same key.

70%
Loading diagram

Schema

Every table ships with typed columns, referential integrity, and documentation.

facilities· Rows: 9,000
ColumnTypeDescription
facility_idvarchar(16)Facility number. Primary key; foreign key on every facility-grain table.
facility_codevarchar(24)Registry-style code, <country>-<region>-<sequence><check letter>. Follows no real national coding scheme.
facility_namevarchar(48)Generated facility name: a facility-type frame in the country's own idiom around an invented place name. One name is deliberately shared by two unrelated facilities.
district_idvarchar(16)District the facility sits in.
class_idvarchar(32)National classification of the facility. Consistent with its capacity and department mix per the class minimums; the build re-verifies it.
tier_idvarchar(8)Cross-country tier, derived from the class.
ownership_idvarchar(16)Who owns and operates the facility.

+8 more columns in facilities. The full schema ships with the download.

facility_capacity· Rows: 90,000
ColumnTypeDescription
capacity_idvarchar(16)Capacity row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
yearintegerCalendar year of this capacity snapshot, 2015 to 2024.
total_bedsintegerTotal inpatient beds. Never below the facility class minimum.
icu_bedsintegerIntensive care beds. Zero at primary-care tiers and at many district hospitals.
isolation_bedsintegerIsolation beds. Jump in 2020 and 2021 through conversion and only partly revert afterwards.
maternity_bedsintegerMaternity beds, including the small maternity units at health centres.

+8 more columns in facility_capacity. The full schema ships with the download.

facility_departments· Rows: 25,894
ColumnTypeDescription
dept_idvarchar(16)Department row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
specialty_idvarchar(8)The specialty this department provides.
opened_yearintegerYear the department opened. Never before the facility was established.
inpatient_capablebooleanTrue when the department admits inpatients; false for diagnostic and support departments and at outpatient tiers.
twenty_four_hour_flagbooleanTrue for round-the-clock departments: emergency, obstetrics and anesthesiology at the referral tiers.
facility_accreditations· Rows: 6,579
ColumnTypeDescription
accreditation_idvarchar(16)Accreditation cycle key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
body_idvarchar(16)The accrediting body.
level_achievedvarchar(32)The level awarded in this cycle, from the body's own level list.
awarded_datedateDate the accreditation was awarded.
expiry_datedateDate it expires, three years after award.
statusvarchar(16)current, expired or lapsed. Lapsed means the facility let it run out without renewing, which real registries are full of.

+2 more columns in facility_accreditations. The full schema ships with the download.

facility_staffing· Rows: 911,860
ColumnTypeDescription
staffing_idvarchar(16)Staffing row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
category_idvarchar(16)The staff category counted in this row.
yearintegerCalendar year, 2015 to 2024.
headcountintegerPeople employed in the category. Zero with open vacancies is an unfilled establishment, the rural staffing finding, and is present on purpose.
ftenumeric(7,1)Full-time equivalents. In 2021 a deliberate cluster of facilities shows headcount rising while FTE falls: isolation and secondment, not an error.
vacanciesintegerUnfilled established posts.

+3 more columns in facility_staffing. The full schema ships with the download.

specialist_staffing· Rows: 1,146,180
ColumnTypeDescription
spec_staffing_idvarchar(16)Specialist staffing row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
specialty_idvarchar(8)The specialty counted in this row.
yearintegerCalendar year, 2015 to 2024.
consultant_countintegerConsultants on staff. The matrix covers every hospital-tier facility against all 42 specialties, so a zero is the scarcity finding, not a missing row. Totals never exceed the facility's specialist physician headcount.
trainee_countintegerTrainees in the specialty. Only teaching facilities have any.
visiting_countintegerVisiting or sessional specialists, the standard workaround where no consultant is resident.

+2 more columns in specialist_staffing. The full schema ships with the download.

workforce_density· Rows: 2,760
ColumnTypeDescription
density_idvarchar(8)Density row key. Primary key.
region_idvarchar(8)Stable fictional identifier for region; use it for declared joins.
yearintegerCalendar year, 2015 to 2024.
doctors_per_10knumeric(6,2)Doctors per 10,000 region population. Exactly reproducible from facility_staffing; the build re-verifies it.
nurses_per_10knumeric(6,2)Nurses per 10,000 region population. Exactly reproducible from facility_staffing.
specialists_per_100knumeric(7,2)Specialist physicians per 100,000 region population. Exactly reproducible from facility_staffing.
who_threshold_flagbooleanTrue when combined doctor and nurse density clears a WHO-style floor of 44.5 per 10,000. The threshold style is public classification knowledge.

+1 more columns in workforce_density. The full schema ships with the download.

catchments· Rows: 11,671
ColumnTypeDescription
catchment_idvarchar(16)Catchment row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
district_idvarchar(16)The district whose population this row serves. Per district, the population_served values sum exactly to the district population.
population_servedintegerPeople in this district served by this facility.
travel_time_bandvarchar(16)Coded travel time from the served population to the facility, UNDER_30_MIN to OVER_4_HOURS.
catchment_typevarchar(16)primary for the facility's home district, secondary for referral coverage of other districts.
facility_utilisation· Rows: 90,000
ColumnTypeDescription
utilisation_idvarchar(16)Utilisation row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
yearintegerCalendar year, 2015 to 2024.
admissionsintegerInpatient admissions that year.
outpatient_visitsintegerOutpatient visits that year. The 2020 drop is the deepest in the panel.
emergency_visitsintegerEmergency visits that year.
surgeriesintegerSurgical procedures that year. 2020 is materially below 2019 in every country and 2022 does not fully recover in half of them.

+5 more columns in facility_utilisation. The full schema ships with the download.

referral_flows· Rows: 102,010
ColumnTypeDescription
flow_idvarchar(16)Referral flow row key. Primary key.
from_facility_idvarchar(16)The referring facility.
to_facility_idvarchar(16)The receiving facility, one or two tiers up the chain.
yearintegerCalendar year, 2015 to 2024.
referral_countintegerReferrals along this edge that year. Dips in 2020 and 2021.
dominant_specialty_idvarchar(8)The specialty most of the edge's referrals belong to.
median_distance_kmnumeric(7,1)Road distance between the two facilities in kilometres, derived from their synthetic coordinates.

+1 more columns in referral_flows. The full schema ships with the download.

facility_covid_capacity· Rows: 432,000
ColumnTypeDescription
covid_capacity_idvarchar(16)COVID capacity row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
year_monthvarchar(16)Month of this snapshot, 2019-01 to 2022-12 with no gaps. Import as text: spreadsheets convert values like 2019-01 to dates.
covid_bedsintegerBeds designated for COVID care that month. Zero through 2019 and at outpatient tiers.
covid_icu_bedsintegerICU beds designated for COVID care.
ventilators_availableintegerVentilators the facility holds.
ventilators_in_useintegerVentilators in use that month. Never exceeds the available count.

+3 more columns in facility_covid_capacity. The full schema ships with the download.

covid_admissions· Rows: 432,000
ColumnTypeDescription
covid_admission_idvarchar(16)COVID admissions row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
year_monthvarchar(16)Month of this row, 2019-01 to 2022-12 with no gaps. Import as text: spreadsheets convert values like 2019-01 to dates.
admissionsintegerCOVID admissions that month.
icu_admissionsintegerOf the admissions, how many went to ICU. Never exceeds admissions.
dischargesintegerCOVID discharges that month.
deathsintegerCOVID deaths that month.

+3 more columns in covid_admissions. The full schema ships with the download.

service_disruption· Rows: 432,000
ColumnTypeDescription
disruption_idvarchar(16)Disruption row key. Primary key.
facility_idvarchar(16)Stable fictional identifier for facility; use it for declared joins.
year_monthvarchar(16)Month of this row, 2019-01 to 2022-12 with no gaps. Import as text: spreadsheets convert values like 2019-01 to dates.
elective_procedures_deferredintegerElective procedures deferred that month. 2020 collapses in every country.
outpatient_vs_baseline_pctnumeric(6,1)Outpatient volume as a percentage of the 2019 baseline. Exactly 100 through the baseline year.
immunisation_sessions_cancelledintegerRoutine immunisation sessions cancelled that month, concentrated at primary-care facilities.
screening_suspended_flagbooleanTrue when screening programmes were suspended that month.

+1 more columns in service_disruption. The full schema ships with the download.

vaccination_coverage· Rows: 6,622
ColumnTypeDescription
coverage_idvarchar(16)Coverage row key. Primary key.
region_idvarchar(8)Stable fictional identifier for region; use it for declared joins.
year_monthvarchar(16)Month of this row, 2021-01 to 2022-12. One region is deliberately missing two months. Import as text: spreadsheets convert values like 2021-01 to dates.
first_dose_pctnumeric(5,1)First-dose coverage of the eligible population, in percent. Monotonic non-decreasing within a region.
second_dose_pctnumeric(5,1)Second-dose coverage, in percent. Monotonic non-decreasing within a region.
booster_pctnumeric(5,1)Booster coverage, in percent. Monotonic non-decreasing within a region.
campaign_phasevarchar(32)Coded rollout phase, from health workers through boosters.

+2 more columns in vaccination_coverage. The full schema ships with the download.

covid_waves· Rows: 24
ColumnTypeDescription
wave_idvarchar(8)Wave key. Primary key.
country_codevarchar(8)ISO 3166-1 alpha-2 country code.
wave_numbervarchar(8)Wave sequence within the country, 1 to 4.
start_monthvarchar(16)Month the wave starts, as year-month.
peak_monthvarchar(16)Month the wave peaks.
end_monthvarchar(16)Month the wave ends.
variant_labelvarchar(16)Deliberately generic variant era label: early, alpha_like, delta_like or omicron_like.

+2 more columns in covid_waves. The full schema ships with the download.

disease_burden· Rows: 2,280,000
ColumnTypeDescription
burden_idvarchar(16)Burden row key. Primary key.
district_idvarchar(16)Stable fictional identifier for district; use it for declared joins.
yearintegerCalendar year, 2015 to 2024.
condition_codevarchar(8)The condition this row measures.
incidence_per_100knumeric(8,1)Generated new cases per 100,000 district population. Zero for COVID-19 before 2020 is a real zero, not a gap.
prevalence_per_100knumeric(8,1)Generated existing cases per 100,000. Several times incidence for chronic conditions, below it for acute ones.
daly_bandvarchar(16)Coded disease burden band for the condition: LOW, MEDIUM, HIGH or VERY_HIGH.

+2 more columns in disease_burden. The full schema ships with the download.

population_health_indicators· Rows: 2,760
ColumnTypeDescription
indicator_idvarchar(8)Indicator row key. Primary key.
region_idvarchar(8)Stable fictional identifier for region; use it for declared joins.
yearintegerCalendar year, 2015 to 2024.
life_expectancy_yearsnumeric(5,1)Generated life expectancy at birth for the region. Dips through 2020 and 2021 and only partly recovers.
infant_mortality_per_1knumeric(5,1)Generated infant deaths per 1,000 live births.
maternal_mortality_per_100knumeric(6,1)Generated maternal deaths per 100,000 live births.
immunisation_coverage_pctnumeric(5,1)Generated routine immunisation coverage in percent. The COVID-era dip does not fully recover by 2024: the scar is deliberate.

+6 more columns in population_health_indicators. The full schema ships with the download.

condition_codes· Rows: 95
ColumnTypeDescription
condition_codevarchar(8)Condition key. Primary key. The codes are this dataset's own and follow no real coding system.
condition_namevarchar(48)The condition in generic medical vocabulary.
condition_categoryvarchar(24)communicable, non_communicable, injury or maternal_neonatal.
chronic_flagbooleanTrue when the condition is chronic, which drives the prevalence-to-incidence ratio in disease_burden.
hf_countries· Rows: 6
ColumnTypeDescription
country_codevarchar(8)ISO 3166-1 alpha-2 country code. Primary key; the only real-world identity in the dataset.
country_namevarchar(16)Country name in English.
iso3_codevarchar(8)ISO 3166-1 alpha-3 code for the same country.
population_bandvarchar(16)Coded population size band. The band is the statement; no exact national population ships anywhere in the dataset.
population_band_descriptionvarchar(56)What the population band means in words.
income_groupvarchar(16)World-Bank-style income classification code: HIC, UMIC or LMIC.
income_group_descriptionvarchar(40)What the income group code means in words.

+5 more columns in hf_countries. The full schema ships with the download.

hf_admin_regions· Rows: 276
ColumnTypeDescription
region_idvarchar(8)Generated region identifier, <country>-R<seq>. Primary key; foreign key on every region-grain table.
country_codevarchar(8)ISO 3166-1 alpha-2 country code.
region_namevarchar(24)Generated region name in the country's own naming style. Invented; collisions with real first-level areas are a build failure.
region_typevarchar(24)The country's own word for this unit: provinsi, negeri, planning_area, changwat, province or tinh.
capital_flagbooleanTrue for exactly one region per country, the capital region. Specialist concentration follows it.
urbanisation_bandvarchar(16)URBAN, MIXED or RURAL. Drives facility placement, staffing levels and vaccination rollout speed.
populationintegerGenerated population of the region. Realistic in ordering and proportion only; region populations partition the country total exactly.

+4 more columns in hf_admin_regions. The full schema ships with the download.

hf_districts· Rows: 2,400
ColumnTypeDescription
district_idvarchar(16)Generated district identifier, <region>-D<seq>. Primary key.
region_idvarchar(8)Stable fictional identifier for region; use it for declared joins.
district_namevarchar(24)Generated district name. Invented; below first level an accidental match with some real place cannot be ruled out and is disclosed.
district_typevarchar(24)The country's own administrative word for the district: kabupaten, kota, daerah, subzone, amphoe, municipality, component_city, huyen or quan.
settlement_typevarchar(16)urban, peri_urban, rural or remote. Drives facility mix, staffing shortfalls and disease burden gradients.
populationintegerGenerated district population. District populations partition their region's population exactly, which is what makes the catchment reconciliation assertable.
householdsintegerGenerated household count for the district.

+3 more columns in hf_districts. The full schema ships with the download.

facility_tiers· Rows: 5
ColumnTypeDescription
tier_idvarchar(8)Cross-country tier key, T1 to T5. The column a cross-country analysis joins on.
tier_codevarchar(24)Stable code for the tier: NATIONAL_REFERRAL down to CLINIC.
tier_namevarchar(24)The tier in words.
tier_descriptionvarchar(168)What sits at this tier and what it refers upward.
facility_classes· Rows: 33
ColumnTypeDescription
class_idvarchar(32)National class key, <country>-<class code>. Primary key.
country_codevarchar(8)ISO 3166-1 alpha-2 country code.
class_codevarchar(24)The class within its national scheme: KELAS_A, DOH_LEVEL_3, REGIONAL and their peers. The schemes are real public classification; the facilities filling them are not.
class_namevarchar(48)The class as the national scheme names it.
tier_idvarchar(8)The one cross-country tier this class maps to. The mapping is total: every class maps to exactly one tier.
class_descriptionvarchar(152)What the class means within its country's scheme.
min_bedsintegerThis dataset's regulatory floor for the class. Every facility of the class carries at least this many beds in every year; the build re-verifies it.

+2 more columns in facility_classes. The full schema ships with the download.

ownership_types· Rows: 12
ColumnTypeDescription
ownership_idvarchar(16)Ownership form key. Primary key.
ownership_namevarchar(40)The ownership form in words.
ownership_descriptionvarchar(120)What the ownership form means.
accreditation_bodies· Rows: 8
ColumnTypeDescription
body_idvarchar(16)Accreditation body key. Primary key.
country_codevarchar(8)Country the body operates in. Empty for the two international bodies, which accredit across all six.
body_namevarchar(56)Generated body name. The bodies are invented, because real accreditation bodies are organisations; the schemes they run are shaped like real national programmes.
scheme_namevarchar(48)Name of the accreditation scheme the body runs.
levels_availablevarchar(56)The ordered levels the scheme can award, pipe-separated.
international_flagbooleanTrue for the two international bodies.
hf_specialties· Rows: 42
ColumnTypeDescription
specialty_idvarchar(8)Specialty key, SP-<code>. Primary key. The codes are this dataset's own.
specialty_namevarchar(48)The clinical specialty in words.
parent_groupvarchar(16)medical, surgical, diagnostic or support.
training_yearsintegerYears of postgraduate training the specialty takes, used to shape scarcity.
scarcity_bandvarchar(16)COMMON, SCARCE or CAPITAL. Drives geographic concentration: capital-band specialties effectively exist only in national referral centres.
scarcity_band_descriptionvarchar(104)What the scarcity band means for where the specialty is found.
staff_categories· Rows: 18
ColumnTypeDescription
category_idvarchar(16)Staff category key, STC-<code>. Primary key.
category_namevarchar(32)The workforce category in words.
clinical_groupvarchar(16)DOCTOR, NURSE, ALLIED or NON_CLINICAL. The grain the density and specialist assertions aggregate over.
category_descriptionvarchar(128)Who is counted in this category.

Sample Data

A snapshot of real rows from the dataset (values are fully synthetic).

facility_idfacility_codefacility_nameclass_idtier_idownership_idestablished_yearteaching_flagreferral_flagstatus
HF000001ID-R01-00001ERSUP CilestariID-KELAS_AT1OWN-GN1957truetrueactive
HF000002ID-R01-00002LRSUP Cilestari IIID-KELAS_AT1OWN-SOE1937truetrueactive
HF000003ID-R01-00003SRSUP Cilestari IIIID-KELAS_AT1OWN-SOE1924truetrueactive

class_id codes

Every code this dataset uses, with what it means. The same mapping ships in the files.

class_idcountryclass_nametierclass_descriptionmin_bedsrequired_specialties
ID-KELAS_AIDRumah Sakit Kelas AT1Top national classification. Full subspecialty and teaching capability; the referral end point of the system.40018
ID-KELAS_BIDRumah Sakit Kelas BT2Provincial referral classification with broad specialist services and intensive care.20011
ID-KELAS_CIDRumah Sakit Kelas CT3District hospital classification. The four base specialist services plus emergency and inpatient care.1004
ID-KELAS_DIDRumah Sakit Kelas DT3Small district hospital classification, general practice led with limited specialist visits.252
ID-KLINIKIDKlinik PratamaT5Licensed outpatient clinic, mostly private.00
ID-PUSKESMASIDPusat Kesehatan MasyarakatT4Sub-district primary care centre. Outpatient, maternal and child health, immunisation; some carry a few observation beds.00
MY-DISTRICT_MINORMYDistrict hospital without specialistsT3District hospital run by medical officers, visited by specialists on rotation.300
MY-DISTRICT_SPECIALISTMYDistrict hospital with specialistsT3District hospital carrying resident specialists in the base disciplines.804
MY-KLINIK_DESAMYKlinik DesaT5Village-level community clinic run by nurses and midwives.00
MY-KLINIK_KESIHATANMYKlinik KesihatanT4Public primary care health clinic.00
MY-NATIONAL_REFERRALMYNational referral hospitalT1Federal tertiary referral and teaching centre.50020
MY-STATE_GENERALMYState general hospitalT2The specialist referral hospital of one state.25012
PH-BARANGAY_STATIONPHBarangay health stationT5Village health post staffed by midwives and health workers.00
PH-DOH_LEVEL_1PHLevel 1 hospitalT3First-referral hospital with the base clinical services and operating capability.252
PH-DOH_LEVEL_2PHLevel 2 hospitalT2Departmentalised hospital with intensive care and the major specialist departments.1006
PH-DOH_LEVEL_3PHLevel 3 hospitalT1Teaching and training hospital with subspecialty and tertiary clinical services.30015
PH-INFIRMARYPHInfirmaryT4Small inpatient unit for uncomplicated cases, below Level 1.60
PH-RURAL_HEALTH_UNITPHRural health unitT4Municipal primary care and public health unit.00
SG-ACUTE_GENERALSGAcute general hospitalT1Acute tertiary hospital within a public healthcare cluster.40018
SG-COMMUNITY_HOSPITALSGCommunity hospitalT3Step-down inpatient care, rehabilitation and sub-acute beds.501
SG-POLYCLINICSGPolyclinicT4Public primary care group practice.00
SG-PRIVATE_CLINICSGPrivate clinicT5Private general practice or specialist clinic.00
SG-SPECIALIST_CENTRESGNational specialty centreT2Single-discipline national centre operating alongside the acute hospitals.1003
TH-COMMUNITYTHCommunity hospitalT3District-level hospital, first-level inpatient care.301
TH-GENERALTHGeneral hospitalT2Standard-level provincial hospital with the major specialist services.1508
TH-HEALTH_PROMOTINGTHHealth promoting hospitalT4Sub-district primary care and prevention unit.00
TH-PRIVATE_CLINICTHPrivate clinicT5Licensed private outpatient practice.00
TH-REGIONALTHRegional hospitalT1Advanced-level hospital serving a group of provinces with full subspecialty care.50018
VN-CENTRALVNCentral hospitalT1Ministry-level hospital at the top of the four-level system.50018
VN-COMMUNE_STATIONVNCommune health stationT4Commune-level primary care station, the base of the system.00
VN-DISTRICTVNDistrict hospitalT3District-level hospital providing first-level inpatient care.502
VN-PRIVATE_CLINICVNPrivate clinicT5Licensed private outpatient practice, concentrated in cities.00
VN-PROVINCIALVNProvincial hospitalT2The general hospital of one province.20010

Version History

v1.0.02026-08-10First release. 9,000 generated facilities across six Southeast Asian countries with ten years of capacity, staffing, utilisation and accreditation history, a full hospital-by-specialty scarcity matrix, district-level disease burden, and 48 months of facility-level COVID operations data.