An interactive look at public Medicaid provider spending data, 2018 to 2024.
As a nurse, I've worked at the front line of healthcare, where care is actually delivered. This dataset was a chance to see one of the system's most important parts from the other side: how Medicaid pays for that care, and where the money goes.
Medicaid is one of the largest parts of the U.S. healthcare system. Together with CHIP, it covered about 73 million people in June 2026, nearly half of them children,2 and in 2024 Medicaid spending reached $931.7 billion, about 18% of all U.S. health spending.3
The charts below show what the public data says, as plainly as possible: how much was paid, for what services, to whom, and how that changed over time. How the data was prepared, how the numbers were checked, and what the data can't tell us are all covered further down.
These figures match HHS's own published charts to the cent
HHS publishes example charts for this dataset. Recomputed on the same date window, the top 20 procedures, top 20 billing providers, and all 72 monthly totals here match them exactly, same items in the same order. How the numbers were checked
Loading data…
Total paid per month
Spending rose from in 2018 to in 2023, an increase of . Monthly spending fell between January and April 2020, at the start of the COVID-19 pandemic, and was back to January's level by October. Through October, 2024 ran ahead of the same months of 2023. November and December 2024 drop far below every other month, which fits CMS's note that 2024 data are preliminary, so they are marked as incomplete.
Hover or use the arrow keys to read any month. Dollars are not adjusted for inflation.
SELECT CLAIM_MONTH, SUM(TOTAL_PAID), SUM(TOTAL_CLAIM_LINES), SUM(TOTAL_PATIENTS) FROM prepared_data GROUP BY CLAIM_MONTH ORDER BY CLAIM_MONTHFull script on GitHub
Top 20 procedure codes by total paid
Personal care services lead, at over 2018 to 2024. Many of the top 20 are home and community-based services, such as personal care, attendant care, habilitation, and adult day care: care that helps people live at home or in the community. Office visits and emergency department visits are the most common medical services on the list.
Descriptions are HHS's own short labels for these HCPCS codes.
† State-specific code. States create their own codes for services that don't fit the national system, and these have no public description. Z9525 is one row per month with no billing or servicing provider listed.
SELECT HCPCS_CODE, SUM(TOTAL_PAID), SUM(TOTAL_CLAIM_LINES) FROM prepared_data WHERE YEAR(CLAIM_MONTH) BETWEEN :first_year AND :last_year GROUP BY HCPCS_CODE ORDER BY SUM(TOTAL_PAID) DESC LIMIT 20Full script on GitHub
Top 20 billing providers by total paid
All 20 are organizations, including county mental health departments, state disability agencies, and home care organizations. The largest, Public Partnerships LLC, is a fiscal intermediary for self-directed care: Medicaid members hire their own caregivers, who can include friends or family, and the intermediary processes their wages.5 A large total usually reflects how many people a provider serves.
Names, locations, and provider types from the CMS NPI Registry.4 Excludes spending with no billing provider listed.
‡ Tennessee's Department of Intellectual and Developmental Disabilities bills under two NPIs, so it appears twice, as it does in HHS's chart.
SELECT BILLING_PROVIDER_NPI_NUM, SUM(TOTAL_PAID) FROM prepared_data WHERE YEAR(CLAIM_MONTH) BETWEEN :first_year AND :last_year AND BILLING_PROVIDER_NPI_NUM <> 'UNKNOWN' GROUP BY BILLING_PROVIDER_NPI_NUM ORDER BY SUM(TOTAL_PAID) DESC LIMIT 20Names come from the public NPI Registry API (lookup script).
How spending is spread across billing providers
Over 2018 to 2024 the typical (median) billing provider received in total. of providers received under $100K each, together of the dollars, while the providers above $100M ( of providers) received .
Columns count providers; hover a column for its share of dollars. The darkest column holds the median provider. Excludes with no billing provider listed.
SELECT BILLING_PROVIDER_NPI_NUM, SUM(TOTAL_PAID) AS provider_total FROM prepared_data WHERE YEAR(CLAIM_MONTH) BETWEEN :first_year AND :last_year AND BILLING_PROVIDER_NPI_NUM <> 'UNKNOWN' GROUP BY BILLING_PROVIDER_NPI_NUM -- then each provider_total is counted into its rangeFull script on GitHub
Every row in this dataset names two providers. The billing provider is the one Medicaid paid. The servicing provider is the one recorded as delivering the care. Often they are the same, such as a clinic billing for its own visits. They differ when an organization bills for care delivered by its staff or contractors, or when an intermediary bills on behalf of caregivers, as in the self-directed care programs mentioned above. Neither case suggests anything unusual; it is how much of Medicaid billing is structured.
The chart splits each year's dollars four ways, including money where one of the two providers isn't listed at all.
Share of dollars by billing and servicing provider
Each year, between and of dollars went to providers billing for their own services. of all dollars over 2018 to 2024 have no billing provider listed.
SELECT YEAR(CLAIM_MONTH),
CASE WHEN BILLING_PROVIDER_NPI_NUM = 'UNKNOWN' THEN 'Billing provider not listed'
WHEN SERVICING_PROVIDER_NPI_NUM = 'UNKNOWN' THEN 'Servicing provider not listed'
WHEN BILLING_PROVIDER_NPI_NUM = SERVICING_PROVIDER_NPI_NUM THEN 'Same provider'
ELSE 'Different provider' END,
SUM(TOTAL_PAID)
FROM prepared_data GROUP BY 1, 2
Full script on GitHubWhat "not listed" means. The dataset's documentation keeps claim lines whose provider number is blank, and the blank shows up here as "not listed." The documentation doesn't say why a provider number is missing, so this page doesn't guess. It includes all of the state-specific code Z9525 from the procedure chart above.
The raw file is too large for a spreadsheet, so I converted it to Parquet, a compressed columnar format, and queried it with DuckDB. Each step and its effect on the row count and total:
Why procedure code 20 was removed. Its 34 rows add up to , about times all U.S. health spending from every source in 2024 ($5.3 trillion).3 Payments that large can't be real, so they were treated as a data error. Every other row was kept, including rows with negative payments ( in total), which are most likely payment corrections; the dataset includes finalized adjusted claims.
The checks run automatically every time the numbers are rebuilt, and the build fails if any don't pass. The scripts and summary data are on GitHub. My full exploration notebook is available on request at [email protected].
Want to make sense of your own data, or learn to use AI for it? I can help. Get help