Build tools for your classes, bookings, and work, or connect software that helps run a studio. Each connection is limited to its selected permissions and account or organization.
Examples for Willow (example studio) use /api/v1/o/willow. Replace willow with your studio’s ID.
Choose what you’re connecting
Your own account
Use a personal API key to find classes, read your benefits, book or cancel for yourself, and manage eligible work coverage. A staff role does not turn this key into a studio administration key.
Open your account’s API tab or API access, then manage keys. Choose only the permissions your tool needs, copy the key once, and keep it in secure settings. Revoke it from the same page.
For schedules, people, staffing, messages, inventory, and other management workflows, an authorized administrator can create a scoped organization token in studio Settings.
The token needs the exact operation scope and your current role must allow the action at the requested location. Read the live manifest to learn what this connection can do.
Review the exact class, recipient, or record before a write. Follow each operation’s confirmation and retry contract. If a result is uncertain, keep the same request ID and arguments, then read the current result before trying a different action.
Assistants and shortcuts
MCP clients
Connect a client that supports Streamable HTTP and a Bearer header to your personal account endpoint:
The server advertises the tools allowed by that key. Store the key in the client’s secure authentication settings.
Siri and ChatGPT
On iPhone, open Account, then API access and Siri & Shortcuts. Enable Siri there to create its dedicated connection and confirm booking changes when prompted.
To use your studio in ChatGPT on the web or your phone, open your studio account’s API tab and choose Connect ChatGPT. Sign in with your usual studio account and review the requested permissions. Return to ChatGPT and select the studio connection to start a conversation. Available tools follow your current role; staff tools require staff access. Revoke the connection from your account’s API tab at any time.
ChatGPT connections are available for studios with a configured integration.
For a private assistant that imports an OpenAPI schema and supports a personal Bearer key, use https://vuoma.com/api/v1/platform/developers/account/openapi.json. Anyone able to use a shared assistant configured with your key may act on your account, so keep that connection private.
Product integrations and shared sign-in
Check purchased products
In studio Settings, open API access and create a Read-only product integration. Select the exact products and read permissions. This key belongs to the organization and remains usable independently of its creator’s personal role; administrators can revoke it at any time.
Keep the key on your server. Read /api/v1/o/willow/integrations/products for permitted products, then query purchases for a signed-in person. Replace both placeholder IDs in this example:
Check on sign-in or periodically, following next_cursor until it is empty. Native commerce offers, payment programs, and explicitly mapped imported products are supported. Select each relevant product or archived edition; names alone never grant access.
Your app decides which purchase statuses qualify for access. Account for refunds, disputes, cancellation, and outstanding installments. For imported history, inspect verification, source_status, and source_recorded_at; an old receipt does not establish current enrollment. Unknown balances and disputes remain null.
Monetary fields have an amount_scope: an order total may repeat across its product lines and must not be summed per line.
Sign in with a studio account
In studio Settings, open Connected apps and register your app’s exact HTTPS callback URLs. Copy the client ID and discovery URL into an OpenID Connect client library:
Use the authorization code flow with S256 PKCE, a fresh state, and a fresh nonce. Members sign in with their existing studio account and approve the identity fields your app requests. Use the authorization URL supplied by discovery.
Your server exchanges the returned code and validates the ID token’s signature, issuer, audience, expiry, and nonce. Use person_id with the purchase endpoint; do not link accounts by an unverified email address.
Sign-in grants identity only. Your organization key separately grants product reads. Identity tokens expire after ten minutes; refresh tokens are not issued. Your app manages its own session and access checks. Revoking a connection prevents further sign-ins and token use, but does not end sessions your app has already created.
Studio websites and apps
Studio sign-in uses /api/v1/o/willow/auth. Authenticated profile, booking and other self resources use /api/v1/o/willow/me with each operation’s required studio or Vuoma credential. Personal API keys use /api/v1/o/willow/personal. Public data and management operations use their documented paths under /api/v1/o/willow.
Build websites with SvelteKit and SvelteKit UI, and mobile apps with React Native. The public packages below reuse Vuoma’s account UI and API contracts while your website or app keeps its own branding.
Install the package versions shown below and commit your lockfile. Package installation supplies UI and transport; your studio still needs its account, email delivery and booking configuration. These packages do not register an Apple app or grant access to a member account.
Websites with @vuoma/svelte
Svelte 5 account entry, dashboards, profiles, memberships, bookings and credit transfers. Use the existing SvelteKit UI controls and managers for accessible forms, navigation and your theme.
Import the session adapter only in server files. Replace YOUR_STUDIO_ID with your exact eight-character studio ID. It is public configuration; an organization API secret is not needed to sign a member in.
// src/lib/server/vuoma.js — server code only
import { create_member_site_adapter } from '@vuoma/svelte/server/member-site'
export const memberSite = create_member_site_adapter({
organization_slug: "YOUR_STUDIO_ID",
api_origin: "https://vuoma.com",
})
// src/hooks.server.js — merge with your existing hook
import { memberSite } from '$lib/server/vuoma'
export async function handle({ event, resolve }) {
await memberSite.restore(event)
return resolve(event)
}
// src/routes/api/member/session/[action]/+server.js
import { memberSite } from '$lib/server/vuoma'
export const POST = (event) => memberSite.action(event, event.params.action)
Create the account manager in your owning feature manager, pass a live member identity getter, and refresh your loader after sign-in. The view connects its manager lifecycle.
The same-origin action installs Secure HttpOnly session cookies and validates Origin and the action header. Send only display-safe member fields from loaders; never serialize access or refresh tokens. Signup and email activation require the studio’s configured backend and verified email sender.
Apps and API clients with @vuoma/sdk
A framework-neutral JavaScript and TypeScript client for public studio reads, signup and email verification, password setup, sign-in, profile, commerce, class and appointment bookings, cancellation and reconciliation. Use it with React Native or your website’s backend. Keep the same request ID when reconciling an uncertain booking; the client does not silently retry a purchase or booking.
Each studio app includes its studio slug as public configuration. No app registration or public app key is needed. Public schedule and catalog requests can be made without signing in.
import { createVuomaClient } from '@vuoma/sdk'
const vuoma = createVuomaClient({
apiOrigin: "https://vuoma.com",
organizationSlug: "willow",
fetch: globalThis.fetch,
})
const bootstrap = await vuoma.public.getBootstrap()
const catalog = await vuoma.public.getCatalog() // Public studio data only.
Native member requests send the signed-in member’s bearer token. The server verifies the live session, studio membership and current permissions; changing the studio slug cannot grant access to another studio. Your host owns refresh and logout: keep access tokens in memory and refresh tokens in Keychain or Keystore through a secure-storage adapter.
The SDK rejects organization API secrets, platform-account tokens and identity-only OAuth tokens in its member client. Private native calls use the member’s explicit Bearer token. Browser cookie requests keep their same-origin protections. For browser account requests, use your same-origin server adapter.
Native member UI with @vuoma/react-native-ui
Use the same sign-in, account details, email-code verification, new-password and booking-review components as Vuoma’s apps. Supply your own logo, theme, fonts and callbacks. The components handle presentation and accessible controls; your host owns navigation, secure session storage and SDK requests.
The SDK, web UI and native UI include the Vuoma Connected Application License. You may use, modify and distribute them in apps connected to Vuoma, including commercial studio apps and local development with mocked responses. The license does not cover a replacement backend or grant API access.
REWILD, Ebb & Float, Third Place and Vuoma compose these public components within their app screens. Studio-member signup and booking use the public SDK. Brand artwork, platform-account integration, navigation and the complete app shell remain private.
Vuoma’s universal app uses its independent global account API and session independently of studio-member sessions. Keep organization integration keys, Supabase secret keys, provider tokens and signing keys on trusted servers in every app setup. A studio slug or registered OAuth client ID is public configuration and grants no member account access by itself. Use each route’s documented credential; changing a URL or installing a package never expands its permissions.
Operation reference
Browse documented operations here. Your connection’s permissions determine which are available.
25 of 798 operations
My bookings
Personal key
GET /api/v1/o/willow/personal/bookings
Book a class
Personal key
POST /api/v1/o/willow/personal/bookings
Cancel my booking
Personal key
POST /api/v1/o/willow/personal/bookings/{booking_id}/cancel
My benefits
Personal key
GET /api/v1/o/willow/personal/credits
Find classes
Personal key
GET /api/v1/o/willow/personal/schedule
My work
Personal key
GET /api/v1/o/willow/personal/work
Request my substitute
Personal key
POST /api/v1/o/willow/personal/work/coverage/request
Withdraw my substitute request
Personal key
POST /api/v1/o/willow/personal/work/coverage/withdraw