Skip to main content
RapidDev - Software Development Agency
bubble-integrationsBubble API Connector

Mindbody

Mindbody's Public API v6 is developer-accessible via developers.mindbodyonline.com and uses an API key plus a SiteId header — both marked Private in Bubble's API Connector so credentials never reach the browser. This guide covers setting up class schedule queries, client authentication via the usertoken endpoint, and building a booking workflow in Bubble. Sandbox SiteId -99 lets you test without affecting live studio data.

What you'll learn

  • How to register at developers.mindbodyonline.com and get your API key and studio SiteId
  • How to configure the Bubble API Connector with Private API-Key and SiteId shared headers
  • How to use Mindbody's sandbox (SiteId -99) to test without affecting live studio data
  • How to query the /v6/class/classes endpoint and display results in a Bubble Repeating Group
  • How to authenticate individual clients via the /v6/usertoken/issue endpoint and use the returned AccessToken for booking calls
  • How to wire a complete class booking flow: date picker → class list → Book button → success state
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate20 min read3–5 hoursHealth & FitnessLast updated July 2026RapidDev Engineering Team
TL;DR

Mindbody's Public API v6 is developer-accessible via developers.mindbodyonline.com and uses an API key plus a SiteId header — both marked Private in Bubble's API Connector so credentials never reach the browser. This guide covers setting up class schedule queries, client authentication via the usertoken endpoint, and building a booking workflow in Bubble. Sandbox SiteId -99 lets you test without affecting live studio data.

Quick facts about this guide
FactValue
ToolMindbody
CategoryHealth & Fitness
MethodBubble API Connector
DifficultyIntermediate
Time required3–5 hours
Last updatedJuly 2026

Build a Custom Fitness Studio Booking Portal on Bubble with the Mindbody API

Mindbody is the platform that runs the backend for tens of thousands of yoga studios, gyms, and wellness centers worldwide. While Mindbody provides its own booking interface for clients, many studio owners want a custom experience: a booking portal that matches their brand, appears embedded in their existing website, or extends Mindbody's functionality in ways the native interface does not support.

The Mindbody Public API v6 makes this possible. Unlike some APIs in this category that require partner program approval or obscure signing algorithms, Mindbody's developer portal at developers.mindbodyonline.com provides self-service access for studios with active subscriptions. You register, receive an API key, identify your studio's SiteId (a number Mindbody assigns to each location), and you can start making API calls within minutes.

In Bubble, the integration lives entirely in the API Connector plugin. Your API key and SiteId go in the shared headers section, both marked Private — Bubble runs API Connector calls from its servers, so these credentials never appear in a user's browser network inspector. Class schedule queries are simple GET calls with date parameters. Booking requires one additional step: authenticating the client against Mindbody to get a short-lived AccessToken, which you then use on the booking call. This two-step auth pattern is the main conceptual hurdle in the Mindbody integration, and this guide walks through it in detail.

Mindbody provides a sandbox environment using SiteId -99. All calls made with SiteId -99 use Mindbody's test data and do not create real bookings for real clients. Use this throughout development. Switching to your production SiteId is a one-line change when you are ready to go live.

For Backend Workflows (to receive Mindbody push notifications about booking confirmations), a paid Bubble plan is required. If your use case is class schedule display and booking without webhooks, the integration works on any Bubble plan.

Integration method

Bubble API Connector

The Bubble API Connector calls https://api.mindbodyonline.com/public/v6 with API-Key and SiteId in Private shared headers. Client-level booking calls additionally require a per-session usertoken obtained from the /v6/usertoken/issue endpoint.

Prerequisites

  • An active Mindbody subscription for your studio — the Public API v6 is included with an active subscription (verify current terms at developers.mindbodyonline.com)
  • A developer account registered at developers.mindbodyonline.com with an API key for your studio
  • Your studio's Mindbody SiteId — a numeric identifier visible in your Mindbody account settings or provided in the developer portal
  • The Bubble API Connector plugin installed in your app (Plugins tab → Add plugins → API Connector by Bubble)
  • A test Mindbody client account with known email and password for testing the usertoken and booking flows (use sandbox SiteId -99 for all development)

