NPI Registry Scraper: 8M US Healthcare Providers + Licenses
Pricing
$2.00 / 1,000 results
NPI Registry Scraper: 8M US Healthcare Providers + Licenses
Extract 8M+ US healthcare providers from the official CMS NPPES registry. 45 fields: practice and mailing addresses, state licenses, specialties, extra locations, endpoints, plus a contact name for businesses. Filter by specialty, state, city, zip or name, or look up NPIs in bulk. $2 per 1,000.
Pricing
$2.00 / 1,000 results
Rating
5.0
(2)
Developer
Sourabh Kumar
Maintained by CommunityActor stats
1
Bookmarked
60
Total users
3
Monthly active users
2.8 hours
Issues response
20 days ago
Last modified
Categories
Share
NPI Registry scraper: doctors, dentists, nurses, clinics and license lookup
Search the official US healthcare provider registry and export contact details, specialties, addresses, state licences and practice locations. Covers individual practitioners and organizations like hospitals, clinics and labs.
$2.00 per 1,000 providers. No per-run fee. No proxy or browser needed.
Data comes straight from the federal CMS NPPES registry, the same source hospitals and insurers use for provider verification.
Why this NPI Registry scraper?
- ๐ฐ Cheap and predictable: $2.00 per 1,000 providers, and nothing else. You are billed per provider delivered, never per run.
- ๐ Fast: direct API calls, no browser and no proxy. A thousand providers land in well under a minute.
- ๐๏ธ Authoritative: the federal registry itself, updated daily by CMS.
- ๐ 45 fields per provider: practice and mailing addresses, every specialty with its licence, additional practice locations, electronic endpoints and organization contacts.
- ๐งโโ๏ธ Contact name always filled: for a business the registry stores no personal name, only an authorized official. This scraper resolves that into one
contactNamecolumn, so business rows never come back blank. - ๐ Goes past the 1,200 cap: the registry refuses to return more than 1,200 records for any one search. Turn on one option and this scraper works around it. See below.
- ๐๏ธ Batch lookup: pass a list of NPI numbers and validate hundreds in a single run, and it tells you which ones were not found.
- โ Bad input never bills you: unknown specialties and empty searches exit cleanly with an explanation, not a failed run.
Getting more than 1,200 results
This is the thing that surprises people, so it is worth being blunt about it.
The registry hard-caps every single search at 1,200 records. Ask for a nationwide specialty and you get 1,200, no matter how many actually exist. Worse, it does not tell you that you have been cut off.
This scraper handles it two ways:
By default you get up to 1,200 and the run says so plainly, for example Partial: 1200 providers. The NPPES API serves at most 1200 records per search. No silent short results.
Turn on "Get all results past the API limit" and it splits your search into smaller ones automatically (by state, then provider type, then ZIP, then name), merges everything and removes duplicates. A nationwide phlebotomy search goes from 1,200 to 4,307 providers.
That option is off by default because it returns, and therefore bills for, several times more rows. Use maxResults to cap the total when you turn it on.
What data can you extract?
Each provider record has 45 fields:
- ๐ชช Identity: NPI number, provider type, status (Active or Deactivated), name prefix and suffix, credential, gender, enumeration and last-updated dates
- ๐งโโ๏ธ Contact name:
contactNameresolves to the practitioner for individuals and to the authorized official for businesses, so the column is never empty - ๐ข Organization: organization name, subpart flag, and the authorized official's name, title, phone and credential
- ๐ฌ Specialties: primary specialty plus the full
taxonomies[]array with code, description, state licence number, licence state and primary flag for every specialty the provider holds - ๐ Identifiers:
identifiers[]array of other registrations such as Medicaid IDs and other non-Medicare identifiers, with issuer and state - ๐ Practice address: street, suite, city, state, ZIP, country, phone, fax
- ๐ฎ Mailing address: kept separate, with its own street, suite, city, state, ZIP and phone
- ๐บ๏ธ Additional practice locations:
practiceLocations[]with every secondary address - ๐ Electronic endpoints:
endpoints[]with secure-messaging addresses and content types for health information exchange - ๐ท๏ธ Other names:
otherNames[]with previous and alternate names - ๐ Source link: direct URL to the provider's registry page for verification
How much does it cost?
Pay per provider delivered. There is no per-run fee, so a small run costs almost nothing.
- $2.00 per 1,000 providers
- The Apify free plan ($5 credit) yields about 2,500 providers
- The Starter plan ($29 credit) yields about 14,500 providers
| What you extract | Providers | Cost |
|---|---|---|
| Family medicine doctors in one Texas city | 500 | $1.00 |
| All dentists in California | 2,000 | $4.00 |
| Every phlebotomy provider nationwide, cap turned off | 4,307 | $8.61 |
Use cases
- ๐ Pharma and medical sales: build prescriber lists by specialty and territory, with phone, address and every practice location.
- ๐ฆท Dental and vision supply: find every practice in a region with contact details and licence numbers.
- ๐ป Healthcare software: enrich a provider database, or validate NPI numbers and state licences at scale.
- ๐ข Decision-maker outreach: businesses come with the authorized official's name, title and direct phone.
- ๐งพ Billing and credentialing: verify a list of NPIs in one run and see exactly which ones are not in the registry.
- ๐ Market research: measure provider density, specialty mix and coverage gaps by state or ZIP.
- ๐ CRM enrichment: append verified phone, fax, address, specialty and licence data to records you already have.
- ๐ Interoperability: pull secure-messaging endpoints for health information exchange work.
Input
| Field | Type | Description | Default |
|---|---|---|---|
taxonomy | string | Specialty, for example "Family Medicine", "Dentist", "Nurse Practitioner". Matched as the start of a specialty name. | none |
state | string | Two-letter state code, for example "CA", "TX", "NY" | none |
city | string | City name, for example "Los Angeles" | none |
postalCode | string | ZIP code such as "90210", or a prefix with a wildcard such as "900*" | none |
firstName | string | First name, wildcards allowed with at least 2 leading characters, for example "Jo*" | none |
lastName | string | Last name, wildcards allowed, for example "Sm*" | none |
organizationName | string | Business name, for example "Mayo Clinic". Switches the search to organizations. | none |
npiNumber | string | Look up one provider by exact 10-digit NPI | none |
npiNumbers | array | Batch lookup. A list of 10-digit NPI numbers. Takes priority over the filters above. | none |
providerType | string | "both", "individual" or "organization" | "both" |
fetchAllResults | boolean | Work around the 1,200-record limit by splitting the search automatically. Returns and bills for many more rows. | false |
maxResults | number | Stop after this many providers. Leave empty for no limit. | no limit |
Run it with no filters at all and you get a small Family Medicine sample from California, so a blank run always succeeds.
Example inputs
Cardiologists in California:
{"taxonomy": "Cardiology","state": "CA","maxResults": 500}
Every phlebotomy provider in the country, past the 1,200 cap:
{"taxonomy": "Phlebotomy","fetchAllResults": true}
Find clinics by name:
{"organizationName": "Kaiser","state": "CA","maxResults": 50}
Batch lookup for credentialing:
{"npiNumbers": ["1245319599","1871538041","1225547771"]}
Output
One row per provider, as JSON, CSV, Excel or straight from the API.
{"npi": "1245319599","type": "individual","status": "Active","contactName": "Laura Sample","firstName": "Laura","lastName": "Sample","credential": "MD","gender": "F","specialty": "Family Medicine","taxonomyCode": "207Q00000X","licenseNumber": "A123456","licenseState": "CA","phone": "310-555-0192","fax": "310-555-0193","address": "1234 Wilshire Blvd","suite": "Suite 400","city": "Los Angeles","state": "CA","zip": "90010","country": "US","mailingAddress": "PO Box 9000","mailingCity": "Los Angeles","mailingState": "CA","mailingZip": "90009","taxonomies": [{ "code": "207Q00000X", "description": "Family Medicine", "primary": true, "licenseNumber": "A123456", "licenseState": "CA" }],"identifiers": [{ "code": "05", "description": "MEDICAID", "identifier": "CA-MED-123", "state": "CA", "issuer": null }],"endpoints": [],"practiceLocations": [],"enumerationDate": "2003-06-12","lastUpdated": "2024-11-08","nppesUrl": "https://npiregistry.cms.hhs.gov/provider-view/1245319599"}
A business row looks the same, except the personal name fields are empty by design and the contact person appears in contactName and the authorized-official fields:
{"npi": "1225547771","type": "organization","organizationName": "1 SHOT PHLEBOTOMY LLC","contactName": "Rachel Davis","authorizedOfficialFirstName": "Rachel","authorizedOfficialLastName": "Davis","authorizedOfficialTitle": "Owner/Phlebotomist","firstName": null,"lastName": null,"specialty": "Technician, Pathology, Phlebotomy","city": "Middleburg Heights","state": "OH"}
Supported specialties
Search by any specialty name in the federal taxonomy. Partial names work: "Nurse" matches Nurse Practitioner, Registered Nurse and the rest.
| Category | Example specialties |
|---|---|
| Primary care | Family Medicine, Internal Medicine, Pediatrics, Geriatric Medicine |
| Dental | Dentist, Oral & Maxillofacial Surgery, Orthodontics, Endodontics |
| Vision | Optometrist, Ophthalmology |
| Mental health | Psychiatry & Neurology, Clinical Psychology, Clinical Social Worker |
| Nursing | Nurse Practitioner, Registered Nurse, Certified Nurse Midwife |
| Allied health | Physical Therapist, Occupational Therapist, Speech-Language Pathologist |
| Surgery | General Surgery, Orthopedic Surgery, Plastic & Reconstructive Surgery |
| Other | Chiropractic, Podiatry, Dermatology, Cardiology, Radiology |
| Organizations | Hospital, Clinic/Center, Group Practice, Pharmacy, Laboratory |
Limitations
Worth knowing before you run a big export.
- 1,200 records per search. A hard limit set by the registry. Turn on "Get all results past the API limit" to work around it, or narrow the search yourself by state or ZIP.
- Location filters match every address on file.
city,stateandpostalCodeare checked against the practice address, the mailing address and any additional locations. So a search for Houston can return a provider whose main address column reads a different city, because their mailing address is in Houston. - Name filters match former names. A search for
"Smith"can return someone listed under a different surname today, because Smith is recorded as a previous name. - Some fields are genuinely empty. The registry simply does not hold a credential for every provider (about a third do), a fax for many, or a gender for businesses. A blank field means the registry is blank, not that the scraper missed it.
- No DEA numbers. The registry does not publish DEA registrations, so no scraper can return them from this source.
- A very large export takes a while. Splitting a huge specialty into thousands of small searches is bound by how fast the registry answers.
Data source
Everything comes from the CMS NPPES National Plan and Provider Enumeration System, run by the Centers for Medicare & Medicaid Services.
- Coverage: more than 8 million active and deactivated US healthcare providers
- Updates: daily, by CMS
- Licence: free public government data, no copyright restrictions
- Access: fully public, no login and no API key
FAQ
Is scraping the NPI Registry legal? The registry is free public data published by the US federal government, with no login and no copyright restrictions. This scraper reads the same public information any visitor can see.
How much does it cost? $2.00 per 1,000 providers, with no per-run fee. The $5 free plan credit is worth roughly 2,500 providers.
Why did I only get 1,200 results? That is the registry's own limit for a single search, not a bug. Turn on "Get all results past the API limit", or split your search by state or ZIP.
Why is the name column empty on some rows?
Those are businesses. The registry stores no personal name for a business, only an authorized official, which is why every row also has a contactName column that is filled in for both.
Can I get an email address? No. The registry does not collect provider email addresses. You get phone, fax, postal addresses and secure-messaging endpoints.
Your feedback
Found a problem or need a field that is missing? Open an issue at console.apify.com/actors/NF5h4pLPnGEesFgF4/issues and it goes straight to the developer.