# WebMD Scraper - Doctors, Reviews & Provider Leads (`scrapesage/webmd-scraper`) Actor

Scrape WebMD doctors & healthcare providers by specialty and location. Get NPI, specialties, ratings, patient reviews, board certifications, accepted insurance, all practice locations, phones, fax & leads - plus optional practice-email enrichment and monitoring. No login, no key, no browser.

- **URL**: https://apify.com/scrapesage/webmd-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Other, Agents
- **Features:** Limited permissions
- **Stats:** 18 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.61 / 1,000 provider scrapeds

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?

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

## WebMD Scraper - Doctors, Reviews & Provider Leads (NPI, Insurance, Phones & Emails)

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by WebMD LLC or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "WebMD" is referenced only to describe the publicly available website this Actor collects data from.

Extract **complete doctor & healthcare-provider data from the [WebMD](https://doctor.webmd.com) physician directory** - search by **specialty and location** (or paste profile URLs) and get **86 fields per provider**: NPI, specialty and sub-specialties, star rating and review counts, WebMD's own AI review summary and monthly star trends, biography, board certifications, state licenses, languages, conditions treated and procedures performed (with patient counts), accepted insurance, FAQs, telehealth and online-booking status, every practice location with **phone and geo**, hospital affiliations and patients'-perspective scores. Optionally turn each provider into a **ready-to-contact lead** by crawling their practice website for **emails, phone numbers and social links**.

No login, no API key, no browser - fast JSON extraction straight from WebMD's own page data, reliable through the default Apify proxy.

### Why this WebMD scraper?

This actor reads WebMD's full embedded provider state and ships **every field it publishes**, then adds the lead-gen layer.

| Data | This actor |
| --- | --- |
| NPI number | ✅ 100% |
| Specialty + practicing name, slug, sub-specialties | ✅ 100% |
| Star rating + rating count + **written**-review count | ✅ 100% |
| Full patient reviews (text, rating, date, reply) | ✅ opt-in - see the review note below |
| **WebMD's AI review summary + monthly star trends** | ✅ providers with written reviews |
| Patients'-perspective scores (correctly labelled) | ✅ providers with rated reviews |
| Biography | ✅ ~100% |
| Board certifications + state licenses | licenses ✅ ~90% · certifications where WebMD holds them |
| Conditions treated + procedures **with patient counts** | ✅ 100% |
| Accepted insurance (named plans) + Medicare/Medicaid | ✅ where the practice supplied plans |
| Every practice location (address, **phone**, hours, geo) | ✅ 100% |
| Hospital affiliations | ✅ where declared |
| Telehealth, online booking & FAQs | ✅ |
| Practice **website + contact emails** (lead wedge) | ✅ opt-in - website is published for claimed/sponsored listings only |
| Lead score (0–100) | ✅ |
| Monitor mode - only new providers | ✅ |

#### What WebMD does *not* publish (so you know before you buy)

We would rather tell you up front than ship you blank columns:

- **Fax** - WebMD exposes a fax key on every location and it is `null` for essentially every provider. We emit `null` rather than invent one.
- **Phone** - 100% on physician searches (25/25 cardiology, 30/30 family medicine), but WebMD suppresses the phone on some unclaimed listings: a Houston dentistry search returned 45%. Verified at source - the phone fields are empty and no number is rendered on the page at all. Telehealth-only providers have no phone or street address by design. Full postal address and geo are always emitted.
- **Practice website** - published only for **claimed, Enhanced or sponsored listings** (~a quarter of a typical result set). This is also the gate on email enrichment: providers with no website are skipped and **never billed**.
- **Written reviews** - most WebMD ratings are **star-only**. A provider showing 89 ratings can have 0 with text. Every record tells you exactly where it stands: `reviewCount` (all ratings), `textReviewCount` (how many have text), `reviewsRetrieved` (how many you got). WebMD's page data embeds **at most 10 written reviews per provider**, so `maxReviewsPerProvider` above 10 has no effect - but `reviewSummary`, `reviewTrends` and `patientExperience` are computed by WebMD across **all** reviews and cost nothing extra.
- **Sub-specialty expertise, intro video, booking link, telehealth flags** - self-declared, so present on Enhanced/sponsored profiles and absent on Basic ones.

Full, field-by-field reasoning lives in `coverage-exceptions.json` in the source.

### Use cases

- **Healthcare lead generation** - medical practices buy EHR/RCM software, medical supplies, marketing, staffing, insurance and equipment. Score providers by reputation and contactability (`leadScore`), reach them directly (`phoneFormatted`, `contactEmails`), and sort by `isSponsored` to find the practices already spending on marketing.
- **Provider network & directory building** - power referral apps, "find a doctor" tools and insurance directories with structured, NPI-keyed provider data for any specialty and city.
- **Market & competitive intelligence** - map provider density, ratings, accepted insurance and accepting-new-patients status by specialty and metro.
- **Reputation & review monitoring** - track ratings and patient reviews for a specialty or a specific provider over time.
- **Recruiting** - find physicians by specialty, sub-specialty, location, languages and credentials.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) - the free plan is enough to try this actor.
2. Open the **WebMD Scraper**, enter **specialties** and **locations** (or paste WebMD URLs), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS - or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "specialties": ["cardiology", "Dentist"],
    "locations": ["texas/austin", "Miami, FL"],
    "maxResults": 200,
    "acceptingNewPatientsOnly": true,
    "includeProviderDetails": true,
    "includeReviews": true,
    "enrichPracticeEmails": true,
    "monitorMode": false
}
```

- **specialties** - friendly names (`Cardiology`, `Dentist`, `OB-GYN`, `Psychiatry`) or WebMD slugs (`cardiology`, `family-medicine`, `dermatology`, `pediatrics`, `psychology`, `orthopaedic-surgery`, …). Combined with every location.
- **locations** - `state/city` (`texas/austin`), a plain `City, ST` (`Austin, TX`), or a whole state (`texas`). City-level searches return the most providers.
- **startUrls** - direct WebMD doctor profiles (`/doctor/…-overview`) or browse pages (`/providers/specialty/…`).
- **acceptingNewPatientsOnly / minRating / gender** - filters.
- **includeProviderDetails** *(default true)* - fetch each profile for the full record (bio, certifications, licenses, languages, conditions, procedures, insurance, all locations, hospital affiliations, FAQs, review summary & trends). One extra page per provider.
- **includeReviews** *(default false)* - collect written patient reviews. See the review note above: most WebMD ratings are star-only and at most 10 written reviews are available per provider.
- **reviewOutput** *(default `nested`)* - `nested` keeps one row per provider with a `reviews` array (best for CSV/Excel - every row has the same columns). `separate` emits each review as its own record, which mixes two record types in one export.
- **enrichPracticeEmails** *(default false)* - crawl the provider's own practice website (home + contact/about, up to 4 pages) for emails, phones and socials. WebMD never exposes emails - this is the only way to get them. Runs only for providers whose listing exposes a website; the rest are skipped and not billed.
- **monitorMode** *(default false)* - remember providers from previous runs and emit only **new** ones next time. Perfect with [Schedules](https://docs.apify.com/platform/schedules).

Calling from the API or an AI agent with **no input at all** is safe: the actor runs the documented example search (cardiology in Austin, TX) and tells you so in the run's status message, instead of failing.

### Output

One record per provider (`type: "provider"`), 86 fields, every row with the same columns. Reviews nest inside the provider by default; set `reviewOutput: "separate"` for standalone `type: "review"` rows.

```json
{
    "type": "provider",
    "npi": "1285849406",
    "fullName": "Fotini Chalkias",
    "formattedName": "Dr. Fotini Chalkias, MD",
    "gender": "female",
    "degree": "MD",
    "specialty": "Cardiovascular Disease",
    "specialtiesDetailed": [{ "name": "Cardiology", "practicingName": "Cardiologist", "slug": "cardiology", "isPrimary": true }],
    "yearsOfExperience": 29,
    "bio": "Dr. Fotini Chalkias is a cardiologist practising in Austin, TX…",
    "rating": 5,
    "reviewCount": 254,
    "textReviewCount": 217,
    "reviewsRetrieved": 10,
    "reviewSummary": "Patients consistently praise Dr. Chalkias for her exceptional listening skills, thorough explanations of test results, and caring bedside manner. The main criticism noted is that some patients feel she is occasionally rushed…",
    "reviewTrends": [{ "period": "May 2025", "oneStar": 0, "twoStar": 0, "threeStar": 0, "fourStar": 0, "fiveStar": 8 }],
    "patientExperience": [{ "aspect": "Staff was courteous", "didWell": 231, "needsImprovement": 0 }],
    "reviews": [{ "reviewId": "44179965", "rating": 5, "text": "She is clear and concise about why she is prescribing tests…", "author": "Patient", "datePublished": "2026-04-02", "providerReply": null, "helpfulCount": 0 }],
    "acceptsNewPatients": true,
    "supportsTelehealth": true,
    "telehealthStates": ["TX"],
    "onlineBookingEnabled": false,
    "boardCertifications": [{ "board": "Cardiovascular Disease", "issuer": "American Board of Internal Medicine", "year": null }],
    "stateLicenses": [{ "type": "Medical Doctor", "state": "Texas", "status": "Active", "expiryYear": 2028 }],
    "languages": ["Greek", "English"],
    "conditionsTreatedDetailed": [{ "name": "Heart Failure", "patientCount": 44 }, { "name": "Atrial Fibrillation", "patientCount": 35 }],
    "proceduresPerformedDetailed": [{ "name": "Echocardiogram", "patientCount": 61 }],
    "faqs": [{ "question": "What conditions does Dr. Chalkias treat?", "answer": "Most often Heart Failure, Atrial Fibrillation and Coronary Artery Disease." }],
    "insuranceCount": 29,
    "insuranceAccepted": ["Aetna", "Cigna", "Humana", "UnitedHealthcare"],
    "acceptsMedicare": true,
    "acceptsMedicaid": true,
    "practiceName": "Baylor Scott & White Clinic - Austin North Burnet",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78758",
    "phone": "5126544050",
    "phoneFormatted": "(512) 654-4050",
    "fax": null,
    "officeCount": 1,
    "offices": [{ "locationId": "5607244", "name": "Baylor Scott & White Clinic - Austin North Burnet", "street": "2608 Brockton Dr", "city": "Austin", "state": "TX", "postalCode": "78758", "phone": "5126544050", "phoneFormatted": "(512) 654-4050", "latitude": 30.392745, "longitude": -97.720331, "isPrimary": true, "acceptsMedicare": true }],
    "hospitalAffiliations": [{ "name": "Ascension Seton Medical Center Austin", "url": "https://doctor.webmd.com/hospital/…" }],
    "isSponsored": false,
    "profileTier": "Basic",
    "website": null,
    "contactEmails": [],
    "profileUrl": "https://doctor.webmd.com/doctor/fotini-chalkias-…-overview",
    "leadScore": 57,
    "searchSpecialty": "cardiology",
    "searchLocation": "texas/austin",
    "scrapedAt": "2026-07-22T00:00:00.000Z"
}
```

### How much does it cost to scrape WebMD?

This Actor uses Apify's **pay-per-event** pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

- **Provider scraped** - One healthcare provider record from WebMD (86 fields): NPI, name, specialty & sub-specialties, star rating, review counts, WebMD's own review summary and monthly star trends, patients'-perspective scores, biography, board certifications, state licenses, languages, conditions treated and procedures performed (with patient counts), accepted insurance, FAQs, telehealth & online-booking status, sponsorship signals, ALL practice locations with phones & geo, hospital affiliations and a 0-100 lead score. Practice website is published by WebMD for claimed/sponsored listings only.
- **Review scraped** - One WRITTEN patient review: star rating, full text, author, date, provider reply and helpful count. Only charged for reviews actually returned - most WebMD ratings are star-only, and WebMD's page data embeds at most 10 written reviews per provider, so a provider showing 89 ratings may bill 0-10 reviews. Every provider record separately carries reviewCount, textReviewCount and WebMD's summary/trends across all reviews at no extra charge.
- **Practice contacts enriched** - Website crawl of one provider/practice for contact leads: emails, phone numbers and social links extracted from the practice's own public site (up to 4 pages). Only charged when a page was actually fetched, and only for providers whose WebMD listing exposes a website - the rest are skipped free of charge.

The current price of each event is shown on the **Pricing** tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** - start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** - official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** - run it daily/weekly with `monitorMode` to capture only newly listed providers; perfect for lead pipelines and directory refreshes.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** - trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/webmd-scraper').call({
    specialties: ['cardiology'],
    locations: ['texas/austin'],
    maxResults: 200,
    enrichPracticeEmails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} providers & leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps - no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** - multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** - push new provider leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** - get notified when a monitored search finds new providers.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** - auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** - pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** - trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** - ask your assistant to "find cardiologists in Austin accepting new patients and list their practice contacts" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready**: AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)**: an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), with no account and no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)**: agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **lead-gen stack** with our other actors:

- **[Healthgrades Scraper](https://apify.com/scrapesage/healthgrades-scraper)** - doctors, reviews & provider leads from Healthgrades (the perfect companion to this WebMD actor).
- **[Companies House Scraper](https://apify.com/scrapesage/companies-house-scraper)** - UK companies, directors & PSCs.
- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** - federal contract opportunities & contacts.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** - events + organizer leads.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** - job postings as hiring-intent signals.
- **[Product Hunt Scraper](https://apify.com/scrapesage/product-hunt-scraper)** - launches, makers & leads.
- **[Apple Podcasts Scraper](https://apify.com/scrapesage/apple-podcasts-scraper)** - shows, episodes & host leads.
- **[Google Play Scraper](https://apify.com/scrapesage/google-play-scraper)** - apps, reviews & developer leads.

### Tips

- **Specialty slugs**: friendly names are auto-mapped (`Cardiologist` → `cardiology`, `OB-GYN` → `obstetrics-gynecology`), and retired slugs such as `cardiovascular-disease` are mapped to their current name, but exact WebMD slugs always work. Browse [doctor.webmd.com/providers/specialty](https://doctor.webmd.com/providers/specialty) for the full list.
- **Exhaust a metro**: WebMD returns ~60 providers per page and paginates automatically; raise `maxResultsPerSearch` to go deeper, or split by specialty.
- **Cost control**: profile fetches and email enrichment are per-provider - keep `includeProviderDetails` on (cheap, one page) and turn on `enrichPracticeEmails` only when you need emails.
- **Proxies**: the default Apify Proxy (datacenter) is enough - WebMD serves clean pages to it.

### FAQ

**How do I scrape doctors for a specific city?** Put `state/city` in `locations` (e.g. `texas/austin`) or a plain `Austin, TX`, and add one or more `specialties`. City-level searches return the most providers.

**Where do the emails come from?** Never from WebMD (it doesn't publish emails). With `enrichPracticeEmails` on, the actor visits the provider's own practice website and extracts publicly listed contact emails - the same thing a human visitor would see.

**Can I export to Google Sheets, CSV, or Excel?** Yes - one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor new providers automatically?** Turn on `monitorMode` and create a [Schedule](https://docs.apify.com/platform/schedules). Each run emits only providers not seen before - it does not conflict with the scheduler.

**Is scraping WebMD legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and WebMD's terms.

**A field is null - why?** Fields are `null` only when WebMD doesn't publish the data, never because the scraper skipped them. The most common cases - fax, practice website, sub-specialty expertise and written reviews - are explained in "What WebMD does *not* publish" above, with the exact reason for every field recorded in `coverage-exceptions.json`.

### Data & lawful use

This Actor reads business and professional listings that the professionals themselves published to be found: names, roles, firms, ratings and the contact details shown on the public listing. Because those details belong to identifiable people, treat the output as personal data. If you are in the EU or UK you are the data controller for what you do with it: have a lawful basis (usually legitimate interest for B2B prospecting or market research), keep any outreach relevant to the professional's line of work, honour opt-outs and deletion requests, and do not use the output for spam.

Under [Apify's Standard Actor Contract](https://docs.apify.com/legal/standard-actor-contract), which governs your use of this Actor, you are the controller of any personal data in your input and output and scrapesage acts only as your processor: that data is processed solely to run your job, written only to your own Apify storage, never used for any other purpose and never shared onward. If you need help with a data-subject request that involves this Actor's output, open an issue on the Issues tab.

### Disclaimer

**This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by WebMD LLC or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.**

"WebMD" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official WebMD product, is not authorised or certified by WebMD LLC, and does not distribute WebMD software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome - this actor is actively maintained.

# Actor input Schema

## `specialties` (type: `array`):

Medical specialties to browse, combined with every location. Friendly names work (e.g. Cardiology, Dentist, OB-GYN) and map to WebMD slugs like cardiology, family-medicine, dermatology, pediatrics, psychiatry, psychology, dentistry. Full list at doctor.webmd.com/providers/specialty.

## `locations` (type: `array`):

Where to search. Use <code>state/city</code> (<code>texas/austin</code>, <code>california/los-angeles</code>), a plain <code>City, ST</code> (<code>Austin, TX</code>), or a whole state (<code>texas</code>, <code>TX</code>). City-level searches return the most providers.

## `startUrls` (type: `array`):

Direct WebMD URLs: doctor profiles (<code>/doctor/...-overview</code>) or browse/directory pages (<code>/providers/specialty/...</code>). Used in addition to specialties + locations.

## `acceptingNewPatientsOnly` (type: `boolean`):

Only include providers currently accepting new patients.

## `minRating` (type: `integer`):

Only include providers with at least this WebMD star rating (1–5). 0 = no minimum.

## `gender` (type: `string`):

Filter providers by gender.

## `maxResultsPerSearch` (type: `integer`):

Maximum providers to collect per specialty × location combination.

## `maxResults` (type: `integer`):

Maximum number of providers to scrape across all searches.

## `includeProviderDetails` (type: `boolean`):

Fetch each profile for the full record: biography, sub-specialty expertise, years of experience, board certifications, state licenses, languages, conditions treated, procedures, accepted insurance, all practice locations and hospital affiliations. One extra page per provider.

## `includeReviews` (type: `boolean`):

Collect each provider's written patient reviews (star rating, text, author, date, provider reply). Requires the profile fetch. <b>Note:</b> most WebMD ratings are star-only - a provider showing 89 reviews may have 0 with text. The record always carries <code>reviewCount</code> (all ratings), <code>textReviewCount</code> (how many have text) and <code>reviewsRetrieved</code>, plus WebMD's own <code>reviewSummary</code> and monthly <code>reviewTrends</code> computed across <i>all</i> reviews.

## `reviewOutput` (type: `string`):

<b>Nested</b> keeps one row per provider with a <code>reviews</code> array - best for CSV/Excel, since every row has the same columns. <b>Separate rows</b> emits each review as its own record (legacy shape); the export then mixes two record types, so many columns will be blank on each row.

## `maxReviewsPerProvider` (type: `integer`):

Cap the reviews kept per provider. WebMD's page data embeds at most <b>10</b> written reviews per provider, so values above 10 have no additional effect.

## `enrichPracticeEmails` (type: `boolean`):

Crawl each provider's own practice website (home + contact/about, up to 4 pages) for contact emails, phone numbers and social links. WebMD never exposes emails - this is the only way to get them. <b>Only runs for providers whose listing exposes a website</b> (roughly a quarter of providers - mostly claimed/sponsored listings); the rest are skipped and never billed.

## `deduplicateProviders` (type: `boolean`):

Skip providers already emitted in this run (by NPI / provider id).

## `monitorMode` (type: `boolean`):

Remember providers seen in previous runs (in a named key-value store) and emit only NEW ones next time. Pair with Apify Schedules to track newly listed providers - it does not conflict with the scheduler.

## `monitorStoreName` (type: `string`):

Key-value store name used to remember seen providers across runs.

## `maxConcurrency` (type: `integer`):

Maximum parallel page fetches.

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

Proxies to use. The default Apify Proxy (datacenter) is enough - WebMD serves clean pages to it.

## `urlsFromFile` (type: `string`):

Paste a list of URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many Start URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically.

## Actor input object example

```json
{
  "specialties": [
    "cardiology"
  ],
  "locations": [
    "texas/austin"
  ],
  "acceptingNewPatientsOnly": false,
  "minRating": 0,
  "gender": "any",
  "maxResultsPerSearch": 60,
  "maxResults": 100,
  "includeProviderDetails": true,
  "includeReviews": false,
  "reviewOutput": "nested",
  "maxReviewsPerProvider": 10,
  "enrichPracticeEmails": false,
  "deduplicateProviders": true,
  "monitorMode": false,
  "monitorStoreName": "webmd-monitor",
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "urlsFromFile": ""
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped records in the default dataset. Provider rows carry the full profile, ratings, specialties, board certifications, insurance, practice locations, phones, lead data and enrichment; review rows carry their own fields.

# 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 = {
    "specialties": [
        "cardiology"
    ],
    "locations": [
        "texas/austin"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "urlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/webmd-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 = {
    "specialties": ["cardiology"],
    "locations": ["texas/austin"],
    "proxyConfiguration": { "useApifyProxy": True },
    "urlsFromFile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/webmd-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 '{
  "specialties": [
    "cardiology"
  ],
  "locations": [
    "texas/austin"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "urlsFromFile": ""
}' |
apify call scrapesage/webmd-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/webmd-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/BwYVjHLwpeZnluGdc/builds/i83hLtNbHC9ACZKFf/openapi.json
