CMS Open Payments Search
Search the **CMS Open Payments** database for payments made by pharmaceutical and medical device companies to physicians and teaching hospitals across the United States. Access **15 million+ general payment records** and **750,000+ research payment records** per year, covering 2018 through 2024.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| result-returned | Charged per result returned from the search/lookup. | $0.02 |
Example: 100 events = $2.00 · 1,000 events = $20.00
Documentation
Search the CMS Open Payments database for payments made by pharmaceutical and medical device companies to physicians and teaching hospitals across the United States. Access 15 million+ general payment records and 750,000+ research payment records per year, covering 2018 through 2024.
No API key required. Just enter a company name like Pfizer or a physician's last name and get back structured payment data in seconds.
Why Use CMS Open Payments Search?
The CMS Open Payments portal is designed for looking up one physician at a time. Extracting bulk data means navigating a clunky interface, dealing with massive CSV downloads, and parsing 91+ columns of inconsistently formatted fields. This actor handles the API complexity, amount filtering (the CMS API stores dollars as text strings), pagination, and field normalization — giving you clean, sorted JSON with associated drug/device product details.
Features
- Physician name lookup — search by last name, first name, or both for precise results
- NPI search — look up a specific physician by National Provider Identifier (the most precise identifier)
- Company search — find all payments from a specific manufacturer with partial name matching (e.g., "Pfizer" matches "PFIZER INC.")
- State filtering — focus on payments in a specific US state
- Payment type filter — filter by 16 payment categories: consulting fees, food and beverage, travel, royalties, research, speaking fees, and more
- Amount range filtering — set minimum and/or maximum dollar amounts with accurate numeric comparison (not string-based)
- Seven years of data — search payment records from 2018 through 2024
- Dual data types — search general payments, research payments, or both simultaneously
- Product associations — each record includes up to 5 associated drugs, devices, or medical supplies with NDC/PDI codes
- Research payment details — research records include study name, clinical trial ID, and principal investigator information
- Sorted output — results are sorted by payment amount (highest first) for immediate insight into the largest transactions
How to Use
-
Enter search criteria — provide at least one filter: physician name/NPI, company name, state, payment type, or amount range. Broader searches return more results but take longer.
-
Choose the data type — select General Payments (consulting, food, travel, gifts), Research Payments (clinical trials, grants), or Both.
-
Select the program year — choose from 2018–2024. Each year is a separate CMS dataset. Defaults to 2024.
-
Run and download — click "Start" and wait for the run to complete (typically 10–60 seconds). Download the structured JSON dataset.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
physicianName | String | No* | — | Physician last name, exact match, case-insensitive (e.g., "SMITH") |
physicianFirstName | String | No | — | Physician first name, combine with last name for precision |
physicianNpi | String | No* | — | National Provider Identifier (10-digit, most precise lookup) |
companyName | String | No* | — | Paying company name, partial match (e.g., "Pfizer", "Abbott") |
state | String | No | — | Two-letter US state code (e.g., "CA", "NY", "TX") |
paymentNature | Select | No | All | Payment type category (16 options) |
minAmount | Number | No | — | Minimum payment amount in USD |
maxAmount | Number | No | — | Maximum payment amount in USD |
programYear | Select | No | 2024 | Reporting year (2018–2024) |
dataType | Select | No | general | General Payments, Research Payments, or Both |
maxResults | Integer | No | 100 | Maximum records to return (1–10,000) |
*At least one search parameter is recommended for meaningful results.
Input Examples
Find all Pfizer payments to physicians in California:
{
"companyName": "Pfizer",
"state": "CA",
"maxResults": 200
}
Look up a specific physician by NPI:
{
"physicianNpi": "1234567890",
"dataType": "both",
"maxResults": 500
}
High-value consulting fees in New York:
{
"paymentNature": "Consulting Fee",
"state": "NY",
"minAmount": 10000,
"maxResults": 100
}
Research payments from Johnson & Johnson in 2022:
{
"companyName": "Johnson",
"dataType": "research",
"programYear": "2022",
"maxResults": 200
}
All payments above $100,000 in 2024:
{
"minAmount": 100000,
"programYear": "2024",
"maxResults": 500
}
Input Tips
- Use
physicianNpifor the most precise physician lookup — it uniquely identifies a single provider. - Company name search uses SQL LIKE wildcards internally, so "Pfizer" matches "PFIZER INC.", "Pfizer Pharmaceuticals", etc.
- Physician name matching is exact and case-insensitive against the API. Use ALL CAPS to match the CMS data format.
- Amount filters (
minAmount/maxAmount) are applied client-side for numeric accuracy. The CMS API stores dollar amounts as text strings, which causes server-side comparisons to fail (e.g., "$19.79" appears greater than "$10,000" in string comparison). - When searching for both general and research payments, set
dataTypeto "both" — the actor queries both datasets and merges results.
Output
General Payment Record
{
"recordId": "1234567",
"dataType": "General",
"programYear": "2024",
"recipientType": "Covered Recipient Physician",
"physicianName": "SMITH, JOHN A",
"physicianFirstName": "JOHN",
"physicianLastName": "SMITH",
"physicianNpi": "1234567890",
"physicianProfileId": "98765",
"specialty": "Allopathic & Osteopathic Physicians|Internal Medicine|Cardiovascular Disease",
"physicianType": "Medical Doctor",
"teachingHospitalName": "",
"addressLine1": "123 Medical Center Dr",
"city": "New York",
"state": "NY",
"zipCode": "10001",
"country": "United States",
"payerName": "PFIZER INC.",
"submittingCompany": "Pfizer Inc.",
"payerState": "NY",
"payerCountry": "United States",
"totalAmount": 2500.00,
"paymentDate": "2024-03-15",
"numberOfPayments": 1,
"paymentForm": "Cash or cash equivalent",
"paymentNature": "Consulting Fee",
"physicianOwnership": false,
"thirdPartyPayment": "No Third Party Payment",
"thirdPartyEntityName": "",
"charityIndicator": false,
"contextualInfo": "",
"disputeStatus": "No",
"products": [
{
"coveredOrNoncovered": "Covered",
"type": "Drug",
"category": "ELIQUIS",
"name": "ELIQUIS",
"ndcCode": "0003-0893",
"pdiCode": ""
}
],
"changeType": "NEW",
"publicationDate": "2025-01-15"
}
Research Payment Record (additional fields)
Research payment records include all general payment fields plus:
{
"principalInvestigatorName": "SMITH, JOHN A",
"principalInvestigatorNpi": "1234567890",
"studyName": "Phase III Clinical Trial of Novel Cardiac Device",
"clinicalTrialId": "NCT04567890",
"researchContextualInfo": "Multicenter randomized controlled trial"
}
Output Fields
Physician / recipient fields:
| Field | Type | Description |
|---|---|---|
recipientType | String | "Covered Recipient Physician" or "Covered Recipient Teaching Hospital" |
physicianName | String | Full name (LAST, FIRST MIDDLE) |
physicianFirstName | String | First name |
physicianLastName | String | Last name |
physicianNpi | String | National Provider Identifier (10-digit) |
physicianProfileId | String | CMS-assigned physician profile ID |
specialty | String | Physician specialty (pipe-delimited hierarchy) |
physicianType | String | Doctor of Medicine, Doctor of Osteopathy, etc. |
teachingHospitalName | String | Hospital name (when recipient is a teaching hospital) |
Location fields:
| Field | Type | Description |
|---|---|---|
addressLine1 | String | Recipient street address |
city | String | Recipient city |
state | String | Recipient two-letter state code |
zipCode | String | Recipient ZIP code |
country | String | Recipient country |
Payment fields:
| Field | Type | Description |
|---|---|---|
totalAmount | Number | Payment amount in USD |
paymentDate | String | Date of payment (YYYY-MM-DD) |
numberOfPayments | Integer | Number of individual payments in this record |
paymentForm | String | Cash, in-kind, stock, etc. |
paymentNature | String | Purpose category (Consulting Fee, Food and Beverage, etc.) |
physicianOwnership | Boolean | Whether physician has ownership interest in payer |
disputeStatus | String | Whether the record is disputed |
Payer fields:
| Field | Type | Description |
|---|---|---|
payerName | String | Name of the paying company |
submittingCompany | String | Company that submitted the report |
payerState | String | Payer state |
payerCountry | String | Payer country |
Product fields (array, up to 5):
| Field | Type | Description |
|---|---|---|
products[].type | String | Drug, Device, Biological, or Medical Supply |
products[].name | String | Product name (e.g., "ELIQUIS") |
products[].category | String | Product category |
products[].ndcCode | String | National Drug Code (for drugs) |
products[].pdiCode | String | Product Device Identifier (for devices) |
Use Cases
- Healthcare compliance officers tracking physician-industry financial relationships to identify potential conflicts of interest and ensure disclosure compliance
- Investigative journalists following the money trail from pharmaceutical manufacturers to prescribing physicians to expose potential influence on medical practice
- Pharmaceutical competitive intelligence teams analyzing which companies spend the most on physician outreach, which KOLs are engaged by competitors, and what therapeutic areas receive the most investment
- Academic researchers studying the relationship between industry payments and prescribing patterns, geographic distribution of pharma spending, and trends over time
- Medical device sales teams identifying which hospitals and physicians are already receiving payments from competitors in their therapeutic area
- Due diligence and credentialing teams verifying physician financial relationships with industry as part of hiring, credentialing, or compliance reviews
- Policy analysts examining Sunshine Act data to evaluate the effectiveness of transparency regulations on industry-physician relationships
How to Use the API
Python
import requests
import time
run = requests.post(
"https://api.apify.com/v2/acts/ryanclinton~cms-open-payments/runs",
params={"token": "YOUR_APIFY_TOKEN"},
json={
"companyName": "Pfizer",
"state": "CA",
"minAmount": 1000,
"maxResults": 200
},
timeout=30,
).json()
run_id = run["data"]["id"]
while True:
status = requests.get(
f"https://api.apify.com/v2/actor-runs/{run_id}",
params={"token": "YOUR_APIFY_TOKEN"},
timeout=10,
).json()
if status["data"]["status"] in ("SUCCEEDED", "FAILED", "ABORTED"):
break
time.sleep(5)
dataset_id = status["data"]["defaultDatasetId"]
items = requests.get(
f"https://api.apify.com/v2/datasets/{dataset_id}/items",
params={"token": "YOUR_APIFY_TOKEN"},
timeout=30,
).json()
for item in items:
print(f"${item['totalAmount']:,.2f} | {item['physicianName']} | {item['payerName']} | {item['paymentNature']}")
JavaScript
const response = await fetch(
"https://api.apify.com/v2/acts/ryanclinton~cms-open-payments/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
companyName: "Pfizer",
state: "CA",
minAmount: 1000,
maxResults: 200,
}),
}
);
const payments = await response.json();
payments.forEach(p =>
console.log(`$${p.totalAmount} | ${p.physicianName} | ${p.paymentNature}`)
);
cURL
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~cms-open-payments/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"companyName": "Pfizer",
"state": "CA",
"minAmount": 1000,
"maxResults": 200
}'
How It Works
Input (physician, company, state, amount, year, type)
│
▼
┌──────────────────────────────────────────────────┐
│ Step 1: Resolve Dataset IDs │
│ Map programYear + dataType to CMS dataset IDs. │
│ 7 years × 2 types = 14 datasets available. │
│ 2024 General alone has 15M+ records. │
└──────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ Step 2: Build API Query │
│ Construct CMS datastore query with conditions. │
│ Company name uses LIKE with % wildcards. │
│ Physician name uses exact match (=). │
│ NPI, state, payment nature use exact match. │
└──────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ Step 3: Paginated Fetch with Retry │
│ Fetch 500 records per page from CMS API. │
│ 120-second timeout per request. │
│ Retry with exponential backoff (3 attempts). │
│ Continue until maxResults reached. │
└──────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ Step 4: Client-Side Amount Filtering │
│ CMS stores amounts as text strings, so │
│ server-side >= / <= comparisons are broken. │
│ Parse totalAmount as float and filter locally. │
│ Fetch extra pages to compensate for filtering. │
└──────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ Step 5: Transform & Sort │
│ Normalize 91+ raw fields → clean camelCase. │
│ Extract up to 5 associated products per record. │
│ Sort by totalAmount descending. │
│ Add research fields for research payments. │
└──────────────────────────────────────────────────┘
│
▼
Structured payment records pushed to dataset
Data Sources
| Source | API Endpoint | Auth Required |
|---|---|---|
| CMS Open Payments | https://openpaymentsdata.cms.gov/api/1/datastore/query/{dataset-id}/0 | No |
Payment Nature Categories
| Category | Description |
|---|---|
| Consulting Fee | Advisory or consulting services |
| Food and Beverage | Meals at meetings, conferences, etc. |
| Travel and Lodging | Transportation and hotel costs |
| Education | Medical education programs |
| Honoraria | Speaking or presentation fees |
| Gift | Non-cash items of value |
| Entertainment | Event tickets, recreation |
| Research | Research-related funding |
| Royalty or License | IP licensing payments |
| Grant | Research or educational grants |
| Ownership/Investment | Equity or ownership interests |
| CE Speaking (Accredited) | Continuing education speaking (accredited) |
| CE Speaking (Non-Accredited) | Continuing education speaking (non-accredited) |
| Other Services/Speaking | Non-CE speaking and services |
| Charitable Contribution | Donations on behalf of physician |
| Space Rental | Facility fees (teaching hospitals only) |
How Much Does It Cost?
| Scenario | Results | Est. Time | Est. Cost |
|---|---|---|---|
| Single physician NPI lookup | 10–50 | 5 sec | < $0.01 |
| Company + state search (200 results) | 200 | 15 sec | ~$0.01 |
| Broad search with amount filter (1,000 results) | 1,000 | 45 sec | ~$0.03 |
| Both data types, full year (10,000 results) | 10,000 | 3 min | ~$0.10 |
The actor uses 256 MB memory and makes lightweight API calls with no browser rendering. The Apify free tier covers hundreds of runs per month.
Tips
- Use NPI for precision — a physician's NPI uniquely identifies them across all CMS databases. It's the most reliable lookup method.
- Start with small maxResults — test your search with 50–100 results first, then scale up once you've confirmed the filters return what you need.
- Company name is partial match — "Abbott" will match "Abbott Laboratories", "Abbott Medical Devices", etc. Be as specific as needed.
- Check both data types — general and research payments are stored in separate CMS datasets. Set
dataTypeto "both" to get the complete picture. - Use amount filters for high-value analysis — setting
minAmount: 10000quickly surfaces the largest financial relationships. - Cross-reference with products — the
productsarray reveals which specific drugs or devices are associated with each payment, linking financial data to product-level competitive intelligence.
Limitations
- Amount filtering is client-side — the CMS API stores dollar amounts as text strings. Server-side numeric comparisons produce incorrect results (e.g., "$19.79" > "$10,000" in string comparison). This actor filters client-side for accuracy, which means broad searches with amount filters may take longer.
- No server-side sort — sorting 15M+ text-stored amount fields causes the CMS API to hang indefinitely. Results are sorted client-side after fetch.
- Physician name is exact match — the CMS API does not support partial physician name matching. You must provide the exact last name as it appears in the database (typically ALL CAPS).
- 120-second timeout — very broad queries on the 15M+ record general payment dataset may approach the CMS API timeout. Adding state, payment type, or company filters significantly improves response times.
- One year at a time — each program year is a separate CMS dataset. To analyze multi-year trends, run the actor once per year and merge results.
- Up to 5 products per record — the CMS API provides up to 5 associated drug/device products per payment record. Some payments may have additional unlisted products.
- Data publication lag — each year's data is typically published in January of the following year. The 2024 data became available in early 2025.
Responsible Use
- All data is public — CMS Open Payments data is published under the Affordable Care Act's Sunshine Act provisions and is freely available for public use.
- Respect CMS API rate limits — the actor includes built-in retry with exponential backoff. Avoid launching many concurrent runs against the same CMS endpoint.
- Handle physician data responsibly — payment records include physician names, NPIs, specialties, and addresses. Use this data for legitimate compliance, research, and business purposes.
- Payments do not imply wrongdoing — the Sunshine Act requires disclosure of financial relationships but does not prohibit them. Many payments are for legitimate consulting, research, and education.
FAQ
Is an API key required? No. The CMS Open Payments API is free and does not require authentication.
How often is the data updated? CMS publishes each program year's data in January of the following year. The 2024 data was published in early 2025. Once published, the data is static for that year.
Why do some amounts seem wrong when I search the CMS website directly? The CMS API stores dollar amounts as text strings. Their own portal handles this internally, but raw API queries using >= or <= operators do string comparison, not numeric. This actor solves this by filtering amounts client-side after parsing them as numbers.
Can I search for payments to teaching hospitals?
Yes. Teaching hospital payments appear when you search by company name, state, or amount range. Hospital names appear in the teachingHospitalName field.
What is the difference between General and Research payments? General payments cover consulting fees, food, travel, gifts, speaking fees, and other transfers of value. Research payments cover funding for clinical trials, research grants, and study-related payments. Research records include additional fields like study name and clinical trial ID.
Can I search across multiple years at once? Not in a single run. Each program year is a separate CMS dataset. Run the actor once per year and merge the results for multi-year analysis.
Why is the search slow for broad queries? The CMS general payment dataset has over 15 million records per year. Adding filters (company, state, payment type) dramatically reduces the data the API must scan and improves response times.
Integrations
- Apify API — trigger runs programmatically for automated compliance monitoring pipelines
- Zapier — automatically run payment searches when new physician records are added to your compliance database
- Make (Integromat) — build workflows that cross-reference payment data with prescribing patterns
- Google Sheets — export payment data directly for compliance team review and audit trails
- Webhooks — receive payment data as soon as the run completes for real-time compliance alerts
- Scheduled Runs — run annually after each year's data publication to update your payment database
Related Actors
| Actor | What it does | Use with CMS Open Payments |
|---|---|---|
| Clinical Trial Tracker | Search ClinicalTrials.gov | Cross-reference research payments with active clinical trials |
| openFDA Drug Event Monitor | FDA adverse event reports | Analyze safety signals for drugs with high physician payment volumes |
| FDA 510(k) Clearances | Medical device clearances | Match device payments with device clearance data |
| SEC EDGAR Filing Analyzer | SEC filing analysis | Research pharma companies' financial disclosures alongside payment data |
| Congress Stock Tracker | Congressional stock trades | Cross-reference pharma payments with congressional investment activity |
| Senate Lobbying Search | Federal lobbying filings | Compare pharma lobbying spending with physician payment patterns |
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Website Content to Markdown
Convert any website to clean Markdown for RAG pipelines, LLM training, and AI apps. Crawls pages, strips boilerplate, preserves headings, tables, and code blocks. GFM support.
Weather Forecast Search
Get weather forecasts for any location worldwide using the free Open-Meteo API. Returns current conditions, daily and hourly forecasts with temperature, precipitation, wind, UV index, and more. No API key needed.
EUIPO EU Trademark Search
Search EU trademarks via official EUIPO database. Find registered and pending trademarks by name, Nice class, applicant, or status. Returns full trademark details and filing history.
Ready to try CMS Open Payments Search?
Start for free on Apify. No credit card required.
Open on Apify Store