Class participants
A ClassParticipant associates an athlete with one Class. It records attendance mode, confirmed or queued state, payment consumption, and trial or no-show flags.
Start from a ClassId returned by Classes and calendars
and a UserId returned by Athletes.
Choose an operation
Section titled “Choose an operation”| Need | API reference |
|---|---|
| List confirmed and queued athletes | GET /Classes/{classId}/Participants |
| Read one booking with Class and payment context | GET /Classes/{classId}/Participants/{userId} |
| Sample the most recently created bookings | GET /Classes/Participants/Recent |
| Summarize one athlete’s attendance | GET /Athletes/{userId}/AttendanceSummary |
| List all club bookings | GET /Classes/Bookings |
| List one Class’s bookings with pagination | GET /Classes/{classId}/Bookings |
| List one User’s saved bookings | GET /Athletes/{userId}/Bookings |
| Summarize attendance for all current athletes | GET /Athletes/AttendanceSummaries |
| Book an athlete or place them in the queue | POST /Classes/{classId}/Participants |
| Cancel a booking or remove a queued athlete | DELETE /Classes/{classId}/Participants/{userId} |
Participant reads require Read or ReadWrite access. Adding and removing
participants requires ReadWrite.
List participants
Section titled “List participants”curl --request GET \ --url https://api-gw.uptivo.fit/club/Classes/700001/Participants \ --header "X-Sub-Key: <subscription-key>" \ --header "Authorization: Bearer <club-api-key>"The response is a complete JSON array and is not paginated. It includes both
confirmed participants and athletes in the queue. Each item uses the same
ClubClassParticipationDTO returned by the individual and bulk booking reads:
[ { "ClubId": 100001, "ClassId": 700001, "ClassName": "Evening yoga", "ClassBegin": "2030-10-12T18:30:00+02:00", "UserId": 300001, "Mode": "InSite", "State": "Participant", "CreatedAtUtc": "2030-10-01T14:05:00Z", "CreditsCost": 0, "UserClassSubscriptionId": 600001, "ClassSubscriptionId": 500001, "NoShow": false, "Trial": false }]| Property | Meaning |
|---|---|
Mode |
InSite or Remote. Price, capacity, and accepted subscriptions depend on this value. |
State |
Participant for a confirmed place or InQueue for the waiting queue. |
CreatedAtUtc |
Creation time; for queued athletes it also determines queue order. |
CreditsCost |
Credits charged when the place was confirmed; 0 when credits were not used or the athlete is queued. |
UserClassSubscriptionId |
UserSubscription assignment used by the booking, or null. |
ClassSubscriptionId |
Subscription product associated with that assignment, or null. |
NoShow |
Whether Uptivo marks the participation as a no-show. |
Trial |
Whether the participation is treated as a trial. |
BookActorId, BookActorName |
Optional identity of the actor that created the booking; absent when unavailable. |
The participant list returns 404 if the Class is absent or belongs to another
club. It returns 400 when the Class belongs to a calendar type that does not
support participants through the Club API.
Read one booking with context
Section titled “Read one booking with context”Use the composite Class and User identifiers to retrieve a booking together with its current published Class and payment context:
curl --request GET \ --url https://api-gw.uptivo.fit/club/Classes/700001/Participants/300001 \ --header "X-Sub-Key: <subscription-key>" \ --header "Authorization: Bearer <club-api-key>"The operation returns the same ClubClassParticipationDTO used by the complete
participant array and paginated booking lists. It includes the booking fields,
Class and trainer context, configured costs, and the associated
UserSubscription when one is available. Nullable subscription fields are
null for free or credit-only bookings.
CreditsCost and SubscriptionCost are amounts associated with the saved
booking, not signed financial changes. A value of 0 for MaxActivities
means unlimited activities. AvailableActivities is a snapshot and can
change after the response.
NoShow is a stored booking flag, not independent evidence of physical
check-in. The operation returns 404 when the booking, published Class, or
non-demo athlete is unavailable in the selected club.
Read recent bookings
Section titled “Read recent bookings”GET /Classes/Participants/Recent?count=3 returns the most recently created
bookings still present in the selected club. count defaults to 3 and
accepts values from 1 through 100.
This is a bounded snapshot for dashboards, samples, and connectivity checks. It includes confirmed and queued bookings for past and future published Classes, but it is not an update feed and does not retain deletions. Do not use it as the only synchronization mechanism.
Summarize athlete attendance
Section titled “Summarize athlete attendance”curl --request GET \ --url "https://api-gw.uptivo.fit/club/Athletes/300001/AttendanceSummary?days=30" \ --header "X-Sub-Key: <subscription-key>" \ --header "Authorization: Bearer <club-api-key>"First/last check-in and the total count cover all saved history in this club.
days (default 30, range 1..366) determines two consecutive windows at request
time. No Class date filters are required.
| Property | Meaning |
|---|---|
FirstCheckIn / LastCheckIn |
Earliest/latest qualifying Class Begin in lifetime history, or null. |
LifetimeCheckInCount |
Total saved check-ins in this club. |
RollingCheckInCount |
Check-ins in [evaluation minus days, evaluation]. |
PriorCheckInCount |
Check-ins in [evaluation minus twice days, evaluation minus days). |
WindowDays / CalculatedAtUtc |
Window size and UTC evaluation instant. |
A check-in is a confirmed booking with NoShow=false in a published Club/PT/
Services Class that has started. Ongoing Classes qualify; future bookings and
queues do not. Dates use Class Begin, not physical entry timestamps. Saved
corrections and deletions change subsequent summaries. A User outside the
selected club or a demo User returns 404.
GET /Athletes/AttendanceSummaries returns the same representation for every
current non-demo Athlete, including zero-count rows, paginated by UserId. See
Bulk summaries and bookings.
Add a participant
Section titled “Add a participant”For the normal server-side booking flow, send the athlete, attendance mode, and payment strategy:
curl --request POST \ --url https://api-gw.uptivo.fit/club/Classes/700001/Participants \ --header "Content-Type: application/json" \ --header "X-Sub-Key: <subscription-key>" \ --header "Authorization: Bearer <club-api-key>" \ --data '{ "UserId": 300001, "Mode": "InSite", "PaymentMode": "Auto", "Trial": false }'The Class must be published and bookable, and the user must be an athlete of the selected club. Unless explicitly bypassed, Uptivo also checks class dates, club eligibility settings, purchase policies, payment resources, and booking limits.
Mode is required in practice and determines which capacity and costs are
used:
InSiteuses the calendar’sLocalcost, capacity, and subscription fields;Remoteuses itsRemotefields and can add the athlete to the associated live session.
Choose a payment mode
Section titled “Choose a payment mode”PaymentMode |
Behavior |
|---|---|
Subscription |
Requires a usable UserSubscription accepted by the Class for the selected mode. |
Credits |
Requires the Class to accept credits and the athlete to have enough club credits. |
Auto |
Prefers a usable UserSubscription and falls back to credits. |
When PaymentMode is omitted, it defaults to Auto. A Class with no configured
cost can be booked without consuming credits or a UserSubscription.
A usable UserSubscription must cover the Class start, be enabled and not suspended at that instant, have enough remaining activities when limited, be accepted by the Class for the requested mode, and remain within its weekly and monthly booking limits. When multiple assignments qualify, do not predict which one the server will choose; persist the IDs returned by the operation.
Understand the result
Section titled “Understand the result”A successful request returns 200 OK and a ClassParticipantOpResultDTO:
{ "ClassId": 700001, "UserId": 300001, "CreatedAtUtc": "2030-10-01T14:05:00Z", "Mode": "InSite", "State": "Participant", "NoShow": false, "Trial": false, "CreditsCost": 0, "TotalCredits": 12, "AvailableActivities": 7, "MaxActivities": 10, "UserClassSubscriptionId": 600001, "ClassSubscriptionId": 500001, "ActorId": null}If a UserSubscription was used, UserClassSubscriptionId,
ClassSubscriptionId, AvailableActivities, and MaxActivities describe the
selected assignment after consumption. If credits were used, CreditsCost
contains the charged amount and TotalCredits is the athlete’s resulting
balance.
Always inspect State. A successful request can return InQueue rather than
Participant when the selected mode is full. Queued athletes are not charged
immediately. When a place becomes available, Uptivo processes the queue in
CreatedAtUtc order, validates payment again, and can publish a
ClassParticipant.Updated event.
Set DisableQueue to true when your integration must fail instead of
accepting a queued result. In that case, a full Class returns 409 with
ErrorType: "ClassFull".
Trial: true explicitly marks the booking as a trial. Uptivo can also set it
when the selected subscription product is of type Trial. NoShow is a
response field; this Club API operation does not set it directly.
Override individual checks
Section titled “Override individual checks”The request exposes narrowly scoped Disable* flags:
| Flag | Bypassed rule |
|---|---|
DisableMedicalCertificateCheck |
Required valid medical certificate. |
DisableMembershipCheck |
Required valid club membership expiration. |
DisableQueue |
Queue placement; a full Class is rejected instead. |
DisableClassCostsCheck |
Availability of enough credits or a usable UserSubscription. Configured costs are not removed. |
DisablePolicyCheck |
Acceptance of required purchase policies. |
DisableClubBookingLimitsCheck |
Club-wide weekly and monthly booking limits. |
DisableDateTimeChecks |
Visibility, booking deadline, start, and end checks. |
DisableUserNoBookingsCheck |
Athlete-level booking restriction. |
Handle booking conflicts
Section titled “Handle booking conflicts”Business-rule failures return 409 Conflict with ApiErrorDTO. Branch on
ErrorType, not on the message or on the order in which rules are evaluated.
ErrorType |
Meaning and suggested action |
|---|---|
ClassNotPublished |
The Class is not currently published; refresh its calendar window. |
ClassNotBookable |
Booking is disabled for the Class; do not retry unchanged. |
Conflict |
The athlete is already present; refresh the participant list. |
RequiredMedicalCertificate |
The athlete lacks a valid required certificate. |
RequiredMembership |
The athlete lacks the club membership requirement. |
AthleteBookingDisabled |
Club booking is disabled for this athlete until a configured time. |
ClassBookingIsEarly |
The visibility or booking window has not opened yet. |
ClassBookingIsPastDue |
The booking deadline has passed. |
ClassHasStarted, ClassIsFinished |
The Class can no longer be booked normally. |
ClassFull |
The selected mode is full and queuing was disabled. |
InvalidPaymentOption |
The requested payment mode is not configured or neither automatic option is usable. |
NotEnoughCredits |
The athlete cannot cover the credit cost. |
NoValidSubscriptions |
No accepted UserSubscription is usable at the Class start. |
SubscriptionLimitsExceeded |
Matching assignments exist, but their weekly or monthly limits are exhausted. |
PoliciesNotAccepted |
Required purchase policies have not been accepted. |
ClubLimitsExceeded |
A club-wide weekly or monthly participation limit was reached. |
Resolve the underlying state and retrieve the Class or participant list again
before retrying. A missing or out-of-scope Class or athlete returns 404, not a
domain conflict.
Remove a participant
Section titled “Remove a participant”curl --request DELETE \ --url https://api-gw.uptivo.fit/club/Classes/700001/Participants/300001 \ --header "X-Sub-Key: <subscription-key>" \ --header "Authorization: Bearer <club-api-key>"For a confirmed participant, Uptivo checks that the Class has not finished and
that its cancellation deadline has not passed. These failures return
ClassIsFinished or CancelTimeIsPastDue. A queued athlete can be removed
without those time checks.
Successful removal refunds credits or limited-subscription activities consumed
by the booking. Persist TotalCredits and, when present,
AvailableActivities from the returned operation result. Uptivo can then
promote the next eligible athlete from the same mode’s queue. Removing a remote
participant also removes the athlete from the associated live session when one
exists.
disableDateTimeChecks=true bypasses the end and cancellation-deadline checks:
DELETE /Classes/700001/Participants/300001?disableDateTimeChecks=trueUse this override only in an approved trusted workflow. Removal is not an
idempotent delete: if the athlete is not currently a participant, the endpoint
returns 404.
Events and reconciliation
Section titled “Events and reconciliation”Successful additions and removals produce ClassParticipant.Created and
ClassParticipant.Deleted events. Queue promotion can produce
ClassParticipant.Updated.
Treat events as change notifications and reconcile with
GET /Classes/{classId}/Participants/{userId} when both identifiers are
known. Use /Classes/Bookings for paginated club-wide reconciliation or
/Classes/{classId}/Bookings for a large Class. The existing
/Classes/{classId}/Participants array remains suitable for a complete,
non-paginated Class refresh. Upsert by the composite identity ClassId plus
UserId, and remove the local relationship after a delete event or an
authoritative refresh.
See Receiving webhook events for delivery rules and Errors for common authentication and retry behavior.