Skip to content

Changelog

  • Added GET /Athletes/{userId}/MembershipSummary and GET /Athletes/MembershipSummaries for effective membership states and the underlying club assignments. Athletes without assignments are included with Status: "None" and an empty Memberships array.
  • Added GET /BadgeAwards, GET /Athletes/{userId}/BadgeAwards, and GET /BadgeAwards/{achievedBadgeId} for visible challenge award history. Lists use award-ID pagination and default to the latest IDs first.
  • Engagement summaries now include BrandLevelSource, CurrentLevel, MonthToDatePoints, MonthlyPointsGoal, and MonthlyPointsResetAtUtc for level and monthly-goal progress.
  • Athlete attendance summaries now return lifetime first/last check-in and total count, plus rolling/prior counts over two consecutive days windows (default 30, range 1..366). Bulk pagination is by UserId and includes Athletes with no check-ins. Zapier attendance searches use Window Days and the same check-in fields.
  • Attendance reads no longer accept from/to Class date filters or return the former interval counters. Update clients to use days and the lifetime and rolling check-in fields.
  • Discard attendance cursors generated with the former Class date filters and restart the UserId scan.
  • Standardized every public resource path segment on PascalCase. Compound segments now use names such as ByEmail, ClientStage, IsGuest, EngagementSummary, AttendanceSummary, UserSubscriptions, and GeoPositions.
  • Consolidated Training reads into GET /Trainings, GET /Trainings/{trainingId}, and GET /Athletes/{userId}/Trainings. Each operation now accepts independent withTelemetry and withUser flags and returns a flat ClubTrainingDTO. The optional Telemetry object contains the five raw series; optional User uses ClubAthleteDTO.
  • Training lists default to 10 items and accept at most 30 when withTelemetry=true; otherwise they default to 30 and accept at most 100. The enrichment flags do not affect selection or cursor position and may change between pages.
  • Use the canonical paths shown in the API reference for every request. The previous hyphenated resource names are not aliases for the new paths.
  • The former /Trainings/WithTelemetry, /Trainings/{trainingId}/WithTelemetry, and /Athletes/{userId}/Trainings/WithTelemetry paths are no longer available. Use the corresponding base operation with withTelemetry=true.
  • Added recommended opaque pagination through the optional cursor parameter and the NextCursor and PrevCursor response fields. Cursors preserve exact (Begin, ID) positions for temporal lists and coexist with the legacy range fields.
  • Added GET /Challenges, GET /Challenges/{challengeId}, GET /Challenges/{challengeId}/Results, and GET /Challenges/{challengeId}/Results/{userId}.
  • Added bulk Athlete summaries through GET /Athletes/EngagementSummaries and GET /Athletes/AttendanceSummaries.
  • Added paginated booking reads through GET /Classes/Bookings, GET /Classes/{classId}/Bookings, and GET /Athletes/{userId}/Bookings.
  • GET /Classes/{classId}/Participants now returns the same ClubClassParticipationDTO representation used by the individual and bulk booking reads. Existing fields, including BookActorId and BookActorName, remain available.
  • Existing pagination without cursor remains supported. New integrations should use opaque cursors, especially for temporal lists, because the legacy one-millisecond continuation can skip rows.
  • Added a self-service Club API tab to the club profile when the club license enables Club API. The page displays the primary and secondary Subscription Keys.
  • Added Club Token creation, rename, and revocation. New tokens support Read or ReadWrite access, an explicit expiration day, and immediate revocation.
  • Added a read-only webhook overview with destinations, subscribed events, provisioning state, and aggregate delivery statistics for the last 24 hours, 7 days, and 30 days.
  • Subscription Keys can now be regenerated independently from the Club API page. Regeneration invalidates the previous value immediately, allowing safe rotation by alternating the primary and secondary keys.
  • Tokens marked Legacy are identified in the Club API page. Because they do not support immediate revocation, integrations must replace them before removing them from the list.
  • Added Athlete.LevelChanged for Uptivo and brand level transitions, including the previous level, new level, change direction, and effective month.
  • Added Badge.Awarded for challenge badge assignments, including the award identity, badge, challenge, effective date, award type, and applicable goal or ranking fields.
  • Added GET /Classes/{classId} to retrieve one published Class directly.
  • Added GET /Classes/{classId}/Participants/{userId} and GET /Classes/Participants/Recent to read enriched booking snapshots with Class, trainer, cost, and UserSubscription context.
  • Added GET /Athletes/{userId}/AttendanceSummary for attended, no-show, pending, and queued counts over a Class start interval of at most 366 days.
  • ClassParticipant.Created, ClassParticipant.Updated, and ClassParticipant.Deleted now include the same enriched booking context. TotalCredits, when provided, contains the resulting credit balance.
  • Added GET /Contacts, GET /Contacts/ByEmail, and GET /Contacts/{userId} operations for non-demo contacts of the selected club. The list uses the same inclusive ID-range pagination as Athletes.
  • Added Contact.Created, Contact.Updated, and Contact.Deleted webhook events. Contact.Deleted includes a Reason of Removed, ConvertedToAthlete, or UserDeleted.
  • Added PUT /Athletes/{userId}/ClientStage, PUT /Athletes/{userId}/IsGuest, and PUT /Contacts/{userId}/ClientStage for club-specific relationship state. Successful calls return the updated Athlete or Contact representation.
  • A non-Trial UserSubscription assignment now sets the selected club’s Athlete commercial stage to Client when it differs.
  • Real commercial-stage and guest-flag changes use the existing Athlete.Updated or Contact.Updated webhook event. Repeating the current value does not send another state-change event.
  • Training reads now expose the same public ClubTrainingDTO fields. BeginDateLocal provides the athlete-local start date. AlternateId, DataSource, RowVersion, and Uploading are no longer returned. Integrations using those removed fields must update their mapping.
  • Training.Created now includes the same public Training fields plus Contact, TrainingMonthTotals, LifetimeTotals, and AchievedGoals. Its former AlternateId, DataSource, RowVersion, and Uploading fields are no longer included.
  • Added GET /Athletes/{userId}/EngagementSummary for current-month and lifetime activity totals, current levels, and awards earned in the athlete’s current local month.
  • Published the enforced Club API limits of 50 calls per minute and 25,000 calls per 30 days, the X-Ratelimit-Limit and X-Ratelimit-Remaining response headers, and the 429 Too Many Requests response returned when a limit is exceeded.
  • GET /Profile now returns ClubProfileDTO, containing the documented club identity, contact, location, and locale fields. Properties outside this public schema are no longer returned. This is a breaking response-contract change for clients that read a removed property.
  • POST /Athletes now correctly adds manager-only or trainer-only users as athletes without removing their existing roles. A pending staff invitation is extended with the athlete role.
  • POST /Athletes no longer reports failed onboarding outcomes inside a 200 OK response. Invalid data returns 400; exhausted license capacity returns 403; an email conflict returns 409; an unexpected failure returns 500. Application errors use ApiErrorDTO. See failed onboarding outcomes for public error values and recovery actions.
  • POST /Classes/{classId}/Participants now validates UserId as a required positive integer and returns 400 Bad Request when it is missing or invalid.
  • Published the effective default and maximum value of every paginated count parameter, together with the defaults for training origin and optional request flags.
  • The ApiErrorType schema now lists only errors returned by Club API operations.
  • Added POST /UserSubscriptions/{userSubscriptionId}/Suspension to start, schedule, or update a UserSubscription suspension.
  • Added DELETE /UserSubscriptions/{userSubscriptionId}/Suspension to cancel a scheduled suspension or reactivate an active one. The operation is idempotent.
  • Added SuspensionState and SuspensionStartUTC to UserSubscription responses. SuspendedAtUTC remains available as a legacy alias.
  • Added HIT samples to training responses that include telemetry, together with the public tuple order and units.
  • GET /Athletes/{userId}/UserSubscriptions now returns a plain JSON array containing all matching UserSubscriptions instead of a pagination envelope.
  • Raw telemetry operations now require both from and to and reject intervals longer than five hours.
  • Calendar operations now require both from and to, require from to be earlier than to, and no longer impose the previous 2030 upper boundary.
  • Calendar operations accept only Club, PT, and Services; other values return 400 Bad Request.
  • A UserSubscription suspension that conflicts with an existing booking now returns 409 Conflict with ErrorType: "SubscriptionInUse".
  • An athlete email conflict now returns 409 Conflict with ErrorType: "EmailAlreadyInUse".
  • Documented required, nullable, and optional properties for Club, Training, telemetry, and calendar Class responses.

Added these properties to the Class resource:

  • CreditsCostLocal
  • CreditsCostRemote
  • TicketsCostLocal
  • TicketsCostRemote
  • MaxLocalParticipants
  • MaxRemoteParticipants
  • LocalSubscriptionIds
  • RemoteSubscriptionIds

Added these webhook events:

  • Class.Updated
  • Class.Deleted
  • Class.Published
  • Class.Unpublished
  • Subscription.Created
  • Subscription.Updated
  • Subscription.Deleted
  • Subscription.Plans.Updated
  • Subscription.Published
  • Subscription.Unpublished

Added Club API operations for listing, adding, and removing Class participants.

Added the calendar operation for retrieving Classes by date range.

Expanded the server-to-server integration guidance.