Upcoming Classes Public API

e-Ballroom's public API allows for rendering of upcoming group classes and social dances on a custom website. This page outlines technical documentation on interfacing with the public API.

You will require the studio GUID to use these public routes. These are available in the Client Portal settings from the e-Ballroom Web Console.

API

https://clientapi.e-ballroom.com

Common behavior

  • Authentication: none
  • Content type: application/json
  • Studio identification: both routes require the public studio GUID from subscriptions.studioGUID; an internal subscription ID is not accepted.
  • Class types: GroupClass and SocialDance
  • Capacity: classSize and spotsAvailable are null when capacity is unlimited. Available spots never falls below zero.
  • Results include group classes and social dances.

GET /Studio/UpcomingClasses/calendar

Returns a FullCalendar-compatible JSON event array. This route is intended for use as a FullCalendar event source and accepts FullCalendar's start and end range parameters.

Query parameters

Name Type Required Description
studio UUID Yes Public studio GUID.
start date-time No Beginning of the requested range. Defaults to midnight 7 days before the server's current date.
end date-time No End of the requested range. Defaults to the final tick of the day 45 days after the server's current date. Must be later than start.

Use ISO 8601 date-time values. Date-only values are also accepted by ASP.NET date-time binding and represent midnight.

Example request

GET /Studio/UpcomingClasses/calendar?studio=0197ad2c-5dce-7e88-81b2-b854eaeb3862&start=2026-09-01T00:00:00&end=2026-10-01T00:00:00
Accept: application/json

Success response

200 OK

[
  {
    "id": "1842",
    "title": "Beginner Waltz - Group Class (Alex Morgan)",
    "start": "2026-09-08T18:30:00",
    "end": "2026-09-08T19:15:00",
    "extendedProps": {
      "classType": "GroupClass",
      "instructorName": "Alex Morgan",
      "price": 20.00,
      "classSize": 16,
      "spotsAvailable": 5
    }
  }
]

An empty range returns 200 OK with [].

Event schema

Field Type Nullable Description
id string No Group class record ID.
title string No Class name, display class type, and instructor when one is assigned.
start date-time No Event start time.
end date-time No Event end time, calculated from the class duration.
extendedProps.classType string No GroupClass or SocialDance.
extendedProps.instructorName string Yes Instructor display name.
extendedProps.price decimal No Class price.
extendedProps.classSize integer Yes Maximum attendance, or null for unlimited capacity.
extendedProps.spotsAvailable integer Yes Remaining capacity, or null for unlimited capacity.

Errors

Status Condition
400 Bad Request studio is missing or is not a valid non-empty UUID.
400 Bad Request end is not later than start.
404 Not Found No studio exists for the supplied public studio GUID.

Results are cached for five minutes per studio, start, and end combination.

GET /Studio/UpcomingClasses/datatables

Returns a DataTables.net server-side processing response. The server uses a fixed date window from midnight 7 days before its current date through the end of the day 45 days after its current date. Clients cannot override this window.

Query parameters

Name Type Required Default Description
studio UUID Yes - Public studio GUID.
draw integer No 0 DataTables draw counter, returned unchanged when it is a valid integer.
start integer No 0 Zero-based row offset. Negative values are treated as 0.
length integer No 10 Requested page size. Values less than or equal to zero are treated as 10.
search[value] string No empty Case-insensitive search text.
columns[i][data] string No - Data field for column index i; used to resolve the requested sort field. Indices must be contiguous from zero.
order[0][column] integer No -1 Index into the submitted columns entries. No sort is applied when the index or field is invalid.
order[0][dir] string No asc Use desc for descending order; every other value is ascending.

Search matches className, instructorName, and the display labels Group Class or Social Dance.

The following columns[i][data] values are sortable:

  • classId
  • className
  • classType
  • instructorName
  • startTime
  • endTime
  • price
  • classSize
  • spotsAvailable

Example request

GET /Studio/UpcomingClasses/datatables?studio=0197ad2c-5dce-7e88-81b2-b854eaeb3862&draw=3&start=0&length=10&search%5Bvalue%5D=waltz&columns%5B0%5D%5Bdata%5D=startTime&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc
Accept: application/json

The bracketed query parameter names are URL-encoded in this example. DataTables normally generates them automatically.

Success response

200 OK

{
  "draw": 3,
  "recordsTotal": 24,
  "recordsFiltered": 4,
  "data": [
    {
      "classId": 1842,
      "className": "Beginner Waltz",
      "classType": "GroupClass",
      "instructorName": "Alex Morgan",
      "startTime": "2026-09-08T18:30:00",
      "endTime": "2026-09-08T19:15:00",
      "price": 20.00,
      "classSize": 16,
      "spotsAvailable": 5
    }
  ]
}

Response schema

Field Type Nullable Description
draw integer No Draw counter parsed from the request.
recordsTotal integer No Number of rows in the fixed date window before search filtering.
recordsFiltered integer No Number of rows after search filtering and before pagination.
data array No Current page of class rows.
data[].classId integer No Group class record ID.
data[].className string No Class name.
data[].classType string No GroupClass or SocialDance.
data[].instructorName string Yes Instructor display name.
data[].startTime date-time No Class start time.
data[].endTime date-time No Class end time, calculated from the class duration.
data[].price decimal No Class price.
data[].classSize integer Yes Maximum attendance, or null for unlimited capacity.
data[].spotsAvailable integer Yes Remaining capacity, or null for unlimited capacity.

Errors

Status Condition
400 Bad Request studio is missing or is not a valid non-empty UUID.
404 Not Found No studio exists for the supplied public studio GUID.

The unfiltered row set is cached for five minutes per studio and server date. Search, sorting, and pagination are applied after the cached rows are loaded.