> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zenamu.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Class

> A standalone class or one session of a course.

The classes endpoint returns two kinds of event in one list. Read `eventType` to
tell them apart:

* `class` — a standalone event with no parent.
* `course_session` — one session of a multi-session course. `courseId` holds the
  opaque ID of the parent course, and `publicUrl` links to the course rather
  than to the single session.

Only events the studio has published, marked visible in the public calendar, and
not marked private are returned.

## Cancellations

A canceled class can remain visible so clients can see that it will not take
place. In that case, `isCanceled` is `true`. Do not present that event as
bookable. Active classes and course sessions return `isCanceled: false`.

## Times

`start` and `end` are UTC. `localTimeStart` and `localTimeEnd` are the same
instants in the studio's zone with a numeric offset, and `timezone` names that
zone. See [Dates and time zones](/api/dates).

## References

A class points at its lecturers and location by ID rather than embedding them.

`lecturerIds` holds opaque lecturer IDs — resolve them against
[`GET /v1/lecturers`](/api/v1/reference/lecturers/list-lecturers).

For a course session with a substitute lecturer, `lecturerIds` lists only the
substitute: the assignment replaces the course's main and additional lecturers
for that session, and the `lecturerIds` [filter](/api/filtering) follows the
same rule.

`locationId` holds an opaque place ID, or `null` — for an online class, and for
one the studio left without a place. Read `isOnline` to tell the two apart
rather than inferring it from `locationId`. Resolve a non-null value against
[`GET /v1/places`](/api/v1/reference/places/list-places).

For a course session this is the place set on that session. When a studio moves
a single session to another room, both `locationId` and the `placeIds` filter
follow that move rather than the course's original place.

`tags` is the one exception: tags are embedded inline, because they are small
and change rarely. Each carries a numeric `id` you can feed back into the
`labelIds` [filter](/api/filtering).

<Tip>
  Fetch lecturers and places once and build a lookup map. Resolving per event
  will exhaust your [rate limit](/api/rate-limits) on a busy schedule.
</Tip>

## Pricing

`pricingOptions` lists every way a client can pay for this class. See
[Pricing option](/api/objects/pricing-option) for how `type`, `value`, and
`currency` fit together, and why `currency` is missing on some entries.

Class pricing options carry an optional `description`; workshop ones do not.

## Capacity

`capacity` appears **only** when you pass `includeCapacity=true` or
`includeCapacity=1`. It is more expensive, so request it only where you show
live availability.

```json theme={null}
{ "max": 20, "reserved": 12 }
```

`max` is the seat limit. Every class has one, so it is always a number.
`reserved` counts active and completed reservations.

<Note>
  Unlike [Workshop](/api/objects/workshop), a class capacity has no `available`
  field. Compute it as `max - reserved`, and clamp at zero — a studio can lower
  the capacity below the number of existing reservations.
</Note>
