How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
25in Maximum providers. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Search the CMS NPPES NPI Registry for US providers by taxonomy and practice location, or look up NPI numbers in a batch. Get provider names, taxonomies, published licence details and practice addresses in an Apify Dataset.
- Search by taxonomy description, state, city, ZIP code, provider type or provider name.
- Look up up to 200 NPI numbers in one input. Duplicate inputs are removed.
- Read pages from NPPES and remove duplicate provider records.
- Save a row for each returned NPI, with the primary taxonomy and all published taxonomies.
- With
onlyNew, save only NPI numbers that are new to your baseline.
Who uses it
Healthcare data teams
Match and clean an NPI list in one batch.
Directory builders
List practices by specialty, state and city.
Market researchers
Count providers of one type in an area.
Price
Prices will be shown after release.
Questions
Does this check a medical licence?
No. It shows published licence fields. Ask the licensing authority to verify.
Can I get doctors' emails or phones?
No. Personal contact fields are left out. Some organization rows may show the practice phone.
Does onlyNew find changed addresses?
No. It only finds new NPI numbers. Compare full exports to see edits.
Do I need an NPPES key?
No. The registry is public. You only need an Apify account.
Can I get doctors' e-mail addresses or personal phone numbers?
No. Individual contact fields are omitted, and no contact enrichment is performed.
Can I export the whole US registry?
No. Use the CMS downloadable files for national bulk coverage. This Actor supports bounded searches and lookup batches.
Details
Step by step on Apify
- Open Input.
- Keep
taxonomyDescription: Dentist,state: RI,city: ProvidenceandmaxResults: 25. - Click Start.
- Open the Providers output and export the Dataset as JSON, CSV or Excel.
- Read Run summary for the completion status, saved count and missing NPI numbers.
Use cases
| Task | Input | Useful output |
|---|---|---|
| Build a practice directory | Taxonomy + state + city | NPI, organization, taxonomy, practice address |
| Match an existing NPI list | npis | NPI, name, type, source dates and missing-number summary |
| Review published taxonomy details | Name or NPI | Primary taxonomy, all taxonomy codes and published licence fields |
Tips for better results
- You can check up to 200 NPI numbers per run. Duplicates are removed.
- Use onlyNew to get only NPI numbers you have not seen before.
- For the whole US registry, use the CMS bulk files instead.
Limits and good to know
- Up to 200 NPI inputs and 1000 saved providers. NPPES returns at most 200 records per request. This Actor scans the first 1000 candidates, rather than the whole national registry
- Search results are a bounded live sample. They are not a snapshot of a fixed total, and source records can change between pages
- Up to 220 source attempts, 4 MiB per response and 8 MiB across a run. Requests are serial with at least 1.1 seconds between attempts. Retries respect Retry-After within the shared deadline
- Search source work stops after 120 seconds; lookup source work stops after 240 seconds. Both stop before the platform timeout. A large batch may therefore stop before all NPIs are processed
MAX_RESULTSmeans the saved-row cap was reached; narrow filters or raise the cap within the allowed range.SOURCE_WINDOW_LIMITmeans the scanned source window ended- A source error fails the run and writes
error, orpartialif rows were already saved. Existing Dataset rows remain available. An input error also fails the run - NPI Registry provides active records. A missing result may be unknown, unavailable or deactivated; the API alone cannot tell which. CMS publishes deactivation information separately
- NPI issuance does not prove a current licence, credential, quality, insurance participation or Medicare enrolment. Data may contain outdated information supplied by providers
Troubleshooting
| Symptom | Likely cause | Action |
|---|---|---|
| Input error before source requests | Bad checksum, mixed modes or unsupported filter | Review the input fields. Clear search prefills for lookup. |
Empty Dataset with not_found | No active record matches | Check spelling, taxonomy wording and filters; review notFoundNpis. |
Empty Dataset with complete and unchanged > 0 | All returned NPIs were already in the onlyNew baseline | Use onlyNew: false for a full export. |
partial and CHARGE_LIMIT | Customer budget reached | Increase the permitted charge or request fewer providers. |
SOURCE_RATE_LIMIT, SOURCE_TIMEOUT or SOURCE_UNAVAILABLE | Registry throttling or an outage | Wait and retry a small request. Preserve the existing Dataset. |
BASELINE_INVALID or BASELINE_SAVE_ERROR | Invalid baseline or a storage problem | Check your named KVS; use a new stateKey for a fresh history. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"npi": "1225787708",
"type": "NPI-2",
"name": "31 ELMGROVE DENTAL LLC",
"organization": "31 ELMGROVE DENTAL LLC",
"credential": null,
"primaryTaxonomy": {
"code": "1223G0001X",
"description": "Dentist, General Practice",
"primary": true,
"licenseNumber": null,
"licenseState": null
},
"practiceAddress": {
"address1": "31 ELMGROVE AVE",
"address2": null,
"city": "PROVIDENCE",
"state": "RI",
"postalCode": "029064103",
"countryCode": "US"
},
"phone": "401-421-9350",
"status": "A",
"enumerationDate": "2022-03-22",
"lastUpdated": "2022-03-22"
}Input settings (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| NPI numbers | npis | array | |
| Maximum providers | maxResults | integer | 25 |
| Only new NPI numbers | onlyNew | boolean | false |
| Baseline key | stateKey | string | "npi-provider-baseline" |
| Taxonomy description | taxonomyDescription | string | "Dentist" |
| State | state | string | "RI" |
| City | city | string | "Providence" |
| Postal code | postalCode | string | |
| Provider type | enumerationType | string | "" |
| Organization name | organizationName | string | |
| Last name | lastName | string |
