Three ways to start.
Search by what you need, your insurance, or the hospital you're going to. Every price is straight from that hospital's own published file.
Every price comes straight from the hospital's federally-mandated machine-readable file. The "cash price" is the self-pay discount they're required to publish. Your actual bill depends on your plan, deductible, and copay.
Three steps. No fees, no signup.
Search
Type a procedure name ("MRI knee"), a CPT code (73721), an insurer, or a hospital. We match it against every U.S. hospital's published price file.
Compare
See the gross price, the cash discount, and the rate every insurance plan negotiated — side by side across hundreds of hospitals.
Decide
Pick the hospital that costs less for the procedure you need. Bring the price to your appointment if there's a dispute. (Always confirm directly — we publish what they published.)
The law's been on the books since 2021. The database wasn't.
- ▸Under 45 CFR § 180, every U.S. hospital must publish a machine-readable price file — gross charges, cash prices, negotiated rates, and min/max — free, public, no signup.
- ▸Hospitals publish files in many different formats. We verified live MRFs for 3,985 of 4,625 CMS-required hospitals. Separately, we have standardized price rows for 4,582 hospital records across all indexed populations.
- ▸A live URL and a searchable price are different milestones. We measure the remaining coverage gap by joining hospital identifiers, not by subtracting totals from different populations. See /about-the-numbers for the live breakdown.
- ▸Mark Cuban built Cost Plus Drugs for the same reason — pricing transparency in healthcare. We're doing it for hospitals.
Three days to launch. Rebuilt deeper. ~3 person-years of human work — updated daily.
Hospital Ledger launched in May 2026 from a three-day build by two AI coding agents — Claude Code and OpenAI Codex — working in parallel under one operator. In September 2026 the dataset was rebuilt from scratch at greater depth — a 5,000-code CPT index, payer files, CMS enforcement records — and put on an autonomous pipeline that keeps it current: pricing waves re-ingest changed hospital files every day, and compliance is re-verified every week. The headline number isn't a vibe — it's a sum of real per-step rates a competent analyst with Excel, Power Query, and Python would actually hit. Every hospital labels "gross charge", "cash price", "negotiated rate", and "CPT code" differently; the CMS rule mandates the data points, not the column names. So every file is a new schema-mapping problem.
| Step | Volume | Per-unit rate (human) | Hours |
|---|---|---|---|
| Parse each MRF (download · open · map columns · normalize · QA) | 4,628 parsed outputs; 4,582 with rows | ~77 min avg (90% × 66 min clean + 10% × 180 min hard) | 4,747 |
| Find candidate MRF URLs from CMS + transparency pages | 4,625 hospitals | ~5 min / hospital | 385 |
| Probe URLs for liveness (curl / browser open) | 7,191 URLs | ~1 min / URL | 120 |
| Rediscover dead links by hunting each hospital's site | ~1,000 dead/missing | ~15 min each | 250 |
| Canonicalize payer names (Aetna vs AETNA vs Aetna Health Inc.) | 68,528 raw rows | ~250 wpm reading + ~500 unique merges | 50 |
| Validate CPT / HCPCS codes against AMA reference | 5,000 codes | ~3 codes / min spot-check + cleanup | 30 |
| Ingest + link CMS enforcement actions to CCNs | 8,642 records | structured CSV, mostly automated | 10 |
| Build the cross-hospital price index (joins, dedup, pivots) | 16,597,174 CPT / HCPCS rows | Excel/Power Query at solo-analyst pace | 40 |
| Design + build the SSR site, API, search, charts | 11 pages, 8 endpoints | solo full-stack dev | 300 |
| Total | ≈ 2,080 hr / person-year (full-time) | ~5,930 |
≈ 2.85 person-years at 40 hr/week fully-utilized, or roughly 5–6 calendar years for one analyst working a sustainable 20 hr/week on the side. And that is just the build — keeping it current never ends: the pipeline re-checks dozens of hospitals every night and re-verifies compliance weekly, work a human team would have to staff forever. The 99 GB of raw MRF data is too large to retype — nobody types it; they normalize. The cost is mapping, not keystrokes. Reading speed (~250 wpm) and typing speed (~40 wpm) only show up inside the per-MRF column-mapping pass and the payer-name canonicalization row.
The hospitals were already legally required to publish this data under 45 CFR § 180. Aggregating it into one queryable place doesn't make it ours to sell — it just makes it actually usable.
- Seed the CMS hospital universe (5,426 facilities)
- Load TPAFS MRF URL seeds, probe each for liveness
- Rediscover dead URLs from each hospital's transparency page
- Exa web search fallback for the still-missing
- Claude / Codex agent loop on the hardest holdouts
- CMS-HPT marker files + email-domain expansion
- Wayback Machine fallback for vanished URLs
- Fetch + parse CSV / JSON / XLSX / ZIP into one unified schema
- Ingest CMS enforcement (warning / CAP / CMP / closure)
- Build cross-hospital CPT / HCPCS price index
- SSR site + Cloudflare Pages + JSON API
- ▸Commercial aggregators (Turquoise, PayerPrice, Serif) lock the data behind NDAs.
- ▸CMS publishes the rule but doesn't aggregate or verify anything.
- ▸Every hospital uses a different format, vendor, and URL convention.
- ▸13.8% of files sit behind bot defenses; "compliance" ≠ "reachable".
- ▸Until LLM agents got good at parsing arbitrary CSV / JSON shapes, this scale of normalization wasn't cost-effective for one person.
Built in the open at github.com/barkleesanders/hospital-ledger — 59 pipeline scripts, ~19,400 lines of Python, ~8,400 lines of TypeScript. AGPLv3 code, CC0 data. No tracking. No signup. Free forever.
Search every hospital
Real-time filter across all 5,426 facilities. 4,625 are CMS-required; 4,582 currently have standardized price rows.
Top 25 worst offenders
CMS-required hospitals with the most enforcement actions and no findable MRF.
| CCN | Hospital | City, State | CMS actions |
|---|
Worst states
By share of CMS-required hospitals with a live MRF.
| State | Total | Live | % live |
|---|
By facility type
Rural Emergency Hospitals (the newest category) lag furthest.
Sources / methodology
The inputs, checks, and limits are listed here on the site, not just in the repo.
- CMS Hospital General Information supplies the hospital universe and CCNs.
- TPAFS/transparency-data supplies the initial MRF seed URLs.
- CMS Enforcement Activities supplies warning, CAP, CMP, and closure records.
- 45 CFR § 180 defines what hospitals are required to publish.
- Start with all CMS-required hospitals.
- Join known MRF links from the seed datasets.
- Probe URLs live and follow redirects to verify which files actually respond.
- Rediscover missing files from hospital transparency pages when the seed is dead.
- Parse live CSV, JSON, XLSX, ZIP, and wrapper-page formats into one schema.
- Generate the on-site standardized price previews from those parsed files.
Current on-site preview coverage: 4,582 hospitals with standardized price rows across all indexed populations. Separately, 3,985 CMS-required hospitals with a verified live MRF.
- Verified live file (the API's legacy
compliantfield) means a file URL was found and verified, not that CMS has determined legal compliance. - Missing means no live public MRF was found after automated discovery and probing.
- Under CMS enforcement means the hospital appears in CMS's public enforcement record.
- Standardized price preview appears when parsed rows were actually generated for that hospital. Hospitals with zero generated rows are not counted in the headline.
Current limits: missing rows can reflect retrieval problems, discovery mistakes, unsupported formats, filtering, or source-file problems. A missing price alone does not identify the cause.
🩺 Live prices — standardized, on-site
Parsed directly from each hospital's MRF into a unified schema. No external links — search prices by CPT or HCPCS code below.
Use it
Everything here is CC0 / public domain. No attribution required. Build whatever you want on top.