Healthcare Provider NPI Enricher
Last updated November 8, 2026
Enrich a list of NPIs or provider names from the official US NPI Registry: one row per provider with taxonomy, license, practice address and phone, and organization official. Invalid and unmatched lookups are free. For healthcare lead lists and provider checks.
Features
- NPIs, individual names, organization names, or a taxonomy search in one run.
- Taxonomy, license, practice address and phone, and organization official on each row.
- An NPI that fails its check digit or has no record is one free row.
- A repeat of a provider in one run is not charged twice.
- Pay per event: Provider row at $0.002.
Input
npisarrayoptional10 digit NPIs. Each returns its record. An invalid NPI or one with no record is a free row.
individual_namesarrayoptionalPeople, as Jane Doe, Doe, Jane, or Dr. Jane Doe MD. The registry also matches common first name aliases. A trailing * after 2 or more letters is a wildcard. Add state to narrow common names.
organization_namesarrayoptionalOrganizations. The registry matches whole words, so add a trailing *, such as kaiser*, to widen the match.
taxonomystringoptionalFilter or search by the registry's taxonomy wording, such as cardiovascular disease, or cardio* as a wildcard. Cardiology alone matches only Pharmacist, Cardiology. Applies to names and to the search. Does not apply to NPIs.
statestringoptionalTwo letter state code. Applies to names and to the search. The registry refuses state alone, so give it with a name, taxonomy, city, or postal code.
citystringoptionalCity filter. Applies to names and to the search.
postal_codestringoptional5 or 9 digit postal code, with a trailing * after 2 or more digits as a wildcard.
provider_typestringoptionalFor the taxonomy, city, or postal code search: both (default), individual, or organization.
max_results_per_lookupstringoptionalProvider rows per name or search, from 1 to 1200. Default 25. The registry serves at most 1200 records per search.
max_charge_usdstringoptionalOptional. The run stops before a charge that would pass this amount. Summary rows are always returned.
Output schema
{
"row_type": "string",
"input": "string",
"lookup_kind": "string",
"npi": "string",
"provider_type": "string",
"status": "string",
"name": "string",
"first_name": "string",
"middle_name": "string",
"last_name": "string",
"credential": "string",
"sole_proprietor": "string",
"organization_name": "string",
"authorized_official": "string",
"authorized_official_phone": "string",
"primary_taxonomy_code": "string",
"primary_taxonomy": "string",
"primary_license": "string",
"primary_license_state": "string",
"taxonomies": "array",
"practice_address": "string",
"practice_city": "string",
"practice_state": "string",
"practice_postal_code": "string",
"practice_country": "string",
"practice_phone": "string",
"practice_fax": "string",
"mailing_address": "string",
"practice_locations": "array",
"other_identifiers": "array",
"other_names": "array",
"endpoints": "array",
"enumeration_date": "string",
"last_updated": "string",
"registry_url": "string",
"match_count": "integer",
"matches_read": "integer",
"rows_returned": "integer",
"duplicates_skipped": "integer",
"row_status": "string",
"error_reason": "string",
"billable_events_json": "string",
"scraped_at": "string"
}Pricing
| Event | Free plan price |
|---|---|
| Provider row | $0.002 |
| Actor Start | $0.002 |
Pay per event on the Apify platform. Paid Apify plans pay less per event. No subscription, no seat license.
On the Apify free plan the actor stops at $1.50 of charges a month, about 750 providers. Any paid Apify plan removes the cap.
Limits
- Rows hold only what the registry publishes, as providers entered it. There is no personal email, and this actor does not look for one. Gender is in the registry and is left out of the rows.
- A practice or mailing address can be a provider's own, and a phone can be out of date. Providers keep these records themselves.
- No Medicare enrollment flag: the registry does not publish one. other_identifiers shows the identifiers a provider chose to list.
- A name lookup matches every person with that name. Check match_count, and narrow with state, city, or taxonomy. A name alone cannot prove a row is the person you mean.
- taxonomy matches the registry's own wording, not the common name of a specialty. In testing, cardiology in Boston returned 6 records, all Pharmacist, Cardiology, because cardiologists are filed under Cardiovascular Disease. cardio* returned the wider set. Read primary_taxonomy on the rows.
- An organization name also matches the record's other names, so kaiser* can return a provider whose legal name does not contain it.
- A list of mostly misses stops: after more than 5 free rows, plus 50 for each provider row, the run writes a free row saying how many lookups were not read. Run the rest after checking the list.
- The registry serves at most 1,200 records per search, and this actor does not split a search to pass that. Run one search per state or city for more.
- Every record read in testing had status A. A no_results row on an NPI can mean it was never issued or is no longer served, and the actor cannot tell which.
- US providers only, because the registry covers those holding an NPI.