Step-by-step guide

1

Step 1: Get Your Mindbody API Key and SiteId

Before configuring anything in Bubble, you need two pieces of information from Mindbody: your API key and your studio's SiteId. Get your API key Go to developers.mindbodyonline.com. If you do not have a developer account, click Sign Up and create one using your studio's Mindbody credentials. Once logged in, navigate to the API Keys section and create a new API key for your application. Give it a descriptive name (e.g., Bubble Custom Portal). Copy the API key value — you will paste it into the Bubble API Connector in the next step. Get your SiteId Your SiteId is a numeric identifier that Mindbody assigns to your studio location. Find it in one of these places: - The Mindbody developer portal under your account information - Your Mindbody software settings under Account → Site Details - In the URL when you are logged into your Mindbody manager account (often visible as a numeric segment in the URL path) For development and testing, use SiteId -99. This is Mindbody's official sandbox environment — all API calls with SiteId -99 use Mindbody's test data and create no real bookings for real clients. It is essential to use -99 throughout development so you do not accidentally create fake bookings for real studio clients. Verify API access Before setting up Bubble, verify that your API key is active by testing a simple call in an API testing tool (like Postman or any browser-based REST client). Send a GET to https://api.mindbodyonline.com/public/v6/class/classes with headers API-Key: your-key and SiteId: -99. If you receive a 200 response with class data, your credentials are valid. If you receive a 401, double-check the API key. If you receive a 403, your Mindbody subscription may not include API access — contact Mindbody support.

mindbody-credential-test.json
1{
2 "Test call (verify credentials)": {
3 "method": "GET",
4 "url": "https://api.mindbodyonline.com/public/v6/class/classes",
5 "headers": {
6 "API-Key": "<your_api_key>",
7 "SiteId": "-99"
8 }
9 }
10}

Pro tip: If you manage multiple studio locations under one Mindbody account, each location has its own SiteId. Make sure you are using the SiteId for the specific location you want to display data for. Using the wrong SiteId returns data for the wrong studio.

Expected result: You have a valid Mindbody API key and know your studio's production SiteId. You have verified both credentials work with a test call to the Mindbody sandbox (SiteId -99).

2

Step 2: Configure the Bubble API Connector with Private Headers

Set up the API Connector plugin in Bubble with the Mindbody credentials as Private shared headers. Install the API Connector In the Bubble editor, click the Plugins tab in the left panel. Click Add plugins and search for API Connector. Select API Connector by Bubble and click Install. Click on the installed plugin to open the configuration panel. Create the Mindbody API group In the API Connector panel, click Add another API. Configure: - API Name: Mindbody - Authentication: None or self-handled - Shared headers (applied to every call in this group): - Header name: API-Key, value: your Mindbody API key — check the Private checkbox - Header name: SiteId, value: -99 (for development; you will change this to your production SiteId before launch) — the Private checkbox is optional for SiteId if you consider it non-sensitive, but marking it Private adds a layer of protection against exposing your specific studio location to client-side inspection - Header name: Content-Type, value: application/json (for POST calls) Why Private matters: Bubble runs API Connector calls from Bubble's servers, not from the user's browser. When a header is marked Private, Bubble also prevents the value from appearing in any client-side JavaScript it generates for your app. This means a user who opens browser developer tools and inspects network traffic will never see your API-Key. Without the Private checkbox, the key could theoretically be visible in Bubble's client-side code. Do not put client AccessTokens (from the usertoken endpoint) in the shared headers — those are per-user and per-session tokens that go in individual API call headers, not the shared group headers.

