Every figure comes with a verified flag. Read the
methodology before relying on one that
says false.
After checkout the key is shown once, on the page you land on. Store it then — we keep only a hash and cannot show it again. Send it as a header:
curl -H "X-API-Key: dk_your_key" "https://api.providercostreports.com/v1/hospitals/010001/metrics"
Or as ?key= on the URL, which is easier in a browser and worse in a
shell history.
Hospitals CSV Nursing homes CSV Home health CSV
Hospitals Parquet Nursing homes Parquet Home health Parquet
Paste a key above, then choose a file.
One dataset per file, as CSV or Parquet. The three are kept separate because they are verified differently and a blended file invites treating them as one.
curl -H "X-API-Key: dk_your_key" -OJ "https://api.providercostreports.com/v1/export?dataset=hospital&format=csv"
-OJ keeps the filename we send, e.g.
datakit-hospital-20260822.csv.
| dataset | covers |
|---|---|
hospital | hospitals |
nursing-home | nursing homes |
home-health | home health agencies |
format is csv or parquet. Parquet is roughly
ten times smaller and keeps verified as a real boolean rather than 0/1.
Add &metric=net_patient_revenue to narrow the file to one metric.
| Tier | Rows per response | Calls per day | Bulk export | Years of history |
|---|---|---|---|---|
| free | 1 | 25 | not included | 1 |
| starter | 500 | 2,000 | not included | 3 |
| pro | 10,000 | 20,000 | 10/day | 10 |
| full | 250,000 | 200,000 | 50/day | all |
Limits clamp rather than reject. Ask for 5,000 rows on a tier allowing 500 and you get 500 with a header saying so, not an error — so a script written against the wrong tier returns less data rather than breaking.
GET /v1/hospitals?state=AL&q=mercy&limit=&offset=
GET /v1/hospitals/{ccn}
GET /v1/hospitals/{ccn}/metrics?metric=&from=&to=
GET /v1/metrics?metric=operating_margin&fiscal_year=2024
GET /v1/tiers
GET /v1/health
Responses are JSON. format= is only understood by
/v1/export; elsewhere it returns 400 rather than quietly sending JSON to
something expecting CSV.
402 means the tier does not include what you asked for; the body names the
tiers that do. 429 means the daily call budget is spent, and exports have their
own separate budget, so one cannot exhaust the other. A key that has lapsed resolves to
the free tier rather than failing, so a script keeps running and starts returning one
row — check tier in any response if numbers look thin.