# Nursing Home Ratings, Fines & Penalties (CMS Care Compare) (`transparent_meteorite/cms-nursing-home-ratings-penalties`) Actor

Get US nursing home star ratings, fines, payment denials, abuse flags and special focus status from the free CMS Provider Data Catalog, one row per facility with phone, address, beds and a 0-100 risk score. No login, no proxy. Filter by state, city, star rating, ownership and fines.

- **URL**: https://apify.com/transparent_meteorite/cms-nursing-home-ratings-penalties.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 facility rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Nursing Home Ratings, Fines & Penalties (CMS Care Compare)

**Nursing home ratings, fines and penalties** from the official CMS Care Compare data: star ratings, total fines, payment denials, abuse flag, special focus status, beds, phone and address, with a 0-100 risk score, one row per facility.

Nursing home ratings, fines and penalties from the official CMS Care Compare data, in one clean table. This actor reads the free CMS Provider Data Catalog and returns one row per Medicare and Medicaid certified nursing home: star ratings, total fines, payment denials, abuse flag, special focus status, beds, phone, address and a 0 to 100 risk score you can sort on. No login, no proxy, no cookies.

### What is Nursing Home Ratings, Fines & Penalties (CMS Care Compare)?

Get US nursing home star ratings, fines, payment denials, abuse flags and special focus status from the free CMS Provider Data Catalog, one row per facility with phone, address, beds and a 0-100 risk score. No login, no proxy. Filter by state, city, star rating, ownership and fines. Run it from the Apify Console, the API or a schedule, and export the results as JSON, CSV, Excel or HTML.

### Output

Each dataset row has these fields: `ccn`, `providerName`, `address`, `city`, `state`, `zip`, `phone`, `ownershipType`, `certifiedBeds`, `avgResidents`, `overallRating`, `healthInspectionRating`, `staffingRating`, `qualityRating`, `totalFinesAmount`, `finesCount`, `paymentDenials`, `latestPenaltyDate`, `abuseFlag`, `specialFocusStatus`, `dataProcessingDate`, `careCompareUrl`, `riskScore` and `scrapedAt`. The Overview table view shows them with readable labels, and you can download the data as JSON, CSV, Excel or XML, or read it through the API.

#### Risk score formula

The score is documented so you can defend it in a report. It adds up to a maximum of 100:

- Star rating, 0 to 40 points: `(5 - overallRating) / 4 * 40`. One star gives 40, five stars give 0. Facilities with no rating get 0 here.
- Fines, 0 to 25 points: `25 * log10(1 + totalFinesAmount) / 6`, capped at 25 (about one million dollars in fines).
- Fine count, 0 to 5 points: one point per fine, capped at 5.
- Abuse flag, 15 points when CMS shows the abuse icon.
- Special focus status, 15 points for a Special Focus Facility, 8 points for a candidate.

It is a screening aid built from public fields, not a legal finding or a quality verdict. Always open the Care Compare link before you act.

### Sample output

| CCN | Facility | City | Stars | Fines (USD) | Fines | Latest penalty | Risk |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 235458 | Optalis Health and Rehabilitation of Grand Rapids | Grand Rapids | 1 | 191579 | 4 | 2025-11-24 | 89 |
| 235363 | Villa at Beecher Place | Flint | 1 | 210026 | 2 | 2024-05-29 | 87 |
| 235292 | Medilodge of Sault Ste. Marie | Sault Ste. Marie | 1 | 65403 | 3 | 2024-06-27 | 86 |
| 235433 | Greenfield Rehab and Nursing Center | Royal Oak | 1 | 367987 | 4 | 2025-10-07 | 82 |
| 235663 | Notting Hill of West Bloomfield | West Bloomfield | 1 | 167213 | 4 | 2025-05-14 | 81 |

One full row:

```json
{
  "ccn": "235458",
  "providerName": "Optalis Health and Rehabilitation of Grand Rapids",
  "address": "1950 32nd Street SE",
  "city": "Grand Rapids",
  "state": "MI",
  "zip": "49508",
  "phone": "6164525900",
  "ownershipType": "For profit - Individual",
  "certifiedBeds": 120,
  "avgResidents": 100.5,
  "overallRating": 1,
  "healthInspectionRating": 1,
  "staffingRating": 2,
  "qualityRating": 4,
  "totalFinesAmount": 191579,
  "finesCount": 4,
  "paymentDenials": 3,
  "latestPenaltyDate": "2025-11-24",
  "abuseFlag": true,
  "specialFocusStatus": "SFF Candidate",
  "dataProcessingDate": "2026-09-01",
  "careCompareUrl": "https://www.medicare.gov/care-compare/details/nursing-home/235458",
  "riskScore": 89,
  "scrapedAt": "2026-10-24T23:50:54.830Z"
}
```

