# Medicare Revalidation Due Date List (CMS) Scraper (`jserle/medicare-revalidation-due-leads`) Actor

Medicare revalidation due date list from CMS, filtered to enrollments due inside a date window you choose: enrollment ID, NPI, name, state, specialty, provider type, due date and days until due. Narrow by state, specialty, provider type or name. Monthly CMS refresh. $0.002/record.

- **URL**: https://apify.com/jserle/medicare-revalidation-due-leads.md
- **Developed by:** [JS Tech Solutions](https://apify.com/jserle) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 revalidation leads

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Medicare Revalidation Due Date List (CMS) Scraper

Pulls the CMS Medicare Revalidation Due Date List and narrows it to the enrollments whose revalidation falls inside a date window you choose, soonest due first, as clean JSON records: enrollment ID, NPI, provider or legal business name, state, specialty, provider type, due date and days until due. Filter by state, specialty, provider type and name.

Every provider and supplier enrolled in Medicare has to revalidate, and CMS publishes the due dates. The published list is 2.93 million enrollment rows, most of them marked "not yet assigned", which makes the useful part, who is due and when, hard to get at. On the August 2026 file: **2,931,409 enrollments in the dataset, 270,992 with a due date on them, 20,945 of those falling in the next 90 days.** That last number is the list.

### Who uses this data

- **Credentialing and provider enrollment vendors.** A revalidation due in 90 days is a dated, qualified need with a deadline attached. Pull the window, filter to your states, work the list.
- **RCM and medical billing companies.** A missed revalidation deactivates the enrollment and stops payment. Providers approaching a due date are the ones most receptive to a conversation about it.
- **MSOs and practice-management groups** watching the due dates across an owned or affiliated portfolio, by state and specialty.
- **Healthcare compliance teams** confirming that every enrollment they hold has its revalidation on the calendar.
- **Health-data teams** joining revalidation timing onto NPI-keyed data they already hold.

### What you get

One dataset item per enrollment, soonest due first.

```json
{
  "source": "https://data.cms.gov/data-api/v1/dataset/3746498e-874d-45d8-9c69-68603cafea60/data",
  "landingPage": "https://data.cms.gov/provider-characteristics/medicare-provider-supplier-enrollment/revalidation-due-date-list",
  "attribution": "Centers for Medicare & Medicaid Services (CMS)",
  "fetchedAt": "2026-08-23T11:45:12.801Z",
  "enrollmentId": "O20030131000002",
  "npi": "1073506911",
  "providerName": "Hidalgo Medical Services",
  "firstName": null,
  "lastName": null,
  "organizationName": "Hidalgo Medical Services",
  "isOrganization": true,
  "state": "NM",
  "enrollmentType": "1",
  "enrollmentTypeText": "Part A",
  "providerType": "Part A",
  "specialty": "Federally Qualified Health Center (Fqhc)",
  "revalidationDueDate": "2026-08-31",
  "adjustedDueDate": null,
  "daysUntilDue": 8,
  "individualTotalReassignTo": null,
  "receivingBenefitsReassignment": null
}
```

`providerName` is the legal business name for an organization and the person's name for an individual, so one column works for both. `daysUntilDue` counts whole days from the run date (UTC) and goes negative for an enrollment already past due. `individualTotalReassignTo` counts the individual enrollments reassigning benefits to an organization, and `receivingBenefitsReassignment` counts the organizations an individual reassigns to; both are useful as a size signal on a group practice.

Dates are ISO 8601 calendar dates. Missing values are `null`, never an empty string. Records are deduplicated on enrollment ID together with NPI: one enrollment ID can legitimately cover many NPIs, so the pair is the key.

### Input

Everything is optional. Run it with no input and you get the 100 enrollments due to revalidate soonest within the next 90 days, nationwide.

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `dueWithinDays` | integer | `90` | Window length from today (UTC). Naming either endpoint below switches this off entirely. |
| `dueFrom` | `YYYY-MM-DD` | today (UTC) | Start of the window. Set a past date to pull overdue enrollments. Set on its own, the window has no end. |
| `dueTo` | `YYYY-MM-DD` | today + `dueWithinDays` | End of the window. Set on its own, the window has no start. |
| `states` | string\[] | all | Two-letter enrollment state codes, e.g. `["NY","NJ","CT"]`. |
| `specialty` | string | - | Case-insensitive substring on the enrollment specialty, e.g. `Cardio`, `Pharmacy`, `Hospice`. |
| `providerType` | enum | `any` | `Part A`, `Non-DME Part B`, or `DME`. |
| `nameKeyword` | string | - | Case-insensitive substring on organization, first and last name. Applied after fetching, so it reads up to 10 pages looking for matches. |
| `maxResults` | integer | `100` | 1 to 50000. This is your cost cap: you pay per delivered record. |
| `includeRaw` | boolean | `false` | Attach a `raw` object with the API row under its published column names. |

The due-date window is always in force. CMS leaves the due date blank on enrollments it has not scheduled yet (its documentation calls these "TBD"), and an enrollment with no date is not a dated lead, so those rows are never delivered. Every request carries a "has a due date" filter, so they are excluded at the API rather than fetched and thrown away.

`dueWithinDays` is a shorthand for "today until N days from today". Naming `dueFrom` or `dueTo` switches it off completely rather than letting it supply the other end, so `dueFrom: "2026-12-01"` means from that date onwards, not from that date for 90 days. One-sided windows are as cheap as two-sided ones.

#### Example inputs

**Everything due in the next 90 days in your states** (enrollment vendor lead list):

```json
{
  "dueWithinDays": 90,
  "states": ["NY", "NJ", "CT"],
  "maxResults": 2000
}
```

**DME suppliers due in a specific month** (billing-company prospecting by provider type):

```json
{
  "dueFrom": "2026-11-01",
  "dueTo": "2026-11-30",
  "providerType": "DME",
  "maxResults": 1000
}
```

**Check one organization's revalidation date** (compliance, paired with a state to keep the scan small):

```json
{
  "dueFrom": "2026-01-01",
  "states": ["NM"],
  "nameKeyword": "Hidalgo Medical",
  "maxResults": 10
}
```

### Pricing

**$0.002 per record; you pay only for records delivered.** One charge per dataset item, nothing else. Set `maxResults` and you have set your bill: 1,000 records is $2.00. Filters are applied before delivery, so a narrow search costs less than a broad one, and a window that matches nothing costs nothing.

### Data source, refresh and licence

Data comes from the **Centers for Medicare & Medicaid Services (CMS)** Revalidation Due Date List, read through the public data.cms.gov API:

- Dataset: [Revalidation Due Date List](https://data.cms.gov/provider-characteristics/medicare-provider-supplier-enrollment/revalidation-due-date-list)
- API endpoint: `https://data.cms.gov/data-api/v1/dataset/3746498e-874d-45d8-9c69-68603cafea60/data`
- Field definitions: [Revalidation Due Date List Data Dictionary](https://data.cms.gov/resources/revalidation-due-date-list-data-dictionary)

**Refresh:** CMS publishes this dataset **monthly** (`accrualPeriodicity: R/P1M` in its catalog entry). The August 2026 file was last modified 2026-08-05. Each run reads live and reports the dataset's row count in the run summary under the `OUTPUT` key, so scheduling the Actor monthly tracks the source's own cadence.

**Licence:** CMS's own `data.json` catalog entry for this dataset gives its licence as **<https://www.usa.gov/government-works>** and its access rights as Open.

**Attribution:** Centers for Medicare & Medicaid Services (CMS). This Actor is **not affiliated with or endorsed by the Centers for Medicare & Medicaid Services**, and nothing here should be read as a CMS endorsement of it.

`https://data.cms.gov/robots.txt` advertises `crawl-delay: 10` and does not disallow `/data-api/v1/dataset/`. The Actor honours the 10 second delay between requests, sends a descriptive User-Agent, opens no parallel connections, and caches nothing between runs. A default run makes two requests.

### Limitations

- **Only about 9% of enrollments carry a due date.** CMS publishes roughly the coming six months of due dates and leaves the rest blank; 270,992 of 2,931,409 rows had a date on 2026-08-23. Those blank rows are excluded, by design.
- **The forward-looking list is organizational.** In the August 2026 file, dated enrollments from today onward are organizations: clinics and group practices, pharmacies, FQHCs, hospices, DME suppliers, ambulance services. The 10,744 individual practitioner rows that carry a date are all in 2023. A past window (`dueFrom: "2023-01-01"`) reaches them; a forward one will not until CMS assigns new individual dates.
- **No contact details.** CMS does not publish an address, phone number or email in this dataset, and this Actor does not invent or enrich them. Join on `npi` against NPPES if you need contact information.
- **No per-record deep link.** The dataset has no public per-enrollment page, so items link to the dataset landing page rather than to a record.
- **The window follows `revalidationDueDate` only.** That is the one date column the CMS API can filter on, so following anything else would mean the server and this Actor disagreed about which rows belong in the window. `adjustedDueDate` is blank on every row of the current file; it is delivered as published, and if CMS starts populating it the run summary says so under `rowsWithAnAdjustedDueDate`.
- **`state` is the enrollment's state**, not necessarily the provider's mailing address, and one provider can hold enrollments in several states.
- **A name search reads pages, not an index.** The API cannot match a keyword across three name columns at once, so `nameKeyword` is applied after fetching. Such a run reads at most 10 pages (about two minutes), reports `pageBudgetReached` if it stops there with partial results, and fails outright rather than billing you if 10 pages produce no match at all. Pair `nameKeyword` with a state or a narrow window.
- **Dates are UTC.** "Today", the window edges and `daysUntilDue` are all computed on the UTC calendar day, so a run started late in the evening west of Greenwich uses the next UTC date. Set `dueFrom` explicitly if that matters to you.

### FAQ

#### How do I look up a Medicare revalidation due date?

Run with `nameKeyword` (or inspect `npi` in the output) together with a state and a window that starts in the past, for example `dueFrom: "2023-01-01"`, so the scan stays small. If the enrollment has no published date yet, CMS lists it as TBD and it will not appear; check again after the next monthly release.

#### Why are most Medicare enrollments missing from the list?

CMS assigns due dates roughly six months ahead and leaves the rest blank ("TBD"). Only 270,992 of 2,931,409 rows carried a date on 2026-08-23, and this Actor delivers dated rows only.

#### What happens if a provider misses Medicare revalidation?

CMS deactivates the enrollment and payment stops until it is reinstated, which is why enrollment and billing vendors work the due-date list ahead of time.

#### Can I get revalidation due dates by state or specialty?

Yes. `states` and `specialty` are applied on top of the date window. `providerType` narrows to `Part A`, `Non-DME Part B` or `DME`.

#### Does the list include individual physicians?

Only when CMS has assigned them a date. In the August 2026 file every forward-dated enrollment is an organization; the 10,744 dated individual rows all fall in 2023 and are reachable with a past window.

#### How often is the CMS revalidation due date list updated?

Monthly. The August 2026 file was last modified 2026-08-05.

### Related datasets

Other datasets by the same author, all pay-per-record with source, refresh cadence and licence stated on each listing:

**Nursing home and long-term care data**

- [Nursing Home Deficiency Citations (CMS) Scraper](https://apify.com/jserle/nursing-home-deficiency-citations)
- [Nursing Home Fines & Civil Money Penalties (CMS) Scraper](https://apify.com/jserle/nursing-home-penalties-fines)
- [Nursing Home Directory & Ownership (CMS Form 671) Scraper](https://apify.com/jserle/ltc-facility-characteristics)
- [Nursing Home Daily Nurse Staffing (CMS PBJ) Scraper](https://apify.com/jserle/cms-nursing-home-staffing-daily)
- [Nursing Home Change of Ownership (CMS SNF CHOW) Scraper](https://apify.com/jserle/snf-change-of-ownership-tracker)
- [New York Nursing Home Bed Availability (NYSDOH) Scraper](https://apify.com/jserle/ny-nursing-home-bed-census)

**Medicare provider enrollment data**

- [Medicare Revoked Providers List (CMS Revocations) Scraper](https://apify.com/jserle/medicare-revoked-providers)
- [Medicare Opt-Out Providers List (CMS Affidavits) Scraper](https://apify.com/jserle/medicare-opt-out-physicians)

**Public procurement and RFP feeds**

- [E-Rate Form 470 RFP Scraper (USAC School & Library Bids)](https://apify.com/jserle/erate-form-470-rfp-feed)
- [NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts)](https://apify.com/jserle/nyc-passport-procurement)

**Developer and AI test data**

- [Synthetic Invoice OCR Ground Truth Dataset Generator](https://apify.com/jserle/ocr-ground-truth-document-factory)

# Actor input Schema

## `dueWithinDays` (type: `integer`):

Window length from today. 90 means every enrolment whose revalidation is due between today and 90 days from now. Ignored when you set an explicit start or end date below.

## `dueFrom` (type: `string`):

Start of the window as YYYY-MM-DD, for example 2026-10-01. Overrides "Due within (days)" and defaults to today. Use a past date to pick up overdue revalidations.

## `dueTo` (type: `string`):

End of the window as YYYY-MM-DD, for example 2026-12-31. Overrides "Due within (days)".

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

Two-letter enrollment state codes, for example NY, NJ, CT. Leave empty for all states and territories. Matched exactly against the enrolment's state code, which is the state of the enrolment record, not necessarily the provider's mailing address.

## `specialty` (type: `string`):

Case-insensitive substring matched against the enrollment specialty. Examples: Cardio, Physical Therapist, Clinic/Group Practice, Pharmacy, Hospice, Ambulance.

## `providerType` (type: `string`):

The Medicare enrolment type. Part A is institutional (hospitals, hospices, FQHCs, home health). Non-DME Part B is practitioners, clinics and group practices. DME is durable medical equipment suppliers.

## `nameKeyword` (type: `string`):

Case-insensitive substring matched against the organization name, first name and last name. Applied after the records are fetched, so a broad window plus a rare name can take several minutes and may hit the per-run read budget.

## `maxResults` (type: `integer`):

How many records to deliver, soonest due first. You are charged per delivered record, so this is also your cost cap.

## `includeRaw` (type: `boolean`):

Attach a `raw` object holding the API row exactly as CMS returned it, under its published column names. Useful for auditing the normalization; roughly doubles item size.

## Actor input object example

```json
{
  "dueWithinDays": 90,
  "providerType": "any",
  "maxResults": 100,
  "includeRaw": false
}
```

# Actor output Schema

## `results` (type: `string`):

One item per enrolment delivered by this run, soonest due first.

## `summary` (type: `string`):

Window used, dataset and match counts, API requests made, delivered records and whether the charge limit stopped the run.

# 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 = {
    "dueWithinDays": 90,
    "providerType": "any",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("jserle/medicare-revalidation-due-leads").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 = {
    "dueWithinDays": 90,
    "providerType": "any",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("jserle/medicare-revalidation-due-leads").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 '{
  "dueWithinDays": 90,
  "providerType": "any",
  "maxResults": 100
}' |
apify call jserle/medicare-revalidation-due-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jserle/medicare-revalidation-due-leads"
        }
    }
}

```

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/B1hwLbhcwQStLKftN/builds/ypzBvYFEGJZfor6L7/openapi.json
