US Healthcare Providers (NPI Registry) Scraper avatar

US Healthcare Providers (NPI Registry) Scraper

Pricing

$1.50 / 1,000 provider (result)s

Go to Apify Store
US Healthcare Providers (NPI Registry) Scraper

US Healthcare Providers (NPI Registry) Scraper

Use this when you need US healthcare organizations or practitioners from the official NPI Registry (NPPES): clinics, hospitals, pharmacies, dentists by specialty, city, state or ZIP, with address, phone, taxonomy and NPI. No key; large areas split automatically. Pay per result.

Pricing

$1.50 / 1,000 provider (result)s

Rating

0.0

(0)

Developer

Hexadata

Hexadata

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

Share

US Healthcare Providers (NPI Registry) Scraper returns healthcare organizations from the official NPI Registry (NPPES, run by CMS) as clean JSON: clinics, hospitals, pharmacies, dental and medical practices, labs and home-health agencies filtered by specialty (taxonomy), name, city, state or ZIP code, with practice address, phone, fax, taxonomy code, license and NPI number. It uses the official NPPES API (no key), splits large areas automatically so a whole state fits in one run, and you pay per result. Individual practitioners are included only when you ask for them.

What you get

One item per provider, same field names as every Hexadata Actor:

FieldTypeDescription
id / npistringNPI number (10 digits), unique
namestringOrganization name, or "First Last, Credential" for individuals
enumerationType / isOrganizationstring, booleanNPI-2 organization or NPI-1 individual
organizationNamestring | null
firstName / lastName / credential / gender / soleProprietormixedIndividuals only (with includeIndividuals)
organizationalSubpart / parentOrganizationboolean | null, string | nullSubpart of a larger organization
otherNamesstring[]Doing-business-as and former names
statusstringactive or deactivated
enumerationDate / lastUpdatedstring | nullNPI issue date and last record update (YYYY-MM-DD)
taxonomy / taxonomyCode / taxonomyGroupstring | nullPrimary specialty, e.g. "Dentist, General Practice" / 1223G0001X
licenseNumber / licenseStatestring | nullLicense of the primary taxonomy
taxonomiesobject[]All taxonomies: code, description, primary, state, license
address / address2 / city / state / postalCode / countrystring | nullPractice location (ZIP+4 as 78746-7759)
phone / faxstring | nullPractice location, formatted 512-327-3631
mailingAddressstring | nullMailing address in one line
practiceLocationsCountintegerAdditional practice locations (details in raw)
urlstringProvider page on npiregistry.cms.hhs.gov
source, scrapedAtstringAttribution and extraction timestamp

With includeContacts: true organizations also carry authorizedOfficialName, authorizedOfficialTitle and authorizedOfficialPhone. With includeRaw: true the original NPPES record is attached as raw.

Use cases

  • Sales teams selling to clinics and practices (dental supplies, medical devices, practice software, billing, staffing) build territory lists by specialty and ZIP prefix with a phone number for every organization.
  • Healthtech and pharma marketing teams pull every pharmacy, urgent-care center or dialysis clinic in a state to size a market or seed a CRM, deduplicated by NPI.
  • Healthcare recruiters and locum agencies map hospitals, group practices and FQHCs in a metro area, with parentOrganization to see which belong to a health system.
  • Payers, credentialing and compliance teams verify NPIs, taxonomy codes, license numbers and status in bulk against the official source.
  • AI agents and RAG pipelines call the Actor as an MCP tool ("list physical-therapy clinics in ZIP 787 with their phone numbers") and get structured results instead of scraping web directories.

Input

FieldTypeDefaultDescription
taxonomiesstring[][] (prefill ["Dentist"])NPPES taxonomy descriptions, e.g. Dentist, Family Medicine, Pharmacy, Clinic/Center; trailing * wildcard (Dent*). Searched one after another.
organizationNamestring–Organization name, trailing * allowed (Mayo*).
citystring– (prefill Austin)Practice-location city.
stateselectany (prefill TX)Two-letter state; must be combined with another filter (NPPES rule).
postalCodesstring[][]ZIP codes (78701) or prefixes of two or more digits (787, 78).
countrystringUSTwo-letter country code of the practice location.
includeIndividualsbooleanfalseAlso return individual practitioners (NPI-1).
enumeratedFromdate–Only NPIs issued on or after this date (new providers).
onlyNewSinceLastRunbooleanfalseFor schedules: skip NPIs delivered by earlier runs (state in the named store hexadata-us-healthcare-providers-npi).
maxResultsinteger100Hard cap on results and cost.
includeContactsbooleanfalseAdd the authorized official of each organization.
includeRawbooleanfalseAttach the original NPPES record.
proxyConfigurationobjectoffNot needed.

