← medicaid-provider-spending

Methodology

Visuals in this post: EyePic Case Per-Enrollee Spending Concentration Top Providers Outlier Screen Provider Lookup Random Sample Methodology
Medicaid July 2026

Every number here can be replicated from public files

This page documents the full pipeline: the federal claims file and its checksum, the registry join that assigns providers to states, the cleaning rule that removes $20 trillion of junk, the EyePic entity matching, and the honest limits of the data. A laptop and free software reproduce all of it.

The source is one federal file anyone can download

All spending figures come from Medicaid Provider Spending by HCPCS, published on HHS Open Data on February 9, 2026. It aggregates T-MSIS claim lines to billing NPI × servicing NPI × procedure code × month, from January 2018 through December 2024, for all states. Seven columns: two provider NPIs, the HCPCS code, the month, unique patients, claim lines, and total paid.

The file ships as an 11.5 GB CSV or a 3.1 GB Parquet file. The Parquet copy used here has SHA-256 checksum f646d426126638dd0177cb14a86bfe7d7e9ed6b081a3e1c270bfe5070fb3fb94, matching the published value, so you can verify you are analyzing the identical file.

Two companion files complete the pipeline: the CMS NPPES registry (July 2026 monthly file), which maps every NPI to a name, practice state, and specialty, and the CMS enrollment dataset for per-enrollee denominators. Analysis ran in DuckDB, free and open source, on a laptop.

Four junk rows carry $20 trillion, so cleaning rules matter

Summing the raw file's paid amounts gives $21.8 trillion, roughly four times what Medicaid actually spent nationally over these years. Nearly all of the excess sits in four rows attributed to "NPI" 5200000300, a state placeholder code, with the invalid procedure code "20". Real NPIs are ten digits starting with 1 or 2.

Every number in this project therefore uses one cleaning rule: keep only rows whose billing NPI is a well-formed ten-digit identifier starting with 1 or 2.

CREATE VIEW spending_clean AS
SELECT * FROM spending
WHERE billing_npi IS NOT NULL
  AND regexp_matches(billing_npi, '^[12][0-9]{9}$');

That leaves $1.10 trillion in nationally attributable payments. Paid amounts sum claim line-level payments (CLM_LINE_PD_AMT), not claim-header totals, per the dataset's own methodology. It is deliberately not a filter on payment size: six and seven figure single claim lines are sometimes real (gene and cell therapies bill $400,000 to $2 million per dose through these codes), so dropping "big" rows would delete real spending.

States come from the provider registry, not the claims

The claims file has no state column. Providers are assigned to states by joining the billing NPI to its practice location in the NPPES registry:

SELECT p.state, sum(s.paid) AS paid
FROM spending_clean s
JOIN providers p ON s.billing_npi = p.npi
GROUP BY p.state;

Three consequences. First, spending follows the biller's registered location, so a provider treating patients across state lines is counted once, in its home state. Second, rows with a blank or invalid billing NPI (about $400 billion nationally) cannot be attributed to any state and are excluded. Third, NPPES reflects current registrations; a provider that moved or deregistered since billing carries its current-file location.

The EyePic companies were matched by their legal names

The indictment names seven companies. Six have NPIs, matched by legal business name in NPPES; MGBK Management, LLC is a management company with no NPI and no claims. All matched records are in Brooklyn or Manhattan with authorized officials consistent with the scheme described by prosecutors (none list the defendant himself).

Company (as indicted)NPIPaid 2018-2024 (dollars)
Harlem Eye Care, Inc.159827424310,896,442
Graham Eye Care, LLC11740395319,382,175
Family Eye Care Ophthalmology, P.C.10134533158,543,005
Parkslope Eye Care, Inc.13861206163,374,116
9th Street Vision Care, Inc.16799430051,842,499
Flatbush Eye Care, Inc.142770575574,671
MGBK Management, LLCno NPI0

