GoodTherapy Therapist Directory Scraper avatar

GoodTherapy Therapist Directory Scraper

Pricing

Pay per event

Go to Apify Store
GoodTherapy Therapist Directory Scraper

GoodTherapy Therapist Directory Scraper

Scrape public GoodTherapy therapist profiles, specialties, locations, phone numbers, and practice details for lead generation and market research.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Scrape public therapist listings and profile details from GoodTherapy directory pages.

What does GoodTherapy Therapist Directory Scraper do?

GoodTherapy Therapist Directory Scraper extracts therapist lead data from public GoodTherapy search results and profile pages. It is designed for healthcare lead generation, referral research, therapist market mapping, and local behavioral-health analysis.

The actor reads GoodTherapy directory pages such as https://www.goodtherapy.org/therapists/ny/new-york, follows pagination, and saves one clean therapist record per dataset row. You can also pass a direct therapist profile URL or use the city/state shortcut.

Who is it for?

  • πŸ₯ Clinic growth teams building partner and referral lists
  • πŸ“ Local SEO teams mapping therapist supply in a city
  • 🀝 Healthcare partnership teams finding private-practice contacts
  • πŸ“Š Analysts comparing specialties, credentials, and locations
  • 🧭 Referral coordinators researching public therapist directories
  • πŸ§ͺ Data teams enriching CRM records with public source URLs

Why use this actor?

GoodTherapy pages are public, but manually collecting names, profile links, phone numbers, credentials, specialties, and office locations is slow. This actor automates the repeatable collection step and outputs structured JSON, CSV, Excel, and API-ready data through Apify datasets.

What data can it extract?

FieldDescription
nameTherapist or practice contact name
credentialsCredentials shown on the listing
profileUrlGoodTherapy profile URL
photoUrlListing photo URL when available
rolesProfessional roles such as Psychotherapist or Counselor
locationPublic listing location text
cityParsed city when available
stateParsed state when available
postalCodeParsed ZIP/postal code when available
phonePublic telephone link when shown
isVerifiedWhether GoodTherapy marks the listing as verified
isAcceptingClientsAvailability signal when detectable on a profile
profileSnippetPublic listing or meta-description snippet
approachTherapy approach text when profile enrichment is enabled
ageGroupsAge-group chips from profile pages
servicesServices and therapy modes from profile pages
concernsConcerns/challenges addressed from profile pages
officeLocationsPublic office location strings from profile pages
sourceUrlDirectory or profile URL where the record was found
scrapedAtISO timestamp for the scrape

How much does it cost to scrape GoodTherapy therapists?

This actor uses pay-per-event pricing. A small $0.005 start charge covers run setup, and a per-therapist charge is emitted for every saved therapist record. Formula-derived tier pricing starts at $0.000045319 per therapist on the Free tier and $0.000039408 on Bronze, with lower per-item prices on higher Apify tiers.

Quick start

  1. Open the actor on Apify.
  2. Paste a GoodTherapy directory URL, for example https://www.goodtherapy.org/therapists/ny/new-york.
  3. Set maxItems to a small number for a first test.
  4. Keep includeProfileDetails off for faster listing-only runs.
  5. Run the actor and export the dataset.

Input options

GoodTherapy URLs

Use startUrls for directory pages or direct profile pages. Directory pages are the normal mode and support pagination.

City and state shortcut

Set city to a GoodTherapy city slug such as new-york and state to a two-letter state code such as ny. The actor builds a URL like /therapists/ny/new-york.

Maximum therapists

maxItems controls how many therapist records are saved. Use a low number for testing and a higher number for production exports.

Maximum directory pages

maxPages controls pagination per source. GoodTherapy city pages can have many pages, so this setting keeps runs predictable.

Profile enrichment

includeProfileDetails fetches every therapist profile page to extract richer fields such as age groups, concerns, services, office locations, and approach text. It is slower than listing-only mode but provides more complete data.

Example input

{
"startUrls": [
{ "url": "https://www.goodtherapy.org/therapists/ny/new-york" }
],
"maxItems": 25,
"maxPages": 2,
"includeProfileDetails": false
}

Example input using location fields

{
"city": "los-angeles",
"state": "ca",
"maxItems": 20,
"maxPages": 1,
"includeProfileDetails": true
}

Example output