mindbody-api-connector-config.json
1{
2 "Mindbody API group config": {
3 "API Name": "Mindbody",
4 "Authentication": "None or self-handled",
5 "Shared headers": [
6 { "key": "API-Key", "value": "<your_api_key>", "private": true },
7 { "key": "SiteId", "value": "-99", "private": true },
8 { "key": "Content-Type", "value": "application/json", "private": false }
9 ]
10 }
11}

Pro tip: During development, keep SiteId set to -99 in the shared headers. Before launching to production, change it to your real SiteId. Consider using Bubble's App Settings → Environment Variables to manage the SiteId switch between dev and production environments.

Expected result: The Mindbody API group is created in the API Connector with API-Key and SiteId as Private shared headers pointing at the sandbox environment. No individual calls have been configured yet.

3

Step 3: Add and Initialize the Class Schedule Call

Add the class schedule GET call and initialize it so Bubble can detect the response structure and expose it as a data source for Repeating Groups. Add the Get Classes call Inside the Mindbody API group, click Add another call. Configure: - Call name: Get Classes - Method: GET - URL: https://api.mindbodyonline.com/public/v6/class/classes - Use as: Data (this binds the call result to page elements directly) - Parameters (query string): - StartDateTime: a start date-time in ISO 8601 format, e.g., 2026-07-10T00:00:00 (you will make this dynamic later) - EndDateTime: an end date-time, e.g., 2026-07-10T23:59:59 - HideCancelledClasses: true (omit cancelled classes from results) Initialize the call Click Initialize call. Bubble sends a real GET request to the Mindbody sandbox with SiteId -99. If the sandbox returns classes for the specified date range, Bubble detects the response structure: a Classes array where each item has fields like ClassDescription.Name, StartDateTime, EndDateTime, MaxCapacity, TotalBooked, Staff.Name, and Location.Name. After successful initialization, all detected fields become available in Bubble's expression editor. If the initialize call returns an empty Classes array (no classes scheduled in the sandbox for that date), Bubble may not detect the field structure. Try different dates or use a date range that is known to have sandbox data. The Mindbody sandbox (SiteId -99) has pre-populated class data on specific dates. Make the dates dynamic After initialization, go back to the Get Classes call parameters and replace the hardcoded date strings with dynamic expressions. Set StartDateTime and EndDateTime to accept values from page inputs. Bubble will prompt you to provide these values when you bind the call to a Repeating Group.

mindbody-get-classes.json
1{
2 "Get Classes call": {
3 "method": "GET",
4 "url": "https://api.mindbodyonline.com/public/v6/class/classes",
5 "params": {
6 "StartDateTime": "<start_datetime>",
7 "EndDateTime": "<end_datetime>",
8 "HideCancelledClasses": "true"
9 },
10 "headers": {
11 "API-Key": "<private>",
12 "SiteId": "<private>"
13 }
14 }
15}

Pro tip: The Mindbody API Connector Initialize call must return a real successful response to unlock the call as a data source. Use the sandbox (SiteId -99) and try date ranges one or two weeks in the future — the Mindbody sandbox has pre-seeded upcoming class schedules. If Initialize fails with 'There was an issue setting up your call', check the Logs tab for the specific HTTP status code returned.

Expected result: The Get Classes call is initialized. Bubble has detected the response fields from the Classes array. The call is available as a Data source when configuring Repeating Group data sources on your page.

4

Step 4: Add the Client UserToken Call for Booking Authentication

