# Medicare Medical Equipment Supplier Scraper (`mrdoe/medicare-dme-supplier-scraper`) Actor

Fetches Medicare DMEPOS supplier records (name, address, specialty, NPI) from the official CMS open data API, optionally enriched with phone and contact details from the NPPES NPI Registry.

- **URL**: https://apify.com/mrdoe/medicare-dme-supplier-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

![Medicare Medical Equipment Supplier Scraper hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/medicare-dme-supplier-scraper--hero.png)

## Medicare Medical Equipment Supplier Scraper

### What does this Actor do?

Medicare Medical Equipment Supplier Scraper fetches publicly available Medicare DMEPOS (Durable Medical Equipment, Prosthetics, Orthotics & Supplies) supplier records directly from CMS's official open data API. Each record includes the supplier's name, National Provider Identifier (NPI), specialty/category, and full address.

Optionally, the Actor can enrich each supplier by looking up its NPI in the public NPPES NPI Registry to add a phone number and, for organizations, an authorized contact name and title.

This Actor uses only official CMS and NPPES government data APIs - no scraping of medicare.gov pages is involved, so results are accurate, structured, and not subject to bot-blocking.

### Why scrape Medicare DME supplier data?

- Build a lead list of DME suppliers by US state or specialty
- Research active Medicare-billing suppliers for market analysis
- Verify a supplier's NPI, address, and specialty against official CMS records
- Cross-reference DME suppliers with other B2B medical equipment datasets
- Identify supplier contact points for outreach or compliance checks

### Features

- Pulls directly from CMS's official DMEPOS-by-supplier open data API
- Filter by US state and/or supplier specialty/category
- Optional NPPES enrichment for phone and authorized contact name/title
- Automatic pagination and deduplication by NPI
- Respects `maxItems`

### Input

![Medicare Medical Equipment Supplier Scraper input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/medicare-dme-supplier-scraper--input.png)

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `state` | string | No | `""` | Two-letter US state abbreviation to filter suppliers (e.g. `CA`) |
| `supplierCategory` | string | No | `""` | Exact CMS specialty/category description to filter by |
| `maxItems` | integer | No | `100` | Maximum supplier records to fetch. Set `0` for unlimited |
| `enrichContacts` | boolean | No | `true` | Look up each supplier's NPI in NPPES to add phone/contact details |
| `proxyConfiguration` | object | No | `{ "useApifyProxy": false }` | Not required - the CMS/NPPES APIs are open government data sources |

### Output

![Medicare Medical Equipment Supplier Scraper dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/medicare-dme-supplier-scraper--output.png)

![Medicare Medical Equipment Supplier Scraper data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/medicare-dme-supplier-scraper--fields.png)

```json
{
    "supplierName": "Reconstructive Hand To Shoulder Of Indiana, Llc",
    "npi": "1003000399",
    "supplierType": "Organization",
    "category": "General Surgery",
    "industry": "General Surgery",
    "contactName": "Michael Pannunzio",
    "contactTitle": "Partner",
    "phone": "317-249-2616",
    "address": "13431 Old Meridian Street, Suite 225",
    "city": "Carmel",
    "state": "IN",
    "zipCode": "46032",
    "country": "US",
    "verifiedSupplier": true,
    "source": "Medicare (CMS DMEPOS Supplier Data)",
    "scrapedAt": "2026-08-19T12:00:00.000Z"
}
```

Fields with no equivalent in Medicare's public data (e.g. `productName`, `employeeCount`, `website`, `email`) are always returned as `null` rather than guessed.

### Output fields

| Field | Description |
| --- | --- |
| `supplierName` | Supplier/company name, or individual practitioner name |
| `npi` | National Provider Identifier |
| `supplierType` | `Organization` or `Individual` |
| `category` / `industry` | CMS supplier specialty/category |
| `contactName`, `contactTitle` | Authorized contact (organizations only, via NPPES) |
| `phone` | Phone number (via NPPES enrichment) |
| `address`, `city`, `state`, `zipCode`, `country` | Registered location |
| `verifiedSupplier` | `true` - the supplier appears in official CMS Medicare billing data |
| `source`, `scrapedAt` | Data provenance and fetch timestamp |

### Use cases

- Generate DME supplier lead lists filtered by state or specialty
- Feed a CRM with verified Medicare supplier contacts
- Research supplier density and coverage by region
- Support compliance/due-diligence checks on DME suppliers
- Combine with other CMS datasets for deeper market analysis

### Pricing

Apify usage is billed according to this Actor's configured pricing plan on the Apify Store.

### FAQ

**Where does this data come from?** CMS's official "Medicare Durable Medical Equipment, Devices & Supplies - by Supplier" open dataset (data.cms.gov), plus the public NPPES NPI Registry for contact enrichment. Both are official U.S. government open data sources.

**Why is `phone` sometimes null?** Phone numbers come from NPPES enrichment, which requires a registered LOCATION address with a phone number on file. Not every NPI record has one.

**Does this include DME product/catalog data?** No. The CMS supplier dataset is aggregated Medicare billing data per supplier, not a product catalog - `productName`, `brand`, and similar product fields are always `null`.

**Why doesn't `state`/`supplierCategory` support partial matches?** The underlying CMS API requires exact-match filter values for these fields.

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the Centers for Medicare & Medicaid Services (CMS) or Medicare.gov. It only accesses official, publicly published open government data. Users are responsible for complying with applicable terms of use, laws, and privacy requirements when using the collected data.

### Preview

![How Medicare Medical Equipment Supplier Scraper works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/medicare-dme-supplier-scraper--how-it-works.png)

# Actor input Schema

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

Two-letter US state abbreviation to filter suppliers (e.g. "CA", "NY"). Leave empty to fetch across all states.

## `supplierCategory` (type: `string`):

Exact CMS specialty/category description to filter by (e.g. "General Surgery", "Ambulance Service Supplier"). Must match the CMS wording exactly. Leave empty for all categories.

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

Maximum number of supplier records to fetch. Set to 0 for unlimited.

## `enrichContacts` (type: `boolean`):

For each supplier, look up its NPI in the public NPPES NPI Registry to add a phone number and (for organizations) an authorized contact name/title. Adds one extra request per supplier.

## `proxyConfiguration` (type: `object`):

The CMS and NPPES APIs are public government data sources and are not blocked, so a proxy is not required. You may still enable Apify Proxy if you prefer.

## Actor input object example

```json
{
  "maxItems": 100,
  "enrichContacts": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "state": "",
    "supplierCategory": "",
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/medicare-dme-supplier-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 = {
    "state": "",
    "supplierCategory": "",
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/medicare-dme-supplier-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 '{
  "state": "",
  "supplierCategory": "",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call mrdoe/medicare-dme-supplier-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/medicare-dme-supplier-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/170uzmGpHwBskK7aR/builds/glBu3KWfP6zytFOwi/openapi.json
