# Psychology Today Scraper - Therapist & Psychiatrist Database (`s-r/psychology-today-scraper`) Actor

Export public Psychology Today therapist and psychiatrist profiles: name, credentials, phone, practice address, specialties, insurance, session fees and license. Search by city, ZIP or directory URL in 26 countries. Built for mental health lead generation.

- **URL**: https://apify.com/s-r/psychology-today-scraper.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 therapist profiles

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?

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

## Psychology Today Scraper

Psychology Today Scraper turns public therapist and psychiatrist directory profiles into a structured therapist database for mental health lead generation, provider research and referral networks. Search by city, state, ZIP code, postal district or a directory URL, then export the profiles you need as CSV, Excel or JSON.

Each dataset row represents one unique profile. Names, qualifications, displayed phone numbers, practice locations and profile links are available from search results. Profile details add published specialties, insurance providers, treatment approaches, education and license information. An optional website lookup returns the therapist's own public website link.

### Psychology Today Scraper coverage

The therapist directory supports 26 country editions: United States, Canada, United Kingdom, Australia, Hong Kong, Ireland, New Zealand, Singapore, South Africa, Austria, Belgium, Denmark, Sweden, Switzerland, France, Spain, Argentina, Chile, Colombia, Costa Rica, Guatemala, Mexico, Panama, Peru, Puerto Rico and Uruguay. The actor uses each country's directory route. Psychiatrist searches are available in the United States.

Start with a specific city or postal district when building a regional provider list. Broad searches can contain more profiles than the directory makes available. The source caps accessible search results at 10,000 profiles for an individual search. Multiple city searches help describe separate areas, although adjacent areas can contain the same providers. The actor removes repeated profile IDs from the dataset.

### How to scrape Psychology Today

1. Choose a `country` and type a city, state or postal code in `location`, or paste a search URL from the directory into `searchUrls`.
2. Optionally narrow the search with `specialties`, `insurance` or `filters`, and set `maxItems`.
3. Keep `includeDetails` on for specialties, insurance, fees and license, and turn on `includeWebsite` if you need the practice website.
4. Run the actor and download the dataset. Larger requests continue page by page within the same run.

### Input

Provide at least one of `location`, `searchUrls` or `profileUrls`. `country` defaults to `us` and accepts upper- or lowercase country codes. `directory` defaults to `therapists`; use `psychiatrists` with `country: "us"` for psychiatrist searches.

A location can be a city, a state, a city and state abbreviation, or a postal code. For example, the research examples use New York and the London directory. To reproduce an existing browser search, copy its complete URL into `searchUrls`. Those URLs retain their source filters and take precedence over `location`, `specialties`, `insurance` and `filters`.

Use `profileUrls` when you already have individual provider links. These are read directly and return the published profile details. If both profile and search URL lists are supplied, direct profiles are processed first and repeated profiles are removed. Direct profile URLs always involve reading the profile, including when `includeDetails` is false.

| Field | Type | Default | Purpose |
|---|---|---|---|
| `country` | string | `us` | Country edition of the directory, such as `us`, `ca`, `gb` or `au` |
| `location` | string | | City, state, city and state, or postal code |
| `directory` | string | `therapists` | `therapists`, or `psychiatrists` in the United States |
| `searchUrls` | array | | Complete directory search URLs, filters included |
| `profileUrls` | array | | Individual provider profile URLs |
| `specialties` | array | | Specialty slugs, such as `anxiety` |
| `insurance` | array | | Insurance slugs, such as `aetna` |
| `filters` | array | | Other refinement slugs, such as `online-counseling` |
| `maxItems` | integer | 20 | Maximum unique profiles for the run (1 to 10,000) |
| `includeDetails` | boolean | true | Read each profile for specialties, insurance, fees and license |
| `includeWebsite` | boolean | false | Add the provider's public website link |
| `cursor` | string | | For direct API use: the returned `next_cursor`, with the original search unchanged |

`maxItems` limits the number of unique profiles delivered across the run. It defaults to 20 and accepts values from 1 to 10,000. You can request a smaller sample before collecting a wider area. A requested maximum is a limit, not a promise that the directory contains that many matching providers.

#### Specialty, insurance and availability filters

For location searches, provide source filter slugs in arrays. `specialties: ["anxiety"]` selects the anxiety specialty. `insurance: ["aetna"]` selects providers listed under Aetna. Other refinement slugs go in `filters`, such as `online-counseling`, `in-person`, `female` or `spanish`, where the selected country and directory offer them.

