NPPES NPI Registry Lookup avatar

NPPES NPI Registry Lookup

Pricing

from $2.50 / 1,000 provider record returneds

Go to Apify Store
NPPES NPI Registry Lookup

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

angel nguyen

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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.

source: CMS NPPES NPI Registry 89 columns per provider no API key required

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.

groupwhat you get
Identitynpi, entity_type (Individual or Organization), entity_type_code
Status and datesstatus, enumeration_date, last_updated, certification_date, deactivation_date, reactivation_date, plus both epoch timestamps
Individual providerfirst, middle and last name, prefix, suffix, credential, sex, sole_proprietor
Organizationorganization_name, organizational_subpart, parent_organization_legal_business_name
Authorized officialname, prefix, suffix, credential, title or position, and direct telephone number
Mailing addressnine columns, including telephone and fax
Practice addressnine columns, including telephone and fax
Primary taxonomycode, description, group, state, licence number, and whether the registry actually flagged it as primary
Every taxonomytaxonomy_count, and all codes, descriptions, licence numbers and licence states joined
Other namescount, the doing-business-as name, its type and code, and all of them joined
Other identifierscount, the primary one broken out with its code, description, state and issuer, and all of them joined
Extra practice locationscount, addresses, states and telephone numbers
HIE endpointscount, endpoints, types, type descriptions, affiliations and uses
Provenancesource, 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

  1. 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.
  2. Each criteria set is resolved against the registry's public API, one request at a time.
  3. Each matching record is flattened into a row of 89 columns and written to the default dataset.
  4. 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.
  5. 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
}
fieldwhat it does
npiNumbersLook these NPI numbers up directly. The cheapest and most precise mode: one NPI resolves to exactly one provider.
lastName, firstNameIndividual provider name. A trailing * is a wildcard, e.g. SMITH*.
organizationNameLegal business name of a hospital, clinic or group practice. * works here too.
taxonomyDescriptionThe registry's own specialty vocabulary, e.g. Internal Medicine, Pharmacy, Nurse Practitioner.
city, state, postalCodeRegistered address filters. state is the two-letter code.
enumerationTypeRestrict to individuals (NPI-1) or organizations (NPI-2). Defaults to both.
maxRecordsPerQueryHard ceiling on records per search, and therefore on cost. Defaults to 50.
onlyNewOrUpdatedOn by default. A repeat run bills only for records the registry has changed.
includeRawRecordAttach 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

EventPriceWhen it fires
provider-record$0.0025 per record — $2.50 per 1,000once per provider record written to the dataset
actor-start$0.00001 per run — one cent per thousand runsonce 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_url on that row. This Actor does not correct, enrich, infer or guess at what the source served.
  • Fewer rows than expected? Check onlyNewOrUpdated first. 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.

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:

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.