Hospital Price Transparency MRF Normalizer
Pricing
Pay per event + usage
Hospital Price Transparency MRF Normalizer
Normalize hospital price transparency MRF files into clean payer, code, and negotiated rate rows for builders and buyers.
Pricing
Pay per event + usage
Rating
0.0
(0)
Developer
George Kioko
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
18 days ago
Last modified
Categories
Share
Hospitals now publish price transparency MRF files with payer names, plans, billing codes, and negotiated rates, but the files are usually too large and inconsistent to use directly. CMS added new 2026 template fields and began enforcement for those fields on April 1, 2026, which means hospitals, consultants, TPAs, employers, revenue cycle teams, and data buyers need cleaner feeds now. This Actor turns public hospital MRF files into normalized rows that can go straight into a dataset, warehouse, quoting tool, or benefits product.
Quick start
Normalize one public hospital MRF:
curl "https://george-the-developer--hospital-mrf-normalizer.apify.actor/normalize?url=https%3A%2F%2Frequest.cooperhealth.org%2Ffinancial%2F210634462_CooperUniversityHealthCare_standardcharges_update.csv&hospital=Cooper%20University%20Hospital&limit=50" \-H "Authorization: Bearer YOUR_APIFY_TOKEN"
Discover MRF links from a hospital pricing page or domain:
curl "https://george-the-developer--hospital-mrf-normalizer.apify.actor/discover?hospital=cooperhealth.org" \-H "Authorization: Bearer YOUR_APIFY_TOKEN"
What it returns
Every normalized row uses the same field names, whether the source file is JSON, CSV, or gzip compressed JSON or CSV.
For best results, pass a direct file URL plus the hospital name. Discovery is free and useful for finding likely files, but hospital websites move links often and some publish several facility files from one page. If the file is very large, start with limit=50, inspect the dataset, then raise the limit for the full pull. The Actor skips rows that do not have a numeric payer rate because blank contract rows are noise for downstream buyers.
| Field | Meaning |
|---|---|
| hospital_id | Stable slug derived from the hospital name |
| hospital_name | Hospital display name from input or source file |
| provider_npi | Type 2 NPI when present |
| billing_code | CPT, HCPCS, DRG, revenue code, or local code |
| billing_code_type | CPT, HCPCS, DRG, MS DRG, APR DRG, EAPG, RC, or LOCAL |
| billing_code_description | Plain description of the service |
| payer_name | Insurance payer name |
| plan_name | Plan name when present |
| negotiated_rate | Parsed numeric negotiated dollar rate |
| negotiated_type | negotiated, fee schedule, percentage, per diem, or case rate |
| expiration_date | Contract expiration date when present |
| modifiers | Billing modifiers as an array when present |
| service_setting | inpatient, outpatient, both, or null |
| source_url | Original MRF URL |
| last_updated | ISO timestamp for the row |
Architecture
graph LRA[Input URL or hospital domain] ==> B[Discover]B ==> C[Fetch]C ==> D[Format detect]D ==> E[Stream parse]E ==> F[Normalize]F ==> G[Apify dataset]
The parser probes the first 2 KB of the stream, handles redirects, detects gzip bytes, rejects XML in v1, and caps reads at 1 GB per URL. JSON files are streamed with stream-json. CSV files are streamed with csv-parse. The Actor does not load full MRF files into memory.
Pricing
| Event | Price | When it fires |
|---|---|---|
| actor start | $0.50 | Once per paid normalize request or batch run |
| rate row | $0.002 | Each normalized row pushed to the dataset |
| normalized bundle | $0.02 | Each unique provider, billing code, and payer triplet |
Health check literals such as example.com, test@gmail.com, stripe.com, test, and ping return mocked data and are not billed.
Positioning
Turquoise Health, Castlight, and similar products are full SaaS dashboards with their own workflows, contracts, and user interfaces. This Actor is different. It gives builders the raw normalized feed so they can plug hospital rates into their own search, quoting, plan design, procurement, or analytics stack without waiting on a sales cycle.
Use this when you want data rows, not another dashboard.
Use cases
- TPA shopping engine: compare negotiated rates across hospitals by payer, plan, CPT, and facility.
- Employer benefit lookup: show members expected negotiated rates for common procedures.
- Healthcare bluebook clone: build fair price bands from multiple hospital MRF feeds.
- Revenue cycle denial appeals: pull payer specific rates as support for underpayment review.
- M and A diligence: inspect payer mix and contract rate exposure across target facilities.
FAQ
Which formats are supported?
JSON, CSV, gzip JSON, and gzip CSV are supported in v1. The parser handles CMS v3 JSON files and common older flat CSV layouts.
Does it handle gzip?
Yes. The Actor detects gzip magic bytes and pipes the stream through Node gzip decompression before format detection.
What is not supported in v1?
XML MRF files, zip archives, XLSX files, multi file index expansion, and payer allowed amount files are not parsed in v1.
Why did my row count come back lower than the limit?
The limit is the number of source rows to scan. Rows with blank codes, blank payers, or non numeric rates are skipped because they do not produce useful normalized output.
Can I get a refund for a bad source file?
If the source URL returns unusable data or the Actor fails before pushing rows, open an issue on the Actor page with the run ID and URL. Failed runs and parser bugs are reviewed case by case.
Are there rate limits?
Bulk mode accepts up to 10 URLs per request. Keep limits low for first tests, then increase once you confirm the source format.
How do I contact the maintainer?
Open an issue on the Apify Actor page with the MRF URL, run ID, and what output you expected.