### Input

| Field | What it does |
| --- | --- |
| `states` | Two-letter state codes. Default `["MI"]`. Leave empty for all states (about 14,700 facilities). |
| `city` | Keep facilities whose city contains this text. |
| `minOverallRating` / `maxOverallRating` | Keep facilities inside a 1 to 5 star range. Unrated facilities are dropped when either limit is set. |
| `onlyWithFines` | Keep only facilities with at least one fine or a fine total above zero. |
| `ownershipType` | Text such as "For profit", "Non profit" or "Government". |
| `sortBy` | `riskScore` (default), `totalFinesAmount`, `overallRating`, `certifiedBeds` or `providerName`. |
| `maxItems` | Rows to return. Default 100, hard cap 20,000. You pay only for rows delivered. |

Example: `{"states": ["MI", "OH"], "maxOverallRating": 2, "onlyWithFines": true, "maxItems": 200}` returns the lowest rated facilities with fines in two states, worst first.

Bad input never crashes the run. Invalid state codes are ignored with a warning, and an empty result ends with a clear message and nothing charged. Run statistics and warnings are saved to the `OUTPUT` record of the key-value store.

### Pricing

Pay per event. You pay a tiny start fee per run ($0.00005) plus **$0.0018 per facility row, which is $1.80 per 1,000 rows**. Worked example: all Michigan facilities (about 420 rows) cost roughly 420 x $0.0018 = $0.76. A 100 row default run costs about $0.18. Set a maximum cost per run in the run options and the actor stops cleanly when it is reached. You are not charged for rows that are not delivered.

### What does Nursing Home Ratings, Fines & Penalties do?

Care Compare is the public site where Medicare publishes ratings for every certified nursing home in the United States. The data behind it is open, but it is spread over many large files with long column names. This actor joins the two datasets that matter for due diligence, **Provider Information** and **Penalties**, and gives you a flat, ready-to-use row per facility.

For each nursing home you get the CMS certification number (CCN), name, full address, phone, ownership type, certified beds, average residents per day, the overall, health inspection, staffing and quality measure star ratings, total fines in dollars, number of fines, payment denials, the date of the most recent penalty, the abuse icon, special focus facility status, the CMS data date and a direct Care Compare link. On top of that it adds a **risk score from 0 to 100** that ranks facilities by how many warning signs they show, so the weakest operators rise to the top.

You choose the states, optionally a city, a minimum or maximum star rating, an ownership type, and whether to keep only facilities with fines. A default run for Michigan returns 100 real facilities in well under a minute.

### Use cases

- **Senior care placement agencies:** screen every facility in a county before recommending it to a family, and keep a shortlist of well rated homes with clean penalty records.
- **Healthcare staffing firms:** find large, low-staffing-rated facilities that are likely to need agency nurses and aides, using certified beds and the staffing rating.
- **Elder-law and injury attorneys:** surface facilities with repeated fines, payment denials or the abuse icon in your state, then open the Care Compare link for the inspection detail.
- **Investors and lenders:** compare ownership types, bed counts and fine history across a market before an acquisition or loan, and track changes between CMS refreshes.
- **Vendors selling to skilled nursing facilities:** build a call list with phone and address, and target facilities under regulatory pressure that need compliance, staffing or software help.
- **Automation idea (n8n, Make or Zapier):** schedule the actor monthly for your states, compare `riskScore` and `totalFinesAmount` with last month in a sheet, and send a Slack or email alert when a facility crosses a threshold or gets a new `latestPenaltyDate`.

### Limits

- The data is only as current as the latest CMS release, usually monthly. New fines may appear weeks after they are issued.
- Fines and penalty dates cover the window CMS publishes, not full history.
- Facilities without a star rating (new or too small) have empty rating fields and are dropped when you set a rating range.
- Hard cap of 20,000 rows per run. There are about 14,700 facilities in the US.
- It does not return inspection narratives, deficiency text or staff names. Use the Care Compare link for those.
- It does not give legal, medical or placement advice.

