# RealSelf Provider & Treatment Scraper (`mrdoe/realself-scraper`) Actor

Scrape RealSelf providers, cosmetic treatments, procedures, reviews, ratings, prices, locations, specialties, and provider profiles. Build structured datasets for aesthetic medicine research, market analysis, provider discovery, and lead generation.

- **URL**: https://apify.com/mrdoe/realself-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Automation, Agents, Lead generation
- **Stats:** 1 total users, 0 monthly users, 64.3% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.00 / 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.

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

![RealSelf Provider & Treatment Scraper hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/realself-scraper--hero.png)

## RealSelf Provider & Treatment Scraper

### What does this Actor do?

RealSelf Provider & Treatment Scraper extracts publicly available doctor, clinic, and practice listings from RealSelf.com provider-finder search pages and individual profile pages. For each provider it collects the name, specialty, treatments/services offered, location, publicly listed phone number, external website, and profile URL.

RealSelf is protected by PerimeterX bot detection, which blocks plain HTTP requests outright. This Actor uses a real browser with browser fingerprinting and a residential proxy to reliably load pages, then reads the same structured (JSON-LD) data RealSelf embeds for search engines.

### Why scrape RealSelf provider data?

- Build a lead list of cosmetic/medical providers by treatment and city
- Research competitor providers, their specialties, and treatment menus
- Track which practices offer a specific treatment in a given market
- Collect publicly listed provider contact/website info for outreach
- Monitor provider profile changes (specialties, services, locations) over time

### Features

- Reads RealSelf's own structured provider data (name, specialty, treatments, address, phone, website)
- Follows "Show more" pagination on search-results pages
- Real browser with fingerprinting + residential proxy to get past PerimeterX bot protection
- Automatic retry with backoff and fresh proxy sessions on blocked requests
- Deduplicates providers by profile URL
- Respects `maxItems`

### Input

![RealSelf Provider & Treatment Scraper input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/realself-scraper--input.png)

| Field                | Type    | Required | Default     | Description                                                                                                |
| -------------------- | ------- | -------- | ----------- | ---------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | Yes      | -           | RealSelf search URLs (e.g. `.../find/California/Los-Angeles/Botox`) or direct doctor/practice profile URLs |
| `maxItems`           | integer | No       | `20`        | Maximum provider records to scrape. Set `0` for unlimited                                                  |
| `proxyConfiguration` | object  | Yes      | RESIDENTIAL | A residential proxy is required - RealSelf blocks datacenter IPs                                           |

### Output

![RealSelf Provider & Treatment Scraper dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/realself-scraper--output.png)

![RealSelf Provider & Treatment Scraper data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/realself-scraper--fields.png)

```json
{
    "productName": "Botox",
    "description": "Meet Behnoush Zarrini, MD, a trusted Board Certified Anesthesiologist...",
    "category": "Fillers and Other Injectables, Skin Rejuvenation and Resurfacing",
    "certifications": ["Doctor of Medicine, Tehran University of Medical Sciences, 1984-1992"],
    "supplierName": "Behnoush Zarrini, MD",
    "supplierUrl": "https://www.realself.com/dr/behnoush-zarrini-beverly-hills-ca",
    "supplierType": "Physician",
    "industry": "Fillers and Other Injectables, Skin Rejuvenation and Resurfacing",
    "phone": "+1 424-401-7825",
    "website": "https://www.bwaesthetics.com/medical-spa-beverly-hills/",
    "address": "9100 Wilshire Blvd Suite 363 W",
    "city": "Beverly Hills",
    "state": "California",
    "zipCode": "90212",
    "country": "US",
    "services": ["Botox", "Daxxify", "Dermal Fillers", "PRP Injections", "Cheek Fillers"],
    "profileUrl": "https://www.realself.com/dr/behnoush-zarrini-beverly-hills-ca",
    "source": "RealSelf",
    "scrapedAt": "2026-08-19T02:05:57.828Z"
}
```

Fields with no RealSelf equivalent (e.g. `brand`, `employeeCount`, `manufacturer`) are always returned as `null` rather than guessed.

### Output fields

| Field                                            | Description                                                          |
| ------------------------------------------------ | -------------------------------------------------------------------- |
| `supplierName`, `supplierType`                   | Provider/practice name and provider type                             |
| `productName`, `category`, `services`            | Treatment searched for, medical specialty, and full treatment list   |
| `certifications`                                 | Credentials listed on the profile                                    |
| `phone`, `website`                               | Publicly listed phone number and the provider's own external website |
| `address`, `city`, `state`, `zipCode`, `country` | Practice location                                                    |
| `profileUrl`                                     | RealSelf provider profile URL                                        |
| `source`, `scrapedAt`                            | Data provenance and fetch timestamp                                  |

### Use cases

- Generate provider lead lists filtered by treatment and location
- Feed a CRM with cosmetic/medical provider contacts
- Competitive research on treatment menus and specialties by market
- Track provider website and contact info for partnership outreach
- Build regional directories of medical aesthetics providers

### Pricing

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

### FAQ

**Why does this Actor require a residential proxy?** RealSelf uses PerimeterX bot protection, which blocks datacenter IPs and non-browser requests. A residential proxy plus a real, fingerprinted browser is required to load pages reliably.

**Why might a run return fewer items than `maxItems`?** PerimeterX blocking is probabilistic - even with a residential proxy, some requests are blocked and retried with a fresh session. The Actor retries generously, but a heavily-flagged proxy pool can occasionally still result in a partial run.

**Does this include reviews or ratings?** No. This Actor focuses on provider/practice and treatment information, not individual patient reviews.

**Why isn't `verifiedSupplier` ever populated?** RealSelf doesn't publish an "equipment supplier" style verification badge equivalent to this schema's meaning, so it's always left `null` rather than guessed.

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by RealSelf. It only accesses publicly available page content. Users are responsible for complying with applicable terms of use, laws, and privacy requirements when using the collected data.

### Preview

![How RealSelf Provider & Treatment Scraper works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/realself-scraper--how-it-works.png)

# Actor input Schema

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

RealSelf provider-finder search URLs (e.g. https://www.realself.com/find/California/Los-Angeles/Botox) or direct doctor/practice profile URLs.

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

Maximum number of provider records to scrape. Set to 0 for unlimited.

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

A residential proxy is required - RealSelf blocks datacenter IPs and non-browser requests with PerimeterX bot protection.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.realself.com/find/California/Los-Angeles/Botox"
    }
  ],
  "maxItems": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.realself.com/find/California/Los-Angeles/Botox"
        }
    ],
    "maxItems": 2,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/realself-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 = {
    "startUrls": [{ "url": "https://www.realself.com/find/California/Los-Angeles/Botox" }],
    "maxItems": 2,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/realself-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 '{
  "startUrls": [
    {
      "url": "https://www.realself.com/find/California/Los-Angeles/Botox"
    }
  ],
  "maxItems": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call mrdoe/realself-scraper --silent --output-dataset

```

## MCP server setup

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