Skip to content

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.

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.

Terminal window
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.

Use the composite Class and User identifiers to retrieve a booking together with its current published Class and payment context:

Terminal window
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.

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.

Terminal window
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.

For the normal server-side booking flow, send the athlete, attendance mode, and payment strategy:

Terminal window
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:

  • InSite uses the calendar’s Local cost, capacity, and subscription fields;
  • Remote uses its Remote fields and can add the athlete to the associated live session.
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.

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.

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.

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.

Terminal window
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=true

Use 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.

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.