Multiple filters are combined by the source. Supported choices differ across countries. Unknown slugs produce a clear input error with available choices. A specialty placed in the insurance array is rejected instead of being interpreted as an insurance company. Browser search URLs are useful when you want to retain exactly the filters selected on the site.

#### Detail and website options

`includeDetails` defaults to true. Disable it for a compact directory list when you only need the fields shown in search results. Without details, specialties, insurance and other detail lists are empty, while unpublished street and license fields are null. The row's `details_loaded` flag shows whether a profile was successfully read.

`includeWebsite` defaults to false. Enable it to retrieve the public external website link. This option does not crawl that website or extract email addresses. A provider without an available website produces a warning and a null website value.

### Output: therapist database fields and exports

The default dataset contains one profile per row and supports Apify's JSON, CSV and Excel exports. Core fields include `place_id`, `url`, `name`, `category`, `phone`, `address`, `street`, `city`, `state`, `postal_code`, `country_code`, `lat`, `lng` and `website`. `fetched_at` records when the profile data was processed, and `source` and `platform` identify its origin.

Additional fields include `credentials`, `title_line`, `phone_e164`, `online`, `in_person`, `accepting_clients`, `fee_individual`, `fee_couples`, `currency`, `specialties`, `insurance`, `treatment_approaches`, `age_focus`, `languages`, `education`, `years_in_practice` and `license`. Arrays preserve individual labels instead of combining unrelated values into one comma-separated cell.

Phone numbers preserve the site's displayed formatting. Fees are numeric session amounts; missing or zero source amounts become null. Currency is inferred from the profile's country. An unpublished street address remains null. The actor does not infer contact details from nearby providers or fill missing fees with regional averages.

The source does not provide email addresses, customer reviews or star ratings. Peer `endorsements` are a separate count and should not be treated as reviews. Fields can change when providers update their profiles, and a directory record describes what was publicly listed at retrieval time.

#### Example output

Input `{"profileUrls": ["https://www.psychologytoday.com/us/therapists/susan-morgenstein-new-york-ny/1070080"], "includeWebsite": true}` returns this row (the `statement` text and `photo_url` are shortened here; the dataset holds them in full):

```json
{
  "place_id": "1070080",
  "url": "https://www.psychologytoday.com/us/therapists/susan-morgenstein-new-york-ny/1070080",
  "name": "Susan Morgenstein",
  "first_name": "Susan",
  "last_name": "Morgenstein",
  "credentials": ["LCSW"],
  "category": "Clinical Social Work/Therapist",
  "title_line": "Clinical Social Work/Therapist, LCSW",
  "phone": "(646) 699-4552",
  "phone_e164": "+16466994552",
  "address": "New York, NY 10019",
  "street": null,
  "city": "New York",
  "state": "New York",
  "state_code": "NY",
  "postal_code": "10019",
  "country_code": "US",
  "online": true,
  "in_person": true,
  "accepting_clients": "YES",
  "fee_individual": 275,
  "fee_couples": null,
  "sliding_scale": true,
  "currency": "USD",
  "verified": "VERIFIED",
  "endorsements": 2,
  "statement": "I take a holistic approach to psychotherapy, prioritizing understanding the entirety of a person, ...",
  "specialties": ["ADHD", "Anxiety", "Cancer", "Chronic Illness", "Chronic Pain", "Depression", "Divorce", "Family Conflict", "Grief", "Life Transitions", "Marital and Premarital", "Obsessive-Compulsive (OCD)", "Parenting", "Peer Relationships", "Pregnancy, Prenatal, Postpartum", "Relationship Issues", "Self Esteem", "Sexual Abuse", "Trauma and PTSD", "Women's Issues"],
  "insurance": [],
  "out_of_network": true,
  "treatment_approaches": ["Attachment-based", "Culturally Sensitive", "Exposure Response Prevention (ERP)", "Psychoanalytic", "Psychodynamic", "Relational", "Trauma Focused"],
  "modalities": ["Individuals"],
  "communities": ["Jewish", "Fat Acceptance"],
  "pronouns": "she, her",
  "license": {"state": "NY", "number": "092494-01", "expiration": "2027-04-01", "type": "license"},
  "years_in_practice": 33,
  "education": "NYU School of Social Work 1993",
  "free_consultation": true,
  "last_updated": "2026-09-09T00:41:59-07:00",
  "website": "http://www.susanmorgensteinlcsw.com",
  "directory": "therapists",
  "details_loaded": true,
  "warnings": []
}
```

#### Example: filtered search by specialty and insurance