Booking a class on behalf of a specific client requires a second level of authentication. Mindbody issues a short-lived AccessToken (usertoken) per client. You must call the /v6/usertoken/issue endpoint with the client's Mindbody email and password to get this token, then use it in the booking call. Add the Issue UserToken call In the Mindbody API group, click Add another call. Configure: - Call name: Issue UserToken - Method: POST - URL: https://api.mindbodyonline.com/public/v6/usertoken/issue - Body type: JSON - Body: { "Username": "<client_email>", "Password": "<client_password>" } - Use as: Action (this is called from a button workflow, not displayed directly in a data element) Click Initialize call. Use a test client account's email and password in the sandbox. Mindbody returns an AccessToken and a UserId. After successful initialization, these fields are available as outputs of the Action in Bubble workflows. Store the AccessToken in App State Do not store the client's Mindbody password in Bubble's database. Only store the AccessToken, and only for the duration of the user's session. Add a custom state to the page (type: text, name: mindbody_access_token). In the workflow that calls Issue UserToken, add a Set state action immediately after: set mindbody_access_token to Result of Step 1's AccessToken. When the user closes the browser or navigates away, the page state clears automatically. The AccessToken is never persisted to the database — only used during the active session. Never pass Mindbody client credentials through a URL parameter or page state that persists across sessions. Always use the usertoken flow to get a fresh, short-lived token for each session.

mindbody-issue-usertoken.json
1{
2 "Issue UserToken call": {
3 "method": "POST",
4 "url": "https://api.mindbodyonline.com/public/v6/usertoken/issue",
5 "headers": {
6 "API-Key": "<private>",
7 "SiteId": "<private>",
8 "Content-Type": "application/json"
9 },
10 "body": {
11 "Username": "<client_email>",
12 "Password": "<client_password>"
13 }
14 }
15}

Pro tip: Client tokens from /usertoken/issue are short-lived. If a user's Bubble session is active longer than the token TTL (verify the expiry in the Mindbody developer docs), subsequent booking calls will fail with 401. Store the token issue time alongside the token and re-authenticate automatically if the token is approaching expiry.

Expected result: The Issue UserToken call is initialized and available as an Action in Bubble workflows. When triggered with a client's Mindbody email and password, it returns an AccessToken stored in page state. No client credentials are persisted to Bubble's database.

5

Step 5: Add the Book Class Call and Wire the Full Booking Workflow

With the class schedule call and usertoken call configured, add the booking action and connect everything into a complete user-facing flow. Add the Book Class (addclienttoclass) call In the Mindbody API group, click Add another call. Configure: - Call name: Book Class - Method: POST - URL: https://api.mindbodyonline.com/public/v6/class/addclienttoclass - Body type: JSON - Body: { "ClassId": <class_id>, "ClientId": "<client_mindbody_id>" } - Additional header (on this specific call, not shared): Authorization: Bearer <access_token> - Use as: Action The Bearer token in the Authorization header is the AccessToken obtained from the usertoken call. The ClientId is the Mindbody client ID returned alongside the AccessToken when you called /v6/usertoken/issue. Store it in a second page custom state (mindbody_client_id). Build the booking page UI Create a page called class-booking. Add: - A Date Input at the top (label: Select a date) - A Repeating Group with data source: Get data from an external API → Mindbody — Get Classes, with StartDateTime wired to the Date Input's value at start of day and EndDateTime wired to the Date Input's value at end of day - Inside the Repeating Group: text elements for class name (Classes's ClassDescription Name), instructor (Classes's Staff Name), start time (Classes's StartDateTime formatted as time), and spots remaining (Classes's MaxCapacity minus Classes's TotalBooked) - A Book This Class button on each row - A popup (Group Focus or Popup element) that appears when Book is clicked, containing email and password inputs and a Confirm Booking button Wire the booking workflow on Confirm Booking: 1. Call Mindbody — Issue UserToken with Email = email input, Password = password input 2. Set state mindbody_access_token to Result of Step 1's AccessToken 3. Set state mindbody_client_id to Result of Step 1's UserId 4. Call Mindbody — Book Class with ClassId = Parent Group's ClassId (the class the user was viewing when they clicked Book) and ClientId = page state mindbody_client_id, with Bearer header = page state mindbody_access_token 5. Show a success popup: Class booked! Check your email for confirmation. RapidDev's team has built custom booking portals on Bubble for fitness studios integrating with Mindbody's API — if you need help wiring the complete booking flow or handling edge cases like waitlists and cancellations, book a free scoping call at rapidevelopers.com/contact.

