How this surface is built
What this is
This is a public mirror of every CMS-required hospital Machine-Readable File (MRF) we have ingested. We currently mirror 5,079 hospitals across 54 states & territories, totaling 2,433,631,223 negotiated-rate rows. The surface is queryable, filterable, and exportable; every row links back to its source MRF with the date we observed it.
This is not medical advice, not a pricing quote, and not a prediction of what your insurance will pay. It is the data the federal government required hospitals to publish, made queryable.
Data source
Hospitals are required by CMS-9915-F (45 CFR 180) to publish a machine-readable file of every standard charge for every item and service. The current schema (effective July 1, 2024 with full enforcement on April 1, 2026) requires JSON or CSV files containing gross charges, discounted cash prices, payer- specific negotiated rates, and the de-identified minimum and maximum negotiated charges across all payers.
We ingest these MRFs from each hospital's cms-hpt.txt
discovery file, which CMS requires hospitals to host at the root of
their public website. Our ingest worker re-fetches each hospital's
files quarterly (or on-demand via the refresh button on hospital
pages). Older filings are retained — every row carries an
mrf_observed_at timestamp so historical comparisons stay
auditable.
Methodology
Median and percentile computation
Every "median" you see on this site is computed via PostgreSQL's
percentile_cont(0.50) WITHIN GROUP (ORDER BY ...). The
25th and 75th percentile bands (IQR) use percentile_cont(0.25)
and percentile_cont(0.75) respectively. These are the
continuous-interpolation forms, not the discrete bucket variant.
Sentinel filter
We always filter rate values to the range
BETWEEN $0.01 AND $5,000,000 before computing a median.
Real-world MRFs contain $0 placeholders (where the hospital files an
"amount not negotiated" row as zero) and $999,999,999 sentinels
(where the schema requires a numeric field but the hospital's billing
system uses an out-of-range value to mean "n/a"). Including these
would distort medians by orders of magnitude.
Outlier detection
On the by-hospital procedure pages, we flag a hospital as a "high outlier" if its median for the procedure is at least 2× the cohort median, and "low outlier" if at most 0.5×. The cohort is whichever set of hospitals appears in the filtered view (state filter applies if set, otherwise national).
Code sets
MRFs reference items and services using a mix of clinical and billing code systems. Each appears as a chip on the surface:
- MS-DRG
- Medicare Severity Diagnosis Related Group — an inpatient billing classification covering ~750 categories. Example: DRG 470 is "Major hip and knee joint replacement without complications."
- APR-DRG
- All Patient Refined DRG — a refinement of MS-DRG used by many state Medicaid plans. Adds severity-of-illness and risk-of-mortality subclasses.
- CPT
- Current Procedural Terminology — outpatient procedure codes owned by the AMA (HCPCS Level I in CMS taxonomy). Example: CPT 27447 is "Total knee arthroplasty."
- HCPCS
- Healthcare Common Procedure Coding System Level II — government-issued codes for items, supplies, and services not covered by CPT (durable medical equipment, drugs administered in a clinical setting, etc.).
- NDC
- National Drug Code — FDA-assigned 11-digit identifier for a specific drug product, manufacturer, and package size.
- CDM
- Charge Description Master — the hospital's own internal line-item dictionary. CDM codes are not standardized across hospitals; "ASPIRIN-81MG-TABLET" at one facility may be "ASA81-PO-EA" at another.
- RC
- Revenue Code — UB-04 4-digit code identifying the type of service or department (room & board, ICU, pharmacy, etc.). Used on inpatient claims alongside the HCPCS/CPT line items.
We treat CPT and HCPCS Level I as equivalent for the purposes of code-type filtering on this surface (they are the same code set under different governance bodies).
Freshness
Every rate row on the surface carries an
mrf_observed_at timestamp showing the date we last
fetched the MRF that produced it. On hospital pages we surface a
"filing age" pill that turns amber after 180 days and red after 365
days. CMS requires hospitals to update their MRFs at least annually,
and many update quarterly — older filings are still legally
compliant but increasingly out of step with current contract terms.
Freshness buckets
- Fresh
- Last successful MRF ingest within the past 90 days. Current quarter; full alignment with current contract terms.
- Aging
- 91–180 days since last successful ingest. Hospital is half-year out of date; technically still compliant.
- Stale
- 181–365 days. Approaching the CMS-9915-F annual deadline; still compliant but expect drift from active contract terms.
- Expired
- More than 365 days since last successful ingest. Out of compliance with the CMS-9915-F annual update mandate.
- Never ingested
- No successful MRF ingest on file. Either the hospital has never
published an MRF or our ingest pipeline has not yet succeeded
against their
cms-hpt.txt.
Public auditor views: browse the freshness dashboard · missing-field heatmap.
Internal coverage status (per-facility pipeline stage, discovery errors) is published at /admin/price-transparency/coverage where it is admin-accessible.
Payer grouping
A single human payer ("Aetna") routinely splits into dozens of
regional-plan UUIDs in MRF filings. The same hospital, filing on the
same day, may have separate rows for "Aetna Choice POS II", "Aetna
HMO Texas", "Aetna PPO National", and so on — each with a
unique payer_id.
Our explorer surfaces (rankings, payer-detail, top-payers tiles) use
name-grouped aggregation, lowercasing the
payer_name_raw and collapsing variants under a single
canonical name. This makes "Aetna" a single entry on a leaderboard
rather than 47 near-identical rows. The downside is that genuinely
different products under the same parent (Medicare Advantage vs.
commercial PPO) get merged. When that distinction matters, drill into
the by-UUID page via /transparency/payer/{payer_id}.
UUID-grouped views remain available via the legacy by-UUID URL, redirected from any payer link as a fallback.
Out-of-pocket math
The OOP estimator widget on procedure pages implements the standard deductible → coinsurance → OOP-max waterfall most commercial insurers use. The math reference, reproduced verbatim from the estimator's docstring, is:
if uninsured:
# No insurance benefits. Patient owes the rate (typically the cash
# discounted price, but we display the negotiated as the floor).
patient_owes = rate
return # short-circuit; deductible/OOP-max/coinsurance ignored
if spent < deductible:
to_deductible = min(rate, deductible - spent)
after_deductible = max(0, rate - to_deductible)
else:
to_deductible = 0; after_deductible = rate
coinsurance_charge = after_deductible * (coinsurance_pct / 100)
patient_owes = to_deductible + coinsurance_charge
if oop_max_active:
patient_owes = min(patient_owes, max(0, oop_max - spent)) # cap
oop_max_active is True when the user provides a
non-blank OOP-max field. A literal 0 is treated as
"no cap" only when the field is empty; if the user types 0,
we honor it (rare but legitimate for some Medicaid contexts).
Math reference: AHA Fact Sheet on Price Estimator Tools (2023) describes this same waterfall.
OOP disclaimer
Estimate only. Actual liability depends on your plan's specific terms, network status, prior authorization requirements, secondary insurance, and a dozen other variables our form cannot capture. Always verify with your insurance carrier and the hospital's billing office before scheduling care.
The form submits its inputs via HTTP GET, which means the values appear briefly in the URL (and in any reverse proxy access log on the request path). We do not store the values you type server-side. If this matters to you (it might — income-related deductibles can be sensitive), use a browser session you trust and close the tab afterward.
This site is not legal, financial, or medical advice.
Glossary
- Coinsurance
- The percentage of a covered service the patient pays after the deductible has been met. Example: 20% coinsurance on a $500 bill after deductible = $100 patient owes, $400 plan pays.
- Cohort median
- The median of medians across whatever set of hospitals appears in the current filtered view. Used as the reference point for outlier detection on by-hospital procedure pages.
- Deductible
- The annual dollar amount the patient pays before insurance starts covering services. Resets each plan year.
- Fee schedule
- A payer's published table of allowed amounts for procedures, used to determine the negotiated rate for a contracted provider.
- Gross charge
- The undiscounted, "list price" charge for a service before any payer-specific contract or cash discount is applied. Required to be published in the MRF.
- HCPCS Level I / II
- HCPCS Level I is identical to CPT (CPT codes are the AMA's version of HCPCS Level I). Level II is the government-issued set for items not covered by CPT.
- IQR (Interquartile Range)
- The range from the 25th to 75th percentile, capturing the middle 50% of the distribution. Used on this site to show how tightly clustered (or wide) prices are within a state or hospital cohort.
- MRF (Machine-Readable File)
- The CMS-required file each hospital must publish containing gross charges, cash prices, payer-specific negotiated rates, and de-identified min/max negotiated rates.
- MS-DRG
- Medicare Severity Diagnosis Related Group, an inpatient classification system grouping clinically-related discharges that consume similar resources.
- OOP-max (Out-of-Pocket Maximum)
- The annual ceiling on what the patient pays out-of-pocket for in-network covered services. Once hit, the plan pays 100% of further covered care for the rest of the plan year.
- Payer
- The entity contractually obligated to pay claims for a given service: a commercial insurer (Aetna, BCBS), a government program (Medicare, Medicaid, TRICARE), or a self-funded employer plan.
- Percentile
- A value below which a given percentage of observations fall. The 25th percentile is the value below which 25% of rates fall.
- Sentinel value
- A placeholder number ($0, $999,999,999) hospitals sometimes file when they have no real value to publish. We filter these out before computing medians.
Citation
Every page on this site is a permanent URL. Filters, sort order, and state selections are encoded in the query string — bookmark or share a URL and the same view loads.
How to cite a row
Use the URL of the page where the row appears, with the filters that produced it. Each rate row footer cites the source MRF and the date we observed it.
Citation examples
APA (7th edition):
HANK Price Transparency. (2026, April 28). Major hip and knee joint replacement (MS-DRG 470) by state. Retrieved April 28, 2026, from http://ppman.hank.ai/transparency/procedure/470/by-state?code_type=MS_DRG
MLA (9th edition):
"Major Hip and Knee Joint Replacement (MS-DRG 470) by State." HANK Price Transparency, 28 Apr. 2026, ppman.hank.ai/transparency/procedure/470/by-state?code_type=MS_DRG. Accessed 28 Apr. 2026.
Chicago (notes-bibliography):
"Major Hip and Knee Joint Replacement (MS-DRG 470) by State," HANK Price Transparency, accessed April 28, 2026, http://ppman.hank.ai/transparency/procedure/470/by-state?code_type=MS_DRG.
Provenance footer
Every individual rate row, when expanded, shows the source MRF URL
and the date we observed it (mrf_observed_at). Cite the
upstream MRF when the specific rate is the news; cite this surface
when the aggregation is the news.
Contact
Found a stale URL, a misclassified row, or a payer-name that should be grouped differently? Email [email protected] with the page URL and a one-line description. We triage all reports and publish corrections in the changelog.
For programmatic access, see our REST API documentation. Bulk download requests for research use should be addressed to the same email.
Changelog
- 2026-04-28: Added patient out-of-pocket estimator widget on procedure pages. Added CSV export, copy-link, and print-as-PDF affordances on every explorer page.
- 2026-04-15: Migrated to name-grouped payer aggregation across rankings and payer-detail pages.
- 2026-04-01: CMS Hospital Price Transparency full enforcement begins; ingest cadence increased to quarterly.
- 2026-03-15: Outlier flags (2× / 0.5× cohort median) introduced on by-hospital procedure pages.