A second NPPES record also named Graham Eye Care LLC (NPI 1174110860) has no claims in the file. Payments shown are facts about Medicaid disbursements; they are not a measure of fraud, and the charges are allegations. The indictment covers January 2024 through July 2025; this dataset ends in December 2024, so the $7.6 million the six companies billed in 2024 is the visible overlap with the charged period, not the full $9 million alleged.

What this data can and cannot say

  • Low-volume cells are suppressed for privacy. The file drops any billing-provider, servicing-provider, procedure, month combination with fewer than 12 claim lines or fewer than 12 unique beneficiaries. Every total on these pages is therefore a floor: small providers and occasional procedures are undercounted or absent entirely, and shares of niche procedure codes are shares of reported billing.
  • It is a subset of Medicaid. Only outpatient and professional claim lines carrying HCPCS codes are included. Institutional per-diem claims, most pharmacy billing, and capitation payments are not, so state totals here are far below total Medicaid budgets.
  • Managed care encounter completeness improved over time. Part of every state's growth, and most of Texas's 2020 to 2021 jump, reflects states getting better at reporting encounters to T-MSIS rather than new spending.
  • 2024 is preliminary. CMS flags 2024 as subject to change as states finalize submissions; December 2024 in particular is visibly incomplete for some billers.
  • Patient counts do not sum. The patients field counts unique beneficiaries within each provider-procedure-month cell; summing cells overstates unique patients, so this project reports paid amounts and claim lines instead.
  • Cross-state comparisons need care. CMS notes that differences across states can reflect state-specific policies, coding practices, and submission patterns rather than real spending differences, and that T-MSIS quality varies by state and data element; see CMS's DQ Atlas. State Medicaid agencies remain the authoritative source for their own claims data.
  • Payments are not verdicts. Every provider-level figure is a record of what Medicaid paid, nothing more.

Replicate it in an afternoon

Download the Parquet file and the NPPES monthly file, install DuckDB, and load:

CREATE TABLE spending AS
SELECT BILLING_PROVIDER_NPI_NUM AS billing_npi,
       SERVICING_PROVIDER_NPI_NUM AS servicing_npi,
       HCPCS_CODE AS hcpcs, CLAIM_FROM_MONTH AS month,
       TOTAL_PATIENTS AS patients,
       TOTAL_CLAIM_LINES AS claim_lines,
       TOTAL_PAID AS paid
FROM 'medicaid-provider-spending.parquet';

CREATE TABLE providers AS
SELECT "NPI" AS npi,
       "Provider Organization Name (Legal Business Name)" AS org_name,
       "Provider Business Practice Location Address State Name" AS state,
       "Healthcare Provider Taxonomy Code_1" AS taxonomy_code
FROM read_csv('npidata_pfile_*.csv', header=true, all_varchar=true);

Then any question in this project is a short query. How much did a company make?

SELECT substr(month, 1, 4) AS yr, sum(paid)
FROM spending_clean
WHERE billing_npi = '1598274243'   -- Harlem Eye Care, Inc.
GROUP BY 1 ORDER BY 1;

The growth screen from the outlier page:

WITH py AS (
  SELECT billing_npi, substr(month,1,4) AS yr, sum(paid) AS paid
  FROM spending_clean GROUP BY 1, 2
)
SELECT a.billing_npi, a.yr, b.paid AS prior, a.paid,
       a.paid / b.paid AS growth
FROM py a JOIN py b
  ON a.billing_npi = b.billing_npi
 AND cast(a.yr AS INT) = cast(b.yr AS INT) + 1
WHERE b.paid >= 100000 AND a.paid >= 1000000
  AND a.paid / b.paid >= 5
ORDER BY growth DESC;

Every chart's underlying CSV is in this project's data folder on GitHub.

Sources: HHS Open Data, Medicaid Provider Spending by HCPCS (2026-02-09 release); CMS NPPES Data Dissemination (July 2026); CMS State Medicaid and CHIP Enrollment Data (June 2026 release); NUCC provider taxonomy (v26.0); NY Attorney General press release (February 2026). Created by Tal Roded · NYCuriosity.