mindbody-book-class.json
1{
2 "Book Class call": {
3 "method": "POST",
4 "url": "https://api.mindbodyonline.com/public/v6/class/addclienttoclass",
5 "headers": {
6 "API-Key": "<private>",
7 "SiteId": "<private>",
8 "Content-Type": "application/json",
9 "Authorization": "Bearer <access_token>"
10 },
11 "body": {
12 "ClassId": "<class_id>",
13 "ClientId": "<client_mindbody_id>"
14 }
15 }
16}

Pro tip: Test the booking flow end-to-end using the Mindbody sandbox (SiteId -99) before switching to your production SiteId. The sandbox has pre-created client accounts for testing — check the Mindbody developer portal for the sandbox test credentials. Calling the live API with your production SiteId during development creates real bookings that real clients may receive confirmation emails for.

Expected result: The full booking flow is wired: user selects a date, sees classes, clicks Book, enters Mindbody credentials in a popup, and the workflow issues a usertoken then books the class. A success message confirms the booking. The entire flow uses the sandbox SiteId -99 during development.

6

Step 6: Add Privacy Rules, Switch to Production, and Test

Before going live, add Privacy rules for any data stored in Bubble's database, switch from the sandbox to your production SiteId, and test the complete flow. Add Privacy rules If you store any Mindbody data in Bubble's database (for example, a BookingRecord Data Type logging each booking), go to Data → Privacy → BookingRecord and add a rule: When Current User is BookingRecord's user — all fields visible. Client booking history is personal data and should only be readable by the client it belongs to. Switch to production In the API Connector, go to the Mindbody API group and update the SiteId shared header value from -99 to your real studio SiteId. This single change switches all calls from the sandbox to your live Mindbody account. Double-check before clicking away — the production SiteId connects to real client accounts and live booking data. Test the production connection In Bubble's preview mode, load the class booking page with the production SiteId configured. Verify: - Classes appear for the current date range (your studio must have classes scheduled) - The class details (instructor name, capacity, time) are correct - Test the booking flow using a real Mindbody client account at your studio — confirm the booking appears in Mindbody's manager console - Check the Logs tab → Workflow logs to verify no 401 or 429 errors Monitor WU consumption Each API Connector call to Mindbody consumes WU on your Bubble plan. For a class booking page that loads on page open (triggering the Get Classes call), estimate WU per call from the Logs tab and project monthly WU usage based on expected visitor volume. If your studio attracts high traffic, consider caching class schedule data in a Bubble Data Type that refreshes hourly rather than querying Mindbody on every page load.

Pro tip: Rate limits apply to the Mindbody Public API v6 and vary by subscription tier. If you plan to build a high-traffic page (class schedules viewed hundreds of times per day), verify your rate limit with Mindbody at developers.mindbodyonline.com. If the schedule does not change frequently, caching it in a Bubble Data Type for 15–60 minutes significantly reduces API calls and WU consumption.

Expected result: The app is running against the production Mindbody API, classes appear correctly, and the booking flow creates real bookings in Mindbody's system. Privacy rules are in place for any locally stored data. WU consumption has been checked in the Logs tab.

Common use cases

Custom Class Schedule and Booking Widget

Embed a branded class schedule on a studio's Bubble website. Users select a date, see available classes for that day (name, instructor, start time, spots remaining), and click Book to reserve a spot. The booking call authenticates the client via their Mindbody credentials and calls the addclienttoclass endpoint. Replace Mindbody's generic booking interface with a custom experience that matches the studio's visual brand.

Bubble Prompt

Build a Bubble class booking page: a date picker at the top, a Repeating Group below showing today's classes from the Mindbody API (class name, instructor, start time, available spots), and a Book button on each row. When clicked, show an email and password input for the client's Mindbody account, call /v6/usertoken/issue to get an AccessToken, then call /v6/class/addclienttoclass with that token.

