# NPI Registry Scraper: US Doctors & Healthcare Provider Leads (`pandadad0214/npi-provider-lists`) Actor

Use this to build lists of US healthcare providers from the official NPI Registry (NPI registry scraper). Input: specialties in plain words plus states, cities or ZIP codes. Output: one de-duplicated row per provider with NPI, name, specialty, address and phone, plus Excel.

- **URL**: https://apify.com/pandadad0214/npi-provider-lists.md
- **Developed by:** [Panda Federation](https://apify.com/pandadad0214) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Doctors & Healthcare Provider Leads

> **NPI registry scraper** on Apify: clean, de-duplicated lists of US doctors, dentists, therapists, clinics and other healthcare providers by specialty and area, from the official NPPES NPI Registry, exported to Excel and CSV. Apify's free plan includes $5 of monthly platform credit, enough for roughly 3,333 providers at $0.0015 each (pricing below).

**Build a clean, de-duplicated list of US healthcare providers for any territory. Type specialties in plain English ("dentist", "physical therapist", "urgent care"), pick states, cities or ZIP codes, and get one row per provider with practice address, phone, fax, taxonomy and license, plus an Excel workbook with a summary by specialty and city.**

Most NPI tools are thin wrappers around the NPPES NPI Registry API, so they inherit its limits: 200 results per call, a hard ceiling of 1,200 results per search, exact taxonomy wording, and the same provider repeated across searches. **NPI Provider Lists** is built for territory lists instead:

- 🗺️ **No 1,200-result ceiling:** big searches (say, every nurse practitioner in Colorado, about 8,400 providers) are split automatically by ZIP code and merged
- 🧹 **One row per provider:** de-duplicated by NPI across specialties, cities, ZIPs and practice locations. A provider who matches two of your specialties appears once, with both listed
- 🩺 **Friendly specialty names:** "family doctor", "cardiologist", "orthodontist", "LCSW", "home health agency" and 80+ others map to the right NPPES taxonomies. Results are re-checked against each provider's own taxonomies, so "physical therapist" doesn't return PT assistants
- 📍 **Real territory filtering:** the registry matches a state or city on *any* address, including out-of-state mailing addresses. This Actor keeps only providers who practice in your territory, and shows the in-territory address when it's an additional practice location
- 📊 **Excel with a Summary sheet:** counts by specialty, state and provider type, plus a city × specialty matrix (Saint Louis, St Louis and St. Louis are counted together). CSV and the search log are included
- 🔒 **Public registry data only:** no email scraping, no guessing, no data from other sites
- 💸 **$0.0015 per provider.** A 1,000-provider list costs $1.50. Searches that find nothing cost nothing

### Who it's for

- **Healthcare sales and marketing teams** (medical devices, pharma, labs, software, billing services) building territory lists for reps
- **Recruiters and staffing agencies** sizing a market for a specialty in a region
- **Researchers, health-policy analysts and journalists** counting providers by specialty and place
- **Practices and health systems** mapping referral networks and competitors

### How to use the NPI registry scraper

1. Click **Try for free** and add one or more **Specialties** (plain names or NPPES taxonomy descriptions).
2. Set the **territory**: states (`VT`), cities (`Austin, TX`) and/or ZIP codes (`05401`, or a prefix such as `941`).
3. Optional: individuals or organizations only, last/first or organization name (trailing `*` wildcard), primary specialty only.
4. Set **Maximum providers**. You pay per provider, so this also caps the cost. With several specialties or areas, the limit is shared fairly, then any unused room goes to the ones that had more.
5. Click **Start**. Most lists finish in under a minute. Download **PROVIDERS_XLSX** or **PROVIDERS_CSV** from **Storage → Key-value store**, or use the dataset via API.

#### Input example

```json
{
  "specialties": ["dentist", "orthodontist", "urgent care"],
  "cities": ["Saint Louis, MO", "Austin, TX"],
  "zipCodes": ["941"],
  "providerType": "all",
  "maxResults": 3000
}
```

#### Specialty names you can type

| Group | Friendly names |
|---|---|
| Physicians | family doctor / family medicine, internist, general practice, pediatrician, cardiologist, dermatologist, psychiatrist, neurologist, ob-gyn, orthopedic surgeon, ophthalmologist, ENT, allergist, gastroenterologist, oncologist, endocrinologist, radiologist, anesthesiologist, emergency medicine, general surgeon, urologist, hospitalist |
| Dental | dentist, general dentist, orthodontist, oral surgeon, pediatric dentist, dental hygienist, dental clinic |
| Therapy & behavioral health | chiropractor, physical therapist, occupational therapist, speech therapist, massage therapist, acupuncturist, podiatrist, optometrist, audiologist, dietitian, psychologist, counselor, mental health counselor, social worker, clinical social worker / LCSW, marriage and family therapist, behavior analyst / ABA therapist |
| Nursing & mid-level | nurse practitioner, family nurse practitioner, psychiatric nurse practitioner, physician assistant, registered nurse, midwife, pharmacist |
| Organizations | pharmacy, home health agency, hospice, nursing home, assisted living, hospital, urgent care, FQHC, rural health clinic, mental health clinic, ambulance, DME supplier, laboratory |

Anything else is sent to the registry as typed, so any NPPES taxonomy description works too: `Family Medicine`, `Nurse Practitioner, Pediatrics`, `Endocrinology, Diabetes & Metabolism`.

### Output example

![Example output table from a real npi-provider-lists run](https://api.apify.com/v2/key-value-stores/0eeXxTD8eJjgE6yTA/records/shot-npi-provider-lists)

One row per provider. A real row from a run for urgent care in Austin, TX:

```json
{
  "npi": "1144710864",
  "providerName": "AMERICAN CURRENT CARE P.A .",
  "providerType": "Organization",
  "specialty": "Urgent care",
  "primaryTaxonomy": "Clinic/Center, Urgent Care",
  "primaryTaxonomyCode": "261QU0200X",
  "allTaxonomies": "Clinic/Center, Urgent Care (261QU0200X)",
  "address1": "13831 N US HIGHWAY 183",
  "city": "AUSTIN",
  "state": "TX",
  "zip": "78750",
  "zipPlus4": "78750-1202",
  "phone": "512-250-0424",
  "fax": "512-219-0192",
  "territoryMatch": "primary practice address",
  "otherPracticeLocations": 0,
  "mailingAddress": "5080 SPECTRUM DR STE 1200W, ADDISON, TX 75001",
  "authorizedOfficial": "Robert Hassett, VP",
  "enumerationDate": "2018-05-17",
  "lastUpdated": "2022-04-21",
  "status": "Active",
  "npiRegistryUrl": "https://npiregistry.cms.hhs.gov/provider-view/1144710864"
}
```

#### Fields

| Field | What it is |
|---|---|
| `npi`, `providerName`, `providerType`, `credential` | NPI number, name (people in title case), Individual or Organization, credential (MD, DDS, PT…) |
| `specialty` | Which of *your* specialties matched (several if more than one did) |
| `primaryTaxonomy`, `primaryTaxonomyCode`, `primaryLicense` | The provider's primary NPPES taxonomy, NUCC code and license (number and state) |
| `allTaxonomies` | Every taxonomy the provider filed, with codes |
| `address1`, `address2`, `city`, `state`, `zip`, `zipPlus4`, `phone`, `fax` | Practice location in your territory |
| `territoryMatch`, `primaryAddressElsewhere`, `otherPracticeLocations` | Whether the primary practice address or an additional practice location is in your territory; the primary address when it's outside; count of additional locations |
| `mailingAddress` | Mailing address as filed |
| `authorizedOfficial`, `authorizedOfficialPhone` | Organizations only: the official listed in NPPES |
| `firstName`, `middleName`, `lastName`, `organizationName`, `soleProprietor` | Name parts for mail merge |
| `enumerationDate`, `lastUpdated`, `status`, `npiRegistryUrl` | NPI issue date, last update, status and the official registry page |

#### Files in the key-value store

| Key | What it is |
|---|---|
| `PROVIDERS_XLSX` | Excel workbook: **Providers** (filterable, frozen header, registry links), **Summary** (by specialty, state, type, and a city × specialty matrix), **Search log** and **Read me** |
| `PROVIDERS_CSV` | Same table as CSV (UTF-8, opens cleanly in Excel) |
| `SUMMARY` | JSON search log: your filters, rows fetched, out-of-territory and other-specialty rows skipped, duplicates merged, API calls and ZIP splits |

### For AI agents

Use this Actor to build de-duplicated lists of US healthcare providers from the official NPI Registry. Call it with Apify's MCP server (`https://mcp.apify.com`, tool `call-actor`, Actor `pandadad0214/npi-provider-lists`) or the API (`POST https://api.apify.com/v2/acts/pandadad0214~npi-provider-lists/run-sync-get-dataset-items`).

Minimal input:

```json
{"specialties": ["dentist"], "states": ["VT"], "maxResults": 50}
```

Each dataset item includes:

- `summary`: one line, e.g. `NPI 1234567890: Jane Smith, DDS; Dentist; Burlington, VT; phone 802-555-0100`
- `npi`: 10-digit NPI
- `providerName`, `credential`, `providerType`: who
- `specialty`, `primaryTaxonomy`: what they do
- `address1`, `city`, `state`, `zip`, `phone`: practice location
- `npiRegistryUrl`: official record

The run's key-value store has a `SUMMARY` record with counts (`returned`, `bySpecialty`) and file names (`PROVIDERS_XLSX`, `PROVIDERS_CSV`), a one-line `takeaway`. Every input field has a description with formats, units and limits.

### NPI registry scraper pricing and free results

**Apify paid-plan discounts:** Bronze members pay 10% less, Silver 20% less and Gold 30% less per result. Free-plan prices are shown below; the discount applies automatically.

**$0.0015 per provider** in the list (pay-per-event), plus a tiny Actor-start fee of $0.00005. Excel, CSV and the summary are included. Runs that find nothing cost nothing beyond the start fee. Set **Maximum providers** (or a maximum cost per run) to control spend.

### FAQ

**Is there a free way to try this NPI registry scraper?** Yes. Apify's free plan includes $5 of monthly platform credit, enough for roughly 3,333 providers at $0.0015 each.

**Where does the data come from?** The official NPPES NPI Registry API run by CMS. Every row links to the provider's registry page. Not affiliated with or endorsed by CMS or HHS.

**Are there emails?** No. The registry doesn't publish emails, and this Actor doesn't scrape other websites to add them.

**How current is it?** Live: every run queries the registry directly. NPPES data is filed by providers themselves, so some addresses and phones are out of date; check `lastUpdated`. Schedule the Actor monthly to refresh a territory.

**Why is my count different from a plain NPI scraper?** Plain scrapers stop at 1,200 results per search, repeat providers across searches, and include providers whose only in-state address is a mailing address. This Actor fixes all three.

**Can I contact these providers?** The data is public, but follow the laws that apply to you (for example TCPA for calls and faxes and CAN-SPAM for email) and honor opt-outs.

**Can I use it from code or an AI agent?** Yes, via the Apify API, the Python/JS clients, or as a tool through Apify's MCP server.

### More Panda Federation tools

- [Reference Checker](https://apify.com/pandadad0214/reference-checker)
- [Citation Generator](https://apify.com/pandadad0214/citation-formatter)
- [Google Scholar Scraper Alternative](https://apify.com/pandadad0214/literature-search)
- [PubMed Scraper](https://apify.com/pandadad0214/pubmed-evidence-table)
- [Grants.gov Scraper](https://apify.com/pandadad0214/grants-finder)
- [Academic Research MCP Server](https://apify.com/pandadad0214/panda-research-mcp)

[All Panda Federation Actors on Apify](https://apify.com/pandadad0214)

Questions or a custom data feed? Open an issue on this Actor's **Issues** tab.

### Changelog

- **2026-10-30 (agent update):** Built for AI agents: a one-line `summary` on every result, `takeaway` in the SUMMARY record, and input fields with formats, limits and examples.
- **2026-10-30:** New search-friendly title and page, FAQ, safe demo run on empty input, Bronze/Silver/Gold discounts, output screenshot.
- **2026-10-29:** First public release with pay-per-event pricing.

# Actor input Schema

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

Plain names work: dentist, orthodontist, family doctor, pediatrician, cardiologist, dermatologist, psychiatrist, chiropractor, physical therapist, nurse practitioner, psychologist, mental health counselor, social worker, pharmacy, home health, hospice, nursing home, urgent care, hospital, FQHC and more (full list in the README). Any NPPES taxonomy description also works, e.g. "Family Medicine" or "Nurse Practitioner, Pediatrics".

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

2-letter codes, e.g. VT, TX. Big states are split automatically by ZIP code, so you are not stuck at the registry's 1,200-result ceiling. If you also list cities without a state, these states are used for them.

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

Optional. Write "Austin, TX". Saint/St, Fort/Ft and Mount/Mt spellings are searched together. When cities are given, the list is limited to those cities (states only fill in a missing state).

## `zipCodes` (type: `array`):

Optional. 5-digit ZIPs (05401) or prefixes of 2-4 digits (941 = San Francisco area, 05 = Vermont/New Hampshire). Added to the territory on top of states or cities.

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

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

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

Optional, individuals only. A trailing \* is a wildcard after at least 2 letters (Sm\*).

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

Optional, individuals only. Wildcards as above.

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

Optional, organizations only, e.g. "Kaiser\*" or "Walgreen\*".

## `primarySpecialtyOnly` (type: `boolean`):

On: keep only providers whose primary taxonomy is the specialty you asked for. Off (default): keep anyone who lists it among their taxonomies.

## `includeSecondaryLocations` (type: `boolean`):

On (default): a provider whose main office is elsewhere but who also practices in your territory is included, and the in-territory address is shown. Off: primary practice address only.

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

You pay per provider in the list, so this also caps the cost. Up to 50,000. With several specialties or areas the limit is shared fairly between them. Whole number, 1 to 50,000 results; default 500.

## Actor input object example

```json
{
  "specialties": [
    "physical therapist",
    "chiropractor"
  ],
  "states": [
    "VT"
  ],
  "cities": [
    "Austin, TX"
  ],
  "zipCodes": [
    "05401",
    "941"
  ],
  "providerType": "all",
  "lastName": "Sm*",
  "firstName": "John",
  "organizationName": "Kaiser*",
  "primarySpecialtyOnly": false,
  "includeSecondaryLocations": true,
  "maxResults": 500
}
```

# Actor output Schema

## `table` (type: `string`):

No description

## `xlsx` (type: `string`):

No description

## `csv` (type: `string`):

No description

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

Run-level summary record. Agent-friendly keys: `takeaway` (one-line plain-English result of 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 = {
    "specialties": [
        "physical therapist",
        "chiropractor"
    ],
    "states": [
        "VT"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pandadad0214/npi-provider-lists").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": [
        "physical therapist",
        "chiropractor",
    ],
    "states": ["VT"],
}

# Run the Actor and wait for it to finish
run = client.actor("pandadad0214/npi-provider-lists").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": [
    "physical therapist",
    "chiropractor"
  ],
  "states": [
    "VT"
  ]
}' |
apify call pandadad0214/npi-provider-lists --silent --output-dataset

```

## MCP server setup

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

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/uKWaJwvDHmmfEhAwy/builds/klbShabGX13ni62N9/openapi.json
