Extract public healthcare provider records from the CMS NPI Registry. Search by NPI number, specialty, provider name, organization, city, state, ZIP, and entity type, then export normalized provider data to CSV, JSON, Excel, or the Apify API.
What does NPI Registry Scraper do?
- Build healthcare lead lists by specialty and geography.
- Enrich internal provider records with official NPI details.
- Find clinics, hospitals, pharmacies, and individual practitioners.
- Support compliance, KYC, provider network, and market research workflows.
Who is it for
- Healthcare sales and marketing teams building specialty-specific outreach lists.
- Provider network and credentialing teams checking official NPI details.
- Compliance, KYC, and due-diligence teams validating provider identities.
- Data enrichment teams matching internal provider records to official registry data.
Example input
{
"taxonomyDescription": "Cardiology",
"city": "Seattle",
"state": "WA",
"maxResults": 20,
"includeRaw": true
}
Exact NPI lookup:
{
"npiNumbers": ["1679576722"],
"maxResults": 1
}
Example output
{
"npi": "1679576722",
"entityType": "individual",
"enumerationType": "NPI-1",
"firstName": "JANE",
"lastName": "DOE",
"organizationName": null,
"credential": "MD",
"primarySpecialty": "Internal Medicine, Cardiovascular Disease",
"practiceCity": "SEATTLE",
"practiceState": "WA",
"practicePhone": "2065550100",
"enumerationDate": "2005-07-01",
"status": "A",
"url": "https://npiregistry.cms.hhs.gov/provider-view/1679576722",
"scrapedAt": "2026-07-08T08:00:00.000Z"
}
Input settings
| Field | Type | Description |
|---|---|---|
npiNumbers |
string[] | Exact 10-digit NPI numbers to look up. |
taxonomyDescription |
string | Specialty or taxonomy text, such as Cardiology or Family Medicine. |
firstName / lastName |
string | Individual provider name filters. |
organizationName |
string | Hospital, clinic, pharmacy, group practice, or other organization name. |
city |
string | Provider practice city. |
state |
string | Two-letter US state code. |
postalCode |
string | ZIP/postal code filter. |
countryCode |
string | Two-letter country code. Defaults to US when omitted. |
enumerationType |
string | NPI-1 for individuals, NPI-2 for organizations, or blank for both. |
maxResults |
integer | Maximum provider records to save. Default: 20. |
includeRaw |
boolean | Include the complete CMS source record in raw. |
proxyConfiguration |
object | Optional proxy settings. Off by default because the registry is public. |
Provide at least one NPI number or one search filter.
Input recipes
Providers by specialty and state
{
"taxonomyDescription": "Pediatrics",
"state": "CA",
"maxResults": 100
}
Organizations in a city
{
"organizationName": "clinic",
"city": "Austin",
"state": "TX",
"enumerationType": "NPI-2",
"maxResults": 50
}
Known NPI enrichment
{
"npiNumbers": ["1679576722", "1234567893"],
"includeRaw": true
}
API usage
Run the actor from code with the Apify API.
Node.js:
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/npi-registry-scraper').call({
taxonomyDescription: 'Cardiology',
state: 'WA',
maxResults: 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python:
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/npi-registry-scraper').call(run_input={
'taxonomyDescription': 'Cardiology',
'state': 'WA',
'maxResults': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
cURL:
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~npi-registry-scraper/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"taxonomyDescription":"Cardiology","state":"WA","maxResults":20}'
MCP and agent usage
Connect AI agents through Apify MCP with:
https://mcp.apify.com/?tools=fetch_cat/npi-registry-scraper
Claude CLI setup:
claude mcp add apify-npi-registry https://mcp.apify.com/?tools=fetch_cat/npi-registry-scraper
MCP JSON config:
{
"mcpServers": {
"apify-npi-registry": {
"url": "https://mcp.apify.com/?tools=fetch_cat/npi-registry-scraper"
}
}
}
Example prompts showing MCP usage:
- "Use MCP to run
fetch_cat/npi-registry-scraperand find 50 active cardiology providers in Seattle. Return NPI, name, specialty, phone, and address." - "Use the Apify MCP server and
fetch_cat/npi-registry-scraperto enrich these NPI numbers with official organization names and taxonomy codes."
Limits and tips
- Keep
maxResultslow for the first run, then scale once the filters return the right provider type. - The CMS registry can return zero results for overly specific combinations; broaden city, specialty, or name filters if needed.
- Exact NPI lookup is best for enrichment. Specialty and location search is best for lead generation.
- When looking up several NPIs, check the run summary for any unavailable identifiers. Provider records saved before a later unavailable lookup remain in the dataset.
Legality and responsible use
The actor exports public CMS NPI Registry data. Provider data is public registry data, but you are responsible for using it lawfully and respecting applicable healthcare, marketing, and privacy rules.
Support
If a run does not return the expected records, open an issue and include the run ID or run URL, input JSON, expected output, actual output, and a reproducible public URL from the NPI Registry when available.
Privacy and data handling
This Actor only requests the permissions needed to run the input you provide. It uses your input (such as URLs, search terms, identifiers, filters, and limits) only to fetch the requested public data from the relevant source site or API for this Actor, then writes results to your Apify dataset/key-value store.
Data may pass through Apify platform services and Apify Proxy during the run, and requests are sent only to the target site or public data provider required for this Actor's results. FetchCat does not send your inputs or outputs to advertising networks, data brokers, or model-training services, and does not retain run data outside Apify storage after the run except when you explicitly share run details for transient support debugging.
You are responsible for using this Actor lawfully, respecting the target site's terms, and avoiding unnecessary personal or sensitive data in inputs. Review the output before storing, sharing, or combining it with other data.