Healthcare Provider Intel: NPI, Pharma Payments, Rx avatar

Healthcare Provider Intel: NPI, Pharma Payments, Rx

Pricing

Pay per usage

Go to Apify Store
Healthcare Provider Intel: NPI, Pharma Payments, Rx

Healthcare Provider Intel: NPI, Pharma Payments, Rx

One row per US provider joined across three federal sources: NPPES identity, licence, address and phone, plus CMS Open Payments industry money received and Medicare Part D prescribing volume. 8M+ NPIs. No API key, no proxy.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

🩺 Healthcare Provider Intel: NPI, Pharma Payments, Rx

⚡ Three public federal APIs joined into one row. No API key, no proxy, no browser, no login.

💸 You are charged only for a provider row that lands in your dataset. The run summary is free.

Overview

There are dozens of NPI scrapers on this Store. All of them return the same thing: a copy of the NPPES registry. Name, address, taxonomy, done. That tells you a dermatologist exists in Palo Alto. It does not tell you whether Regeneron paid her $8,414 last year, or whether she writes 147 Medicare prescriptions.

This actor answers those questions in the same row, because it joins three separate federal datasets that the government publishes independently and nobody publishes together:

  1. NPPES NPI Registry for identity, specialty, state licence number, practice address and phone.
  2. CMS Open Payments for every dollar of pharma and medical device money the provider received, who paid it, and what it was for.
  3. CMS Medicare Part D Prescriber for prescribing volume, drug cost, beneficiary count and cost per claim.

The result is one row that a commercial team can actually act on: who the provider is, how to reach them, which manufacturers already have a relationship with them, and how much they prescribe.

✅ 8M+ NPIs · ✅ Industry payments by payer · ✅ Medicare prescribing volume · ✅ State licence and direct phone · ✅ MCP ready for AI agents

What makes a row

{
"npi": "1780675181",
"provider_name": "SUMAIRA ZAREEN AASI",
"credential": "MD",
"primary_specialty": "Dermatology, MOHS-Micrographic Surgery",
"license_number": "C54709",
"license_state": "CA",
"practice_address": "300 PASTEUR DR",
"practice_city": "STANFORD",
"practice_state": "CA",
"practice_postal_code": "94305",
"phone": "650-723-4000",
"payment_year": "2024",
"payment_count": 10,
"payments_total_usd": 9173.64,
"top_payer": "Regeneron Pharmaceuticals, Inc.",
"top_payer_usd": 8414.83,
"payers_count": 2,
"top_payers": ["Regeneron Pharmaceuticals, Inc.: $8414.83", "MIMEDX Group, Inc.: $758.81"],
"top_payment_natures": ["Consulting Fee", "Travel and Lodging", "Food and Beverage"],
"medicare_claims": 147,
"medicare_drug_cost_usd": 2707.55,
"medicare_beneficiaries": 117,
"medicare_cost_per_claim_usd": 18.42,
"medicare_provider_type": "Dermatology",
"has_industry_payments": true,
"is_medicare_prescriber": true,
"commercial_priority": "high",
"sources": ["NPPES", "CMS Open Payments", "CMS Part D Prescriber"]
}

commercial_priority is deliberately simple and explainable rather than a black box score. A provider who both takes industry money and writes Medicare volume is high. One or the other is medium. Neither is low. You can rebuild it from the raw fields yourself if you disagree with the rule.

Input

{
"specialties": ["Dermatology"],
"states": ["CA"],
"providerType": "individual",
"includePayments": true,
"paymentYear": 2024,
"includePrescribing": true,
"industryPaidOnly": false,
"maxProviders": 200
}
FieldWhat it takes
specialtiesNPPES taxonomy descriptions. Matching is partial, so Cardiology also returns Cardiovascular Disease.
statesTwo letter state codes. Needs a specialty, name, city or postal code alongside it, because NPPES rejects a bare state.
citiesPractice cities. Crossed with the specialty list to form the search plan.
postalCodesFive digit ZIPs for tight territory targeting.
npisTen digit NPIs to enrich directly. Use this to bulk enrich a list you already have.
lastNameProvider last name. Trailing asterisk works as a wildcard.
organizationNameOrganisation name. Add a trailing asterisk for prefix matching.
providerTypeindividual, organization or both.
includePaymentsJoin Open Payments. One extra request per provider.
paymentYearOpen Payments programme year.
includePrescribingJoin Part D Prescriber. One extra request per provider.
industryPaidOnlyKeep only providers who received at least one industry payment.
maxProvidersHard cap for the run, and your main cost control.

