NPI Registry Scraper

Search and export public CMS NPI Registry healthcare provider records by NPI, specialty, name, organization, and location.

Data fields

FieldTypeDescription
npistring10-digit National Provider Identifier.
entityTypestringindividual or organization.
enumerationTypestringNPI-1 or NPI-2.
firstNamestring | nullValue exported as firstName.
lastNamestring | nullValue exported as lastName.
organizationNamestring | nullValue exported as organizationName.
credentialstring | nullValue exported as credential.
genderstring | nullValue exported as gender.

Input preview

npiNumbersNPI numbers
taxonomyDescriptionTaxonomy or specialty
firstNameFirst name
lastNameLast name
organizationNameOrganization name
cityCity

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

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-scraper and find 50 active cardiology providers in Seattle. Return NPI, name, specialty, phone, and address."
  • "Use the Apify MCP server and fetch_cat/npi-registry-scraper to enrich these NPI numbers with official organization names and taxonomy codes."

Limits and tips

  • Keep maxResults low 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.

Common questions

Questions and answers reused from the canonical actor README.

Does this require a CMS account?

No. It uses public NPI Registry records.

Can I look up exact NPIs?

Yes. Add one or more 10-digit values in npiNumbers.

Why did my search return zero records?

The filters may be too narrow or the specialty text may not match registry taxonomy wording. Try fewer filters or a broader specialty.

Can I export phone numbers and addresses?

Yes. Practice and mailing address fields, phones, and fax numbers are included when CMS provides them.