# Medicare Part D Prescriber Scraper (CMS) (`foo121/cms-prescriber-scraper`) Actor

Export Medicare Part D prescribers by state, specialty and drug from CMS open data: NPI, prescriber, specialty, brand/generic drug, total claims and drug cost. Pharma & med-device market intel, pay per result.

- **URL**: https://apify.com/foo121/cms-prescriber-scraper.md
- **Developed by:** [ziv shay](https://apify.com/foo121) (community)
- **Categories:** Business, Lead generation
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Medicare Part D Prescriber Scraper (CMS)

**Medicare Part D prescriber data** scraper — pull official **CMS prescriber drug data** by state, specialty, and drug, with claim counts and total drug cost per prescriber.

Built for **pharma sales & market access teams, med-device companies, and healthcare market intelligence analysts** who need to know who is prescribing what, where, and how much. This **CMS prescriber scraper** reads the **official CMS open data** release — Medicare Part D Prescribers by Provider and Drug — so every row is sourced from a public, authoritative federal dataset.

No API key required. Filter by state and (optionally) provider type, prescriber name, organization, or a specific drug, and get back prescriber-level **prescriber drug data**: NPI, name, specialty, location, brand and generic drug names, total claims, and total drug cost. Pairs naturally with our **US Healthcare Provider (NPI) Scraper** — match on `npi` to enrich prescribers with full registry contact details.

### What you get

| Field | Description |
|---|---|
| `npi` | Prescriber's 10-digit National Provider Identifier |
| `prescriberName` | Prescriber's name (last, first) |
| `specialty` | Prescriber specialty / provider type as classified by CMS |
| `city` | Prescriber city |
| `state` | Prescriber state |
| `brandName` | Brand name of the prescribed drug |
| `genericName` | Generic (non-proprietary) name of the drug |
| `totalClaims` | Total Part D claims for that prescriber/drug |
| `totalDrugCost` | Total drug cost in USD for that prescriber/drug |
| `year` | Data year of the CMS Part D release |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `state` | string | — | Two-letter state code (e.g. `"CA"`). Strongly recommended to keep runs fast and relevant |
| `providerType` | string | — | Optional specialty filter (e.g. `"Endocrinology"`) |
| `lastName` | string | — | Optional prescriber last name filter |
| `organizationName` | string | — | Optional org name filter (used only if `lastName` is empty) |
| `drugName` | string | — | Optional drug filter (brand tried first, e.g. `"Ozempic"`, then generic) |
| `maxItems` | integer | `500` | Max prescriber/drug rows to return |

#### Example input

```json
{
  "state": "CA",
  "providerType": "Endocrinology",
  "drugName": "Ozempic",
  "maxItems": 500
}
```

### Example run output

```json
{
  "npi": "1356789012",
  "prescriberName": "Patel, Anita",
  "specialty": "Endocrinology",
  "city": "San Diego",
  "state": "CA",
  "brandName": "Ozempic",
  "genericName": "Semaglutide",
  "totalClaims": 412,
  "totalDrugCost": 387450.18,
  "year": 2023
}
```

### Use cases

- **Pharma sales & market access teams** identifying and ranking high-volume prescribers for a target drug in a territory.
- **Med-device companies** mapping specialty prescribing patterns to find clinical decision-makers.
- **Healthcare market intelligence analysts** sizing drug uptake and competitive share by state and specialty.
- **Commercial ops teams** enriching prescriber lists (join on `npi` with the NPI scraper) for territory planning.

### vs IQVIA and enterprise prescriber-data vendors

IQVIA and similar prescriber-intelligence vendors sell this kind of intel through enterprise contracts at enterprise prices. This **Medicare Part D prescriber scraper** pulls the **official CMS Part D public dataset** instead — pay per result, no contract, no minimum.

Honest caveat: the CMS data is the **public Medicare Part D claims summary**, not IQVIA's proprietary projected, audited, all-payer panel. It covers Medicare Part D only and is released on CMS's annual schedule. If you need all-payer projected volumes, that's a different (paid) product. If you need authoritative Medicare prescribing fact, this is it.

### Pricing

Pay per result — billed only for the prescriber/drug rows returned, no subscription.

### Keywords

Medicare Part D prescriber data, CMS prescriber scraper, prescriber drug data, CMS open data prescribers, prescriber by drug, Ozempic prescribers, prescriber volume data, pharma market access data, prescriber NPI claims, Medicare prescribing data

# Actor input Schema

## `state` (type: `string`):

Two-letter US state code to filter prescribers by (e.g. CA, NY, TX). Strongly recommended — CMS Part D is national.

## `providerType` (type: `string`):

Prescriber specialty exactly as CMS labels it (e.g. Endocrinology, Family Practice, Internal Medicine, Cardiology). Optional.

## `lastName` (type: `string`):

Filter by an individual prescriber's last name (exact match). Optional.

## `organizationName` (type: `string`):

Filter by organization prescriber name (exact match). Optional. Used only if Last name is empty.

## `drugName` (type: `string`):

Filter by a drug, brand (e.g. Ozempic) or generic (e.g. Semaglutide). Brand is tried first, then generic. Optional.

## `maxItems` (type: `integer`):

Maximum number of prescriber-drug rows to output.

## Actor input object example

```json
{
  "state": "CA",
  "providerType": "Endocrinology",
  "drugName": "Ozempic",
  "maxItems": 500
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("foo121/cms-prescriber-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("foo121/cms-prescriber-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call foo121/cms-prescriber-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,foo121/cms-prescriber-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vxAeN9tKiKidGC8Fr/builds/PzRY8LdTkJD6KUY4X/openapi.json
