STUDIONEXIS API v1
Studio login →

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
Your API key for testing

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_limited

Studio

GET/api/v1/me

Get your studio

Returns the studio the API key belongs to — useful as a connectivity test.

Example response
{
  "id": "cl…", "name": "Dev Studio", "slug": "dev-studio",
  "currency": "USD", "timezone": "Asia/Bangkok",
  "plan": "starter", "bookingUrl": "https://dev-studio.stg.studionexis.com/book"
}
Try it

Clients

Your studio's client list — the same people you see under Clients in the dashboard.

GET/api/v1/clients

List clients

Paginated list, newest studios often sync this into a CRM or sheet.

FieldTypeDescription
qstringSearch name, phone or email
limitnumberPage size, max 100 (default 25)
offsetnumberSkip N results
Example response
{
  "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…"
  }]
}
Try it
POST/api/v1/clients

Create a client

Adds a client (channel is recorded as "api"). Plan limits apply.

FieldTypeDescription
name *stringFull name
phonestringPhone number
emailstringEmail address
tagsstring[]Up to 10 tags
notesstringFree-form notes
Example response
{ "id": "cl…", "name": "API Test Client", "phone": "555-0199", … }   // HTTP 201
Try it
GET/api/v1/clients/{id}

Get one client

Full profile including active packages and booking count.

FieldTypeDescription
id *stringClient id (path)
Example response
{
  "id": "cl…", "name": "Ava Nguyen", …,
  "totalBookings": 14,
  "activePackages": [{ "id": "cp…", "name": "10-Class Pack", "creditsLeft": 6, "expiresAt": "…", "renews": false }]
}
Try it

Classes & schedule

Upcoming public classes with live availability — the same data your booking page shows.

GET/api/v1/classes

List upcoming classes

Defaults to the next 14 days.

FieldTypeDescription
fromISO dateWindow start (default now)
toISO dateWindow end (default +14 days)
limitnumberPage size, max 100
offsetnumberSkip N results
Example response
{
  "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"
  }]
}
Try it
GET/api/v1/classes/{id}

Get one class

Everything on the class detail page: description, benefits, equipment, availability.

FieldTypeDescription
id *stringClass id (path)
Example response
{ "id": "cs…", "name": "Reformer Flow", "description": "…", "spotsLeft": 2, "benefits": ["Core strength"], … }
Try it

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.

GET/api/v1/bookings

List bookings

Newest first. Filter by client.

FieldTypeDescription
clientIdstringOnly this client's bookings
limitnumberPage size, max 100
Example response
{
  "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": "…"
  }]
}
Try it
POST/api/v1/bookings

Create a booking

Book by clientId, or send name + phone/email and the client is found-or-created. Full classes become WAITLIST.

FieldTypeDescription
classId *stringThe class (session) id
clientIdstringExisting client id
namestringIf no clientId: client name
phone / emailstringIf no clientId: at least one contact
seatsnumber1–5 people (default 1)
Example response
{
  "id": "bk…", "status": "BOOKED", "seats": 1,
  "paymentMethod": "at_studio",
  "client": { "id": "cl…", "name": "API Test Client" }
}   // HTTP 201 · 409 already_booked / not_enough_spots
Try it
POST/api/v1/bookings/{id}/cancel

Cancel a booking

Refunds all package credits for the seats and promotes waitlisted clients into the freed spots.

FieldTypeDescription
id *stringBooking id (path)
Example response
{ "id": "bk…", "status": "CANCELLED", "creditsRefunded": 1 }
Try it

Packages

GET/api/v1/packages

List packages & memberships

The studio's active credit packs and auto-renewing memberships.

Example response
{
  "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
  }]
}
Try it

Orders & sales

GET/api/v1/orders

List orders

Every sale — drop-ins, packages, merch, membership renewals. Great for accounting exports.

FieldTypeDescription
statusstringPAID · PENDING · REFUNDED · VOID
limitnumberPage size, max 100
Example response
{
  "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": "…"
  }]
}
Try it

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.