# Doctor Payments Scraper (CMS Open Payments) (`scrapemint/doctor-payments-scraper`) Actor

Who pays your doctor: US pharma and medical-device payments to physicians from the federal Open Payments database, by doctor name, paying company, specialty or state, with a per-doctor totals view. Consulting fees, speaking, meals, travel, royalties. No API key.

- **URL**: https://apify.com/scrapemint/doctor-payments-scraper.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$4.00 / 1,000 payment rows

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Doctor Payments Scraper (CMS Open Payments)

Who pays your doctor. Every payment US drug and medical-device companies make to physicians is reported to the federal government's Open Payments program - consulting fees, speaking gigs, meals, travel, royalties - with the doctor's name, the paying company, and the amount. This actor turns that public database into structured data by doctor, company, specialty or state. No API key, no login, no browser.

### Two modes

**Individual payments** - one row per payment:

- doctor name, type, specialty, NPI, city, state
- paying company, product name, amount, date
- nature of payment (consulting, food & beverage, travel, royalty...) and form of payment

**Doctor totals** - one aggregated row per physician: total received, number of payments, how many companies paid, the **top companies by dollars**, and a **breakdown by payment type**. This is the "how much has this doctor taken, and from whom" view.

```json
{
    "mode": "doctor_totals",
    "doctorLastName": "smith",
    "state": "CA",
    "year": 2024
}
```

### Ways to search

- **doctorLastName / doctorFirstName** - a specific physician (add state to disambiguate common names)
- **companyName** - all payments a manufacturer or GPO made (partial match)
- **state** and **year** - narrow the search

At least a doctor last name or a company is required - the database holds tens of millions of payments per year, so it is filter-first by design.

### Who uses this

- **Journalists and watchdogs**: the Dollars-for-Docs beat - which doctors take the most, and from which drugmakers.
- **Pharma competitive intelligence**: see rivals' payment footprint by specialty and geography.
- **Hospital and health-system compliance**: audit your own physicians' industry financial ties.
- **Health-policy researchers and academics**: conflict-of-interest analysis with structured data.

Pairs with our Lobbying Disclosure Scraper (corporate money into government) for the full influence-money picture, and with our Healthcare Provider Leads directory.

### Pricing

A small fee per payment row, or per doctor summary in totals mode. Searches that match nothing are free note rows, and the first 2 rows of every run are free.

### Notes

- Source: CMS Open Payments, the official US government database, published yearly. Program years 2019 through the latest published year are available; the actor resolves the year automatically.
- A payment on record is a disclosed financial relationship, not evidence of wrongdoing.
- In doctor-totals mode, a physician with an unusually large payment history is summarized from their most recent payments; add first name and state for an exact lifetime figure.

# Actor input Schema

## `mode` (type: `string`):

Payments returns one row per payment. Doctor totals aggregates a physician's payments into a single summary row (total received, top companies, by payment type) - the flagship view.

## `doctorLastName` (type: `string`):

Physician last name (exact, case-insensitive). Combine with first name and state to pin down a specific doctor.

## `doctorFirstName` (type: `string`):

Physician first name (exact, case-insensitive). Optional.

## `companyName` (type: `string`):

Manufacturer or GPO making the payment ("pfizer", "medtronic"). Partial match. Use this to pull all payments a company made.

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

Two-letter state of the physician ("CA", "TX"). Optional filter.

## `year` (type: `string`):

Which year's payments to search. Data is available for 2019 through the latest published year.

## `maxRows` (type: `integer`):

In Payments mode, the max payment rows. In Doctor totals mode, the max doctors summarized.

## Actor input object example

```json
{
  "mode": "payments",
  "year": "2024",
  "maxRows": 50
}
```

# 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 = {
    "year": "2024",
    "maxRows": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/doctor-payments-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 = {
    "year": "2024",
    "maxRows": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/doctor-payments-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 '{
  "year": "2024",
  "maxRows": 50
}' |
apify call scrapemint/doctor-payments-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapemint/doctor-payments-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/zAhetMAzKyO9MDmM8/builds/6Yp8AkfeVcb8Jp6S9/openapi.json
