# NPI Registry Scraper - US Healthcare Providers, $1/1K (`plotpointtech/npi-registry-healthcare-providers`) Actor

Export US doctors, dentists, clinics and pharmacies from the official CMS NPI Registry by specialty, city, ZIP or NPI: licenses, taxonomies, addresses, phone, fax and authorized officials. $1 per 1,000 providers.

- **URL**: https://apify.com/plotpointtech/npi-registry-healthcare-providers.md
- **Developed by:** [Plot Point Technologies](https://apify.com/plotpointtech) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.62 / 1,000 providers

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 Healthcare Providers

**Search the official CMS NPPES NPI Registry and export every matching US doctor, nurse, therapist, dentist, pharmacy, clinic or hospital as a clean spreadsheet row.** Filter by specialty, city, state, ZIP code, name, organization or NPI number and get names, credentials, every taxonomy with license numbers, practice and mailing addresses, phone and fax, key dates and the authorized official of organizations. **$1 per 1,000 providers.**

### What does this NPI Registry scraper do?

- **Searches the official registry** through the public NPPES NPI Registry API (version 2.1) run by the Centers for Medicare & Medicaid Services. No API key, no login.
- **Goes past the 1,200-result limit.** The API returns at most 1,200 providers per search. When a search hits that cap, the tool splits it by ZIP code prefix and provider type automatically and removes duplicates, so you get every match (for example, 2,571 family medicine providers practicing in Houston, TX in about one minute).
- **Searches many specialties, cities and ZIP codes in one run.** Each combination is searched separately and merged.
- **Matches the practice location by default**, not just the mailing address, so you find providers who actually see patients in the city you choose.
- **Optionally keeps only providers whose primary specialty** matches your search.
- **Looks up NPI numbers in bulk** for credentialing and data cleanup.

### What data do you get?

| Group | Fields |
|---|---|
| Identity | `npi`, `enumerationType` (Individual / Organization), `name`, `organizationName`, `namePrefix`, `firstName`, `middleName`, `lastName`, `nameSuffix`, `credential`, `sex`, `soleProprietor`, `organizationalSubpart`, `parentOrganizationName` |
| Specialty & licenses | `primaryTaxonomyCode`, `primaryTaxonomy`, `primaryLicense`, `primaryLicenseState`, `taxonomies` (all, each with `code`, `description`, `primary`, `license`, `licenseState`, `taxonomyGroup`) |
| Contact | `practiceAddress`, `practicePhone`, `practiceFax`, `practiceCity`, `practiceState`, `practicePostalCode`, `mailingAddress`, `otherPracticeLocations` |
| Status & dates | `status`, `enumerationDate`, `lastUpdated`, `certificationDate`, `deactivationDate`, `reactivationDate` |
| Other | `otherIdentifiers` (e.g. Medicaid IDs), `otherNames`, `endpoints` (Direct / health information exchange addresses), `authorizedOfficial` (organizations: name, title, credential, phone), `registryUrl` |

### Who uses it?

- **Healthcare sales and marketing teams** building lead lists of practices by specialty and territory (medical devices, pharma, billing, software, staffing).
- **Credentialing and provider enrollment teams** verifying NPIs, taxonomies, license numbers and addresses in bulk.
- **Provider directories, health plans and health-tech apps** keeping their provider data current.
- **Analysts and researchers** mapping provider supply by specialty, city or ZIP code.

### How to use it

1. Click **Try for free** (or **Start**).
2. Enter one or more **Specialties** (for example `Dermatology`, `Family Medicine`, `Dentist`, `Physical Therapist`), and a **City**, **State** and/or **ZIP codes**. Or enter a **name**, an **organization name** or a list of **NPI numbers**.
3. Choose **Provider type** (individuals, organizations or both) and set **Maximum results**.
4. Run it and download the results as Excel, CSV or JSON, or send them to your CRM.

### Input example

```json
{
  "taxonomyDescriptions": [
    "Dermatology"
  ],
  "cities": [
    "Austin"
  ],
  "state": "TX",
  "enumerationType": "any",
  "addressType": "location",
  "primaryTaxonomyOnly": false,
  "maxResults": 50
}
```

The input table:

| Field | What it does |
|---|---|
| `taxonomyDescriptions` | Specialties as the registry names them. Each is searched separately. |
| `cities`, `state`, `postalCodes` | Location filters. ZIP codes accept a prefix wildcard such as `787*`. The registry does not allow a search by state alone. |
| `npiNumbers` | 10-digit NPIs to look up directly. |
| `firstName`, `lastName`, `organizationName` | Name filters; a trailing `*` after two letters works as a wildcard. |
| `enumerationType` | `any`, `individual` (NPI-1) or `organization` (NPI-2). |
| `addressType` | Apply location filters to the `location` (practice) address, the `mailing` address, or `any`. |
| `primaryTaxonomyOnly` | Keep only providers whose primary taxonomy contains the searched specialty. |
| `splitLargeSearches` | Automatically split searches with more than 1,200 matches (default on). |
| `maxResults` | Stop after this many providers. |

### Output example

A real record from the default run (taxonomy list shortened to 3 of 15, individual-name fields omitted):

```json
{
  "npi": "1821157579",
  "enumerationType": "Organization",
  "name": "AUSTIN REGIONAL CLINIC, PA",
  "organizationName": "AUSTIN REGIONAL CLINIC, PA",
  "organizationalSubpart": "NO",
  "parentOrganizationName": null,
  "primaryTaxonomyCode": "207Q00000X",
  "primaryTaxonomy": "Family Medicine",
  "primaryLicense": null,
  "primaryLicenseState": null,
  "taxonomies": [
    {
      "code": "207N00000X",
      "description": "Dermatology",
      "primary": false,
      "license": null,
      "licenseState": null,
      "taxonomyGroup": "193200000X - Multi-Specialty Group"
    },
    {
      "code": "207R00000X",
      "description": "Internal Medicine",
      "primary": false,
      "license": null,
      "licenseState": null,
      "taxonomyGroup": "193200000X - Multi-Specialty Group"
    },
    {
      "code": "207Q00000X",
      "description": "Family Medicine",
      "primary": true,
      "license": null,
      "licenseState": null,
      "taxonomyGroup": "193200000X - Multi-Specialty Group"
    }
  ],
  "practiceAddress": {
    "address1": "6210 E US HWY 290",
    "address2": "SUITE 420 - CREDENTIALING",
    "city": "AUSTIN",
    "state": "TX",
    "postalCode": "78723-1098",
    "countryCode": "US",
    "phone": "512-231-5516",
    "fax": "512-406-6216",
    "fullAddress": "6210 E US HWY 290, SUITE 420 - CREDENTIALING, AUSTIN, TX 78723-1098"
  },
  "practicePhone": "512-231-5516",
  "practiceFax": "512-406-6216",
  "practiceCity": "AUSTIN",
  "practiceState": "TX",
  "practicePostalCode": "78723-1098",
  "mailingAddress": {
    "address1": "6210 E HWY 290",
    "address2": null,
    "city": "AUSTIN",
    "state": "TX",
    "postalCode": "78723-1142",
    "countryCode": "US",
    "phone": null,
    "fax": null,
    "fullAddress": "6210 E HWY 290, AUSTIN, TX 78723-1142"
  },
  "otherPracticeLocations": [],
  "status": "Active",
  "enumerationDate": "2006-12-08",
  "lastUpdated": "2025-08-28",
  "certificationDate": "2025-08-28",
  "deactivationDate": null,
  "reactivationDate": null,
  "otherIdentifiers": [],
  "otherNames": [],
  "endpoints": [],
  "authorizedOfficial": {
    "namePrefix": null,
    "firstName": "ANAS",
    "middleName": null,
    "lastName": "DAGHESTANI",
    "nameSuffix": null,
    "credential": "MD",
    "title": "CEO/President",
    "phone": "512-419-0707",
    "fullName": "ANAS DAGHESTANI"
  },
  "registryUrl": "https://npiregistry.cms.hhs.gov/provider-view/1821157579"
}
```

### How much does it cost?

**$1 per 1,000 providers** ($0.001 each), plus a $0.00005 start fee per run. NPIs that are not found are logged and not charged.

| You collect | You pay |
|---|---|
| 50 dermatology providers in one city (default run) | $0.05 |
| 2,571 family medicine providers in Houston | $2.57 |
| 20,000 providers across a sales territory, refreshed monthly | $20.00 a month |

**Volume discounts on higher Apify plans.** The prices above are for the Apify Free plan. On paid plans the per-result price drops automatically: about 15% lower on Bronze, 25% lower on Silver and 38% lower on Gold and above.

### Use it via API, Make, Zapier, n8n or an AI agent

**Apify API.** Start a run and get the results back in one HTTP request (replace `YOUR_API_TOKEN` with the token from Apify Console > Settings > Integrations):

```bash
curl -X POST "https://api.apify.com/v2/acts/plotpointtech~npi-registry-healthcare-providers/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"taxonomyDescriptions": ["Dermatology"], "cities": ["Austin"], "state": "TX", "enumerationType": "any", "addressType": "location", "primaryTaxonomyOnly": false, "maxResults": 50}'
```

For longer jobs, start the run asynchronously and read the dataset when it finishes. Official `apify-client` libraries exist for Python and JavaScript; the **API** tab on this page has ready-made code.

**No-code automation.** Connect the tool to **Make, Zapier, n8n, Google Sheets, Slack, Airtable** or any webhook with Apify integrations, and use **Schedules** in Apify Console to run it hourly, daily or weekly.

**AI agents (MCP).** Give Claude, ChatGPT, Cursor, VS Code or any MCP-compatible agent direct access to this tool through the hosted Apify MCP server. Add this server URL to your client:

```
https://mcp.apify.com?tools=plotpointtech/npi-registry-healthcare-providers
```

The agent can then call the tool with the same input fields shown above and read the results.

### FAQ

**Is it legal to use NPI Registry data?**
The NPPES NPI Registry is public US government data. CMS publishes it so anyone can look up healthcare providers, and offers this API for that purpose. It contains no patient information, so HIPAA privacy rules about patient data do not apply to it. You are responsible for how you use the data: if you contact providers for marketing, follow the laws that apply to you, such as the CAN-SPAM Act for email, the Telephone Consumer Protection Act (TCPA) and Do Not Call rules for calls, faxes and texts (the Junk Fax Prevention Act covers unsolicited faxes), and state privacy laws.

**Why does a provider appear whose practice city is different from the one I searched?**
Many providers list additional practice locations. The registry matches your city against those too; you will find the matching address in `otherPracticeLocations`.

**Why do I get providers whose primary specialty is something else?**
The registry matches any of a provider's taxonomies. Turn on **Primary specialty only** to keep just providers whose primary taxonomy matches.

**Which specialty names can I use?**
The registry's taxonomy descriptions, such as `Family Medicine`, `Internal Medicine, Cardiovascular Disease`, `Dentist`, `Chiropractor`, `Pharmacy`, `Nurse Practitioner` or `Clinical Social Worker`. A partial name usually works; an unknown name is reported in the log.

**Does it include emails?**
No. The NPI Registry does not publish email addresses. You get practice phone and fax numbers and addresses. To find emails on practice websites, combine it with our Email & Contact Scraper.

**How fresh is the data?**
Every run queries the live registry, which CMS updates daily. `lastUpdated` shows when the provider last changed their record.

**Are deactivated NPIs included?**
The registry API generally returns only active NPIs; an NPI that is not returned is logged as not found (invalid or deactivated) and not charged.

### Related tools from Plot Point Technologies

- [Email & Contact Scraper - Website Emails, Phones & Socials](https://apify.com/plotpointtech/website-contact-finder): emails, phones and social links from any list of company websites.
- [Local Business Leads Scraper - MX-Checked Emails & Phones](https://apify.com/plotpointtech/local-business-leads): local businesses by category and city with checked emails.
- [Building Permits Scraper - Construction Leads, 13 Cities](https://apify.com/plotpointtech/building-permits-feed): new building permits from 13 US and Canadian cities, one format.
- [SEC Form D Scraper - New Startup Funding Leads Daily](https://apify.com/plotpointtech/sec-form-d-fundraise-feed): companies that just raised money, from SEC Form D filings.

Plot Point Technologies is not affiliated with the Centers for Medicare & Medicaid Services (CMS), the US Department of Health and Human Services or NPPES.

***

If this tool saved you time, we would be grateful for a short review on this page; it helps other people find it. If something did not work as expected, please open an issue on the **Issues** tab and we will look into it quickly.

# Actor input Schema

## `taxonomyDescriptions` (type: `array`):

Provider specialties as the NPI Registry names them, e.g. Dermatology, Family Medicine, Dentist, Physical Therapist, Nurse Practitioner, Pharmacy. Each one is searched separately. The registry matches any of a provider's taxonomies, not only the primary one (see 'Primary specialty only').

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

City names, e.g. Austin. Each city is searched separately. Combine with State to avoid same-named cities in other states.

## `state` (type: `string`):

Two-letter US state code, e.g. TX. The registry does not allow a search by state alone; add a specialty, city, ZIP code or name.

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

5-digit ZIP codes, or a prefix with a wildcard such as 787\* (at least two digits before the \*). Each one is searched separately.

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

Look up specific providers by their 10-digit NPI. Clear the search fields above if you only want these NPIs.

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

Individual providers only. Trailing wildcard allowed after two letters, e.g. Jo\*. Common nicknames/aliases are matched too.

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

Individual providers only. Trailing wildcard allowed after two letters, e.g. Smi\*.

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

Organizations only (hospitals, clinics, group practices, pharmacies). Trailing wildcard allowed, e.g. Mayo Clinic\*.

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

Individuals (NPI-1: doctors, nurses, therapists...) or organizations (NPI-2: hospitals, clinics, groups, pharmacies).

## `addressType` (type: `string`):

Which address the location filters apply to. 'Practice location' finds providers who actually practice there.

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

Keep only providers whose PRIMARY taxonomy contains the specialty you searched for (drops providers who list it as a secondary taxonomy).

## `splitLargeSearches` (type: `boolean`):

The NPI Registry API returns at most 1,200 providers per search. When a search hits that cap, the tool automatically splits it by ZIP code prefix and provider type to collect the rest.

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

Stop after this many providers (you pay per provider).

## Actor input object example

```json
{
  "taxonomyDescriptions": [
    "Dermatology"
  ],
  "cities": [
    "Austin"
  ],
  "state": "TX",
  "enumerationType": "any",
  "addressType": "location",
  "primaryTaxonomyOnly": false,
  "splitLargeSearches": true,
  "maxResults": 50
}
```

# Actor output Schema

## `results` (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 = {
    "taxonomyDescriptions": [
        "Dermatology"
    ],
    "cities": [
        "Austin"
    ],
    "state": "TX",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("plotpointtech/npi-registry-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 = {
    "taxonomyDescriptions": ["Dermatology"],
    "cities": ["Austin"],
    "state": "TX",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("plotpointtech/npi-registry-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 '{
  "taxonomyDescriptions": [
    "Dermatology"
  ],
  "cities": [
    "Austin"
  ],
  "state": "TX",
  "maxResults": 50
}' |
apify call plotpointtech/npi-registry-healthcare-providers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plotpointtech/npi-registry-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/Y5MZQfPjv8jcMdi4K/builds/ncPMcXmdflrkJNtek/openapi.json
