StudioNexis API
A simple REST API for your studio's data — clients, classes, bookings, packages and sales. Use it from your own tools, spreadsheets, or no-code platforms like Make.com and Zapier. All requests use JSON over HTTPS.
Base URL: https://app.stg.studionexis.com/api/v1
Stored only in this browser. Every “Try it” console below uses it automatically.
Authentication
Generate a key in your dashboard under Settings → API. Send it with every request in theAuthorization header. The key grants full access to that one studio — treat it like a password and regenerate it if it leaks.
curl https://app.stg.studionexis.com/api/v1/me \ -H "Authorization: Bearer nx_live_your_key_here"
Errors & rate limits
Errors always return this shape, with conventional HTTP status codes. The limit is 120 requests per minute per key (HTTP 429 beyond that).
{ "error": { "code": "not_enough_spots", "message": "Not enough spots left for that seat count." } }
401 unauthorized · 403 plan_limit / suspended · 404 not_found
409 already_booked / not_enough_spots · 422 validation · 429 rate_limitedStudio
/api/v1/meGet your studio
Returns the studio the API key belongs to — useful as a connectivity test.
{
"id": "cl…", "name": "Dev Studio", "slug": "dev-studio",
"currency": "USD", "timezone": "Asia/Bangkok",
"plan": "starter", "bookingUrl": "https://dev-studio.stg.studionexis.com/book"
}Clients
Your studio's client list — the same people you see under Clients in the dashboard.
/api/v1/clientsList clients
Paginated list, newest studios often sync this into a CRM or sheet.
| Field | Type | Description |
|---|---|---|
| q | string | Search name, phone or email |
| limit | number | Page size, max 100 (default 25) |
| offset | number | Skip N results |
{
"total": 36, "limit": 5, "offset": 0,
"data": [{
"id": "cl…", "name": "Ava Nguyen", "phone": "555-2100",
"email": "ava.nguyen@example.com", "channel": "instagram",
"tags": ["vip"], "memberSince": "2026-01-04T…", "lastVisitAt": "2026-07-08T…"
}]
}/api/v1/clientsCreate a client
Adds a client (channel is recorded as "api"). Plan limits apply.
| Field | Type | Description |
|---|---|---|
| name * | string | Full name |
| phone | string | Phone number |
| string | Email address | |
| tags | string[] | Up to 10 tags |
| notes | string | Free-form notes |
{ "id": "cl…", "name": "API Test Client", "phone": "555-0199", … } // HTTP 201/api/v1/clients/{id}Get one client
Full profile including active packages and booking count.
| Field | Type | Description |
|---|---|---|
| id * | string | Client id (path) |
{
"id": "cl…", "name": "Ava Nguyen", …,
"totalBookings": 14,
"activePackages": [{ "id": "cp…", "name": "10-Class Pack", "creditsLeft": 6, "expiresAt": "…", "renews": false }]
}Classes & schedule
Upcoming public classes with live availability — the same data your booking page shows.
/api/v1/classesList upcoming classes
Defaults to the next 14 days.
| Field | Type | Description |
|---|---|---|
| from | ISO date | Window start (default now) |
| to | ISO date | Window end (default +14 days) |
| limit | number | Page size, max 100 |
| offset | number | Skip N results |
{
"total": 43, "limit": 5, "offset": 0,
"data": [{
"id": "cs…", "name": "Reformer Flow", "startsAt": "2026-07-20T00:30:00.000Z",
"endsAt": "…", "instructor": "Mia Instructor", "location": null,
"capacity": 6, "spotsLeft": 2, "price": 18.5,
"difficulty": "Athletic", "format": "Reformer"
}]
}/api/v1/classes/{id}Get one class
Everything on the class detail page: description, benefits, equipment, availability.
| Field | Type | Description |
|---|---|---|
| id * | string | Class id (path) |
{ "id": "cs…", "name": "Reformer Flow", "description": "…", "spotsLeft": 2, "benefits": ["Core strength"], … }Bookings
Create and cancel bookings exactly like the booking page does — credits are auto-spent when the client has them, waitlist applies when the class is full, cancellations refund credits and promote the waitlist.
/api/v1/bookingsList bookings
Newest first. Filter by client.
| Field | Type | Description |
|---|---|---|
| clientId | string | Only this client's bookings |
| limit | number | Page size, max 100 |
{
"total": 210, "limit": 5, "offset": 0,
"data": [{
"id": "bk…", "status": "BOOKED", "seats": 1, "paymentMethod": "package_credit",
"client": { "id": "cl…", "name": "Ava Nguyen" },
"class": { "id": "cs…", "name": "Mat Pilates", "startsAt": "…" },
"createdAt": "…"
}]
}/api/v1/bookingsCreate a booking
Book by clientId, or send name + phone/email and the client is found-or-created. Full classes become WAITLIST.
| Field | Type | Description |
|---|---|---|
| classId * | string | The class (session) id |
| clientId | string | Existing client id |
| name | string | If no clientId: client name |
| phone / email | string | If no clientId: at least one contact |
| seats | number | 1–5 people (default 1) |
{
"id": "bk…", "status": "BOOKED", "seats": 1,
"paymentMethod": "at_studio",
"client": { "id": "cl…", "name": "API Test Client" }
} // HTTP 201 · 409 already_booked / not_enough_spots/api/v1/bookings/{id}/cancelCancel a booking
Refunds all package credits for the seats and promotes waitlisted clients into the freed spots.
| Field | Type | Description |
|---|---|---|
| id * | string | Booking id (path) |
{ "id": "bk…", "status": "CANCELLED", "creditsRefunded": 1 }Packages
/api/v1/packagesList packages & memberships
The studio's active credit packs and auto-renewing memberships.
{
"data": [{
"id": "pk…", "name": "10-Class Pack", "credits": 10, "price": 220,
"kind": "GROUP", "billing": "one_time", "validityDays": 90
}, {
"id": "pk…", "name": "Unlimited-ish Monthly", "credits": 12, "price": 99,
"kind": "GROUP", "billing": "monthly", "validityDays": 30
}]
}Orders & sales
/api/v1/ordersList orders
Every sale — drop-ins, packages, merch, membership renewals. Great for accounting exports.
| Field | Type | Description |
|---|---|---|
| status | string | PAID · PENDING · REFUNDED · VOID |
| limit | number | Page size, max 100 |
{
"total": 141, "limit": 5, "offset": 0,
"data": [{
"id": "or…", "number": 141, "total": 45, "discount": 0,
"method": "cash", "status": "PAID",
"client": { "id": "cl…", "name": "Ruby Ngo" },
"items": [{ "label": "Intro — 3 Classes", "kind": "package", "qty": 1, "unitPrice": 45 }],
"createdAt": "…"
}]
}Make.com & Zapier
Both platforms can call this API directly — no special app needed:
Make.com: add an HTTP → Make a request module. Set the URL to any endpoint above, method GET/POST, and add a header Authorization: Bearer nx_live_…. Parse response = yes. From there, map the JSON into Sheets, WhatsApp, email — anything.
Zapier: use Webhooks by Zapier → Custom Request with the same URL + header.
Outgoing webhooks (live): in your dashboard → App Store, add your Make/Zapier webhook URL and pick events (booking.created, booking.cancelled, client.created, order.paid). We POST JSON instantly with an X-Nexis-Signature header — HMAC-SHA256 of the raw body using your webhook secret, so you can verify it's really us.