# Medicare Provider Enrollment Revalidation Due Date Check (`malekh/medicare-provider-enrollment-revalidation-due-date`) Actor

Check Medicare revalidation due dates for a list of NPIs against the current CMS Revalidation Due Date List. Flags overdue and due-soon enrollments per provider with dates, provider type, specialty and state. Resolves the live monthly release each run, so it never answers from a stale snapshot.

- **URL**: https://apify.com/malekh/medicare-provider-enrollment-revalidation-due-date.md
- **Developed by:** [Malek H](https://apify.com/malekh) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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/platform/actors/running/actors-in-store#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 Provider Enrollment Revalidation Due Date Check

Give it a list of NPIs. It tells you which of your providers have a **Medicare
provider enrollment revalidation** due — and which are already past due.

Every Medicare-enrolled provider and supplier must revalidate their enrollment
every five years (every three for DMEPOS suppliers). CMS publishes the
**Revalidation Due Date List** monthly, but it is a 2.9-million-row file with no
lookup interface: you cannot ask it *"are any of my 400 providers due?"*. This
Actor does that join.

Miss a revalidation due date and CMS deactivates billing privileges. Reactivation
is retroactive only to the date you resubmit, so the practice eats the gap. The
whole point of this Actor is that the answer it gives you is trustworthy.

### What you get

One row per NPI, with every Medicare enrollment that NPI holds:

| Status | Meaning |
|---|---|
| `overdue` | At least one enrollment is past its revalidation due date |
| `due_soon` | Due within your window (default 180 days) |
| `due_later` | Has a date, beyond your window |
| `tbd` | CMS has not assigned a due date yet — published as TBD |
| `not_enrolled` | No Medicare enrollment record found for this NPI |
| `invalid_npi` | Failed the NPI check digit or the wrong length — **not looked up** |

A provider with several enrollments is summarised by its **most urgent** one, so
a TBD or a far-future enrollment can never hide an overdue sibling.

#### Input

```json
{
  "providers": [
    { "recordId": "HR-1041", "npi": "1013960657" },
    { "recordId": "HR-1042", "npi": "1053393447" },
    "1003879883"
  ],
  "dueWithinDays": 180
}
```

`providers` accepts bare NPI strings or objects. Any `recordId` you supply is
echoed back so results reconcile against your credentialing system. Up to 20,000
NPIs per run, batched 50 to a request — 500 providers resolve in about ten
seconds.

#### Output

```json
{
  "recordId": "HR-1041",
  "npi": "1013960657",
  "status": "overdue",
  "statusDetail": "2 of 42 Medicare enrollment(s) are past their revalidation due date...",
  "providerName": "Northside Radiology Associates Llc",
  "nextDueDate": "2026-03-31",
  "daysUntilDue": -120,
  "enrollmentCount": 42,
  "overdueCount": 2,
  "dueSoonCount": 5,
  "tbdCount": 29,
  "enrollments": [
    {
      "enrollmentId": "O20200826003152",
      "status": "overdue",
      "dueDate": "2026-03-31",
      "daysUntilDue": -120,
      "providerType": "Non-DME Part B",
      "specialty": "Clinic/Group Practice",
      "stateCode": "CA",
      "reassignmentsToOthers": "33"
    }
  ],
  "source": {
    "release": "Revalidation Due Date List : 2026-07-01",
    "published": "2026-07-14",
    "rowCount": 2922248
  }
}
```

Every row carries the exact CMS release it was answered from, so an audit can
reproduce it.

### Why the answers are trustworthy

A revalidation checker that quietly returns "nothing due" is worse than no
checker at all. Two ways that happens are real, and both are guarded here.

**1. The stale-release trap.** CMS mints a *new* dataset ID for every monthly
release and keeps all 87 previous ones live and returning `200 OK`. An archived
release answers every query cheerfully with due dates that stopped years ago —
one such snapshot returns 2.55M rows whose newest due date is **2020-09-30**.
This Actor never hardcodes a dataset ID. It resolves the release the CMS catalog
marks `latest` on every run, and then **fails the run** if that release has fewer
than 2 million rows, is missing an expected column, or has a newest due date that
has already passed.

**2. The ignored-filter trap.** The CMS API accepts three spellings of a
multi-value filter and only one of them actually filters; another silently drops
the filter and returns arbitrary providers that look exactly like real results.
This Actor uses the correct form and then verifies that every NPI in the response
is one it asked for, failing loudly on any stray row rather than attributing a
stranger's due date to your provider.

**Absence is never a clean bill of health.** An NPI with no rows is reported as
`not_enrolled`, not as "nothing due". A mistyped NPI is caught by its check digit
and reported as `invalid_npi` rather than silently becoming `not_enrolled`.

### Source

- **CMS Revalidation Due Date List** —
  <https://data.cms.gov/provider-characteristics/medicare-provider-supplier-enrollment/revalidation-due-date-list>
- Public domain US Government data, retrieved through the documented
  `data.cms.gov` API. No key, no scraping, no rate-limit circumvention.
- Updated by CMS monthly; this Actor always reads the current release.

Verify any individual result in PECOS at <https://pecos.cms.hhs.gov/>.

### Pricing

Pay per event: a flat fee per run, charged only after the source passes its
integrity checks, plus a small fee per NPI checked. Invalid NPIs are not charged.

### Limitations

- Reflects the CMS monthly release. A revalidation you submitted this week will
  not clear here until CMS republishes.
- `tbd` is CMS's own value — it means no date has been assigned yet, not that the
  data is missing. CMS normally posts a date about six months ahead.
- Reports revalidation due dates only. It is not a full PECOS enrollment record
  and does not cover payer enrollments outside Medicare.

# Actor input Schema

## `providers` (type: `array`):

The NPIs to check against the CMS Revalidation Due Date List. Either bare 10-digit NPI strings, or objects with an 'npi' field plus an optional 'recordId' that is echoed back on the result so rows reconcile with your credentialing system. Up to 20,000 per run.

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

How far ahead counts as 'due\_soon'. An enrollment due inside this window is flagged due\_soon; beyond it, due\_later. Anything already past its date is overdue regardless. 180 days gives a credentialing team two quarters of warning.

## Actor input object example

```json
{
  "providers": [
    {
      "recordId": "HR-1041",
      "npi": "1013960657"
    },
    {
      "recordId": "HR-1042",
      "npi": "1053393447"
    },
    "1003879883"
  ],
  "dueWithinDays": 180
}
```

# 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 = {
    "providers": [
        {
            "recordId": "HR-1041",
            "npi": "1013960657"
        },
        {
            "recordId": "HR-1042",
            "npi": "1053393447"
        },
        "1003879883"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malekh/medicare-provider-enrollment-revalidation-due-date").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 = { "providers": [
        {
            "recordId": "HR-1041",
            "npi": "1013960657",
        },
        {
            "recordId": "HR-1042",
            "npi": "1053393447",
        },
        "1003879883",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malekh/medicare-provider-enrollment-revalidation-due-date").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "providers": [
    {
      "recordId": "HR-1041",
      "npi": "1013960657"
    },
    {
      "recordId": "HR-1042",
      "npi": "1053393447"
    },
    "1003879883"
  ]
}' |
apify call malekh/medicare-provider-enrollment-revalidation-due-date --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malekh/medicare-provider-enrollment-revalidation-due-date",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2TY0lUR6ijITb4dGo/builds/BrhmbcX4eqDWDpQVL/openapi.json
