NPI Healthcare Provider Scraper (NPPES)
Pricing
Pay per usage
NPI Healthcare Provider Scraper (NPPES)
Bulk-query the official CMS NPPES NPI Registry and export structured US healthcare provider leads — doctors, dentists, specialists — to JSON or CSV. Filter by state, city, specialty, and name. 7 M+ providers covered.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
🎯 What this scrapes
The NPPES NPI Registry is the authoritative federal directory of every healthcare provider in the United States. Every active physician, dentist, chiropractor, nurse practitioner, hospital, and medical group is listed here — complete with verified location address, telephone number, fax, speciality taxonomy, licence number, and enumeration status.
The registry's own API is publicly accessible, but turning it into a reliable bulk export takes real engineering: paginating past NPPES's 200-record-per-request ceiling, normalising the nested taxonomy and address objects, handling partial-result pages near the 1 200-result query cap, and coercing dates and flags into consistent types. We handle all of that and hand you back one richly-typed row per provider.
Feed it a state + specialty combination and you have a targeted lead list in minutes. Pharma field reps, dental-supply sales teams, and healthcare-data vendors have been paying $50 per thousand records from SaaS list brokers for data that the federal government publishes for free. This Actor fetches it directly and undercuts the going rate by roughly 96 %.
🔥 What we handle for you
- 🔁 Automatic pagination — the NPPES API returns at most 200 records per request. We page through all available results (up to ~1 200 per query combination) and merge them transparently.
- 🧱 Rate-limit-aware backoff — when the CMS endpoint pushes back we slow down, honour
Retry-Afterheaders, and retry up to 5 times with exponential backoff before surfacing an error. - 🧊 Pydantic-validated rows — every field is typed at write time. Booleans are booleans. Dates arrive as ISO-8601 strings. Taxonomy codes, licence numbers, and address fields are normalised across individual and organisational providers.
- 🌐 Proxy-ready — the NPPES API is a public federal endpoint and direct routing works on most infrastructure. The proxy configuration field is there when you need it.
- 💰 Pay-Per-Event pricing — you pay only for records that land in your dataset. No data, no charge beyond the small run warm-up fee.
- 📦 Export in any format — Apify Console exports the dataset as JSON, CSV, or Excel with one click. Pull via API for automated pipelines.
💡 Use cases
- Pharma / medical-device field rep territory lists — pull every GP or specialist in a sales territory by state + taxonomy and load into your CRM.
- Dental-supply prospecting — filter by
dentisttaxonomy and state for a fresh dentist contact list at a fraction of the cost of a list broker. - Healthcare-data vendor pipelines — bulk-export the registry by specialty and resell structured datasets to compliance, billing, or referral-network products.
- Credentialing verification — cross-reference provider NPI numbers, licence states, and taxonomy codes for onboarding workflows.
- Insurance network gap analysis — identify active providers in a region and compare against your network panel.
- Academic and policy research — map provider density and specialty distribution by state or ZIP.
⚙️ How to use it
- Click Try for free — no credit card required.
- Set at least one search filter: state, specialty, city, or provider name.
- Optionally set enumerationType to restrict to individuals (NPI-1) or organisations (NPI-2).
- Set maxItems — 200 is the default; the NPPES query cap is ~1 200 per combination.
- Click Start. Results stream into the dataset in real time.
- Export from Storage → Dataset as JSON, CSV, or Excel.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
state | string | one of | — | 2-letter state code (CA, NY, TX …). Filters by address state. |
city | string | one of | — | City name within the chosen state. |
postalCode | string | one of | — | 5-digit ZIP code. |
taxonomyDescription | string | one of | — | Specialty keyword: dentist, chiropractor, internal medicine, etc. |
enumerationType | string | no | both | NPI-1 (individual), NPI-2 (organisation), or both. |
firstName | string | one of | — | Filter by provider first name (individuals). |
lastName | string | one of | — | Filter by provider last name (individuals). |
organizationName | string | one of | — | Filter by practice or organisation name. |
maxItems | integer | no | 200 | Max records to return (1–1200). NPPES hard-caps a single query at ~1 200. |
proxyConfiguration | object | no | {"useApifyProxy": false} | Apify Proxy settings. Direct routing works for NPPES on most infrastructure. |
At least one "one of" field is required to avoid returning the entire registry.
Example input
{"state": "CA","taxonomyDescription": "dentist","enumerationType": "NPI-1","maxItems": 200,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one NPI registry provider record.
| Field | Type | Notes |
|---|---|---|
npi | string | 10-digit National Provider Identifier. |
enumeration_type | string | NPI-1 (individual) or NPI-2 (organisation). |
name | string | Provider display name — org name or "First Last" for individuals. |
credential | string | null | Credential suffix (MD, DDS, DO, RN …). |
status | string | null | Active or Inactive. |
primary_taxonomy | string | null | NUCC taxonomy code for the primary speciality. |
specialty | string | null | Human-readable taxonomy description. |
license | string | null | State licence number for the primary taxonomy. |
license_state | string | null | State that issued the licence. |
address_line1 | string | null | Street address (LOCATION purpose). |
city | string | null | City. |
state | string | null | 2-letter state code. |
postal_code | string | null | ZIP code. |
country | string | null | Country code (usually US). |
phone | string | null | Office phone number. |
fax | string | null | Office fax number. |
sole_proprietor | boolean | null | True if enumerated as a sole proprietor. |
gender | string | null | Provider gender (individual providers only). |
enumeration_date | string | null | Date the NPI was first assigned (ISO-8601). |
last_updated | string | null | Date the record was last updated in NPPES (ISO-8601). |
scraped_at | string | null | When this row was recorded (ISO-8601 UTC). |
Example output
{"npi": "1234567890","enumeration_type": "NPI-1","name": "Jane Smith","credential": "DDS","status": "Active","primary_taxonomy": "122300000X","specialty": "Dentist","license": "CA12345","license_state": "CA","address_line1": "123 Main St","city": "Los Angeles","state": "CA","postal_code": "90001","country": "US","phone": "310-555-0100","fax": "310-555-0101","sole_proprietor": true,"gender": "F","enumeration_date": "2010-03-15","last_updated": "2024-11-01","scraped_at": "2026-06-07T10:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you only pay when these events fire:
| Event | USD | What triggers it |
|---|---|---|
actor-start | $0.005 | One-off warm-up charge per run |
result | $0.002 | Per provider record written to the dataset |
Example: 1 000 provider records at the rates above = $2.00. No subscription, no minimum, no card required to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- NPPES query cap — the registry limits skip to 1 000, so any single state + specialty combination returns at most ~1 200 records. For large specialties (e.g. all physicians in California) you will need to paginate by city or ZIP code range across multiple runs.
- No email addresses — NPPES does not publish provider email addresses. Phone and fax are included; email is not part of the public registry.
- US providers only — the NPPES registry covers US-based or US-licensed providers. International providers are out of scope.
- Data freshness — NPPES records reflect CMS update cycles. Providers who recently enrolled or updated their information may appear with a short delay. The
last_updatedfield indicates the record's freshness. - Deactivated NPIs — by default the API returns both active and inactive providers. Filter by
status == "Active"post-export if you only want active practitioners.
❓ FAQ
Is this data public and legal to use?
Yes. The NPPES NPI Registry is a public federal dataset maintained by CMS (Centers for Medicare & Medicaid Services). It is published under a public domain licence with no restrictions on use. This Actor queries the public API endpoint documented at npiregistry.cms.hhs.gov.
Why can't I get all dentists in California in one run?
NPPES limits individual API queries to 200 records per page and caps the skip offset at 1 000, which means any single query combination is bounded at approximately 1 200 results. California alone has tens of thousands of active dentists. To get them all, segment by city or ZIP code range and run multiple Actor jobs, then merge the datasets.
What is the difference between NPI-1 and NPI-2?
NPI-1 (Individual) is assigned to licensed healthcare practitioners — physicians, dentists, nurses, physical therapists, and so on. NPI-2 (Organisational) is assigned to provider organisations — hospitals, group practices, dental chains, and labs. Set enumerationType to target one type or leave it as both to return all.
How current is the data?
The NPPES registry is updated continuously as providers enrol, update, or deactivate. The last_updated field on each row tells you when CMS last touched that record. For most use cases the data is current within days.
Can I get email addresses?
NPPES does not publish email addresses. If you need emails you will need to enrich the NPI data with a separate email-finder tool after export.
What is the NPI taxonomy code?
The NUCC Health Care Provider Taxonomy code identifies a provider's speciality (e.g. 122300000X = Dentist). Each NPI record may have multiple taxonomy codes; this Actor surfaces the one marked primary. Full NUCC taxonomy reference: nucc.org.
💬 Your feedback
Spotted a bug, need a new filter, or want ZIP-code-range pagination built in? Open an issue on the Issues tab in Apify Console — we read every report and ship fixes weekly.