### Related Actors

- [EPA ECHO Facility Violations](https://apify.com/transparent_meteorite/epa-echo-facility-violations) for environmental violations by facility.
- [FDA Recalls and Enforcement Reports](https://apify.com/transparent_meteorite/fda-recalls-enforcement-reports) for product and drug enforcement actions.
- [Medicare Open Payments Doctors](https://apify.com/transparent_meteorite/medicare-open-payments-doctors) for industry payments to physicians.
- [Website Contact Extractor](https://apify.com/transparent_meteorite/website-contact-extractor) to turn facility names into emails and websites.

### FAQ

**Where does the data come from?** The official CMS Provider Data Catalog (Provider Information and Penalties datasets, the same data that powers Care Compare). It is public and needs no key.

**How fresh is it?** CMS refreshes the files about monthly. Each row carries `dataProcessingDate` so you can see the CMS data date.

**Why is latestPenaltyDate empty for some facilities?** The penalties file only lists fines and payment denials in the CMS three year window. A facility with no recorded penalty has no date.

**What does the abuse flag mean?** It mirrors the CMS abuse icon, which marks facilities cited for abuse, neglect or exploitation at the latest inspections. It is a CMS flag, not our judgment.

**Can I get all states?** Yes. Leave `states` empty and raise `maxItems`. A full national run reads about 14,700 facilities and takes a few minutes.

**Does it include resident names or staff data?** No. It returns facility level business records only: name, address, business phone and published ratings.

**Is the risk score a quality rating?** No. It is a transparent screening formula (see above) that combines public CMS fields. Use it to prioritize, then verify on Care Compare.

**Did this actor do the job?** If it saved you time, a short honest review on the [Reviews tab](https://apify.com/transparent_meteorite/cms-nursing-home-ratings-penalties/reviews) helps other people judge it. If something was off, open an Issue on this page with the input you used. I read every one and fix real bugs, usually the same day.

**This Actor vs jungle_synthesizer/cms-hospital-crawler:** that one covers many Care Compare provider types, including hospitals, hospice, home health and dialysis. Choose this one for nursing homes only, with fines, payment denials, the abuse flag and a 0-100 risk score you can sort on.

### Changelog

- 2026-10-24: Initial release.
- 2026-10-25: Documentation updated: README refreshed.
- 2026-10-25: Listing refresh: new Store icon, README reorganised (overview, data fields, pricing, FAQ) and changelog tab added. No code change.

# Changelog

This Actor's version history is a separate document: https://apify.com/transparent_meteorite/cms-nursing-home-ratings-penalties/changelog.md

# Actor input Schema

## `states` (type: `array`):

Two-letter US state codes, for example MI, OH, TX. Leave empty for all states (about 14,700 facilities).

## `city` (type: `string`):

Optional. Keep facilities whose city contains this text, for example "Detroit".

## `minOverallRating` (type: `integer`):

Optional 1 to 5. Keep facilities rated at or above this.

## `maxOverallRating` (type: `integer`):

Optional 1 to 5. Set to 2 to find low-rated facilities. Facilities with no rating are dropped when either rating limit is set.

## `onlyWithFines` (type: `boolean`):

Turn on to keep only facilities with at least one fine or a fine total above zero in the last three years.

## `ownershipType` (type: `string`):

Optional. Text such as "For profit", "Non profit" or "Government".

## `sortBy` (type: `string`):

Order of the rows. Rows are cut to Max rows after sorting.

## `maxItems` (type: `integer`):

Stop after this many rows. You pay only for rows delivered. Hard cap 20,000.

## Actor input object example

```json
{
  "states": [
    "MI"
  ],
  "onlyWithFines": false,
  "sortBy": "riskScore",
  "maxItems": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "states": [
        "MI"
    ],
    "sortBy": "riskScore",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/cms-nursing-home-ratings-penalties").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "states": ["MI"],
    "sortBy": "riskScore",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("transparent_meteorite/cms-nursing-home-ratings-penalties").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "states": [
    "MI"
  ],
  "sortBy": "riskScore",
  "maxItems": 100
}' |
apify call transparent_meteorite/cms-nursing-home-ratings-penalties --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,transparent_meteorite/cms-nursing-home-ratings-penalties"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MX5AT78cpCmlwKhBd/builds/6M13HtiGcaNgo2gly/openapi.json
