# NPI Registry Scraper: US Doctor, Dentist & Clinic Leads (`hydrocore/npi-healthcare-providers`) Actor

Find US healthcare providers from the official CMS NPI Registry: doctors, dentists, therapists, clinics and pharmacies with specialty, phone, fax, address and license. Filter by specialty, city, state or ZIP; catch newly registered practices; monitor only new NPIs.

- **URL**: https://apify.com/hydrocore/npi-healthcare-providers.md
- **Developed by:** [Hydrocore Data](https://apify.com/hydrocore) (community)
- **Categories:** Lead generation, Business, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 provider saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper: US Doctor, Dentist & Clinic Leads

Build lists of **US healthcare providers** from the official **CMS NPPES NPI Registry**: doctors, dentists, nurse practitioners, therapists, chiropractors, pharmacies, clinics, labs and more. Each row has the **specialty, practice phone, fax, address, license number, NPI issue date** and, for organizations, the **authorized official**.

No API key, no login, no browser. Data comes from the free public NPI Registry API run by the US Centers for Medicare & Medicaid Services (CMS). Competitively priced: you pay only for providers saved after your filters.

### Try it in under a minute

1. Keep the default sample (Dentists in Austin, TX) or change specialty / city / state.
2. Optional: set **NPI issued in the last N days** (e.g. 90) to catch newly registered practices.
3. Click **Start**, then open **Dataset → Overview** for name, specialty, phone, address and NPI date.
4. Export JSON, CSV or Excel, or connect Make / Zapier / n8n / the API. Turn on **monitor mode** and schedule weekly for a fresh practice feed.

### Who uses it

- **Healthcare sales & marketing** (dental supply, medical devices, EHR/SaaS, billing, pharma): targeted provider lists by specialty and area.
- **Agencies selling to practices**: find **newly registered practices** (NPI issued in the last 30/90 days), the moment they need websites, software and suppliers.
- **Healthcare recruiters**: providers by specialty and city.
- **Credentialing, payer and compliance teams**: verify or enrich lists of NPI numbers.
- **Researchers & analysts**: market sizing by specialty and geography.

### Features

- Search by **specialty**, **city**, **state**, **ZIP code**, organization or person name, or look up a list of **NPI numbers**.
- **Newly registered** filter (NPI issued in the last N days) and **recently updated** filter (moves, new phones).
- **Auto-split past the API limit**: the NPI API returns max 1,200 records per query; when a city search hits that, the Actor re-queries every ZIP it found, so big cities are covered.
- Individuals, organizations, or both. Optional "primary specialty must match" and "phone required".
- Sort by newest NPI, recently updated, name, or state/city. Sorting happens before your cap.
- **Monitor mode**: only providers you have not received before. Schedule weekly to get a fresh feed of new practices.
- No duplicates: one row per NPI.

#### Example input

```json
{
  "specialties": ["Dentist"],
  "cities": ["Austin"],
  "states": ["TX"],
  "enumeratedWithinDays": 365,
  "sortBy": "newest",
  "maxResults": 100
}
```

### Output

| Field | Type | Example | Description |
|---|---|---|---|
| name | text | Central Texas Perio And Implants | Provider or organization name |
| primarySpecialty | text | Dentist, Periodontics | Primary taxonomy |
| providerType | text | organization | individual or organization |
| phone | text | 512-335-3600 | Practice phone |
| street / city / state / postalCode | text | Austin, TX 78729 | Practice location |
| enumerationDate | date | 2026-11-02 | Date the NPI was issued |
| npi | text | 1437058955 | National Provider Identifier |
| url | link | npiregistry.cms.hhs.gov | Official registry page |

Views: **Overview**, **Contact details**, **Specialty & license**, **Detailed (all fields)**. Export as JSON, CSV or Excel, or connect via API, Make, Zapier or n8n. Every row has the same columns; empty values are `null`.

Real example row from a test run:

```json
{
  "npi": "1437058955",
  "name": "Central Texas Perio And Implants",
  "providerType": "organization",
  "primarySpecialty": "Dentist, Periodontics",
  "credential": null,
  "phone": "512-335-3600",
  "fax": "512-335-9771",
  "street": "10123 Lake Creek Pkwy Bldg 1",
  "city": "Austin",
  "state": "TX",
  "postalCode": "78729",
  "enumerationDate": "2026-11-02",
  "lastUpdatedDate": "2026-11-02",
  "status": "active",
  "firstName": null,
  "lastName": null,
  "organizationName": "Central Texas Perio And Implants",
  "doingBusinessAs": null,
  "taxonomyCode": "1223P0300X",
  "licenseNumber": null,
  "licenseState": null,
  "allSpecialties": [
    "Dentist, Periodontics"
  ],
  "isSoleProprietor": null,
  "authorizedOfficialName": "Kurt Delius",
  "authorizedOfficialTitle": "Doctor",
  "authorizedOfficialPhone": "512-335-3600",
  "mailingStreet": "10123 Lake Creek Pkwy Bldg 1",
  "mailingCity": "Austin",
  "mailingState": "TX",
  "mailingPostalCode": "78729",
  "otherPracticeLocationCount": 0,
  "url": "https://npiregistry.cms.hhs.gov/provider-view/1437058955",
  "searchQuery": "taxonomy_description=Dentist&city=Austin&state=TX",
  "source": "CMS NPPES NPI Registry",
  "scrapedAt": "2026-11-06T00:40:14.545Z"
}
```

The `OUTPUT` record holds a run summary (API records read, queries, split queries, API-limit warnings).

### Why this Actor

- **Official government source**, not a scraped directory, so data matches what CMS publishes daily.
- **Find new practices**: the "NPI issued in the last N days" filter is a lead source most directories don't offer.
- **Clean, Excel-ready columns**: formatted phones, 5-digit ZIPs, ISO dates, title-cased names.
- **Pay per saved provider**: filtered-out or duplicate NPIs are free; cap spend with Max providers.

### Pricing

Pay per event: charged per **saved provider**. Records removed by filters are free. Use "Max providers" to cap spend.

### FAQ

**Does it include emails?** The NPI Registry has no emails. Pair results with a website/contact finder if you need them.

**How fresh is it?** The NPI API is refreshed daily by CMS.

**Why fewer results than expected?** Check the run summary. If a ZIP-level query still hit 1,200 records, narrow by specialty or provider type.

**Is this allowed?** NPPES data is public information that CMS publishes for free download and API access. Follow privacy, TCPA/CAN-SPAM and other marketing laws when contacting providers. Issuance of an NPI does not mean a provider is licensed or credentialed (per CMS).

### Changelog

- 1.0: first release.

# Actor input Schema

## `specialties` (type: `array`):

NPI taxonomy descriptions, e.g. Dentist, Family Medicine, Chiropractor, Physical Therapist, Nurse Practitioner, Pharmacy, Psychologist, Optometrist. Each is searched separately.

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

Practice-location cities. Combine with States to avoid same-name cities.

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

e.g. TX, CA. The NPI API needs at least one more criterion (specialty, city, ZIP or name) with a state.

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

5-digit ZIPs (or prefixes like 787\*). Overrides cities. Use ZIPs to split big searches past the 1,200-per-query API limit.

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

Default: both.

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

Trailing \* wildcard allowed, e.g. 'smile\*'.

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

Individuals only. Trailing \* wildcard allowed.

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

Individuals only.

## `npiNumbers` (type: `array`):

10-digit NPIs to enrich/verify. When set, other search fields are ignored.

## `enumeratedWithinDays` (type: `integer`):

Find new practices and newly licensed providers. Empty = any date.

## `updatedWithinDays` (type: `integer`):

Catch moves, new addresses and phone changes. Empty = any date.

## `onlyPrimarySpecialty` (type: `boolean`):

Drop providers where your specialty is only a secondary taxonomy.

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

Skip providers without a practice phone.

## `autoSplit` (type: `boolean`):

The NPI API returns at most 1,200 records per query. When a city/state search hits that limit, the Actor re-queries each ZIP code it found to reach the rest. On by default.

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

Applied before the cap.

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

Hard cap on saved (and charged) providers. Default 100.

## `onlyNew` (type: `boolean`):

Remembers NPIs already saved and skips them next time.

## `monitorKey` (type: `string`):

Separate 'seen' lists for different saved searches.

## Actor input object example

```json
{
  "specialties": [
    "Dentist"
  ],
  "cities": [
    "Austin"
  ],
  "states": [
    "TX"
  ],
  "providerType": "all",
  "onlyPrimarySpecialty": false,
  "requirePhone": false,
  "autoSplit": true,
  "sortBy": "newest",
  "maxResults": 100,
  "onlyNew": false,
  "monitorKey": "default"
}
```

# Actor output Schema

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

Name, specialty, phone, address, NPI date and link.

## `contacts` (type: `string`):

Phone, fax, practice and mailing address, authorized official.

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

Every field for each provider.

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

Counts, queries and API-limit warnings.

# 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 = {
    "specialties": [
        "Dentist"
    ],
    "cities": [
        "Austin"
    ],
    "states": [
        "TX"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("hydrocore/npi-healthcare-providers").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 = {
    "specialties": ["Dentist"],
    "cities": ["Austin"],
    "states": ["TX"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("hydrocore/npi-healthcare-providers").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 '{
  "specialties": [
    "Dentist"
  ],
  "cities": [
    "Austin"
  ],
  "states": [
    "TX"
  ],
  "maxResults": 100
}' |
apify call hydrocore/npi-healthcare-providers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hydrocore/npi-healthcare-providers"
        }
    }
}
```

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/5IFZdUMH0AFhZB74Q/builds/1Cfby0ar9gSMg8Uul/openapi.json