Copy this prompt to try it in Bubble

Member Portal with Visit History and Upcoming Bookings

Build a member-facing dashboard in Bubble where clients see their upcoming booked classes, past visit history, and current membership status — all pulled from Mindbody. Use the client's Mindbody AccessToken (stored in the session) to call client-authenticated endpoints and display personalized data without the client needing to log in to Mindbody's own interface.

Bubble Prompt

Build a Bubble member portal: after the client enters their Mindbody email and password to get an AccessToken, show their upcoming classes (GET /v6/class/classchedule filtered to booked), their recent visits (GET /v6/client/clientvisits), and their active membership type from Mindbody's client endpoint.

Copy this prompt to try it in Bubble

Instructor and Staff Management Dashboard

Build an internal Bubble tool for studio managers to view the week's class schedule across multiple instructors, see enrollment numbers for each class, and identify under-enrolled sessions that need promotion. Use the business-level API-Key authentication (no per-client token needed) to query class data without any client login requirement.

Bubble Prompt

Build a Bubble internal dashboard for studio managers: a week-view calendar showing all classes from the Mindbody API (instructor, class name, enrolled vs. capacity), with a flag on any class below 50% capacity. Allow managers to click a class to see the full enrollment list from GET /v6/class/classchedule.

Copy this prompt to try it in Bubble

Troubleshooting

API Connector calls return 401 Unauthorized

Cause: The API-Key header value is incorrect, the API key has been deactivated in the Mindbody developer portal, or the SiteId does not match the studio associated with the API key.

Solution: Open the API Connector and re-verify the API-Key header value. Copy it directly from developers.mindbodyonline.com without extra whitespace. Confirm the SiteId is either -99 (sandbox) or your correct production studio SiteId. Re-initialize the Get Classes call after correcting the values.

The API Connector Initialize call fails with 'There was an issue setting up your call'

Cause: The Initialize call requires a real successful response with class data. If no classes are scheduled in the sandbox for the specified date range, the response has an empty Classes array and Bubble cannot detect the field structure.

Solution: Try different date ranges when initializing. The Mindbody sandbox (SiteId -99) has pre-seeded class data on specific dates — check the Mindbody developer documentation for sandbox data availability. Alternatively, try StartDateTime of today and EndDateTime of one month from today to maximize the chance of finding sandbox classes.

Booking calls return 401 with 'Authorization failed' after successfully getting a usertoken

Cause: The client AccessToken from /usertoken/issue is short-lived. If time passed between token issuance and the booking call (user stayed on the confirmation screen), the token expired. Alternatively, the Bearer token is not being passed correctly in the Authorization header of the Book Class call.

Solution: Verify that the Authorization header on the Book Class call is set to Bearer followed by the page state mindbody_access_token value. Check that the token is being read from page state correctly. If the token TTL is too short for your UX flow, re-issue the token immediately before the booking call rather than after the usertoken step.

Sandbox SiteId -99 returns correct data but production SiteId returns empty results

Cause: No classes are scheduled in the production Mindbody account for the date range being queried, or the API key is associated with a different studio than the production SiteId.

Solution: In the Mindbody manager console, verify that classes are scheduled for the dates you are querying. Confirm that the production SiteId matches the studio associated with your API key. If you have multiple studio locations, each has a unique SiteId — verify you are using the correct one.

Using the production SiteId during development created real bookings for studio clients

Cause: The SiteId was set to the production studio SiteId instead of the sandbox (-99) during testing.

Solution: Always keep SiteId set to -99 during development. Use Bubble's App Settings → Environment Variables or a simple text Data Type storing the current SiteId to make switching between sandbox and production a single-place change. Before switching to production, manually cancel any test bookings created in the production Mindbody system via the manager console.

