NPI Registry Scraper | 7M+ US Healthcare Providers (CMS) avatar

NPI Registry Scraper | 7M+ US Healthcare Providers (CMS)

Pricing

from $1.00 / 1,000 results

Go to Apify Store
NPI Registry Scraper | 7M+ US Healthcare Providers (CMS)

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

Haketa

Maintained by Community

Actor stats

0

Bookmarked

25

Total users

5

Monthly active users

3 days ago

Last modified

Features

Limited permissions

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.

Apify Actor

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

FeatureDetails
🩺 Data Coverage7,000,000+ active & historical US healthcare providers β€” both NPI-1 (Individuals) and NPI-2 (Organizations)
πŸ” Search ModesBy Specialty / Taxonomy (dropdown or custom text), Provider Name, Organization Name, City / State / ZIP, or direct 10-digit NPI lookup
πŸ“‡ B2B Contact FieldsPractice & mailing phones/faxes, full street addresses, state license numbers, plus named authorizedOfficial (name, title, direct phone) on organizations
πŸ”’ 1,000+ Deep PaginationAutomatic skip-offset pagination (200 records/page) + automatic state & alphabetical A–Z sharding to bypass the 1,200-record single-query ceiling
πŸ›‘οΈ Deduplication100% deduplicated by 10-digit npi across multi-state, multi-city, and prefix-sharded queries
πŸ“€ Export FormatsBulk 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 maxRecords target 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 full taxonomies[] array.
    • Addresses & contact: mailingAddress, locationAddress, top-level phone, mailingPhone, city, state, postalCode, country, and practiceLocations[].
    • Dates & provenance: enumerationDate, certificationDate, lastUpdated, scrapedAt, searchQuery, sourceUrl.
    • Extras: identifiers[] (state Medicaid IDs, license IDs), otherNames[] (DBAs, former names, AKAs), endpoints[] (FHIR Direct messaging).
  • βœ… 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 Set of 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: Deactivated changes.
  • 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 authorizedOfficial decision-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.

ParameterTypeDescription
specialtystring (select)Provider specialty / taxonomy from a dropdown (e.g. Family Medicine, Cardiology, Nurse Practitioner, Pharmacy, Dentist, Hospital). Fastest way to pull a targeted list.
specialtyCustomstringAny CMS taxonomy phrase not in the dropdown (partial match), e.g. "Neurology", "Oncology", "Acupuncturist". Overrides the dropdown when set.
statesarray<string>2-letter US state / territory codes (NY, CA, TX, PR…). Each state runs as a separate query. Modifier β€” pair with a substantive criterion.
enumerationTypeenumNPI-1 = individuals (doctors, nurses…), NPI-2 = organizations (hospitals, clinics, pharmacies), any = both.
organizationNamestringOrganization legal-business-name search (e.g. "Mount Sinai", "Kaiser Permanente", "Walgreens").
firstNamestringIndividual first name (partial match). Best paired with a last name + state.
lastNamestringIndividual last name (partial match).
citiesarray<string>City-name filter (e.g. ["New York","Brooklyn"]). Each city runs as a separate query.
postalCodestringZIP filter, partial match ("100" matches all 100xx ZIPs).
npisarray<string>10-digit NPI numbers for direct lookup β€” the fastest, most precise mode. Each NPI becomes its own task.
addressPurposeenumMatch on LOCATION (practice), MAILING, PRIMARY, SECONDARY, or any. Modifier.
maxRecordsintegerHard cap across all queries. 0 = unlimited (pages until every query exhausts). Default 100.
requestDelayintegerMilliseconds between page fetches (100–10000). 500–2000 ms is courteous. Default 800.
proxyConfigurationobjectOptional 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

FieldCoverageDescription
πŸ†” 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🟑 ConditionalMost-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🟑 ConditionalMulti-site organizations' secondary physical practice locations.
πŸ”’ identifiers / otherNames / endpoints🟑 ConditionalState 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/organizationalSubpart populate for organizations (null for individuals); gender/soleProprietor/credential populate for individuals (null for orgs); and identifiers/otherNames/endpoints/practiceLocations populate 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: 0 for 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=10000 on 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

  1. 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.
  2. Via API: POST https://api.apify.com/v2/acts/haketa~nppes-npi-registry-scraper/runs?token=YOUR_TOKEN with a JSON body of the input above.
  3. On a schedule: use Apify's built-in Scheduler (any cron) to refresh your NPI dataset daily/weekly.
  4. Choose your export: JSON, CSV, Excel (XLSX), HTML, XML, RSS, or JSON Lines β€” from the dataset UI or the dataset API.
  5. 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 ApifyClient
client = 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" or specialtyCustom: "Oncology" works on the human-readable NUCC taxonomy; you never need the 10-character codes.
  • Use the npis array 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 the authorizedOfficial object (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 β€” maxRecords is 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. Raise maxRecords or narrow the first query to spread results across states.
  • Watch spellings β€” use 2-letter uppercase state codes (NY, not Ny) 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.


Compose these with the NPI Registry Scraper to cross-reference license numbers, enrich leads, and build full healthcare/compliance pipelines:


πŸ“‹ Changelog

VersionDateUpdates
v1.22026-11Unlocked 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.12026-11Added authorizedOfficial decision-maker extraction for NPI-2 organizations, cleaned placeholder tokens (--, .), and added specialty dropdown + mixed default sample.
v1.02026-05Initial release supporting NPI-1 & NPI-2 provider extraction, taxonomy/license normalization, and multi-state query matrices.
⌂ 捒网址