Two upstream traps this actor handles for you

NPPES silently repeats its last page. The API clamps limit to 200 and skip to 1000. Asking for skip=2000 does not error and does not return an empty page. It returns the skip=1000 page again, byte for byte, forever. A pager that waits for the API to run out will loop and re-deliver the same 200 providers indefinitely, and you would pay for every duplicate. This actor knows the ceiling is 1200 per query, stops there, and gets past it by crossing your specialty list with your geography list into many independent queries instead of one long one.

The Open Payments dataset id changes every year. Actors that hardcode the UUID quietly return zero payments for every provider the January after CMS publishes a new programme year. This one resolves the id from the live CMS metastore at the start of each run, and if the year you asked for is not published yet it falls back to the newest available year and tells you which one it used in the summary row.

Common use cases

Pharma and medical device targeting. Find every dermatologist in a territory, see which manufacturers already pay them, and prioritise the ones with prescribing volume but no existing relationship with your competitor.

Key opinion leader identification. Rank a specialty by total consulting and speaking fees received to find who the industry already treats as an authority.

Healthcare recruiting. Specialty plus state plus licence number plus direct practice phone, in one export.

Medical practice sales. Target group practices and clinics as organisations, with authorised official name, title and phone.

Compliance and transparency research. Reconstruct the industry payment picture for a specialty or a region without downloading a 15 million row bulk file.

Journalism and academic research. All three sources are official government releases, so every figure is citable back to the agency that published it.

AI agents. Point an agent at it through MCP and ask which cardiologists in Ohio received more than $10,000 from a named manufacturer last year.

Cost control built in

  1. Run level spend cap. Enrichment costs two extra requests per provider, so a per provider budget bounds nothing while the provider count grows. The ceiling applies to the whole run.
  2. Zero yield abort. Two consecutive pages that add no new provider and the query is dropped. One productive page resets it, so a healthy run never trips it.
  3. No transport escalation. A source that does not answer degrades that one group of fields and is reported in sources. There is no retry through a paid proxy or a browser.

Pricing

EventPriceYou pay when
Provider enriched$0.003An enriched provider row lands in your dataset

$3.00 per 1,000 providers, whether the row carries one source or all three. Empty runs cost nothing.

Run it on a schedule

  1. Run once with the specialty and territory you want, then click Save as a task.
  2. In the Apify Console go to Schedules → Create new.
  3. Pick a frequency and attach the saved task.
  4. Wire the dataset to Sheets, Salesforce, HubSpot or a webhook from the Integrations tab.

Deduplicate on npi. NPPES updates continuously, Open Payments publishes annually, and Part D publishes annually, so a monthly refresh is usually enough.

FAQ

Is this data public? Yes. NPPES, Open Payments and Part D Prescriber are all official public releases from CMS, published for reuse. No login, no key, nothing scraped from behind a paywall.

Why do some providers have no payments or no prescribing? Because they genuinely have none in that year. Open Payments only covers physicians, dentists, podiatrists, optometrists, chiropractors and, since 2021, several non physician practitioner types. Part D only covers Medicare Part D prescribing. A zero is reported as zero, not left blank, so you can tell "checked and none" apart from "not checked".

What does payments_truncated mean? A small number of providers have more industry payment records than the API returns in one call, which is capped at 500. When that happens the row carries the true payment_count from the API alongside payments_summed, and flags the total as partial. Publishing a quietly incomplete sum would be worse than saying so.

Can I enrich a list of NPIs I already have? Yes. Put them in npis and the search is skipped entirely.

Why does a state on its own return nothing? Because NPPES refuses it: "Field state requires additional search criteria". Add a specialty, a city, a postal code or a name.

Which Part D year is used? The most recent one CMS publishes on its "by Provider" endpoint. CMS keeps that endpoint pointed at the latest year.

Use from Claude, ChatGPT and any MCP agent

https://mcp.apify.com/?tools=themineworks/healthcare-provider-intelligence

Or call it programmatically:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/healthcare-provider-intelligence').call({
specialties: ['Cardiovascular Disease'],
states: ['OH'],
includePayments: true,
paymentYear: 2024,
industryPaidOnly: true,
maxProviders: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Questions, or need a federal source we do not join yet? Reach out through the Apify profile.