US Healthcare Providers (NPI Registry) Scraper
Pricing
$1.50 / 1,000 provider (result)s
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
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:
| Field | Type | Description |
|---|---|---|
id / npi | string | NPI number (10 digits), unique |
name | string | Organization name, or "First Last, Credential" for individuals |
enumerationType / isOrganization | string, boolean | NPI-2 organization or NPI-1 individual |
organizationName | string | null | |
firstName / lastName / credential / gender / soleProprietor | mixed | Individuals only (with includeIndividuals) |
organizationalSubpart / parentOrganization | boolean | null, string | null | Subpart of a larger organization |
otherNames | string[] | Doing-business-as and former names |
status | string | active or deactivated |
enumerationDate / lastUpdated | string | null | NPI issue date and last record update (YYYY-MM-DD) |
taxonomy / taxonomyCode / taxonomyGroup | string | null | Primary specialty, e.g. "Dentist, General Practice" / 1223G0001X |
licenseNumber / licenseState | string | null | License of the primary taxonomy |
taxonomies | object[] | All taxonomies: code, description, primary, state, license |
address / address2 / city / state / postalCode / country | string | null | Practice location (ZIP+4 as 78746-7759) |
phone / fax | string | null | Practice location, formatted 512-327-3631 |
mailingAddress | string | null | Mailing address in one line |
practiceLocationsCount | integer | Additional practice locations (details in raw) |
url | string | Provider page on npiregistry.cms.hhs.gov |
source, scrapedAt | string | Attribution 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
parentOrganizationto see which belong to a health system. - Payers, credentialing and compliance teams verify NPIs, taxonomy codes, license numbers and
statusin 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
| Field | Type | Default | Description |
|---|---|---|---|
taxonomies | string[] | [] (prefill ["Dentist"]) | NPPES taxonomy descriptions, e.g. Dentist, Family Medicine, Pharmacy, Clinic/Center; trailing * wildcard (Dent*). Searched one after another. |
organizationName | string | – | Organization name, trailing * allowed (Mayo*). |
city | string | – (prefill Austin) | Practice-location city. |
state | select | any (prefill TX) | Two-letter state; must be combined with another filter (NPPES rule). |
postalCodes | string[] | [] | ZIP codes (78701) or prefixes of two or more digits (787, 78). |
country | string | US | Two-letter country code of the practice location. |
includeIndividuals | boolean | false | Also return individual practitioners (NPI-1). |
enumeratedFrom | date | – | Only NPIs issued on or after this date (new providers). |
onlyNewSinceLastRun | boolean | false | For schedules: skip NPIs delivered by earlier runs (state in the named store hexadata-us-healthcare-providers-npi). |
maxResults | integer | 100 | Hard cap on results and cost. |
includeContacts | boolean | false | Add the authorized official of each organization. |
includeRaw | boolean | false | Attach the original NPPES record. |
proxyConfiguration | object | off | Not 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 BaseTOKEN=$(npx awal x402 pay 'https://agi.apify.com/protocols/x402/prepaid-tokens?amount=1¤cy=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 ApifyClientclient = 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.
Limitations & legal
- 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 insource. 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 withincludeContacts: 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
onlyNewSinceLastRunworks by remembering delivered NPIs (up to 50,000 per account store), not by date. UseenumeratedFromto keep only recently issued NPIs. - Address of the practice location is used for
city,stateand ZIP filters, as in NPPES;mailingAddressis given for reference. - If NPPES changes its response format and three consecutive pages lack the mandatory fields, the run fails with
SITE_LAYOUT_CHANGEDand 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.