# RateMDs Doctor Review & Rating Scraper (`jungle_synthesizer/ratemds-scraper`) Actor

Scrape doctor profiles, ratings, and patient reviews from RateMDs.com. Extract physician names, specialties, addresses, phone numbers, overall/staff/punctuality/helpfulness/knowledge ratings, and full review text. Covers the United States and Canada.

- **URL**: https://apify.com/jungle\_synthesizer/ratemds-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## RateMDs Doctor Review & Rating Scraper

Scrape doctor profiles and patient reviews from [RateMDs.com](https://www.ratemds.com). Returns names, specialties, addresses, phone numbers, multi-dimensional ratings (overall plus Staff, Punctuality, Helpfulness, Knowledge), and recent reviews for ~1M US and Canadian physicians.

### RateMDs Scraper Features

- Browses by country, state or province, city, and specialty — any combination works
- Accepts direct profile URLs when you already know which doctors you want, which saves a listing walk
- Extracts aggregate rating plus the four per-category sub-ratings (Staff, Punctuality, Helpfulness, Knowledge) where the profile is RateMDs-native
- Returns recent reviews with date, rating, and full text — flattened into `YYYY-MM-DD | rating | body` strings so they drop cleanly into a spreadsheet
- Captures affiliated clinics with lat/long coordinates from embedded JSON-LD
- Covers both the United States and Canada, including Canadian provincial codes like ON, BC, QC
- Uses residential US proxies with Cloudflare-aware rendering — required, because RateMDs is behind a JS challenge
- Pay-per-event pricing — roughly $0.003 per doctor record plus a flat $0.10 actor-start fee

### Who Uses RateMDs Doctor Data?

- **Healthcare marketers** — build outreach lists segmented by specialty, city, and patient rating bands
- **Reputation-management firms** — track client doctors' review counts and sentiment over time, which is most of the job
- **Patient-acquisition platforms** — seed provider directories with verified contact details and ratings
- **Cross-border healthcare analysts** — compare US and Canadian provider density or rating distributions in a single run
- **Competitive-intelligence teams** — map practice footprints by specialty across metro areas

### How RateMDs Scraper Works

1. You pick a mode. Either provide filters (countries, states, city, specialty) to browse the `/best-doctors/` listings, or hand the scraper a list of direct `/doctor-ratings/` profile URLs.
2. A Playwright browser session loads each page behind the Cloudflare challenge. Anti-detection hooks and a US residential proxy do the heavy lifting so the page actually renders.
3. On listing pages the scraper harvests every unique profile link and follows `?page=N` pagination until `maxItems` is reached. Profile URLs are deduplicated across specialty and geography filters, so the same doctor does not get scraped twice.
4. On profile pages the scraper reads the embedded JSON-LD — Physician schema plus Place entries for each clinic — merges in the per-category rating tiles and languages list from the DOM, and writes a single flat record to the dataset.

### Input

#### Browse by specialty and country

```json
{
  "countries": ["us"],
  "specialty": "dermatologist",
  "maxItems": 50,
  "sp_intended_usage": "Dermatology lead gen for a medical device vendor",
  "sp_improvement_suggestions": "n/a"
}
````

#### Narrow by state and city

```json
{
  "countries": ["ca"],
  "states": ["ON"],
  "city": "toronto",
  "specialty": "chiropractor",
  "maxItems": 100,
  "sp_intended_usage": "Market sizing for a Canadian chiropractic SaaS",
  "sp_improvement_suggestions": "n/a"
}
```

#### Scrape specific doctor profiles directly

```json
{
  "profileUrls": [
    { "url": "https://www.ratemds.com/doctor-ratings/3540782/Dr-Michael-Robbins-Markham-ON.html/" },
    { "url": "https://www.ratemds.com/doctor-ratings/dr-angelo-ayar-tamarac-fl-us/" }
  ],
  "maxItems": 10,
  "sp_intended_usage": "Profile verification",
  "sp_improvement_suggestions": "n/a"
}
```

#### Input Parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| countries | string\[] | `["us"]` | Country codes: `us`, `ca`. Controls the default browse scope when no states are given. |
| states | string\[] | — | Two-letter US state or Canadian province codes (e.g. `CA`, `NY`, `ON`, `BC`). |
| city | string | — | City slug as used on RateMDs (e.g. `los-angeles`, `new-york`, `toronto`). Works best with a state filter. |
| specialty | string | All specialties | Specialty slug (e.g. `cardiologist`, `dermatologist`, `family-gp`). Leave empty to default to a rotating basket of common specialties. |
| profileUrls | array | — | Direct RateMDs profile URLs. When provided, all browse filters are ignored. |
| maxItems | integer | `15` | Maximum doctor records to return. Set to `0` for unlimited. |
| proxyConfiguration | object | US residential Apify proxy | Proxy settings. Residential is required — RateMDs blocks datacenter IPs. |
| sp\_intended\_usage | string | — | Required. Describe how you plan to use the data. |
| sp\_improvement\_suggestions | string | — | Required. Feedback on what could be improved. |

**Supported specialties:** Acupuncturist, Addiction Medicine, Allergist/Immunologist, Anesthesiologist, Audiologist, Bariatric/Weight Loss, Cardiologist, Cardiothoracic Surgeon, Chiropractor, Colorectal/Proctologist, Cosmetic/Plastic Surgeon, Dentist, Dermatologist, Dietitian, ENT/Otolaryngologist, Emergency/Critical Care, Endocrinologist, Endodontist, Family/GP, Gastroenterologist, Geneticist, Gynecologist/OBGYN, Homeopath, Infectious Disease, Internist/Geriatrician, Massage Therapist, Naturopath, Nephrologist, Neurologist, Neurosurgeon, Nurse Practitioner, Occupational Therapist, Oncologist, Ophthalmologist, Optician, Optometrist, Oral/Maxillofacial Surgeon, Orthodontist, Orthopedic Surgeon, Osteopath, Pain Management, Pathologist, Pediatrician, Periodontist, Physical Therapist, Physiatrist, Plastic Surgeon, Podiatrist, Psychiatrist, Psychologist, Pulmonologist, Radiologist, Respirologist, Rheumatologist, Sports Medicine, Surgeon, Urologist, Vascular Surgeon.

### RateMDs Scraper Output Fields

```json
{
  "doctor_name": "Dr. Michael Robbins",
  "specialty": "Chiropractor",
  "practice_name": "Dr. Michael G. Robbins",
  "street_address": "326 Main Street North",
  "city": "Markham",
  "state": "ON",
  "zip": "L3P 1Z1",
  "country": "ca",
  "phone": "(905) 471-6696",
  "website": "http://markhamchiropractic.com/",
  "photo_url": "https://cdn1.ratemds.com/media/doctors/doctor/image/doctor-michael-robbins-chiropractor.jpg",
  "latitude": 43.887057,
  "longitude": -79.263348,
  "overall_rating": 4.99,
  "staff_rating": 5,
  "punctuality_rating": 5,
  "helpfulness_rating": 5,
  "knowledge_rating": 5,
  "review_count": 866,
  "reviews": [
    "2024-07-27 | 5.0 | Dr. Robbins is a great chiropractor and a wonderful person. Very knowledgeable and his treatments are very effective.",
    "2024-07-16 | 4.0 | It was a nice experience and friendly staff. Thank you"
  ],
  "clinics": [
    "Dr. Michael G. Robbins | Markham, ON | https://www.ratemds.com/clinic/ca-on-markham-dr-michael-g-robbins/"
  ],
  "opening_hours": [],
  "languages": ["English"],
  "breadcrumb_trail": "Doctors > Ontario > Markham > Chiropractor",
  "profile_url": "https://www.ratemds.com/doctor-ratings/3540782/Dr-Michael-Robbins-Markham-ON.html/",
  "scraped_at": "2026-04-18T01:33:08.209Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| doctor\_name | string | Full doctor name including title (e.g. `Dr. Angelo Ayar`) |
| specialty | string | Primary medical specialty |
| practice\_name | string | Primary clinic or practice name |
| street\_address | string | Street address of the primary practice |
| city | string | Practice city |
| state | string | Two-letter state or province code |
| zip | string | Postal code |
| country | string | `us` or `ca` |
| phone | string | Practice phone number |
| website | string | External practice website, if listed |
| photo\_url | string | Doctor headshot URL |
| latitude | number | Latitude of the primary practice |
| longitude | number | Longitude of the primary practice |
| overall\_rating | number | Aggregate rating on a 0–5 scale |
| staff\_rating | number | Staff rating (native RateMDs profiles only, else `null`) |
| punctuality\_rating | number | Punctuality rating (native profiles only) |
| helpfulness\_rating | number | Helpfulness rating (native profiles only) |
| knowledge\_rating | number | Knowledge rating (native profiles only) |
| review\_count | number | Total number of patient reviews |
| reviews | string\[] | Recent reviews, each formatted as `YYYY-MM-DD \| rating \| text` |
| clinics | string\[] | Affiliated clinics, each formatted as `Clinic Name \| City, State \| URL` |
| opening\_hours | string\[] | Weekly opening hours in schema.org format (e.g. `Mo 08:00-16:00`) |
| languages | string\[] | Languages spoken by the doctor |
| breadcrumb\_trail | string | Country > State > City > Specialty trail |
| profile\_url | string | Full RateMDs profile URL |
| scraped\_at | string | ISO-8601 timestamp for when the record was collected |

### FAQ

#### How many doctors does the RateMDs Scraper cover?

RateMDs Scraper can reach roughly 1 million physician profiles across the US and Canada, given enough `maxItems` and wide enough filters. A single-specialty national crawl can return tens of thousands of records in a single run; a national crawl across all specialties is a multi-hour job.

#### Does the RateMDs Scraper need residential proxies?

Yes. RateMDs sits behind a Cloudflare managed challenge that blocks datacenter IPs. The actor defaults to US Apify residential proxies, which is the correct setup. Running without residential proxies will stall on "Just a moment..." pages and return nothing.

#### Why are some per-category ratings `null`?

The RateMDs Scraper returns `staff_rating`, `punctuality_rating`, `helpfulness_rating`, and `knowledge_rating` only for native RateMDs profiles. Partner-served profiles (for example, those backed by doctor.com) expose only the aggregate rating, so those four sub-fields are `null`. This is a RateMDs data limitation, not a scraper limitation.

#### Can I scrape a specific list of doctors?

Yes. Drop their RateMDs profile URLs into the `profileUrls` field and the actor will visit each one directly, skipping the browse step entirely. This is the fastest path when you have known targets — verification, enrichment, monitoring.

#### How much does it cost to run the RateMDs Scraper?

Pay-per-event: roughly $0.003 per doctor record plus a flat $0.10 per actor start. A 1,000-record run is about $3.10. Actual cost depends on run duration and memory — check your Apify usage dashboard for exact numbers.

#### Is it legal to scrape RateMDs?

The RateMDs Scraper collects publicly available information from RateMDs. You are responsible for ensuring your use of the data complies with applicable laws, including HIPAA where relevant. The actor does not access any private account data, patient records, or protected health information.

### Need More Features?

Need additional fields, bulk national exports, or a different review platform? [Get in touch](https://apify.com/jungle_synthesizer/ratemds-scraper).

### Why Use RateMDs Scraper?

- **Multi-dimensional ratings** — Returns the four per-category scores RateMDs exposes (Staff, Punctuality, Helpfulness, Knowledge), not just the aggregate. Most competitors drop these.
- **US plus Canada in one actor** — Query Canadian provinces the same way you query US states. If you need a single healthcare dataset that covers both markets, this is it.
- **Priced per record** — You pay $0.003 for every doctor that comes back, which means a small test run costs pocket change and a production crawl is still cheaper than writing the scraper yourself.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

## `countries` (type: `array`):

Select which countries to crawl. Defaults to both US and Canada.

## `states` (type: `array`):

Two-letter US state or Canadian province code (e.g. CA, NY, ON, BC). Leave empty to use country-level browse.

## `city` (type: `string`):

Filter by city slug as used on RateMDs (e.g. 'los-angeles', 'new-york', 'toronto'). Works best combined with a state filter.

## `specialty` (type: `string`):

Filter by medical specialty slug (e.g. 'cardiologist', 'dermatologist', 'family-gp'). Leave empty to crawl across all specialties.

## `profileUrls` (type: `array`):

Specific RateMDs doctor-profile URLs to scrape. Bypasses browse when provided. Accepts URLs from www.ratemds.com/doctor-ratings/...

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

Maximum number of doctor profiles to scrape. Set to 0 for unlimited.

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

Residential proxies are required -- the site uses Cloudflare protection.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "countries": [
    "us"
  ],
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "countries": [
        "us"
    ],
    "city": "",
    "specialty": "",
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/ratemds-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "countries": ["us"],
    "city": "",
    "specialty": "",
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/ratemds-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "countries": [
    "us"
  ],
  "city": "",
  "specialty": "",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call jungle_synthesizer/ratemds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/ratemds-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RateMDs Doctor Review & Rating Scraper",
        "description": "Scrape doctor profiles, ratings, and patient reviews from RateMDs.com. Extract physician names, specialties, addresses, phone numbers, overall/staff/punctuality/helpfulness/knowledge ratings, and full review text. Covers the United States and Canada.",
        "version": "1.0",
        "x-build-id": "P9YJyn7bcgkRsZUqK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~ratemds-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-ratemds-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~ratemds-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-ratemds-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~ratemds-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-ratemds-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "sp_intended_usage",
                    "sp_improvement_suggestions"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "countries": {
                        "title": "Country Filter",
                        "type": "array",
                        "description": "Select which countries to crawl. Defaults to both US and Canada.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "us",
                                "ca"
                            ],
                            "enumTitles": [
                                "United States",
                                "Canada"
                            ]
                        }
                    },
                    "states": {
                        "title": "State / Province Filter",
                        "type": "array",
                        "description": "Two-letter US state or Canadian province code (e.g. CA, NY, ON, BC). Leave empty to use country-level browse.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "AL",
                                "AK",
                                "AZ",
                                "AR",
                                "CA",
                                "CO",
                                "CT",
                                "DE",
                                "DC",
                                "FL",
                                "GA",
                                "HI",
                                "ID",
                                "IL",
                                "IN",
                                "IA",
                                "KS",
                                "KY",
                                "LA",
                                "ME",
                                "MD",
                                "MA",
                                "MI",
                                "MN",
                                "MS",
                                "MO",
                                "MT",
                                "NE",
                                "NV",
                                "NH",
                                "NJ",
                                "NM",
                                "NY",
                                "NC",
                                "ND",
                                "OH",
                                "OK",
                                "OR",
                                "PA",
                                "RI",
                                "SC",
                                "SD",
                                "TN",
                                "TX",
                                "UT",
                                "VT",
                                "VA",
                                "WA",
                                "WV",
                                "WI",
                                "WY",
                                "AB",
                                "BC",
                                "MB",
                                "NB",
                                "NL",
                                "NS",
                                "ON",
                                "PE",
                                "QC",
                                "SK"
                            ],
                            "enumTitles": [
                                "Alabama",
                                "Alaska",
                                "Arizona",
                                "Arkansas",
                                "California",
                                "Colorado",
                                "Connecticut",
                                "Delaware",
                                "District of Columbia",
                                "Florida",
                                "Georgia",
                                "Hawaii",
                                "Idaho",
                                "Illinois",
                                "Indiana",
                                "Iowa",
                                "Kansas",
                                "Kentucky",
                                "Louisiana",
                                "Maine",
                                "Maryland",
                                "Massachusetts",
                                "Michigan",
                                "Minnesota",
                                "Mississippi",
                                "Missouri",
                                "Montana",
                                "Nebraska",
                                "Nevada",
                                "New Hampshire",
                                "New Jersey",
                                "New Mexico",
                                "New York",
                                "North Carolina",
                                "North Dakota",
                                "Ohio",
                                "Oklahoma",
                                "Oregon",
                                "Pennsylvania",
                                "Rhode Island",
                                "South Carolina",
                                "South Dakota",
                                "Tennessee",
                                "Texas",
                                "Utah",
                                "Vermont",
                                "Virginia",
                                "Washington",
                                "West Virginia",
                                "Wisconsin",
                                "Wyoming",
                                "Alberta",
                                "British Columbia",
                                "Manitoba",
                                "New Brunswick",
                                "Newfoundland and Labrador",
                                "Nova Scotia",
                                "Ontario",
                                "Prince Edward Island",
                                "Quebec",
                                "Saskatchewan"
                            ]
                        }
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "Filter by city slug as used on RateMDs (e.g. 'los-angeles', 'new-york', 'toronto'). Works best combined with a state filter."
                    },
                    "specialty": {
                        "title": "Specialty",
                        "enum": [
                            "",
                            "acupuncturist",
                            "addiction-medicine",
                            "allergist-immunologist",
                            "anesthesiologist",
                            "audiologist",
                            "bariatric-weight-loss",
                            "cardiologist",
                            "cardiothoracic-surgeon",
                            "chiropractor",
                            "colorectal-proctologist",
                            "cosmetic-plastic-surgeon",
                            "dentist",
                            "dermatologist",
                            "dietitian",
                            "ear-nose-and-throat-ent",
                            "emergency-critical",
                            "endocrinologist",
                            "endodontist-root-canal",
                            "family-gp",
                            "gastroenterologist",
                            "geneticist",
                            "gynecologist-obgyn",
                            "homeopath",
                            "infectious-disease",
                            "internist-geriatrician",
                            "massage-therapist",
                            "naturopath",
                            "nephrologist",
                            "neurologist",
                            "neurosurgeon",
                            "nurse-practitioner",
                            "occupational-therapist",
                            "oncologist",
                            "ophthalmologist",
                            "optician",
                            "optometrist",
                            "oral-maxillofacial-surgeon",
                            "orthodontist",
                            "orthopedic-surgeon",
                            "osteopath",
                            "pain-management",
                            "pathologist",
                            "pediatrician",
                            "periodontist",
                            "physical-therapist",
                            "physiatrist",
                            "plastic-surgeon",
                            "podiatrist",
                            "psychiatrist",
                            "psychologist",
                            "pulmonologist",
                            "radiologist",
                            "respirologist",
                            "rheumatologist",
                            "sports-medicine",
                            "surgeon",
                            "urologist",
                            "vascular-surgeon"
                        ],
                        "type": "string",
                        "description": "Filter by medical specialty slug (e.g. 'cardiologist', 'dermatologist', 'family-gp'). Leave empty to crawl across all specialties."
                    },
                    "profileUrls": {
                        "title": "Profile URL(s)",
                        "type": "array",
                        "description": "Specific RateMDs doctor-profile URLs to scrape. Bypasses browse when provided. Accepts URLs from www.ratemds.com/doctor-ratings/...",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of doctor profiles to scrape. Set to 0 for unlimited.",
                        "default": 15
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxies are required -- the site uses Cloudflare protection."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
