Mindbodyonline APImindbodyonline.com ↗
Search fitness and wellness class times near any location, read studio schedules, check course availability, and fetch booking prices via the Mindbody API.
What is the Mindbodyonline API?
The Mindbody API exposes 4 endpoints that cover the full discovery-to-booking flow on Mindbody's Explore marketplace. Use search_classes to find upcoming class times near any city or address, then drill into a studio's daily schedule with get_class_schedule, check day-by-day availability across up to 90 days with get_course_availability, and retrieve per-class-time purchase options — prices, passes, and intro offers — via get_booking_details.
curl -X GET 'https://api.parse.bot/scraper/a4f3826c-786a-40eb-8907-bc1ce986f82d/search_classes?date=2026-10-09&category=Yoga&location=Austin%2C+TX&category_type=fitness' \ -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 mindbodyonline-com-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: Mindbody class search → course availability → booking details."""
from parse_apis.mindbodyonline_com_api import Mindbody, CategoryType, InputNotFound
client = Mindbody()
# Search for yoga classes near Austin, capped at 5 results.
try:
for ct in client.class_times.search(location="Austin, TX", category_type=CategoryType.FITNESS, query="yoga", limit=5):
print(ct.name, ct.start_time_local, ct.location.name, f"{ct.openings}/{ct.capacity} spots")
except InputNotFound:
print("Location could not be resolved; try a different search term.")
# Drill into the first result's course to check upcoming availability.
ct = client.class_times.search(location="Austin, TX", query="yoga", limit=1).first()
if ct is not None:
avail = ct.course.availability(days=14)
print(f"{avail.course_name} at {avail.location.name} ({avail.timezone})")
for day in avail.availability:
print(f" {day.date}: {day.class_count} class(es)")
# Fetch booking/purchase options for that specific class time.
booking = ct.booking_details()
for po in booking.purchase_options:
label = " [intro]" if po.is_intro_offer else ""
print(f" {po.name}: ${po.price} {po.currency_code}{label}")
# Browse the studio's full schedule for the same day.
for sibling in ct.location.schedule(date="2026-10-09", limit=3):
print(sibling.name, sibling.instructor.name, sibling.duration_minutes, "min")
print("exercised: class_times.search / course.availability / booking_details / location.schedule")
Searches upcoming class times near a free-text location (city, address or place name, resolved by the site's own geocoder) for one calendar day in that location's timezone. One result row is one scheduled class time with its course, instructor, studio location, openings and advertised purchase options. Omitting date searches the remainder of today (local time); a date in the past returns an empty list. query is the site's relevance search and matches course, studio and category text loosely (e.g. 'yoga' also surfaces Pilates classes); use category for an exact category match. Results are sorted by start time. Paginated with page and page_size (max 100); total_found is the site's total for the search and has_more says whether a further page exists. Round trips: one geocode plus one search. An unresolvable location yields a stale_input error.
| Param | Type | Description |
|---|---|---|
| date | string | Calendar day to search, ISO YYYY-MM-DD, interpreted in the resolved location's timezone. Omitted = today (local), from the current moment onward. |
| page | integer | 1-based results page. |
| query | string | Free-text relevance search term (class name, studio name, activity). Omitted = all classes. |
| category | string | Exact site category name as shown in class_times[*].category, e.g. 'Yoga' or 'Pilates'. Omitted = all categories. |
| locationrequired | string | Free-text place to search around, e.g. 'Austin, TX' or a street address. Resolved to coordinates and a timezone by the site; the resolution is echoed in resolved_location. |
| page_size | integer | Rows per page, 1-100. |
| radius_miles | integer | Search radius around the resolved location, 1-100 miles. The site treats the radius loosely, so a few results slightly beyond it can appear. |
| category_type | string | Restricts results to one of the site's top-level business types. Omitted = all types. |
{
"type": "object",
"fields": {
"date": "the local calendar day that was searched (YYYY-MM-DD)",
"page": "integer page returned",
"has_more": "boolean: whether page+1 exists",
"page_size": "integer rows per page requested",
"class_times": "array of class time rows: class_time_id, name, category, subcategory, start/end times in UTC and local (with timezone), duration_minutes, capacity, openings, web_openings, waitlistable, free, bookable_after_utc, booking_cutoff_utc, drop_in_price (null when not advertised), purchase_options (id, name, is_single_session, is_intro_offer, retail_price, online_price), booking_ref (opaque string for get_booking_details), course (course_slug, name, description, virtual, image), instructor (name, instructor_slug), location (studio details incl. location_slug, address, coordinates, timezone, distance_miles, rating, currency_code, categories)",
"total_found": "integer: site's total number of matching class times across all pages",
"radius_miles": "integer radius applied",
"resolved_location": "object: how the site resolved the location input (city, region_code, country_code, latitude, longitude, timezone)"
},
"sample": {
"data": {
"date": "2026-10-09",
"page": 1,
"has_more": true,
"page_size": 2,
"class_times": [
{
"free": false,
"name": "Swan Sculpt",
"course": {
"name": "Swan Sculpt",
"image": "https://prodapilymberfitness.mindbodyonline.com/system_stock_images/118/images/original_Web-Image_0005_iStock-936121424_super.jpg?1536882602",
"virtual": false,
"course_slug": "swan-sculpt-black-swan-yoga-3",
"description": "Our Sculpt class is a dynamic, high-energy workout that blends yoga, strength training, and cardio."
},
"capacity": 50,
"category": "Yoga",
"location": {
"city": "Austin",
"name": "Black Swan Yoga Austin",
"phone": "+1 (555) 012-3456",
"state": "TX",
"address": "123 Main St",
"address2": "",
"latitude": 30.2604525,
"timezone": "America/Chicago",
"longitude": -97.7348381,
"categories": [
"Pilates",
"Weight training",
"Yoga"
],
"postal_code": "62704",
"country_code": "US",
"neighborhood": "East Cesar Chavez",
"currency_code": "USD",
"location_name": "Cesar Chavez - Black Swan Yoga",
"location_slug": "black-swan-yoga-3",
"total_ratings": 610,
"average_rating": 4.91,
"distance_miles": 1.085711635963428
},
"openings": 49,
"timezone": "America/Chicago",
"instructor": {
"name": "John Doe",
"instructor_slug": "drew-c0d99506"
},
"booking_ref": "{\"mb_class_id\":241904,\"mb_class_schedule_id\":7520,\"mb_class_description_id\":595,\"mb_site_id\":164427,\"mb_location_id\":5,\"mb_master_location_id\":1876137,\"inventory_source\":\"MB\",\"inventory_category\":\"class_time\"}",
"subcategory": "Yoga sculpt",
"end_time_utc": "2026-10-09T11:45:00Z",
"waitlistable": false,
"web_openings": 49,
"class_time_id": "386745334",
"drop_in_price": null,
"end_time_local": "2026-10-09T06:45:00-0500",
"start_time_utc": "2026-10-09T11:00:00Z",
"duration_minutes": 45,
"purchase_options": [
{
"id": "108333",
"name": "*1 Month Unlimited",
"online_price": 128,
"retail_price": 128,
"is_intro_offer": false,
"is_single_session": false
},
{
"id": "108480",
"name": "1 Week Unlimited",
"online_price": 35,
"retail_price": 35,
"is_intro_offer": false,
"is_single_session": false
}
],
"start_time_local": "2026-10-09T06:00:00-0500",
"bookable_after_utc": "2026-09-18T06:58:28Z",
"booking_cutoff_utc": "2026-10-09T11:00:00Z"
}
],
"total_found": 74,
"radius_miles": 5,
"resolved_location": {
"city": "Austin",
"query": "Austin, TX",
"latitude": 30.267153,
"timezone": "America/Chicago",
"longitude": -97.7430608,
"region_code": "TX",
"country_code": "US"
}
},
"status": "success"
}
}About the Mindbodyonline API
What the API Covers
The Mindbody API surfaces structured data from Mindbody's public Explore marketplace, which aggregates fitness, wellness, and beauty businesses. The four endpoints follow the natural discovery funnel: search → schedule → availability → pricing. Every class time object returned by search_classes and get_class_schedule shares the same field shape, including class_time_id, name, category, subcategory, UTC and local start/end times with timezone, duration_minutes, instructor details, studio location (with location_slug), open spots, and the booking_ref string needed by get_booking_details.
Searching and Filtering Classes
search_classes accepts a free-text location parameter (city name, address, or place name) that the site resolves to coordinates and a timezone. The resolved_location object in the response exposes latitude, longitude, timezone, city, region_code, and country_code, so you can confirm exactly what geography was matched. Results can be narrowed by query (class or studio name), category (e.g. Yoga, Pilates), category_type (top-level business type), date (ISO YYYY-MM-DD), and radius_miles (1–100). The total_found field tells you how many class times matched across all pages; use page and page_size to paginate.
Schedule and Availability
get_class_schedule requires exactly one of course_slug or location_slug — both come from the search_classes response. Pass location_slug to get every upcoming class time at a studio on a given day; pass course_slug to narrow to one class. get_course_availability takes a course_slug and an optional days window (1–90) and returns an availability array of {date, class_count} objects — only days with at least one scheduled class are included — plus total_class_times for the window. This is useful for building calendar views without fetching full schedule data for every day.
Booking Details
get_booking_details takes the opaque booking_ref string from any class time object and returns the full list of purchase options the site offers for that specific class time. Each option in purchase_options includes id, name, description, price, currency_code, is_single_session, is_intro_offer, is_dynamically_priced, session count, validity duration, and activation/expiration dates. The endpoint also decodes site_id, class_id, and location_id from the booking_ref, which can be useful for cross-referencing.
The Mindbodyonline API is a managed, monitored endpoint for mindbodyonline.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when mindbodyonline.com 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 mindbodyonline.com 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 geo-aware fitness class finder using
search_classeswithlocation,category, andradius_milesfilters. - Display a studio's full daily timetable by calling
get_class_schedulewith alocation_slug. - Render a month-view availability calendar for a recurring class using
get_course_availabilitywith a 90-day window. - Show real-time pricing and pass options for a selected class time by calling
get_booking_detailswith thebooking_ref. - Aggregate intro offers across studios in a city by parsing
is_intro_offerflags frompurchase_options. - Track instructor schedules by filtering
search_classesresults by the instructor fields inclass_times. - Compare drop-in prices across studios for the same activity type using
categoryfiltering andget_booking_details.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Mindbody have an official developer API?+
What exactly does `get_booking_details` return, and can I use it to complete a booking?+
How does the `location` parameter in `search_classes` work, and what if the resolved location is wrong?+
location input is a free-text string — city name, street address, or place name — that the site's own geocoder resolves to coordinates and a timezone. The resolved_location object in the response includes the matched latitude, longitude, city, region_code, country_code, and timezone, so you can verify what was resolved. If the resolution is ambiguous, pass a more specific string (e.g. include the state or country). The radius_miles parameter is applied loosely by the site, so a small number of results outside the exact radius may appear.Does the API return historical class data or past schedule dates?+
search_classes and get_class_schedule return upcoming class times only, and get_course_availability covers from the current moment forward up to 90 days. Historical or past-session data is not exposed. You can fork this API on Parse and revise it to add an endpoint if you identify a historical data surface to target.