{
"name": "Example Therapist",
"credentials": "LCSW",
"profileUrl": "https://www.goodtherapy.org/therapists/profile/example",
"photoUrl": "https://www.goodtherapy.org/thumbs/160x160/example.jpg",
"roles": ["Clinical Social Worker", "Psychotherapist"],
"location": "New York, 10001",
"city": "New York",
"state": null,
"postalCode": "10001",
"phone": "+12125550123",
"isVerified": true,
"isAcceptingClients": null,
"profileSnippet": "Public listing text...",
"approach": null,
"ageGroups": [],
"services": [],
"concerns": [],
"officeLocations": [],
"sourceUrl": "https://www.goodtherapy.org/therapists/ny/new-york",
"scrapedAt": "2026-05-28T00:00:00.000Z"
}

Tips for best results

  • Start with includeProfileDetails: false to collect listing data quickly.
  • Enable profile enrichment when you need specialties, concerns, or longer descriptions.
  • Use maxPages with city pages to control runtime and cost.
  • Use direct profile URLs if you only need a few known therapists.
  • Export to CSV for outreach workflows or JSON for enrichment pipelines.

Integrations

Use the dataset in CRM imports, healthcare market maps, referral partner databases, spreadsheets, BI tools, or enrichment jobs. Apify can push results through webhooks, API clients, Make, Zapier, or your own ETL process.

API usage with Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/goodtherapy-therapist-directory-scraper').call({
startUrls: [{ url: 'https://www.goodtherapy.org/therapists/ny/new-york' }],
maxItems: 25,
maxPages: 2
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

API usage with Python

from apify_client import ApifyClient
client = ApifyClient('MY_APIFY_TOKEN')
run = client.actor('automation-lab/goodtherapy-therapist-directory-scraper').call(run_input={
'startUrls': [{'url': 'https://www.goodtherapy.org/therapists/ny/new-york'}],
'maxItems': 25,
'maxPages': 2,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

API usage with cURL

curl "https://api.apify.com/v2/acts/automation-lab~goodtherapy-therapist-directory-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"startUrls":[{"url":"https://www.goodtherapy.org/therapists/ny/new-york"}],"maxItems":25,"maxPages":2}'

MCP usage

You can use this actor through the Apify MCP server from Claude Code, Claude Desktop, or compatible MCP clients.

MCP URL:

https://mcp.apify.com/?tools=automation-lab/goodtherapy-therapist-directory-scraper

Claude Code setup:

$claude mcp add apify-goodtherapy "https://mcp.apify.com/?tools=automation-lab/goodtherapy-therapist-directory-scraper"

Claude Desktop JSON config:

{
"mcpServers": {
"apify-goodtherapy": {
"url": "https://mcp.apify.com/?tools=automation-lab/goodtherapy-therapist-directory-scraper"
}
}
}

Example prompts:

  • "Run the GoodTherapy scraper for New York and return therapist names and phone numbers."
  • "Find public GoodTherapy profiles in Los Angeles and summarize the common specialties."
  • "Export GoodTherapy therapist records as CSV for my referral research."

Data quality notes

GoodTherapy profile layouts vary. Some listings expose phone numbers and verified badges; others may not. Profile-enrichment fields depend on what is publicly present on the therapist's profile page.

Legality and ethical use

This actor extracts publicly available information. You are responsible for using the data lawfully, respecting GoodTherapy terms, and following applicable privacy, healthcare, outreach, and anti-spam regulations. Do not use scraped data for deceptive, discriminatory, or unlawful purposes.

FAQ

Why did I get fewer results than requested?

The directory page may contain fewer available profiles than your limit, duplicate profiles may be skipped, or maxPages may be too low. Increase maxPages or use another city URL.

Why are profile details empty?

Profile-enrichment fields only populate when includeProfileDetails is enabled and the profile page publishes those sections. Listing-only runs intentionally leave rich profile fields empty to run faster.

Changelog

0.1

Initial version with HTTP directory scraping, pagination, direct profile URL support, location shortcut input, and optional profile enrichment.

Support

If a GoodTherapy page layout changes or you need additional fields, open an Apify actor issue with an example URL and desired output fields.

Field reference

Use profileUrl as the stable source identifier. Use sourceUrl to understand which directory page produced each row. Use scrapedAt to track freshness in recurring workflows.

Performance guidance

Listing-only mode is the fastest mode. Enrichment mode performs one extra HTTP request per therapist profile, so it is best for smaller or more targeted runs.

Export formats

Apify datasets support JSON, JSONL, CSV, Excel, XML, and RSS exports. Choose JSON/JSONL for pipelines and CSV/Excel for spreadsheet workflows.