# NPI Registry Provider Leads (No 1,200 Cap) (`open-data-tools-hq/npi-provider-leads`) Actor

Search the official CMS NPI Registry for doctors, dentists, clinics, home health agencies and any provider type, with no 1,200-result cap. Phones, addresses, taxonomies, licenses, authorized officials. Auto-splits big searches by ZIP and dedupes.

- **URL**: https://apify.com/open-data-tools-hq/npi-provider-leads.md
- **Developed by:** [Open Data Tools](https://apify.com/open-data-tools-hq) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result returneds

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

## NPI Registry Provider Leads: No 1,200-Result Cap

Pull **every** matching healthcare provider from the official CMS **NPI Registry** (NPPES): doctors, dentists, chiropractors, therapists, nurse practitioners, pharmacies, clinics, home health agencies, and every other provider type. Each comes back as a clean row with phone, practice and mailing address, specialty taxonomies, license numbers, and (for organizations) the authorized official's name, title, and phone.

### The 1,200-row problem, solved

The NPI Registry API returns at most 200 rows per page and **silently stops at 1,200 results per search**. Most tools stop there, or quietly repeat the same page. This actor detects when a search is capped and **automatically splits it by ZIP-code prefix** (66\*, 660\*, 6606\*, and so on) until every slice is complete. It then dedupes by NPI.

> Real test: *Dentists (individual) in Kansas* returns 1,200 rows from a plain API search. With this actor it returned **1,897 unique dentists** in about 40 seconds.

### Who uses this

- Dental, medical, and pharma sales reps building territory lists
- Healthcare marketing agencies, SaaS (EHR, billing, scheduling), and staffing firms
- Medical billing and credentialing services
- Market researchers sizing a specialty by state or ZIP

### Features

- Search by **provider type** (taxonomy), **state**, **city**, **ZIP or prefix**, **name**, or **organization name**, plus combinations. Lists are searched as a cross product.
- **Practice-location state filter**: the registry matches a state on *any* address. This actor keeps only providers that actually practice there, unless you turn that off.
- **Primary specialty only**, **must have phone**, **NPI issued after a date** (new practices).
- **Monitor mode**: schedule weekly or monthly and get only providers you have not received before.
- Polite request rate, automatic retries, and normalized output.

### Input examples

**All dentists practicing in Kansas:**

```json
{ "taxonomies": ["Dentist"], "states": ["KS"], "enumerationType": "individual" }
```

**Home health agencies in Colorado with a phone, including the authorized official:**

```json
{ "taxonomies": ["Home Health"], "states": ["CO"], "enumerationType": "organization", "requirePhone": true }
```

**Chiropractors and physical therapists who got an NPI in 2026, in Texas:**

```json
{ "taxonomies": ["Chiropractor", "Physical Therapist"], "states": ["TX"], "enumeratedAfter": "2026-01-01" }
```

### Output example

```json
{
  "npi": "1851023659",
  "entityType": "Organization",
  "name": "1 ABOVE THE REST",
  "otherNames": ["MOUNTAIN HOME HEALTH CARE"],
  "authorizedOfficial": { "name": "OLGA GERMAN", "title": "Owner", "credential": null, "phone": "7207396135" },
  "primaryTaxonomy": "Home Health",
  "primaryTaxonomyCode": "251E00000X",
  "taxonomies": [{ "code": "251E00000X", "description": "Home Health", "primary": true, "licenseNumber": null, "licenseState": null }],
  "practiceAddress": { "street1": "4465 NORTHPARK DR STE 307", "city": "COLORADO SPRINGS", "state": "CO", "zip": "80907-4238", "country": "US", "phone": "719-645-4291", "fax": null },
  "mailingAddress": { "street1": "6990 W 38TH AVE STE 202", "city": "WHEAT RIDGE", "state": "CO", "zip": "80033-4981", "country": "US", "phone": "720-739-6135", "fax": null },
  "phone": "719-645-4291",
  "additionalPracticeLocations": [],
  "endpoints": [],
  "identifiers": [],
  "enumerationDate": "2022-06-29",
  "lastUpdated": "2022-06-29",
  "status": "Active",
  "registryUrl": "https://npiregistry.cms.hhs.gov/provider-view/1851023659",
  "scrapedAt": "2026-10-27T06:29:33+00:00"
}
```

Individuals also include `firstName`, `lastName`, `credential` (DDS, MD, NP...), `sex`, and `soleProprietor`. `endpoints` lists Direct messaging or FHIR addresses when the provider has published them.

### Notes

- Very large searches (for example, every nurse nationwide) work but take longer, because the registry API is the bottleneck. Narrow by state or provider type for speed.
- If a single 5-digit ZIP still has 1,200+ matches for your query, the run log will warn you. Add another filter, such as entity type or a more specific taxonomy.
- If you use phone numbers for outreach, you are responsible for TCPA and Do-Not-Call compliance.

### Legal

NPI data is published by the U.S. Centers for Medicare & Medicaid Services (CMS) under its NPPES data dissemination policy. This actor is not affiliated with or endorsed by CMS or HHS.

# Actor input Schema

## `taxonomies` (type: `array`):

NPI taxonomy descriptions, partial match, e.g. 'Dentist', 'Chiropractor', 'Physical Therapist', 'Home Health', 'Nurse Practitioner', 'Family Medicine', 'Pharmacy'. Each is searched separately.

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

Two-letter state codes. Each is searched separately.

## `cities` (type: `array`):

Optional city names (exact).

## `postalCodes` (type: `array`):

Optional 5-digit ZIPs or prefixes with *, e.g. 941*.

## `enumerationType` (type: `string`):

Individuals are people; organizations are clinics, agencies, groups, and pharmacies.

## `firstName` (type: `string`):

Optional. Supports trailing \* wildcard (2+ chars).

## `lastName` (type: `string`):

Optional. Supports trailing \* wildcard (2+ chars).

## `organizationName` (type: `string`):

Optional. Supports trailing \* wildcard (2+ chars).

## `practiceLocationStateOnly` (type: `boolean`):

The registry matches a state on any address (including mailing). Keep only providers whose practice location is in your states.

## `primaryTaxonomyOnly` (type: `boolean`):

Keep only providers whose primary specialty matches the searched taxonomy.

## `requirePhone` (type: `boolean`):

Skip providers without a practice-location phone.

## `enumeratedAfter` (type: `string`):

Keep only providers whose NPI was issued on or after this date (new practices). Applied after search.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember delivered NPIs and skip them next time.

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

Stop after this many providers. You are charged only for providers returned.

## Actor input object example

```json
{
  "taxonomies": [
    "Dentist"
  ],
  "states": [
    "KS"
  ],
  "enumerationType": "any",
  "practiceLocationStateOnly": true,
  "primaryTaxonomyOnly": false,
  "requirePhone": false,
  "onlyNewSinceLastRun": false,
  "maxResults": 1000
}
```

# Actor output Schema

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

Default dataset items (overview view in Console).

# 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 = {
    "taxonomies": [
        "Dentist"
    ],
    "states": [
        "KS"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("open-data-tools-hq/npi-provider-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 = {
    "taxonomies": ["Dentist"],
    "states": ["KS"],
}

# Run the Actor and wait for it to finish
run = client.actor("open-data-tools-hq/npi-provider-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 '{
  "taxonomies": [
    "Dentist"
  ],
  "states": [
    "KS"
  ]
}' |
apify call open-data-tools-hq/npi-provider-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,open-data-tools-hq/npi-provider-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/b1DDPaoLWhANLj3SX/builds/W3ES5xJMnGqklTBdV/openapi.json
