GoodTherapy Therapist Directory Scraper
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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?
| Field | Description |
|---|---|
name | Therapist or practice contact name |
credentials | Credentials shown on the listing |
profileUrl | GoodTherapy profile URL |
photoUrl | Listing photo URL when available |
roles | Professional roles such as Psychotherapist or Counselor |
location | Public listing location text |
city | Parsed city when available |
state | Parsed state when available |
postalCode | Parsed ZIP/postal code when available |
phone | Public telephone link when shown |
isVerified | Whether GoodTherapy marks the listing as verified |
isAcceptingClients | Availability signal when detectable on a profile |
profileSnippet | Public listing or meta-description snippet |
approach | Therapy approach text when profile enrichment is enabled |
ageGroups | Age-group chips from profile pages |
services | Services and therapy modes from profile pages |
concerns | Concerns/challenges addressed from profile pages |
officeLocations | Public office location strings from profile pages |
sourceUrl | Directory or profile URL where the record was found |
scrapedAt | ISO 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
- Open the actor on Apify.
- Paste a GoodTherapy directory URL, for example
https://www.goodtherapy.org/therapists/ny/new-york. - Set
maxItemsto a small number for a first test. - Keep
includeProfileDetailsoff for faster listing-only runs. - 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: falseto collect listing data quickly. - Enable profile enrichment when you need specialties, concerns, or longer descriptions.
- Use
maxPageswith 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 ApifyClientclient = 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().itemsprint(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.
Related scrapers
- https://apify.com/automation-lab/psychology-today-therapist-scraper
- https://apify.com/automation-lab/google-maps-lead-finder
- https://apify.com/automation-lab/doctor-lead-scraper
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.