GoodTherapy APIgoodtherapy.org ↗
Search GoodTherapy.org therapists by location, specialty, insurance, and more. Extract full profiles with credentials, approach, and contact details.
What is the GoodTherapy API?
The GoodTherapy.org API provides 4 endpoints for searching and extracting therapist data from one of the largest US therapist directories. The search_therapists endpoint returns paginated lists of providers filterable by ZIP code, radius, specialty, insurance, therapeutic model, gender, and pricing. Profile data includes credentials, practice description, verified status, and telehealth availability.
curl -X GET 'https://api.parse.bot/scraper/38ef7adb-b8db-415b-abb1-39e8987b9093/search_therapists?age=3&name=Smith&page=1&miles=1&model=1&gender=1&pricing=free_initial_consultation&zipcode=10001&concerns=2&industry=8&language=1&services=9&insurance=all&specialty=1&accessibility=1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace goodtherapy-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: GoodTherapy SDK — search therapists, browse filters, and drill into profiles."""
from parse_apis.GoodTherapy_org_API import GoodTherapy, Pricing, State, TherapistNotFound
client = GoodTherapy()
# Fetch the filter catalog to discover available specialties and services.
catalog = client.filter_catalogs.get()
print("Specialties available:", type(catalog.availableSpecialties))
# Search for therapists near NYC offering sliding scale pricing.
for therapist in client.therapists.search(zipcode="10001", pricing=Pricing.SLIDING_SCALE, limit=3):
print(therapist.full_name, therapist.city_state, therapist.verified)
# Drill into one therapist's full profile via the instance method.
therapist = client.therapists.search(zipcode="10001", limit=1).first()
if therapist:
try:
profile = therapist.profile()
print(profile.name, profile.phone, profile.verified)
except TherapistNotFound as exc:
print(f"Profile removed: {exc}")
# Browse locations — list cities in California.
for loc in client.locations.list(state=State.CA, limit=5):
print(loc.name, loc.url)
print("exercised: filter_catalogs.get / therapists.search / therapist.profile / locations.list")
Search for therapists by location (ZIP or city), radius, and various filters (specialty, insurance, etc.). Returns a paginated list of therapist summaries. Either zipcode or name should be provided. Results are paginated with approximately 20 therapists per page.
| Param | Type | Description |
|---|---|---|
| age | string | Comma-separated age group IDs from get_facets (e.g. '1,3' for Children and Adults) |
| name | string | Search for a specific therapist by name |
| page | integer | Page number for pagination (1-based) |
| miles | integer | Radius in miles from the zipcode location |
| model | string | Comma-separated therapeutic model IDs from get_facets (e.g. '16,33' for CBT and DBT) |
| gender | string | Comma-separated gender IDs (1: Female, 2: Male, 3: Non-Binary) |
| pricing | string | Comma-separated pricing IDs from get_facets (e.g. 'sliding_scale', 'free_initial_consultation') |
| zipcode | string | ZIP code or city name to search near (e.g. '10001' or 'New York') |
| concerns | string | Comma-separated concern IDs from get_facets (e.g. '1,27' for Abuse and Depression) |
| industry | string | Comma-separated industry IDs from get_facets (e.g. '7,8' for LGBTQ+ and BIPOC) |
| language | string | Comma-separated language IDs from get_facets (e.g. '1,52' for English and Spanish) |
| services | string | Comma-separated service IDs from get_facets (e.g. '9' for Telehealth) |
| insurance | string | Comma-separated insurance company IDs from get_facets (e.g. '12' for Aetna) |
| specialty | string | Comma-separated specialty IDs from get_facets (e.g. '4,7' for Anxiety and Depression) |
| accessibility | string | Comma-separated accessibility IDs from get_facets (e.g. '1,4' for Accessible Parking and Wheelchair Accessible Building) |
{
"type": "object",
"fields": {
"page": "integer current page number",
"therapists": "array of therapist summary objects",
"total_count": "integer total number of matching therapists"
},
"sample": {
"data": {
"page": 1,
"therapists": [
{
"id": 94555,
"slug": "gabe-lopez-social-worker",
"phone": "3232193449",
"verified": true,
"full_name": "Gabe Lopez LMSW",
"image_url": "https://www.goodtherapy.org/thumbs/160x160/dbimages/94555--.jpg",
"last_name": "Lopez",
"city_state": "New York, NY 10001",
"first_name": "Gabe",
"telehealth": false,
"credentials": "LMSW",
"profile_url": "https://www.goodtherapy.org/therapists/profile/gabe-lopez-social-worker",
"organization": "",
"sliding_scale": false,
"practice_summary": "",
"free_consultation": false,
"approach_to_helping": "Looking for a therapist can feel daunting..."
}
],
"total_count": 193
},
"status": "success"
}
}About the GoodTherapy API
Search and Filter Therapists
The search_therapists endpoint accepts a zipcode parameter (ZIP code or city name), a miles radius (1–250), and a set of comma-separated filter IDs covering age groups, therapeutic models, genders, pricing options, and more. Results are paginated via the page parameter and each response includes a total_count integer alongside an array of therapist summaries. Each summary exposes id, full_name, slug, phone, city_state, verified, and telehealth flags. A name parameter lets you search for a specific therapist by name instead of location.
Filter Facets
Before constructing filtered searches, call get_facets to retrieve all valid filter IDs. The response covers availableAges, availableModels, availableGenders, availablePricing, availableConcerns, availableServices, availableCountries, availableLanguages, availableIndustries, and availableInsurances. Each category returns key-name pairs you can pass directly into search_therapists parameters such as model, age, gender, and pricing.
Detailed Therapist Profiles
Pass a slug from search results into get_therapist_profile to retrieve the full profile. The response includes name with credentials, phone, a description string covering the therapist's clinical approach, a verified boolean, and a details object whose keys are section headings (such as specialties, education, and insurance accepted) mapped to arrays of items or text. Slugs follow a name-date format (e.g. jane-smith-20150101) and are stable across requests.
Browse by Location
The browse_locations endpoint lets you enumerate the directory's geographic coverage without a prior search. Called without parameters it returns all US states as name-and-URL objects. Pass a lowercase state abbreviation such as ca or ny to list cities within that state, each with its own directory URL. This is useful for building location-aware tooling or validating coverage before querying a specific area.
The GoodTherapy API is a managed, monitored endpoint for goodtherapy.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when goodtherapy.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official goodtherapy.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a therapist-finder app that filters by ZIP code, insurance, and therapeutic model using search_therapists
- Aggregate therapist profiles with credentials and practice descriptions for a mental health resource directory
- Identify telehealth-available providers in a given radius using the telehealth flag on therapist summaries
- Map therapist density by state or city using browse_locations combined with search_therapists pagination
- Populate a CRM with therapist contact data and verified status from get_therapist_profile
- Research therapeutic model availability (e.g. CBT, DBT) across US metro areas using model filter IDs from get_facets
- Monitor new or updated therapist listings by periodically querying search_therapists for a target ZIP code
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.