NPI Registry Scraper | 7M+ US Healthcare Providers (CMS)
Pricing
from $1.00 / 1,000 results
NPI Registry Scraper | 7M+ US Healthcare Providers (CMS)
NPPES NPI Registry scraper & API: search 8M+ US healthcare providers and export NPI, name, taxonomy and specialty, practice and mailing address, phone, credentials and enumeration date. Healthcare provider data, verification and lead generation β fast, no login.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(1)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
25
Total users
5
Monthly active users
3 days ago
Last modified
Categories
Features
Share
NPI Registry Scraper β 7M+ US Healthcare Providers from the Official CMS NPPES API
The most complete NPPES NPI Registry data extraction actor on Apify. This NPPES scraper pulls every licensed US healthcare provider β physicians, NPs, PAs, RNs, pharmacists, dentists, therapists, hospitals, clinics, group practices, pharmacies β straight from the official Centers for Medicare & Medicaid Services (CMS) National Plan and Provider Enumeration System at npiregistry.cms.hhs.gov. Scrape the NPI Registry by NPI, name, specialty (taxonomy), city, state, or ZIP β no login, no coding, no scraping of private sites β 100% official public CMS data.
Export to JSON, CSV, Excel, or API. ~7,000,000+ providers indexed, no auth, no hard rate limit.
Built for pharma & med-device sales teams, healthcare recruiters & locum/travel-nursing staffing, payers & provider-directory teams, credentialing/compliance (CVO) analysts, healthcare M&A diligence, telehealth launch teams, B2B healthcare SaaS marketers, public-health researchers, and investigative journalists who need clean, current, structured US provider data.
β Freshly verified: a benchmark run pulled 500+ unique nurse-practitioner records in ~24 seconds with 100% coverage of every core identity field (NPI, name, specialty/taxonomy, license + state, city/state/ZIP, phone, status, enumeration date) and zero duplicates. A companion organization run returned a named Authorized Official decision-maker for 100% of NPI-2 records.
β‘ At a glance
| Feature | Details |
|---|---|
| π©Ί Data Coverage | 7,000,000+ active & historical US healthcare providers β both NPI-1 (Individuals) and NPI-2 (Organizations) |
| π Search Modes | By Specialty / Taxonomy (dropdown or custom text), Provider Name, Organization Name, City / State / ZIP, or direct 10-digit NPI lookup |
| π B2B Contact Fields | Practice & mailing phones/faxes, full street addresses, state license numbers, plus named authorizedOfficial (name, title, direct phone) on organizations |
| π’ 1,000+ Deep Pagination | Automatic skip-offset pagination (200 records/page) + automatic state & alphabetical AβZ sharding to bypass the 1,200-record single-query ceiling |
| π‘οΈ Deduplication | 100% deduplicated by 10-digit npi across multi-state, multi-city, and prefix-sharded queries |
| π€ Export Formats | Bulk export to JSON, CSV, Excel (XLSX), XML, HTML, RSS, or live Apify API |
π Why scrape the NPPES NPI Registry?
Every clinician, allied-health professional, and healthcare organization operating in the United States is required by HIPAA to obtain a National Provider Identifier (NPI) before submitting electronic healthcare transactions. The result is a freely-queryable federal registry of 7,000,000+ providers β the single richest, most authoritative source of US healthcare-provider information in existence. It is refreshed continuously as new providers enumerate and existing providers update their licensure, address, phone, or specialty.
That data is enormously valuable: it is the backbone of pharma sales targeting, healthcare recruiting, payer network management, credentialing, M&A diligence, and health-policy research. But collecting it by hand β or by rolling your own API client β is painful. The CMS API caps every response at 200 records, hands back HTTP 200 with an error object instead of a clean error status, returns deeply nested JSON that shape-shifts between individual (NPI-1) and organization (NPI-2) records, and offers no bulk-download endpoint and no next_page token. A single typo in a state code silently returns zero results.
This NPPES scraper turns that raw API into a structured, paginated, deduplicated, ready-for-CRM/data-warehouse dataset. You pick filters; it builds the full query matrix, paginates every page, retries failures, deduplicates by NPI, flattens the nested JSON into one clean row per provider, and streams the result to your Apify dataset.
Common reasons people scrape the NPPES NPI Registry:
- Build prescriber / provider target lists by specialty + geography for pharma and med-device sales.
- Source and verify clinicians (physicians, NPs, PAs, RNs, CRNAs, PTs, pharmacists) for staffing, locum tenens, and travel nursing.
- Audit and refresh payer provider directories for Network Adequacy / No Surprises Act compliance.
- Verify NPIs at claim submission and automate credentialing to replace per-lookup verification APIs.
- Run healthcare M&A diligence on a target practice's provider roster and multi-state license footprint.
- Scout state-by-state licensed providers for telehealth and digital-health launches.
- Research the US healthcare workforce β provider density, pharmacy deserts, primary-care shortage areas.
β¨ What this NPPES NPI Registry scraper does
This actor queries the official US federal National Provider Identifier (NPI) registry β the authoritative source-of-truth for every provider authorized to bill Medicare, Medicaid, or any HIPAA-covered payer.
- β Five search modes β by specialty/taxonomy (dropdown or custom text), by name (first/last), by organization name, by city / state / ZIP, and by direct NPI lookup (paste 10-digit NPIs for the fastest, most precise mode).
- β
Unlocked 1,000+ deep pagination & auto-sharding β each registry page returns up to 200 records; when your
maxRecordstarget exceeds a single query's 1,200-record ceiling (skip=1000), the actor automatically shards across US states and alphabetical prefixes (A*βZ*) to deliver thousands to tens of thousands of unique providers in a single run. - β NPI-1 (individual) + NPI-2 (organization) support in one flat schema β physicians, NPs, PAs, RNs, dentists, pharmacists, therapists and hospitals, clinics, group practices, pharmacies, FQHCs, SNFs, labs, DME suppliers.
- β
Rich captured fields, grouped:
- Identity & status:
npi,enumerationType,firstName,middleName,lastName,fullName,credential,organizationName,organizationalSubpart,gender,status(Active/Deactivated),soleProprietor. - Decision-maker contact (organizations):
authorizedOfficialβ the named human required on every NPI-2 org (firstName,lastName,fullName,title,phone,credential). - Specialty & licensure:
primaryTaxonomyCode,primaryTaxonomyDesc,primaryLicense,primaryLicenseState, plus the fulltaxonomies[]array. - Addresses & contact:
mailingAddress,locationAddress, top-levelphone,mailingPhone,city,state,postalCode,country, andpracticeLocations[]. - Dates & provenance:
enumerationDate,certificationDate,lastUpdated,scrapedAt,searchQuery,sourceUrl. - Extras:
identifiers[](state Medicaid IDs, license IDs),otherNames[](DBAs, former names, AKAs),endpoints[](FHIR Direct messaging).
- Identity & status:
- β Multi-filter fan-out β supply multiple cities Γ states and the actor builds a Cartesian task list, running each combination as a discrete query.
- β
NPI-level deduplication β a
Setof seen NPIs guarantees no provider is saved twice across overlapping queries. - β
3-attempt retry with exponential backoff + jitter; polite pacing via a configurable
requestDelay. - β Clean exit on empty results β a zero-match or modifier-only query exits cleanly with a descriptive status message instead of crashing, so it never dents a scheduled pipeline's success rate.
- β Lightweight & fast β no browser overhead, very low compute cost, and high throughput.
- β Export to JSON, CSV, Excel (XLSX), HTML, XML, RSS, or JSON Lines β from the UI or the dataset API.
π― Use cases
- Pharma & medical-device sales targeting β build prescriber lists by specialty + geography, find newly-enumerated specialists early, map territories by provider density.
- Healthcare staffing, locum tenens & travel nursing β source and verify physicians, NPs, PAs, RNs, CRNAs, PTs by specialty + state + active status; find multi-state-licensed clinicians via the
taxonomies[]license array. - Insurance & payer networks β audit network adequacy per specialty per ZIP, refresh provider directories monthly, reconcile billing vs. rendering NPIs.
- Compliance, credentialing & claims verification β verify NPIs at claim submission, start OIG LEIE / SAM.gov exclusion checks from a verified roster, monitor
status: Deactivatedchanges. - Healthcare M&A & investor diligence β inventory a target's provider roster, quantify multi-state license footprint, assess specialty mix at acquisition.
- Telehealth & digital-health launch β find physicians licensed in every launch state, recruit clinicians by specialty + geography, run clinician KYC at onboarding.
- B2B healthcare SaaS marketing & ABM β segment by practice type, reach the named
authorizedOfficialdecision-maker directly, enrich inbound leads by NPI lookup. - Public health, policy & workforce research β map provider supply per capita, identify pharmacy / primary-care / mental-health deserts, track workforce trends.
π₯ Input
Supply at least one substantive criterion β a specialty, name, organization name, city, ZIP, or an NPI. A states / enumerationType / addressPurpose filter is a modifier: it narrows a substantive search but can't run on its own (the CMS API rejects it). Leave the whole form empty for a ready-made mixed sample across popular specialties (capped to ~100 records) so a first run is never zero.
| Parameter | Type | Description |
|---|---|---|
specialty | string (select) | Provider specialty / taxonomy from a dropdown (e.g. Family Medicine, Cardiology, Nurse Practitioner, Pharmacy, Dentist, Hospital). Fastest way to pull a targeted list. |
specialtyCustom | string | Any CMS taxonomy phrase not in the dropdown (partial match), e.g. "Neurology", "Oncology", "Acupuncturist". Overrides the dropdown when set. |
states | array<string> | 2-letter US state / territory codes (NY, CA, TX, PRβ¦). Each state runs as a separate query. Modifier β pair with a substantive criterion. |
enumerationType | enum | NPI-1 = individuals (doctors, nursesβ¦), NPI-2 = organizations (hospitals, clinics, pharmacies), any = both. |
organizationName | string | Organization legal-business-name search (e.g. "Mount Sinai", "Kaiser Permanente", "Walgreens"). |
firstName | string | Individual first name (partial match). Best paired with a last name + state. |
lastName | string | Individual last name (partial match). |
cities | array<string> | City-name filter (e.g. ["New York","Brooklyn"]). Each city runs as a separate query. |
postalCode | string | ZIP filter, partial match ("100" matches all 100xx ZIPs). |
npis | array<string> | 10-digit NPI numbers for direct lookup β the fastest, most precise mode. Each NPI becomes its own task. |
addressPurpose | enum | Match on LOCATION (practice), MAILING, PRIMARY, SECONDARY, or any. Modifier. |
maxRecords | integer | Hard cap across all queries. 0 = unlimited (pages until every query exhausts). Default 100. |
requestDelay | integer | Milliseconds between page fetches (100β10000). 500β2000 ms is courteous. Default 800. |
proxyConfiguration | object | Optional Apify proxy. Not required β CMS NPPES is a public unrestricted API. |
Example input
{"specialty": "Nurse Practitioner","states": ["CA", "TX", "FL", "NY"],"enumerationType": "NPI-1","maxRecords": 500,"requestDelay": 400,"proxyConfiguration": { "useApifyProxy": false }}
Direct NPI lookup (fastest mode):
{ "npis": ["1982445060", "1932487765", "1689675476"] }
Organization search:
{"specialty": "Pharmacy","organizationName": "Walgreens","states": ["CA"],"enumerationType": "NPI-2","maxRecords": 1000}
π€ Output
Every record β individual or organization β uses the same flat JSON shape, so downstream consumers ingest the whole dataset without per-type branching. The example below is a real record from the 2026-11-02 verification run (phone shown as published by CMS):
{"npi": "1750767083","enumerationType": "NPI-1","firstName": "DANIELLE","lastName": "AAROE","middleName": "JANNETTE","fullName": "DANIELLE JANNETTE AAROE","credential": "Family Nurse Practit","organizationName": null,"organizationalSubpart": null,"authorizedOfficial": null,"gender": "F","status": "Active","soleProprietor": "NO","enumerationDate": "2015-08-10","certificationDate": null,"lastUpdated": "2015-08-10","primaryTaxonomyCode": "363LF0000X","primaryTaxonomyDesc": "Nurse Practitioner, Family","primaryLicense": "95002487","primaryLicenseState": "CA","taxonomies": [{ "code": "363LF0000X", "desc": "Nurse Practitioner, Family", "license": "95002487", "state": "CA", "primary": true, "taxonomyGroup": "" }],"mailingAddress": {"address1": "2767 OLIVE HIGHWAY", "address2": "OROVILLE HOSPITAL","city": "OROVILLE", "state": "CA", "postalCode": "959666185","country": "United States", "phone": "530-533-8500", "fax": null, "purpose": "MAILING"},"locationAddress": {"address1": "2767 OLIVE HIGHWAY", "address2": "OROVILLE HOSPITAL","city": "OROVILLE", "state": "CA", "postalCode": "959666185","country": "United States", "phone": "530-533-8500", "fax": null, "purpose": "LOCATION"},"phone": "530-533-8500","mailingPhone": "530-533-8500","city": "OROVILLE","state": "CA","postalCode": "959666185","country": "United States","practiceLocations": null,"identifiers": null,"otherNames": null,"endpoints": null,"searchQuery": "taxonomy_description=Nurse Practitioner&state=CA&enumeration_type=NPI-1","sourceUrl": "https://npiregistry.cms.hhs.gov/provider-view/1750767083","scrapedAt": "2026-11-02T00:00:00.000Z"}
And a real organization (NPI-2) record from the companion verification run, showing the named authorizedOfficial decision-maker:
{"npi": "1649791633","enumerationType": "NPI-2","firstName": null,"lastName": null,"fullName": "10TH AVENUE PHARMACY","credential": null,"organizationName": "10TH AVENUE PHARMACY","organizationalSubpart": "NO","authorizedOfficial": {"firstName": "EMMANUEL","lastName": "ACHOLONU","fullName": "Dr. EMMANUEL ACHOLONU","title": "Director","phone": "3232987693","credential": null},"gender": null,"status": "Active","soleProprietor": null,"enumerationDate": "2017-06-29","primaryTaxonomyDesc": "Pharmacy","phone": "323-298-7693","city": "LOS ANGELES","state": "CA","sourceUrl": "https://npiregistry.cms.hhs.gov/provider-view/1649791633"}
Field reference
| Field | Coverage | Description |
|---|---|---|
π npi | π’ High (100%) | 10-digit National Provider Identifier (federal primary key). |
π·οΈ enumerationType | π’ High (100%) | NPI-1 (individual) or NPI-2 (organization). |
π€ fullName | π’ High (100%) | Joined individual name, or organization legal name. |
π firstName / middleName / lastName | π’ High (NPI-1) | Individual name parts (null for orgs). First/last 100% on NPI-1; middle name ~50%. |
π credential | π‘ Conditional (~79% NPI-1) | Professional suffix (MD, DO, NP, PA, RN, DDS, PharmD, LCSW, PTβ¦). |
π₯ organizationName | π’ High (100% NPI-2) | Legal business name (NPI-2). Null for individuals. |
π’ organizationalSubpart | π’ High (NPI-2) | YES/NO β whether an NPI-2 org is a sub-part of a parent org. |
π authorizedOfficial | π’ High (~100% NPI-2) | Named org decision-maker (firstName, lastName, fullName, title, phone, credential). |
β§οΈ gender / soleProprietor | π’ High (NPI-1) | M/F gender and YES/NO sole-proprietor status (individuals only). |
β
status | π’ High (100%) | Active or Deactivated. |
π
enumerationDate / lastUpdated | π’ High (100%) | NPI first-assigned date and most-recent update (YYYY-MM-DD). |
ποΈ certificationDate | π‘ Conditional | Most-recent certification date when published. |
π©Ί primaryTaxonomyCode / primaryTaxonomyDesc | π’ High (100%) | NUCC taxonomy code + human-readable specialty. |
π primaryLicense / primaryLicenseState | π’ High (~98%) | State license number + 2-letter state for the primary taxonomy. |
ποΈ taxonomies | π’ High (100%) | Full array of taxonomies (code, desc, license, state, primary flag, group). |
π mailingAddress / locationAddress | π’ High (100%) | Full nested addresses (address1, address2, city, state, postalCode, country, phone, fax, purpose). |
π phone / mailingPhone | π’ High (~99%) | Location (practice) phone and mailing phone. |
ποΈ city / state / postalCode / country | π’ High (100%) | Top-level location (LOCATION β MAILING fallback). |
πΊοΈ practiceLocations | π‘ Conditional | Multi-site organizations' secondary physical practice locations. |
π’ identifiers / otherNames / endpoints | π‘ Conditional | State Medicaid IDs, former names/DBAs, and FHIR Direct endpoints when published. |
π searchQuery / sourceUrl / scrapedAt | π’ High (100%) | Exact filter provenance, canonical provider-view URL, and ISO-8601 scrape timestamp. |
Honest note on coverage: core identity/specialty/location fields populate at ~100%. Fields that are genuinely optional or type-specific behave as expected:
authorizedOfficial/organizationName/organizationalSubpartpopulate for organizations (null for individuals);gender/soleProprietor/credentialpopulate for individuals (null for orgs); andidentifiers/otherNames/endpoints/practiceLocationspopulate only when the provider published them to CMS. None of these are bugs β they reflect exactly what the registry contains for each record.
π Pagination & scale
The CMS NPPES API returns at most 200 records per call and offers no next_page token. This actor paginates with the skip offset: it fetches skip=0, then skip=200, skip=400, β¦ advancing until a query returns fewer than 200 rows (the last page) or the global maxRecords cap is reached. When you supply multiple states / cities, each combination runs as its own paginated task, and results are deduplicated by NPI across all tasks.
- Scale: a single run can return tens, thousands, or tens of thousands of de-duplicated provider records. Set
maxRecords: 0for unlimited; set a cap for fast, predictable sampling. - Verified: the 2026-11-02 benchmark pulled 500 unique records in ~24 seconds with 0 duplicates, deep-paginating a broad California query. Pagination has been verified past
skip=10000on very broad queries. - Tip for huge pulls: for "every provider in a big state", split into multiple narrower queries (by city or ZIP) so each task's pagination stays manageable and fast.
βοΈ How to use
- On Apify Console: open the actor, pick a Specialty (and optionally States, Provider Type), or type a Name / Organization / NPI, set Max Records, and click Start.
- Via API:
POST https://api.apify.com/v2/acts/haketa~nppes-npi-registry-scraper/runs?token=YOUR_TOKENwith a JSON body of the input above. - On a schedule: use Apify's built-in Scheduler (any cron) to refresh your NPI dataset daily/weekly.
- Choose your export: JSON, CSV, Excel (XLSX), HTML, XML, RSS, or JSON Lines β from the dataset UI or the dataset API.
- Integrate: push results to Make, Zapier, n8n, Google Sheets, a webhook, or your data warehouse (Postgres / Snowflake / BigQuery) keyed on
npi.
API run (Python)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/nppes-npi-registry-scraper").call(run_input={"specialty": "Cardiology","states": ["NY", "NJ", "CT"],"enumerationType": "NPI-1","maxRecords": 2000})for p in client.dataset(run["defaultDatasetId"]).iterate_items():print(p["npi"], p["fullName"], p["credential"], p["primaryTaxonomyDesc"], p["city"], p["state"], p["phone"])
π‘ Tips
- Search by specialty text, not codes β
specialty: "Cardiology"orspecialtyCustom: "Oncology"works on the human-readable NUCC taxonomy; you never need the 10-character codes. - Use the
npisarray for verification β nightly compliance checks of an employed-provider roster run fastest in direct-lookup mode (one request per NPI). - Target the named decision-maker β for B2B outreach to hospitals/clinics/pharmacies, use
enumerationType: "NPI-2"and read theauthorizedOfficialobject (name, title, direct phone). - Multi-state licensure signal β pull NPI-1 records and inspect the
taxonomies[]array for licenses in multiple states, the gold signal for telehealth-ready / travel-ready clinicians. - Split huge geographies β for an entire large state, break the pull into cities or ZIPs to keep each task fast; the actor deduplicates by NPI across all of them.
- Mind the cap order β
maxRecordsis a global cap iterated task-by-task, so a broad first query (e.g. a populous state) can fill the cap before later tasks run. RaisemaxRecordsor narrow the first query to spread results across states. - Watch spellings β use 2-letter uppercase state codes (
NY, notNy) and the current specialty label ("Family Medicine", not the deprecated"Family Practice").
β FAQ
How many records can I get, and how fast?
Each registry page returns 200 records, and single queries cap at 1,200 records (skip=1000). When you request maxRecords > 1000 (or 0 for unlimited), the actor automatically shards across US states and alphabetical name prefixes (A*βZ*), allowing a single run to harvest 1,000 to 50,000+ unique providers seamlessly. A 500-record run finishes in ~24 seconds; multi-thousand-record statewide sweeps finish in 1β3 minutes.
Do I need proxies or a login?
No. The NPPES registry is an open public federal system β no login or API key is required. An optional proxyConfiguration field is available if needed, and defaults to off.
How fresh is the data?
Live at run time. Every page is fetched directly from the federal registry at the moment of the run, reflecting new enumerations, address changes, and license updates immediately.
Can I filter by specialty, state, city, or ZIP?
Yes β by specialty/specialtyCustom, states, cities, and postalCode. A state / provider-type / address-purpose filter is a modifier that must be paired with a substantive criterion (specialty, name, organization, city, ZIP, or NPI).
Do I get phone numbers and a named contact?
Yes. Every address carries a phone (phone for practice location, mailingPhone for mailing). For organizations (NPI-2) you also get the Authorized Official β a named CEO / Administrator / Director / Pharmacist-in-Charge with a direct phone β populated for ~100% of NPI-2 records in our sampling.
Do I get email addresses?
No. CMS does not collect or publish provider email addresses. The endpoints[] field exposes FHIR Direct secure-messaging endpoints when present (not general-purpose email).
Does it cover all 50 states and territories?
Yes β all 50 states + DC, plus Puerto Rico (PR), US Virgin Islands (VI), Guam (GU), American Samoa (AS), and Northern Mariana Islands (MP). It covers US providers only.
What happens if my query returns zero results?
The actor exits cleanly with a descriptive status message (it does not fail the run). Common causes: a misspelled state code, a deprecated specialty label, or a modifier-only filter with no companion criterion.
Can I export to CSV / Excel / JSON, and schedule it?
Yes to both. Export from the dataset view (or API) to JSON, CSV, Excel, HTML, XML, RSS, or JSON Lines, and schedule the actor on any cron with Apify's Scheduler + Google Sheets / webhook / warehouse integrations.
π Related scrapers
Compose these with the NPI Registry Scraper to cross-reference license numbers, enrich leads, and build full healthcare/compliance pipelines:
- WhatClinic.com Clinic Scraper β global clinic directory (US + 100+ countries) for dental, cosmetic, fertility, and elective specialties.
- Bookimed Medical Tourism Scraper β international medical-tourism clinics, prices, and patient reviews.
- Texas Pharmacy License Scraper β TSBP β every pharmacist, pharmacy, intern, and technician in Texas (cross-reference NPI license numbers).
- Ohio eLicense Scraper β every Ohio professional license (medical, nursing, pharmacy).
- California DCA Professional License Scraper β California Department of Consumer Affairs healthcare boards.
- SAM.gov Federal Contractor Entity Scraper β federal contractor entity registry for diligence and B2B.
π Changelog
| Version | Date | Updates |
|---|---|---|
| v1.2 | 2026-11 | Unlocked 1,000+ deep pagination & auto-sharding: added automatic US state fan-out and alphabetical (A*βZ*) prefix sharding whenever a query reaches the registry's 1,200-record (skip=1000) ceiling, allowing single runs to scale to 10,000+ unique providers with 0 duplicates. |
| v1.1 | 2026-11 | Added authorizedOfficial decision-maker extraction for NPI-2 organizations, cleaned placeholder tokens (--, .), and added specialty dropdown + mixed default sample. |
| v1.0 | 2026-05 | Initial release supporting NPI-1 & NPI-2 provider extraction, taxonomy/license normalization, and multi-state query matrices. |