Best practices

  • Always develop and test with Mindbody's sandbox SiteId -99. It provides real API behavior with test data and prevents accidental creation of fake bookings for real studio clients.
  • Mark both the API-Key and SiteId headers as Private in the Bubble API Connector. Bubble proxies calls server-side, but the Private checkbox adds the additional guarantee that these values cannot appear in any client-side JavaScript generated for your app.
  • Never store Mindbody client passwords in Bubble's database. Use the /usertoken/issue endpoint to get a short-lived AccessToken per session and store only the token (in page state, not the database) for the duration of the session.
  • Add Bubble Privacy rules to any Data Type that stores Mindbody booking history or client records. Set visibility to Current User is record's user — Mindbody booking data is personal information about individual clients.
  • Cache class schedule data for pages that show the same schedule to many visitors. Rather than querying Mindbody's API on every page load, store the schedule in a Bubble ClassCache Data Type and refresh it every 15–60 minutes. This reduces WU consumption and API rate limit pressure significantly.
  • Build error handling into every booking workflow. A failed booking call (class full, client already booked, expired token) should display a specific, actionable error message rather than a blank state or silent failure.
  • Test the full end-to-end booking flow in Bubble's preview mode using the sandbox before deploying. Include edge cases: class at full capacity, client already booked for the class, invalid client credentials.
  • Monitor WU consumption per API call in the Logs tab during your beta period. For high-traffic booking pages, WU costs scale with visitor volume — project monthly WU usage and adjust your Bubble plan if needed before launch.

Alternatives

Frequently asked questions

Do I need a paid Bubble plan to use the Mindbody API?

Not necessarily for the basic integration. API Connector calls (outbound requests from Bubble to Mindbody) work on all Bubble plans including the free plan. You need a paid plan (Starter at $32/month or higher) only if you want to receive Mindbody push webhook notifications via a Backend Workflow. The class schedule query and booking flows described in this guide work on any Bubble plan.

What is SiteId -99 and when should I use it?

SiteId -99 is Mindbody's official sandbox environment. All API calls made with SiteId -99 use Mindbody's test data — pre-seeded class schedules, test client accounts, and sandbox booking records. No real studio data is affected and no real clients receive booking confirmations. Use SiteId -99 for all development and testing. Switch to your production SiteId only when you are ready to go live.

Why do client bookings require a separate usertoken step?

Mindbody's API has two levels: business-level access (viewing class schedules, studio information) uses your API-Key and SiteId. Client-level access (booking on behalf of a specific person) requires authenticating as that specific client to get their AccessToken. This two-level model ensures that your API key cannot book or cancel classes for arbitrary clients without their credentials — each booking is explicitly authorized by the client whose Mindbody account is being used.

How do I handle class waitlists in the Bubble booking flow?

Mindbody's API supports waitlists via the addclienttoclasswaitlist endpoint (POST /v6/class/addclienttoclasswaitlist). When a booking call fails because a class is full, check the error response for a capacity-exceeded indication and add a second step in your workflow that calls the waitlist endpoint instead. Store a WaitlistEntry record in Bubble's database so users can see their waitlist position on the member portal.

Can I display Mindbody class schedules without requiring clients to log in?

Yes. The GET /v6/class/classes endpoint is business-level authenticated — it requires only your API-Key and SiteId (both Private in the API Connector), not a client AccessToken. You can display the full class schedule including names, times, instructors, and availability to any visitor without requiring them to log in. Only the booking action (addclienttoclass) requires the client to authenticate via the usertoken endpoint.

What happens if Mindbody's rate limit is reached?

Mindbody's API will return 429 Too Many Requests. The exact rate limit depends on your subscription tier — verify current limits at developers.mindbodyonline.com. If you are hitting rate limits, implement a caching strategy: store the class schedule in a Bubble Data Type and refresh it from the Mindbody API every 15–60 minutes instead of on every page load. This reduces API calls dramatically for high-traffic booking pages.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire Bubble integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.