Developers
The API isn't a feature. It's the product.
Our own dashboard and storefront are clients of the same REST API you get: an OpenAPI spec, signed webhooks, and a generated TypeScript SDK. If we can build on it, so can you.
TypeScript SDK
Generated from the spec, typed end to end.
book-a-room.ts
import { storefrontGetAvailability, storefrontCreateBooking } from "@studio/sdk";
const day = await storefrontGetAvailability({ path: { slug: "riff-city" }, query: { roomId, date } });
await storefrontCreateBooking({ path: { slug: "riff-city" }, body: { roomId, startsAt, endsAt } });Availability is computed, never stored — location hours ∩ room overrides − blackouts − existing bookings, with the studio's minimums and turnover buffers already applied. What the API returns is what can actually be booked.
Surface area
Endpoint groups
| Group | Auth | Covers |
|---|---|---|
| Storefront | public | Rooms, tiers, rates, computed availability per room and day |
| Bookings | customer session | Create a booking, pay (Payment Element), list my sessions, cancel |
| Series | customer session | Recurring weekly slots with saved-card auto-charge |
| Admin — calendar | staff session | Day calendar feed, create/move/resize bookings, refunds |
| Admin — approvals | staff session | Approval queue, approve (captures the card hold), decline (releases it) |
| Admin — catalog | staff session | Rooms, series, customers, org settings, Stripe Connect + billing |
| Webhooks | staff session | Register endpoints, signed deliveries (standard-webhooks), retries |
Webhooks
Signed events, from day one.
Every mutation fans out to your registered endpoints, signed with the standard-webhooks scheme and retried on failure. Point Zapier, your Slack bot, or your smart locks at it.
| booking.created | a booking was made (storefront or desk) |
| booking.updated | time, room, or details changed |
| booking.cancelled | cancelled by the customer or the desk |
| booking.approved | an approval-room booking was confirmed; card captured |
| booking.declined | declined; the card hold was released |
| payment.succeeded | money in — booking paid |
| payment.authorized | card hold placed for an approval room |
| payment.failed | a charge or auto-charge failed |
| payment.refunded | refund issued (card or account credit) |
| series.created | a recurring weekly slot was set up |
| series.updated | series edited — applies forward only |