NPPES NPI Registry Lookup
Pricing
from $2.50 / 1,000 provider record returneds
NPPES NPI Registry Lookup
NPPES NPI Registry Lookup extracts US healthcare providers from the CMS NPPES registry and returns 89 flat columns per provider: identity, status, taxonomies, every state licence, mailing and practice addresses, other identifiers and HIE endpoints. Search by NPI, name, specialty or state.
Pricing
from $2.50 / 1,000 provider record returneds
Rating
0.0
(0)
Developer
angel nguyen
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
NPPES NPI Registry Lookup extracts US healthcare providers from the CMS NPPES NPI Registry and gives you 89 flat columns for every provider it returns. Give this npi registry lookup a list of NPI numbers, a surname, a specialty or a state, and you get one row per provider — and you are charged only for the records you actually receive, because a query that matches nothing is free.
What this npi registry lookup returns
One flat row per provider, with 89 columns, read live from the registry during the run that returns it. The column list is not a marketing number: it is generated from the code that builds the rows, so what is advertised and what is delivered cannot drift apart.
| group | what you get |
|---|---|
| Identity | npi, entity_type (Individual or Organization), entity_type_code |
| Status and dates | status, enumeration_date, last_updated, certification_date, deactivation_date, reactivation_date, plus both epoch timestamps |
| Individual provider | first, middle and last name, prefix, suffix, credential, sex, sole_proprietor |
| Organization | organization_name, organizational_subpart, parent_organization_legal_business_name |
| Authorized official | name, prefix, suffix, credential, title or position, and direct telephone number |
| Mailing address | nine columns, including telephone and fax |
| Practice address | nine columns, including telephone and fax |
| Primary taxonomy | code, description, group, state, licence number, and whether the registry actually flagged it as primary |
| Every taxonomy | taxonomy_count, and all codes, descriptions, licence numbers and licence states joined |
| Other names | count, the doing-business-as name, its type and code, and all of them joined |
| Other identifiers | count, the primary one broken out with its code, description, state and issuer, and all of them joined |
| Extra practice locations | count, addresses, states and telephone numbers |
| HIE endpoints | count, endpoints, types, type descriptions, affiliations and uses |
| Provenance | source, source_authority, source_url, registry_url, retrieved_at, matched_query, query_index |
Every row carries registry_url, a direct link to that provider's page on the NPI Registry, so you
can re-check any row at the source without going back through this Actor.
Why run a nppes provider lookup here rather than by hand
NPPES publishes the national provider registry through an interface built for one person asking one question at a time. You give this Actor a list, it walks the list inside the registry's own published limits, and hands back one flat row per provider. What would otherwise be hundreds of manual queries and a reshaping step becomes one run and one dataset.
Three things it does that are worth knowing before you compare it with anything else:
- It reads NPPES itself. Not a resold aggregate, not a cached snapshot that has quietly aged. Every field you receive was served by the registry during your run.
- It keeps what flattening usually loses. A provider with four taxonomies has four licence numbers in four states. Most flat exports keep one. This one keeps the primary broken out into typed columns and the full set joined, so nothing is silently dropped.
- It tells you when it found nothing. A query that matches no provider writes an unbilled row saying so, rather than returning a shorter list that reads as "that is all there was".
How it works
- You supply one or more search criteria — see Input below. NPPES rejects a query with no criteria at all, so a run with every field blank looks up nothing and bills nothing.
- Each criteria set is resolved against the registry's public API, one request at a time.
- Each matching record is flattened into a row of 89 columns and written to the default dataset.
- With Only new or updated providers on (the default), a provider whose registry record has
not changed since your last run is skipped and not billed again. "Changed" is judged by the
registry's own
last_updated_epoch, not by anything this Actor decides. - A criteria set that resolves to nothing writes an unbilled row saying which of the three things happened: not found, rejected by the registry, or the registry did not answer at all.
Those last three are deliberately kept apart. "The registry says no such provider" and "the registry did not answer" are different facts, and a row that merges them is worse than no row.
Input
Give at least one criterion. Every filter below is applied by NPPES itself, so narrowing a search costs you nothing extra and returns fewer billable rows.
{"npiNumbers": ["1760438840", "1104130236"],"taxonomyDescription": "Internal Medicine","state": "TX","maxRecordsPerQuery": 50,"onlyNewOrUpdated": true}
| field | what it does |
|---|---|
npiNumbers | Look these NPI numbers up directly. The cheapest and most precise mode: one NPI resolves to exactly one provider. |
lastName, firstName | Individual provider name. A trailing * is a wildcard, e.g. SMITH*. |
organizationName | Legal business name of a hospital, clinic or group practice. * works here too. |
taxonomyDescription | The registry's own specialty vocabulary, e.g. Internal Medicine, Pharmacy, Nurse Practitioner. |
city, state, postalCode | Registered address filters. state is the two-letter code. |
enumerationType | Restrict to individuals (NPI-1) or organizations (NPI-2). Defaults to both. |
maxRecordsPerQuery | Hard ceiling on records per search, and therefore on cost. Defaults to 50. |
onlyNewOrUpdated | On by default. A repeat run bills only for records the registry has changed. |
includeRawRecord | Attach the untouched NPPES JSON as _raw alongside the flat columns. Does not change what you are charged. |
Output
One row per provider. This is a real record returned by a real run, trimmed to its populated columns — the empty ones are present in every row and omitted here only for length:
{"source": "NPPES","source_authority": "Centers for Medicare and Medicaid Services (CMS) NPPES NPI Registry","source_url": "https://npiregistry.cms.hhs.gov/api/","registry_url": "https://npiregistry.cms.hhs.gov/provider-view/1225219363","retrieved_at": "2026-09-05T20:41:28.816Z","matched_query": "NPI 1225219363","npi": "1225219363","entity_type_code": "NPI-2","entity_type": "Organization","status": "A","enumeration_date": "2007-11-16","last_updated": "2011-02-25","organization_name": "ACOR ORTHOPAEDIC, INC.","organizational_subpart": "NO","authorized_official_first_name": "JEFFREY","authorized_official_last_name": "ALAIMO","authorized_official_credential": "CPO","authorized_official_title_or_position": "President","authorized_official_telephone_number": "2166624500","mailing_address_1": "18530 S MILES RD","mailing_city": "CLEVELAND","mailing_state": "OH","mailing_postal_code": "441284238","mailing_telephone_number": "216-662-4500","practice_address_1": "18700 S MILES RD","practice_city": "CLEVELAND","practice_state": "OH","practice_postal_code": "441284242","practice_telephone_number": "216-662-4500","address_count": 2,"primary_taxonomy_code": "335E00000X","primary_taxonomy_desc": "Prosthetic/Orthotic Supplier","primary_taxonomy_is_primary": true,"taxonomy_count": 1,"other_names_count": 1,"other_name": "CLEVELAND PROSTHETIC CENTER","other_name_type": "Doing Business As","resolved": true}
A criteria set that resolves to nothing emits an unbilled row instead, so a miss is visible rather than silent:
{"source": "NPPES","resolved": false,"matched_query": "NPI 1063608134","unavailableReason": "NOT_FOUND","note": "The registry answered and matched no provider. This row is not billed."}
Pricing
| Event | Price | When it fires |
|---|---|---|
provider-record | $0.0025 per record — $2.50 per 1,000 | once per provider record written to the dataset |
actor-start | $0.00001 per run — one cent per thousand runs | once when a run starts |
There is no per-query fee, no per-page fee and no meaningful per-run fee. You pay for provider records and nothing else.
Worked example. A run returning 1,000 provider records costs $2.50 plus $0.00001 for the
start, whether those thousand records came from one search or from fifty. A run that matches
nothing costs $0.00001. A daily repeat run with onlyNewOrUpdated left on bills only for the
providers whose registry entry actually changed that day, which in this registry is a small
fraction of any given result set.
Where the price comes from. $2.50 per 1,000 is the measured median price of the priced, run-evidenced comparable listings in this category plus the standard 25% — measured live on 2026-09-05 across nine live comparable listings, seven of which publish a price. It is deliberately not the cheapest listing in the category. What it buys against the alternatives is the field surface: 89 columns against the only published field-count claim in this niche, which is 45.
Limits and troubleshooting
- The registry serves at most 1,200 records for any single set of criteria — 200 per page, and it stops paging at 1,000. Both were measured directly rather than read off a document, and both are enforced silently by NPPES: ask for more and you get 1,200 with no error. This Actor caps at that figure and says so in the run log instead of quietly returning less than you asked for. To reach further, split the search — by state, by specialty, or by ZIP prefix.
- No API key and no account are needed, at either end. The registry answered HTTP 200 to an unauthenticated request on 2026-09-05, from an ordinary connection and from a datacenter connection alike, and it was checked from both because a source proved from one machine is not a source proved.
- Rate limits are the registry's, not ours. A run that meets one backs off and continues rather than failing.
- NPPES is the authority for correctness. If a record looks wrong, check it at the
registry_urlon that row. This Actor does not correct, enrich, infer or guess at what the source served. - Fewer rows than expected? Check
onlyNewOrUpdatedfirst. On a repeat run it is doing its job.
Integrations and API
Run it from the Apify Console, the Apify API, the Apify CLI, or any scheduler. Results come back as JSON, CSV, XLSX or HTML, through the dataset API, or pushed to a webhook when the run finishes. Because every row is flat and typed, it loads into a spreadsheet, a warehouse, Make, Zapier or n8n with no transform step, and into an LLM context without reshaping.
curl "https://api.apify.com/v2/acts/praise-most-high~nppes-npi-registry-lookup/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H 'Content-Type: application/json' \-d '{"taxonomyDescription":"Internal Medicine","state":"TX","maxRecordsPerQuery":25}'
Three dataset views ship with the Actor — Providers, Licences and Addresses and contact — so the columns you want are one click away rather than a spreadsheet edit away.
Frequently asked questions
Is the data live? Yes. Every record is read from NPPES during the run that returns it. Nothing is served from a stored snapshot.
What happens if my query matches nothing? You are not charged for it. The run writes an unbilled row that says which of the three possible things happened.
Can I run this every day? Yes, and you should leave onlyNewOrUpdated on so you pay only for
what the registry has actually changed. It defaults to on.
How many providers can I get in one run? Up to 1,200 per set of criteria, which is the
registry's own ceiling, and as many criteria sets as you like in one run via npiNumbers.
Do you store the underlying records? No. The output carries identifiers, metadata and the source's own link.
Who is the data about? Healthcare providers in their professional capacity, exactly as CMS publishes them. This Actor returns no field CMS does not already publish, and no patient data of any kind.
Why 89 columns and not more? Because 89 is what the registry actually serves once its repeated groups are counted and joined. Offering a column NPPES does not serve would be a false claim, not a feature.
Legal and data handling
CMS states, on its own data dissemination page:
The information disclosed on the NPI Registry and in the downloadable files are FOIA-disclosable and are required to be disclosed under the FOIA and the eFOIA amendments to the FOIA. There is no charge to view the data.
That statement was read from the CMS data dissemination page on 2026-09-05. This Actor reproduces the registry on that basis and names NPPES as the source in every row it writes. It reads only what NPPES publishes openly, holds no credential belonging to any third party, and bypasses no access control. It returns information about providers in their professional capacity and no patient information of any kind.
Actor Recommendations
Other source-named extractors from this publisher, each reading one named source and saying so:
- Shopify Store Product Scraper — reads a storefront's own product feed and returns one row per product.
- WTA Tennis Rankings Scraper — reads the WTA's own published ranking tables and returns one row per ranked player.
- Skool Community Stats Scraper — reads named Skool community pages and returns their published membership statistics.
Support and feedback
Open an issue on this Actor's Issues tab. Bug reports are answered fastest when they carry the
run ID and the exact input you used, because both let the run be reproduced rather than guessed at.
If a provider record looks wrong, include its registry_url — that is the source's own page for
that provider, and it settles whether the problem is in this Actor or in the registry.