Input `{"location": "New York, NY", "specialties": ["anxiety"], "insurance": ["aetna"], "maxItems": 1, "includeDetails": false}` delivers one compact row and a run summary that confirms which filters the directory applied and how it resolved the location:

```json
{
  "query": "New York, NY",
  "applied_filters": [
    {"group": "issues", "slug": "anxiety", "id": 14, "title": "Anxiety"},
    {"group": "insurance", "slug": "aetna", "id": 3153, "title": "Aetna"}
  ],
  "resolved_location": {"type": "City", "name": "New York", "country_code": "US", "region": "New York", "region_code": "NY"},
  "results_count": 9351,
  "billing": {"therapist_details": 0, "therapist_website": 0},
  "partial": false,
  "warnings": []
}
```

The row itself is Amanda Pelcher Marriage and Family Therapy PLLC, a Marriage & Family Therapist (MS, LMFT) in New York, NY 10013, phone `(914) 685-6558`, online sessions, accepting clients. Because `includeDetails` is false, the specialty and insurance arrays on the row stay empty and only the `therapist` event is charged; the filters still apply to the search itself. `results_count` shows how many matching providers the directory reports for this filtered search, which helps you size a collection before raising `maxItems`.

### Use cases for therapist and psychiatrist data

- **Mental health lead generation.** Build a regional list of practices with phone, city, credentials and website for vendors of practice-management software, billing services, telehealth platforms and continuing education.
- **Referral networks.** Clinics, hospitals and employee assistance programs can map which providers in an area accept a given insurer, treat a specialty such as trauma or ADHD, or offer online sessions.
- **Market and pricing research.** Compare published session fees, sliding-scale availability and out-of-network billing across cities or countries, using the numeric `fee_individual` and `currency` fields.
- **Network adequacy and coverage studies.** Count providers per postal code, insurer or language to find areas where care is hard to find.
- **CRM enrichment.** Use `place_id` and `url` as stable keys to refresh provider records on a schedule and spot new, moved or updated profiles.

### Psychology Today Scraper compared with other options

| Option | What you get | Trade-off |
|---|---|---|
| This actor | Fresh public profiles on demand, filtered by place, specialty and insurer, with one row per unique provider | Only what providers publish; no email addresses |
| Bought therapist email lists | Static lists with emails, often sold per thousand records | Age and sourcing are unclear, no specialty or insurance detail, and you cannot choose the exact area or filters |
| Copying profiles by hand | Full control | Slow for more than a few dozen providers and hard to keep current |
| Open-source scripts | Free code | Usually US-only, break when the site changes, and leave pagination, duplicates and exports to you |

Among the Psychology Today actors in the Apify Store, this one charges the directory row and the full profile as separate events, so a compact list costs less than a full export. It keeps phone numbers as displayed next to an international format, returns fees as numbers with a currency, separates labels into arrays, and covers the therapist directory in 26 countries as well as the US psychiatrist directory.

### Pricing and free users

Charging follows delivered profiles and successful enrichment. The therapist event counts delivered unique rows. The details event counts rows whose profile was successfully read, and the website event counts rows with a retrieved website link. Missing enrichment is not counted as successful enrichment. Empty results do not incur result or enrichment charges.

| Event | Charged for |
|---|---|
| `therapist` | Each unique profile delivered to the dataset |
| `therapist_details` | Each delivered row whose full profile was read (`details_loaded: true`) |
| `therapist_website` | Each delivered row with a public website link (`includeWebsite: true`) |

A compact list with `includeDetails: false` incurs only the `therapist` event. Repeated profiles are removed before charging.

The current event prices displayed on the Apify actor page determine the price of your run. Check that price table before starting a larger collection and use Apify's spending limit to control your budget. Users without a paid Apify plan receive up to ten profiles per run. Paid users can request their chosen maximum, subject to source coverage and run limits.

### Limitations and warnings

The run output record contains counts, warnings and a `partial` flag. `applied_filters` lists the filters confirmed by the search page with their group, slug, source ID and displayed title. `resolved_location` reports the location name, source type, country and region; for example, a postcode search can resolve to a postcode district. These fields describe the last search page processed, including when you supply a search URL. Direct profile requests return an empty filter list and a null resolved location. `query` retains your requested location or URLs.

A profile detail failure preserves the search row and adds a warning identifying the unsuccessful phase. A website failure likewise preserves the provider record. This lets you distinguish an unpublished value from a phase that could not be completed.