At least one of taxonomies, organizationName, city or postalCodes is required. Invalid input (bad state code, wildcard too short, malformed date) stops the run before the first request, so it costs nothing.

How large areas work: NPPES returns at most 1,200 providers per query. When a query hits that cap, the Actor splits it by ZIP-code prefix (00*–99*, then 780*… as needed) and deduplicates by NPI, so taxonomies: ["Dentist"], state: "TX", maxResults: 10000 simply works; in a saved test it returned 1,300 Texas dentists in 84 API requests.

Output example

A real item from the run saved in tests/test1_taxonomy_city (taxonomies: ["Dentist"], city: "Austin", state: "TX", 2026-10-27):

{
"id": "1154494250",
"npi": "1154494250",
"name": "360 DENTAL CARE P.A.",
"enumerationType": "NPI-2",
"isOrganization": true,
"organizationName": "360 DENTAL CARE P.A.",
"firstName": null,
"lastName": null,
"credential": null,
"gender": null,
"soleProprietor": null,
"organizationalSubpart": false,
"parentOrganization": null,
"otherNames": ["MICHAEL B. NUSSBAUM D.D.S."],
"status": "active",
"enumerationDate": "2006-11-16",
"lastUpdated": "2020-08-22",
"taxonomy": "Dentist, General Practice",
"taxonomyCode": "1223G0001X",
"taxonomyGroup": "193400000X - Single Specialty Group",
"licenseNumber": "16292",
"licenseState": "TX",
"taxonomies": [{ "code": "1223G0001X", "description": "Dentist, General Practice", "primary": true, "state": "TX", "license": "16292" }],
"address": "3660 STONERIDGE RD STE B101",
"address2": null,
"city": "Austin",
"state": "TX",
"postalCode": "78746-7759",
"country": "US",
"phone": "512-327-3631",
"fax": "512-327-2234",
"mailingAddress": "3660 STONERIDGE RD STE B101, Austin, TX, 78746-7759, US",
"practiceLocationsCount": 0,
"url": "https://npiregistry.cms.hhs.gov/provider-view/1154494250",
"source": "NPPES NPI Registry, Centers for Medicare & Medicaid Services (CMS)",
"scrapedAt": "2026-10-27T12:51:27.903Z"
}

Pricing & cost examples

$1.50 per 1,000 providers (pay per event, charged only for items saved to the dataset; duplicates and failed runs are never billed). maxResults is a hard cost cap and Apify platform usage is included.

  • A first look: maxResults: 50 ≈ $0.08.
  • All pharmacies in the Austin area (postalCodes: ["787"], about 600) ≈ $0.90.
  • Every dental practice in Texas (about 10,000 organizations) ≈ $15; the whole US for one specialty (100,000+) ≈ $150+.

Use with AI agents (MCP)

Every Apify Actor is available as a tool through the Apify MCP server. Add this server to Claude, Cursor, VS Code or any MCP client (OAuth sign-in on first use, or an Authorization: Bearer <APIFY_TOKEN> header):

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=hexadatalabs/us-healthcare-providers-npi-scraper"
}
}
}

Then ask, for example:

"Give me the physical-therapy clinics in ZIP codes starting with 787 with their phone numbers, newest registrations first."

The agent calls the Actor with {"taxonomies":["Physical Ther*"],"postalCodes":["787"],"maxResults":200} and sorts by enumerationDate. The Actor description and every input field start with "Use this when…" so tool selection works without extra prompting.

Pay with USDC (x402, no account needed)

AI agents can pay for this Actor directly with USDC through Apify's x402 support, with no Apify account: the agent buys a prepaid token from Apify AGI with a Coinbase Agentic Wallet (USDC on Base, minimum $1) and uses that token as a normal API token. This Actor runs with limited permissions, which is what makes it eligible. Current steps are in Apify's x402 guide:

