OTHERAI

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.

Try on Apify Store
$0.02per event
0
Users (30d)
0
Runs (30d)
90
Actively maintained
Maintenance Pulse
$0.02
Per event

Maintenance Pulse

90/100
Last Build
Today
Last Version
1d ago
Builds (30d)
8
Issue Response
N/A

Cost Estimate

How many results do you need?

result-returneds
Estimated cost:$2.00

Pricing

Pay Per Event model. You only pay for what you use.

EventDescriptionPrice
result-returnedCharged 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

  1. 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.

  2. Choose the data type — select General Payments (consulting, food, travel, gifts), Research Payments (clinical trials, grants), or Both.

  3. Select the program year — choose from 2018–2024. Each year is a separate CMS dataset. Defaults to 2024.

  4. Run and download — click "Start" and wait for the run to complete (typically 10–60 seconds). Download the structured JSON dataset.

Input Parameters

ParameterTypeRequiredDefaultDescription
physicianNameStringNo*Physician last name, exact match, case-insensitive (e.g., "SMITH")
physicianFirstNameStringNoPhysician first name, combine with last name for precision
physicianNpiStringNo*National Provider Identifier (10-digit, most precise lookup)
companyNameStringNo*Paying company name, partial match (e.g., "Pfizer", "Abbott")
stateStringNoTwo-letter US state code (e.g., "CA", "NY", "TX")
paymentNatureSelectNoAllPayment type category (16 options)
minAmountNumberNoMinimum payment amount in USD
maxAmountNumberNoMaximum payment amount in USD
programYearSelectNo2024Reporting year (2018–2024)
dataTypeSelectNogeneralGeneral Payments, Research Payments, or Both
maxResultsIntegerNo100Maximum 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 physicianNpi for 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 dataType to "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:

FieldTypeDescription
recipientTypeString"Covered Recipient Physician" or "Covered Recipient Teaching Hospital"
physicianNameStringFull name (LAST, FIRST MIDDLE)
physicianFirstNameStringFirst name
physicianLastNameStringLast name
physicianNpiStringNational Provider Identifier (10-digit)
physicianProfileIdStringCMS-assigned physician profile ID
specialtyStringPhysician specialty (pipe-delimited hierarchy)
physicianTypeStringDoctor of Medicine, Doctor of Osteopathy, etc.
teachingHospitalNameStringHospital name (when recipient is a teaching hospital)

Location fields:

FieldTypeDescription
addressLine1StringRecipient street address
cityStringRecipient city
stateStringRecipient two-letter state code
zipCodeStringRecipient ZIP code
countryStringRecipient country

Payment fields:

FieldTypeDescription
totalAmountNumberPayment amount in USD
paymentDateStringDate of payment (YYYY-MM-DD)
numberOfPaymentsIntegerNumber of individual payments in this record
paymentFormStringCash, in-kind, stock, etc.
paymentNatureStringPurpose category (Consulting Fee, Food and Beverage, etc.)
physicianOwnershipBooleanWhether physician has ownership interest in payer
disputeStatusStringWhether the record is disputed

Payer fields:

FieldTypeDescription
payerNameStringName of the paying company
submittingCompanyStringCompany that submitted the report
payerStateStringPayer state
payerCountryStringPayer country

Product fields (array, up to 5):

FieldTypeDescription
products[].typeStringDrug, Device, Biological, or Medical Supply
products[].nameStringProduct name (e.g., "ELIQUIS")
products[].categoryStringProduct category
products[].ndcCodeStringNational Drug Code (for drugs)
products[].pdiCodeStringProduct 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

SourceAPI EndpointAuth Required
CMS Open Paymentshttps://openpaymentsdata.cms.gov/api/1/datastore/query/{dataset-id}/0No

Payment Nature Categories

CategoryDescription
Consulting FeeAdvisory or consulting services
Food and BeverageMeals at meetings, conferences, etc.
Travel and LodgingTransportation and hotel costs
EducationMedical education programs
HonorariaSpeaking or presentation fees
GiftNon-cash items of value
EntertainmentEvent tickets, recreation
ResearchResearch-related funding
Royalty or LicenseIP licensing payments
GrantResearch or educational grants
Ownership/InvestmentEquity or ownership interests
CE Speaking (Accredited)Continuing education speaking (accredited)
CE Speaking (Non-Accredited)Continuing education speaking (non-accredited)
Other Services/SpeakingNon-CE speaking and services
Charitable ContributionDonations on behalf of physician
Space RentalFacility fees (teaching hospitals only)

How Much Does It Cost?

ScenarioResultsEst. TimeEst. Cost
Single physician NPI lookup10–505 sec< $0.01
Company + state search (200 results)20015 sec~$0.01
Broad search with amount filter (1,000 results)1,00045 sec~$0.03
Both data types, full year (10,000 results)10,0003 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 dataType to "both" to get the complete picture.
  • Use amount filters for high-value analysis — setting minAmount: 10000 quickly surfaces the largest financial relationships.
  • Cross-reference with products — the products array 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

ActorWhat it doesUse with CMS Open Payments
Clinical Trial TrackerSearch ClinicalTrials.govCross-reference research payments with active clinical trials
openFDA Drug Event MonitorFDA adverse event reportsAnalyze safety signals for drugs with high physician payment volumes
FDA 510(k) ClearancesMedical device clearancesMatch device payments with device clearance data
SEC EDGAR Filing AnalyzerSEC filing analysisResearch pharma companies' financial disclosures alongside payment data
Congress Stock TrackerCongressional stock tradesCross-reference pharma payments with congressional investment activity
Senate Lobbying SearchFederal lobbying filingsCompare pharma lobbying spending with physician payment patterns

How it works

01

Configure

Set your parameters in the Apify Console or pass them via API.

02

Run

Click Start, trigger via API, webhook, or set up a schedule.

03

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.

Ready to try CMS Open Payments Search?

Start for free on Apify. No credit card required.

Open on Apify Store