Healthcare Provider NPI Enricher
Pricing
from $1.70 / 1,000 provider rows
Healthcare Provider NPI Enricher
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.
Pricing
from $1.70 / 1,000 provider rows
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Security
Limited permissionsShare
Give NPIs or provider names and get each provider's record from the official US NPI Registry: one row per provider with taxonomy, license, practice address and phone, and, for an organization, its authorized official. You pay per provider, and Mamba Labs pays the platform costs.
Features
- Four ways in, in one run. NPIs, individual names, organization names, or a search by taxonomy, city, or postal code.
- Flat columns for Clay. Primary taxonomy, license, and practice address sit in their own columns, and the full lists stay as arrays.
- Misses are free. An NPI that fails its check digit is caught before any lookup, and an NPI or name with no record is one free row that says so.
- A provider is charged once per run, even when two lookups match the same NPI.
match_counton provider rows, so a name that matched 40 people is easy to spot. It is null when the matches filled the page, because more may exist.- The 1,200 limit is stated. The registry serves at most 1,200 records per search, and a search that reaches it reads
partial. Nothing is cut off silently. - Restart aware. If Apify moves the run to another host, it resumes from its saved position.
How the data is read
The actor calls the NPI Registry API run by CMS, directly. CMS publishes this data under its NPPES data dissemination notice, with no key, no sign in, and no charge. There is no scraping, no AI, and no other developer's actor. Records change daily, and each run reads them live.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
npis | array | 10 digit NPIs. Each returns its record. An invalid NPI or one with no record is a free row. | |
individual_names | array | People, 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_names | array | Organizations. The registry matches whole words, so add a trailing , such as kaiser, to widen the match. | |
taxonomy | string | Filter 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. | |
state | string | Two 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. | |
city | string | City filter. Applies to names and to the search. | |
postal_code | string | 5 or 9 digit postal code, with a trailing * after 2 or more digits as a wildcard. | |
provider_type | string | both | For the taxonomy, city, or postal code search: both (default), individual, or organization. |
max_results_per_lookup | string | 25 | Provider rows per name or search, from 1 to 1200. Default 25. The registry serves at most 1200 records per search. |
max_charge_usd | string | Optional. The run stops before a charge that would pass this amount. Summary rows are always returned. |
Output
| Field | Type | What it holds |
|---|---|---|
row_type | string | One of: provider, lookup_summary, run_summary. run_summary is the one free row written when the input is refused. |
input | string | The NPI, name, or search that produced this row. |
lookup_kind | string | npi, individual, organization, or search. |
npi | string | The 10 digit National Provider Identifier. |
provider_type | string | individual (NPI-1) or organization (NPI-2). |
status | string | The registry status. A is active. |
name | string | Full name of the person or organization, as the registry holds it. |
first_name | string | Individuals. |
middle_name | string | Individuals. |
last_name | string | Individuals. |
credential | string | Individuals: the credential as entered, such as M.D. |
sole_proprietor | string | Individuals: YES or NO as the registry holds it. |
organization_name | string | Organizations. |
authorized_official | string | Organizations: name, title, and credential of the official the registry lists. |
authorized_official_phone | string | Organizations: the phone the registry lists for the official. |
primary_taxonomy_code | string | The taxonomy marked primary. |
primary_taxonomy | string | Description of the primary taxonomy. |
primary_license | string | License number on the primary taxonomy, when given. |
primary_license_state | string | State of that license. |
taxonomies | array | Every taxonomy: code, desc, primary, state, license. |
practice_address | string | Primary practice street lines. |
practice_city | string | Primary practice city. |
practice_state | string | Primary practice state. |
practice_postal_code | string | Primary practice postal code. |
practice_country | string | Two letter code. |
practice_phone | string | The phone on the primary practice address. |
practice_fax | string | The fax on the primary practice address. |
mailing_address | string | The mailing address on one line. |
practice_locations | array | Further practice addresses in the registry. |
other_identifiers | array | Other identifiers the provider listed: code, desc, identifier, issuer, state. |
other_names | array | Other names on the record. |
endpoints | array | Electronic exchange endpoints the provider published. |
enumeration_date | string | When the NPI was issued. |
last_updated | string | When the record last changed. |
registry_url | string | The record on the NPI Registry. |
match_count | integer | Records this lookup matched, when they fit on one page. Null when more may exist. Above 1 on a name lookup means check the row before relying on it. |
matches_read | integer | lookup_summary: records read for this lookup. |
rows_returned | integer | lookup_summary: provider rows written for this lookup. |
duplicates_skipped | integer | lookup_summary: records already returned earlier in this run, not charged again. |
row_status | string | ok, or why this row carries no data: no_results, no_change, partial, blocked, or error. |
error_reason | string | Why the row is not ok. A refused input reads input_invalid: followed by what to fix. |
billable_events_json | string | What this row was billed as, for example {"provider-row":1}. {} means free. |
scraped_at | string | When the row was written, UTC. |
Pricing
Pay per event. Lookup summaries, NPIs not found, invalid NPIs, and refused input are free.
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
provider-row, one provider record | $0.002 | $0.0019 | $0.0018 | $0.0017 |
apify-actor-start, once per run (one per GB of memory; the default 256 MB is one) | $0.002 | $0.002 | $0.002 | $0.002 |
Per 1,000 rows of provider-row: $2.00 on the free plan, $1.70 on Gold.
Free plan cap: 1.50 USD of evaluation a month, about 750 rows. Any paid Apify plan removes the cap, and it resets on the 1st. The run stops before a charge that passes your maximum charge per run in Apify or your max_charge_usd input.
Mamba Labs pays the platform costs of your run, Apify proxy traffic included.
Usage examples
Enrich a list of NPIs.
{"npis": ["1003000126", "1740362904"]}
Find a person, narrowed by state.
{"individual_names": ["Jane Doe", "Doe, John"],"state": "CA","max_results_per_lookup": "5"}
Search by taxonomy and city.
{"taxonomy": "cardiovascular disease","city": "Boston","state": "MA","provider_type": "individual","max_results_per_lookup": "200"}
Clay. Number inputs are text fields, which is what Clay sends. A list input takes a JSON list, so put the column inside a one item list.
MCP. The Mamba Labs MCP server @mambalabsdev/mcp-healthcare-provider-npi-enricher exposes this actor to Claude and other MCP clients.
Limitations
- 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_identifiersshows the identifiers a provider chose to list. - A name lookup matches every person with that name. Check
match_count, and narrow withstate,city, ortaxonomy. A name alone cannot prove a row is the person you mean. taxonomymatches the registry's own wording, not the common name of a specialty. In testing,cardiologyin Boston returned 6 records, all Pharmacist, Cardiology, because cardiologists are filed under Cardiovascular Disease.cardio*returned the wider set. Readprimary_taxonomyon 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.
Mamba Labs actor suite
Built by Mamba Labs.