# NPI Registry Scraper – NPPES Healthcare Provider Leads (`dedicated_crest/npi-healthcare-provider-leads`) Actor

NPI Registry scraper (official CMS NPPES API): US doctors, dentists, clinics & other providers with NPI, specialty, practice address, phone, fax, authorized official, license. Filter by specialty, state, city, ZIP. Past the 1,200 cap. $1/1,000.

- **URL**: https://apify.com/dedicated_crest/npi-healthcare-provider-leads.md
- **Developed by:** [Ben Barazandeh](https://apify.com/dedicated_crest) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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.

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 – NPPES Healthcare Provider Leads

**Build lists of US doctors, dentists, clinics and other healthcare providers from the official NPI Registry, for $1 per 1,000 providers.** Search by specialty, state, city, ZIP, name or NPI number and get the NPI, name, credential, specialty (taxonomy), license, practice address, **practice phone and fax**, mailing address, authorized official (owner/CEO) with title and phone, other/DBA names and the NPI issue date.

- ✅ **Official source**: the CMS NPPES NPI Registry API, covering every HIPAA-covered US provider (~8 million NPIs)
- ✅ **Past the 1,200-result API cap**: large searches are auto-split by state and ZIP prefix, so you can pull a whole state
- ✅ **Lead-ready**: practice phone/fax, owner contact for organizations, "phone required" and "primary specialty only" filters
- ✅ **No API key or login**. Pay per unique provider, and it stops at your *Maximum cost per run*

**Try it now:** the input is pre-filled with *dentists in San Diego, CA*, 50 providers. Click **Start**; the test run below took about 18 seconds.

### Real run results (18 Oct 2026)

Pre-filled input: specialty `Dentist`, state `CA`, city `San Diego, CA`, `maxItems: 50` (run `P2hSpYvpjM3y6spk0`, 18 seconds, 50 providers). First 8 rows (phone, fax, address and authorized official are in the dataset):

| NPI | Name | Type | Primary specialty | City | NPI issued |
|---|---|---|---|---|---|
| 1326171653 | Dr. WILLIAM JOSEPH DI ZINNO, DMD | Individual | Dentist, General Practice | San Diego, CA | 2007-03-14 |
| 1417108101 | DR MICHAEL L. REYNOLDS DDS INC | Organization | Dentist, General Practice | San Diego, CA | 2008-10-01 |
| 1699214478 | GLENN C. ASHMORE DDS, INC. | Organization | Dentist | San Diego, CA | 2017-02-14 |
| 1215326947 | A. R. GHASSEMI D.D.S., M.S., P.C. | Organization | Dentist | San Diego, CA | 2015-01-19 |
| 1730639188 | A.S. KIM DDS, INC. | Organization | Dentist, General Practice | San Diego, CA | 2016-10-10 |
| 1700180825 | STEPHANIE ANN PURA ABARTE, DDS | Individual | Dentist | Lemon Grove, CA | 2011-01-04 |
| 1487251294 | Dr. ZEKI ABDULAALI, DDS | Individual | Dentist, General Practice | San Diego, CA | 2020-10-05 |
| 1235104688 | BRUCE SHINTARO ABE, D.D.S. | Individual | Dentist, Periodontics | San Diego, CA | 2006-02-21 |

### Use cases

- **Healthcare B2B sales and marketing**: med-device, dental supply, pharma, EHR/practice-management SaaS, billing and RCM, staffing, insurance
- **Local lead generation agencies**: dentist, chiropractor or med-spa lists for any city or ZIP
- **New-practice prospecting**: find providers whose **NPI was issued recently** (new clinicians and new practices)
- **Data enrichment and verification**: look up or verify a list of NPIs (credentialing, payer and provider data hygiene)
- **Analysts and AI agents**: provider density and market sizing by specialty and geography

### Features

- 🩺 Search by **specialty/taxonomy** (wildcards OK), **provider type** (individual or organization), **state, city, ZIP**, name, organization name, or a list of **NPI numbers**
- 🚀 **Auto-split** past the API's 1,200-result cap: large searches are split by state and ZIP prefix, so you can pull a whole state
- 🆕 Filters: **NPI issued after**, **record updated after**, **only with phone**, **primary specialty must match**
- 🧹 Deduplication by NPI, clean formatted phone numbers and ZIPs, separate practice and mailing addresses
- ♻️ Retries, pagination and a run SUMMARY record
- 💵 Stops cleanly at your **Maximum cost per run**

### How to use it

1. Click **Try for free**.
2. Enter specialties (e.g. `Dentist`, `Chiropractor`, `Physical Therapist`) and a location (state, `San Diego, CA`, or ZIPs).
3. Run it and export to CSV/Excel/JSON, or schedule it monthly with *NPI issued after* to catch new providers.

### Input example

```json
{
  "specialties": ["Dentist"],
  "cities": ["San Diego, CA"],
  "providerType": "organization",
  "maxItems": 300
}
```

### Output example

Real output (one provider):

```json
{
  "npi": "1730639188",
  "type": "Organization",
  "name": "A.S. KIM DDS, INC.",
  "organizationName": "A.S. KIM DDS, INC.",
  "firstName": null,
  "middleName": null,
  "lastName": null,
  "credential": null,
  "gender": null,
  "soleProprietor": null,
  "authorizedOfficialName": "Dr. ANNE KIM, DDS",
  "authorizedOfficialTitle": "CEO",
  "authorizedOfficialPhone": "734-657-9694",
  "primaryTaxonomyCode": "1223G0001X",
  "primarySpecialty": "Dentist, General Practice",
  "licenseNumber": "55536",
  "licenseState": "CA",
  "allSpecialties": [
    "Dentist, General Practice"
  ],
  "taxonomyGroup": "193400000X - Single Specialty Group",
  "practiceAddress1": "501 WASHINGTON ST STE 740",
  "practiceAddress2": null,
  "practiceCity": "SAN DIEGO",
  "practiceState": "CA",
  "practiceZip": "92103-2231",
  "practiceCountry": "US",
  "practicePhone": "619-296-2172",
  "practiceFax": null,
  "mailingAddress": "3915 LA CRESTA WAY, BONITA, CA, 91902-2575",
  "mailingPhone": "734-657-9694",
  "otherNames": [
    "VILLAGE HILLCREST DENTAL"
  ],
  "additionalPracticeLocations": 1,
  "enumerationDate": "2016-10-10",
  "lastUpdated": "2021-04-26",
  "certificationDate": "2021-04-26",
  "status": "Active",
  "npiRegistryUrl": "https://npiregistry.cms.hhs.gov/provider-view/1730639188",
  "scrapedAt": "2026-10-17T17:40:55.910Z"
}
```

### Pricing

**Pay per event: $0.001 per provider** (**$1 per 1,000 providers**), no start fee. Duplicates and filtered-out records are free. Set a *Maximum cost per run* and the Actor stops cleanly when it's reached. Example: all individual chiropractors in California with a phone came to 3,000 providers in about 3 minutes.

How that compares with other NPI/NPPES Actors on the Apify Store (free-tier list prices from the Store API, checked 18 Oct 2026):

| Actor | Price per 1,000 providers | Start fee |
|---|---|---|
| **This Actor** | **$1.00** | none |
| NPI Registry Scraper, 8M US Healthcare Providers (sourabhbgp) | $2.00 | none |
| NPPES NPI Registry Search (pink_comic) | $2.00 | $0.0001 |
| NPI Registry Scraper, 7M+ US Providers (haketa) | $2.00 | $0.00005 |
| NPI Registry Scraper, Healthcare Providers & Leads (scrapesage) | $4.00 | none |
| NPI/NPPES Healthcare Provider Scraper (parseforge) | $12.00 | $0.16 |

### Notes

- NPPES does **not** include email addresses. Phone and fax are as self-reported by providers.
- NPPES matches a specialty against **any** of a provider's taxonomies. Turn on *Primary specialty must match* for stricter lists.
- A ZIP or state filter can match either the practice or mailing address. When splitting by state, the Actor keeps providers whose practice location is in that state.

### FAQ

**Is this legal?** Yes. The NPI Registry is public data published by CMS (US Dept. of Health & Human Services) through an official, free API. Follow applicable marketing laws (TCPA, CAN-SPAM) when contacting providers.

**Affiliation:** Independent tool, not affiliated with CMS or HHS.

**Does it include email addresses?** No. NPPES doesn't publish emails. You get practice phone and fax, mailing address and, for organizations, the authorized official's name, title and phone.

**How do I find newly opened practices?** Set *NPI issued after* (`enumeratedAfter`) to a recent date, e.g. the last 90 days, and schedule the run monthly.

**Which specialty names work?** NPPES taxonomy descriptions such as `Dentist`, `Chiropractor`, `Family Medicine`, `Nurse Practitioner`, `Physical Therapist`, `Pharmacy`. Wildcards like `Dent*` work too.

**Can I look up a list of NPIs?** Yes. Paste them into `npiNumbers` to verify or enrich an existing list.

### Related tools

Other Actors by the same developer that work well with this one:

- [Bulk WHOIS & DNS Lookup](https://apify.com/dedicated_crest/domain-whois-dns-intel): check practice websites: email provider, domain age and whether the site is up
- [USAspending Scraper](https://apify.com/dedicated_crest/usaspending-federal-awards): federal health contracts and grants (HHS, VA, CMS) by recipient
- [Grants.gov Scraper](https://apify.com/dedicated_crest/grants-gov-opportunity-finder): open federal health grants for clinics and nonprofits
- [Local Business Leads](https://apify.com/dedicated_crest/osm-local-business-leads): local clinics, pharmacies and practices from OpenStreetMap with websites, emails and phones

# Actor input Schema

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

NPPES taxonomy descriptions, e.g. "Dentist", "Chiropractor", "Physical Therapist", "Family Medicine", "Nurse Practitioner", "Dermatology". Trailing \* wildcard allowed (e.g. "Ortho\*").

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

Individual clinicians, organizations (clinics, practices, pharmacies, agencies) or both.

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

2-letter state codes, e.g. CA, TX. Large states are split automatically by ZIP to get past the API's 1,200-result limit.

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

City names, optionally with state: "San Diego, CA". Overrides States (a single State is applied to cities without one).

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

5-digit ZIPs or prefixes with wildcard (at least 2 digits), e.g. 92101, 921\*.

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

Individual provider first name (wildcard \* allowed after 2 characters).

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

Individual provider last name (wildcard \* allowed after 2 characters).

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

Organization name (wildcard \* allowed after 2 characters).

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

Look up specific 10-digit NPIs (enrich a list).

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

Only providers whose NPI was issued on/after this date, e.g. new practices and newly licensed clinicians (YYYY-MM-DD).

## `updatedAfter` (type: `string`):

Only providers whose NPPES record was updated on/after this date (moves, new locations).

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

Skip providers without a practice-location phone number.

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

Keep only providers whose primary taxonomy matches the specialty (NPPES otherwise matches any listed taxonomy).

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

Automatically split searches with more than 1,200 matches by state and ZIP prefix to get complete results.

## `maxItems` (type: `integer`):

Maximum providers to return (0 = no limit).

## Actor input object example

```json
{
  "specialties": [
    "Dentist"
  ],
  "providerType": "any",
  "states": [
    "CA"
  ],
  "cities": [
    "San Diego, CA"
  ],
  "requirePhone": false,
  "primarySpecialtyOnly": false,
  "autoSplit": true,
  "maxItems": 50
}
```

# Actor output Schema

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

Providers with NPI, name, specialty, practice address, phone, fax, authorized official and dates.

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

Providers saved, filtered out, API queries and any queries truncated at the NPPES limit.

# 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"
    ],
    "states": [
        "CA"
    ],
    "cities": [
        "San Diego, CA"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("dedicated_crest/npi-healthcare-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 = {
    "specialties": ["Dentist"],
    "states": ["CA"],
    "cities": ["San Diego, CA"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("dedicated_crest/npi-healthcare-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 '{
  "specialties": [
    "Dentist"
  ],
  "states": [
    "CA"
  ],
  "cities": [
    "San Diego, CA"
  ],
  "maxItems": 50
}' |
apify call dedicated_crest/npi-healthcare-provider-leads --silent --output-dataset

```

## MCP server setup

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