A missing location or unsupported directory produces an input error. An unknown location or a search with no matching providers produces an empty result. Temporary source failures can interrupt a larger collection; inspect the run output to see whether the returned dataset is complete.

### FAQ

#### Can I collect psychiatrists outside the United States?

The psychiatrist directory is supported only in the United States. Therapist searches use the relevant country edition, including counselling and psychology directories where those names are used by the source.

#### Why does a provider have no street address or phone number?

Providers choose which contact information to publish. Some list only a city or postal district, and some offer online appointments without a physical practice location. Missing public values remain null.

#### Does this actor export email addresses or ratings?

No. The directory offers a contact form rather than a public email field and does not publish customer ratings. The actor returns the public website link when requested, without following it for additional contact information.

#### How can I reduce repeated providers across searches?

Use specific locations and keep the searches in one run. Profile IDs identify providers, and repeated IDs are removed before dataset delivery and charging. You can also use `place_id` to compare exports collected at different times.

#### Is there a Psychology Today API?

Psychology Today does not offer a public API for its provider directory. This actor works as a Psychology Today API: start it through the Apify API with the same input as above and read the dataset as JSON, CSV or Excel.

#### Can I get a therapist email list from Psychology Today?

Not directly. Profiles publish a phone number, a contact form and sometimes a website, but no email address. Turn on `includeWebsite` to collect the practice website for your own outreach process.

#### How many therapists can I scrape in one run?

Up to 10,000 unique profiles per run through `maxItems`. A single search in the directory can show at most 10,000 profiles, so split a large state into cities or postal codes for broader coverage.

#### Is it legal to scrape Psychology Today?

The actor reads only publicly published professional profiles and does not log in. Whether your use is allowed depends on your purpose and on local rules such as GDPR, CAN-SPAM or TCPA for outreach. Check with your legal advisor before contacting providers.

# Actor input Schema

## `country` (type: `string`):

Supported two-letter country code, case-insensitive: us, ca, gb, au, hk, ie, nz, sg, za, at, be, dk, se, ch, fr, es, ar, cl, co, cr, gt, mx, pa, pe, pr, uy.

## `location` (type: `string`):

City, state, City, ST, ZIP code or postal district. Required unless searchUrls or profileUrls is provided.

## `directory` (type: `string`):

Therapists in all supported countries; psychiatrists only in the United States.

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

Maximum unique profiles across the complete run. An API response delivers at most 20; follow next_cursor with the original inputs.

## `includeDetails` (type: `boolean`):

Read profile pages for published street addresses, specialties, insurance, licenses and education. Direct profile URLs always return profile details.

## `includeWebsite` (type: `boolean`):

Read the public website link page. Missing or unsuccessful links produce warnings; no email extraction.

## `cursor` (type: `string`):

Opaque next_cursor from a previous response. Keep all selection inputs unchanged.

## `searchUrls` (type: `array`):

Full Psychology Today search URLs, including any source filters. Overrides location and filter arrays.

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

Full Psychology Today profile URLs to read directly; duplicates are removed. Processed before searches.

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

Specialty slugs in the source issues refinements, such as anxiety or adhd. Combined with AND semantics.

## `insurance` (type: `array`):

Insurance slugs in the source insurance refinements, such as aetna. Combined with AND semantics.

## `filters` (type: `array`):

Other refinement slugs, such as online-counseling, in-person, female or spanish. Ignored with searchUrls.

## Actor input object example

```json
{
  "country": "us",
  "directory": "therapists",
  "maxItems": 20,
  "includeDetails": true,
  "includeWebsite": false,
  "searchUrls": [
    "https://www.psychologytoday.com/us/therapists/ny/new-york"
  ]
}
```

# Actor output Schema

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

Public therapist and psychiatrist directory profiles.

## `output` (type: `string`):

OUTPUT record with the run's counts and status flags.

## `errors` (type: `string`):

Failures with a code and a redacted message. Absent when the run had none.

# 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 = {
    "searchUrls": [
        "https://www.psychologytoday.com/us/therapists/ny/new-york"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/psychology-today-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 = { "searchUrls": ["https://www.psychologytoday.com/us/therapists/ny/new-york"] }

# Run the Actor and wait for it to finish
run = client.actor("s-r/psychology-today-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 '{
  "searchUrls": [
    "https://www.psychologytoday.com/us/therapists/ny/new-york"
  ]
}' |
apify call s-r/psychology-today-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s-r/psychology-today-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/IHtU6RMxlCnHuz0zF/builds/vyUk5aWN4jXPPg1YA/openapi.json