npx -y awal auth login <email> && npx awal auth verify <code> # one-time wallet setup; then fund it with USDC and a little ETH on Base
TOKEN=$(npx awal x402 pay 'https://agi.apify.com/protocols/x402/prepaid-tokens?amount=1&currency=usd' --max-amount 1000000 --json | jq -r .token)
curl -s -X POST "https://api.apify.com/v2/acts/hexadatalabs~us-healthcare-providers-npi-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"taxonomies":["Dentist"],"city":"Austin","state":"TX","maxResults":50}'

Cost: $1 USDC ≈ 666 providers at this Actor's price; the token balance is a hard spending cap, and the token expires 14 days after purchase.

API & integrations

curl -X POST "https://api.apify.com/v2/acts/hexadatalabs~us-healthcare-providers-npi-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"taxonomies":["Dentist"],"city":"Austin","state":"TX","maxResults":50}'
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("hexadatalabs/us-healthcare-providers-npi-scraper").call(run_input={
"taxonomies": ["Pharmacy"], "state": "TX", "postalCodes": ["787"], "includeContacts": True, "maxResults": 1000,
})
for p in client.dataset(run["defaultDatasetId"]).iterate_items():
print(p["npi"], p["name"], p["phone"], p["postalCode"])
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('hexadatalabs/us-healthcare-providers-npi-scraper').call({
taxonomies: ['Clinic/Center'], state: 'FL', enumeratedFrom: '2026-01-01', onlyNewSinceLastRun: true, maxResults: 5000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.enumerationDate} · ${p.name} · ${p.city}`).join('\n'));

Schedules and webhooks: create a weekly Schedule in Apify Console with onlyNewSinceLastRun: true (and optionally enumeratedFrom) to receive only providers you have not seen before, then add a webhook or integration (e-mail, Slack, Google Sheets, Make, Zapier, HTTP) on the ACTOR.RUN.SUCCEEDED event.

  • Source: the official NPPES NPI Registry API v2.1 (npiregistry.cms.hhs.gov/api), which needs no key; the Actor identifies itself with a User-Agent and pauses between requests. NPPES data is public information released by CMS under the Freedom of Information Act; keep the attribution in source. Hexadata is not affiliated with CMS.
  • Organizations by default: NPI-2 records (clinics, hospitals, pharmacies, group practices). Individual practitioners (NPI-1) are named persons and are returned only with includeIndividuals: true; the authorized official of an organization only with includeContacts: true.
  • Taxonomy names must match NPPES wording ("Dentist", "Family Medicine", "Pharmacy", "Clinic/Center", "Physical Therapist"); use a trailing * to widen. Full list at taxonomy.nucc.org.
  • No sorting or total count in NPPES: results come in the API's order, and onlyNewSinceLastRun works by remembering delivered NPIs (up to 50,000 per account store), not by date. Use enumeratedFrom to keep only recently issued NPIs.
  • Address of the practice location is used for city, state and ZIP filters, as in NPPES; mailingAddress is given for reference.
  • If NPPES changes its response format and three consecutive pages lack the mandatory fields, the run fails with SITE_LAYOUT_CHANGED and nothing is charged.

Changelog

  • 0.1.0 (2026-10-27): first release. Taxonomy, name, city, state, ZIP and country filters; automatic ZIP-prefix splitting past the 1,200-result cap; organizations by default; incremental mode; dataset table view; MCP-ready descriptions.

Support

Open an issue in the Issues tab of this Actor (or e-mail Hexadata through the Apify profile). Issues are answered within 24 hours and confirmed bugs are fixed in a beta build within 48 hours.

En español

US Healthcare Providers (NPI Registry) Scraper extrae organizaciones de salud de EE.UU. (clínicas, hospitales, farmacias, consultorios dentales y médicos) del registro oficial NPI (NPPES, de CMS) mediante su API, sin clave. Filtra por especialidad, nombre, ciudad, estado o código postal y devuelve dirección, teléfono, fax, código de taxonomía, licencia y NPI en JSON limpio; cuando un área supera el tope de 1,200 resultados de NPPES, el actor la divide automáticamente por prefijo postal. Precio: $1.50 por cada 1,000 resultados; maxResults limita el costo. Solo organizaciones por defecto; los profesionales individuales solo si se piden.