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

# Get a compact group workout run with participant session data

> Returns participant session data including backend-calculated set-level `progress`, `completionPercentage`, and `progressSummary` fields so clients do not need to infer progress from exercise-level completion. For a performance with saved set rows, `template.sets` and `template.setsData` are session-scoped to that saved row count so exercise headers update after sets are added or removed without mutating the shared plan. Every performance set includes effective and coach placeholder fields for reps, weight, time, distance, RPE and rest. Coach prescriptions take precedence over stored client hints; rep ranges remain strings, and placeholders never count as logged work. Slow-request diagnostics measure participant loading as a whole and include participant counts. Booked participants are authorized within their lesson and session regardless of home location; the coach must have access to the lesson location. Unbooked additions and manual workouts retain normal member access.

Requires the workout_groups:read scope. This operation maps to /app/v1/coach/workout/group/runs/:runId and retains its Workout V2 permission, feature-flag, and resource-scope checks.

The clientId path parameter is resolved inside the company bound to the Public API token when present.



## OpenAPI

````yaml /openapi/public-v1.json get /public/v1/workout/groups/runs/{runId}
openapi: 3.1.0
info:
  title: FITsociety Public API v1
  version: 1.0.0
  description: >-
    Developer Public API endpoints under `/public/v1`. This reference is
    filtered to OAuth/Bearer Public API resources and excludes provider callback
    receivers, storefront routes, public widgets, wishlist routes, and
    access-device validation endpoints.
  contact:
    name: FITsociety Engineering
servers:
  - url: https://api.fitsociety.io
    description: Production
security: []
tags:
  - name: Workout
    description: >-
      Workout V2 libraries, programmes, client plans, calendars, sessions,
      groups, settings and progress. AI operations are excluded.
  - name: OAuth
    description: Public API OAuth endpoints for server-to-server client credentials.
  - name: Health
    description: Public API token health checks.
  - name: Platform
    description: >-
      Inspect Public API client context, capabilities, scopes, and redacted
      audit logs.
  - name: Company Catalog
    description: Read and manage company profile metadata and locations.
  - name: Clients
    description: >-
      Create and manage clients through the Public API using Bearer access
      tokens.
  - name: Coaches
    description: Retrieve coaches for the authenticated company via integrations.
  - name: Calendar Events
    description: Read Public API calendar events.
  - name: Calendar Templates
    description: >-
      Read and manage event types and event templates used by calendar
      availability and bookings.
  - name: Calendar Extensions
    description: >-
      Read recurring bookings, booking requests, calendar tasks, and
      availability closure metadata.
  - name: Availability
    description: Read bookable availability slots and signed availability tokens.
  - name: Availability Management
    description: >-
      Manage coach and location availability templates used to derive bookable
      slots.
  - name: Bookings
    description: Read and manage Public API bookings.
  - name: Finance
    description: >-
      Read invoices, transactions, products, subscriptions, and memberships with
      guarded finance writes.
  - name: Credits
    description: >-
      Read company-wide and client-scoped credit allocations, mutations, and
      guarded credit adjustments.
  - name: Exports
    description: >-
      Create and monitor asynchronous company exports through Public API Bearer
      endpoints.
  - name: Webhooks
    description: >-
      Manage outbound webhook subscriptions and inspect delivery attempts
      through Public API Bearer endpoints.
  - name: Measurements
    description: Read and write client measurement entries.
  - name: Progress Photos
    description: Read client progress photo metadata and short-lived signed media URLs.
  - name: Forms
    description: Read, create, update, and archive company form templates.
  - name: Intakes
    description: Assign intake forms and read client intake assignments and submissions.
  - name: Check-ups
    description: >-
      Schedule and cancel client check-ups and read their status and
      submissions.
  - name: Documents
    description: >-
      Read client document and folder metadata, register external document
      links, update metadata, and archive documents from Public API listings.
      Binary upload, permanent deletion, and company-wide document management
      are not exposed.
  - name: Habits
    description: Read habits and habit entries.
  - name: Goals
    description: Read client goal summaries.
  - name: Conversations
    description: >-
      Read and manage direct and group chat conversations through the Public
      API.
  - name: Reports
    description: Read aggregate attendance, revenue, and retention summaries.
paths:
  /public/v1/workout/groups/runs/{runId}:
    get:
      tags:
        - Workout
      summary: Get a compact group workout run with participant session data
      description: >-
        Returns participant session data including backend-calculated set-level
        `progress`, `completionPercentage`, and `progressSummary` fields so
        clients do not need to infer progress from exercise-level completion.
        For a performance with saved set rows, `template.sets` and
        `template.setsData` are session-scoped to that saved row count so
        exercise headers update after sets are added or removed without mutating
        the shared plan. Every performance set includes effective and coach
        placeholder fields for reps, weight, time, distance, RPE and rest. Coach
        prescriptions take precedence over stored client hints; rep ranges
        remain strings, and placeholders never count as logged work.
        Slow-request diagnostics measure participant loading as a whole and
        include participant counts. Booked participants are authorized within
        their lesson and session regardless of home location; the coach must
        have access to the lesson location. Unbooked additions and manual
        workouts retain normal member access.


        Requires the workout_groups:read scope. This operation maps to
        /app/v1/coach/workout/group/runs/:runId and retains its Workout V2
        permission, feature-flag, and resource-scope checks.


        The clientId path parameter is resolved inside the company bound to the
        Public API token when present.
      operationId: publicWorkoutgetPublicV1WorkoutGroupsRunsRunId
      parameters:
        - in: path
          name: runId
          required: true
          description: Group workout run id.
          schema:
            type: string
            example: 67f1234567890abcdef1234
      responses:
        '200':
          description: Group run detail.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceGETAppV1CoachWorkoutGroupRunsRunIdResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      run:
                        runId: 67f1234567890abcdef1234
                        source: calendar_event
                        status: active
                        calendarEventId: null
                        manualSessionKey: small-group-2026-06-04-09
                        startedAt: null
                        endedAt: null
                      participants:
                        - clientId: 67f1234567890abcdef1234
                          ok: true
                          sessionId: null
                          sessionStatus: planned
                          workoutSource: auto_assigned_plan
                          sourceLabel: Full Body - Day 2
                          templateId: null
                          errorCode: ''
                          requiresConfirmation: false
                          confirmationToken: null
                          confirmationTokenExpiresAt: null
                          timerStartedAt: null
                          timerPausedAt: null
                          timerElapsedMs: 90000
                          runTimer:
                            timerStartedAt: null
                            timerPausedAt: null
                            timerElapsedMs: 300000
                          member:
                            clientId: 67f1234567890abcdef1234
                            firstName: Joseph
                            lastName: Quin
                            fullName: Joseph Quin
                            email: joseph@example.com
                            image: https://cdn.example.com/avatar.jpg
                            isActive: true
                            tags:
                              - _id: 67f1234567890abcdef1234
                                id: 67f1234567890abcdef1234
                                name: VIP
                                label: VIP
                                color: '#105DFB'
                            memberships:
                              - _id: 67f1234567890abcdef1234
                                id: 67f1234567890abcdef1234
                                membershipId: null
                                storeModuleMembershipId: null
                                productName: Premium Monthly
                                name: Premium Monthly
                                status: Active
                                startDate: null
                                endDate: null
                                expiresAt: null
                                nextBillingDate: null
                                autoRenewCheck: false
                            activeMembership:
                              _id: 67f1234567890abcdef1234
                              id: 67f1234567890abcdef1234
                              membershipId: null
                              storeModuleMembershipId: null
                              productName: Premium Monthly
                              name: Premium Monthly
                              status: Active
                              startDate: null
                              endDate: null
                              expiresAt: null
                              nextBillingDate: null
                              autoRenewCheck: false
                            membershipExpiresAt: null
                            remainingCredits: 23
                            creditBalance: 23
                            nextTrainingAt: null
                            nextTrainingBookingId: null
                            groupWorkoutSession:
                              sessionId: null
                              sessionStatus: paused
                              workoutSource: auto_assigned_plan
                              sourceLabel: Assigned plan
                              startedAt: null
                              endedAt: null
                          sessionData:
                            session:
                              id: 67f1234567890abcdef1234
                              planId: null
                              programmeScheduleItemId: null
                              plannedDate: '2026-09-08'
                              locationId: null
                              planMomentId: null
                              status: in_progress
                              startedAt: '2026-04-12T10:00:00.000Z'
                              endedAt: null
                              rating: 8
                              difficulty: Moderate
                              emojiRating: Energized
                              notes: Session felt good overall.
                              showSetRpe: true
                              activeExerciseId: null
                              activePerformanceId: null
                              activeExerciseUpdatedAt: null
                              provenance:
                                origin: coach
                                startedByActorType: coach
                                startedByClientId: null
                                startedByCoachId: null
                                executedByCoachId: null
                                completedByActorType: ''
                                completedByClientId: null
                                completedByCoachId: null
                                endedByActorType: ''
                                endedByClientId: null
                                endedByCoachId: null
                                lastUpdatedByActorType: coach
                                lastUpdatedByClientId: null
                                lastUpdatedByCoachId: null
                              planMoment:
                                id: 67f1234567890abcdef1234
                                name: Day 1
                                description: Upper body push.
                                date: '2026-04-15'
                                order: 0
                                scoring:
                                  scoringType: forTime
                                  descriptionOnly: true
                                  acceptsManualResult: true
                                  targetValue: null
                                  timeDomain:
                                    windowSeconds: null
                                    timeCapSeconds: 900
                                    rounds: 3
                                    intervalSeconds: null
                                    intervalCount: null
                                    workSeconds: null
                                    restSeconds: null
                                  scoreValidation:
                                    timeCapSeconds: 900
                                    maxReps: null
                                    expectedIntervals: null
                                  result:
                                    roundsCompleted: 5
                                    repsPerRound: 30
                                    extraReps: 12
                                    totalReps: 162
                                    intervalReps:
                                      - 12
                                      - 11
                                      - 10
                                    elapsedSeconds: 742
                                    finishedBeforeCap: true
                                    timeCapSeconds: 900
                                    maxLoadKg: 120
                            medicalInfo:
                              anyInjuries:
                                showCheck: true
                                value: Knee replacement L (2023)
                              anyMedications:
                                showCheck: true
                                value: Metformin 500mg
                              anyAllergies:
                                showCheck: false
                                value: ''
                              anyHeartProblem: true
                              anyBloodPressureIssue: true
                              approvedPhysicalActivities: true
                            performances:
                              - id: 67f1234567890abcdef1234
                                sessionId: 67f1234567890abcdef1234
                                planId: null
                                planMomentId: null
                                exerciseId: 67f1234567890abcdef1234
                                planExerciseId: null
                                source: plan
                                name: Barbell Bench Press
                                template:
                                  exerciseId: 67f1234567890abcdef1234
                                  planExerciseId: null
                                  sets: 3
                                  minReps: 8
                                  maxReps: 10
                                  metric: 45 sec
                                  rest: 75
                                  rpe: 7
                                  notes: Keep shoulder blades pinned.
                                  description: Flat horizontal press with controlled tempo.
                                  order: 0
                                libraryExercise:
                                  primaryMuscle: Chest
                                  description: Flat horizontal press with controlled tempo.
                                  secondaryMuscles:
                                    - Shoulders
                                    - Triceps
                                  primaryJoint: Shoulder
                                  difficulty: Intermediate
                                  intensity: Above Average
                                  equipment:
                                    - Barbell
                                    - Bench
                                  images:
                                    - url: >-
                                        https://cdn.example.com/workouts/plan-cover.jpg
                                      width: 1280
                                      height: 720
                                  videos:
                                    - url: >-
                                        https://cdn.example.com/workouts/demo.mp4
                                      platform: s3
                                      videoId: ''
                                      thumbnail: >-
                                        https://cdn.example.com/workouts/demo-thumb.jpg
                                      duration: 84
                                      width: 1920
                                      height: 1080
                                  defaultType: reps
                                order: 0
                                isActive: true
                                isCompleted: false
                                date: '2026-04-12T10:00:00.000Z'
                                startedAt: null
                                endedAt: null
                                groupId: super-a
                                totals:
                                  totalReps: 24
                                  totalTimeSeconds: 0
                                  totalDistanceMeters: 0
                                  totalVolume: 1680
                                  maxWeight: 75
                                  estimated1RM: 95
                                  averageRPE: 8.2
                                sets:
                                  - setNumber: 1
                                    setType: 'N'
                                    displayNumber: 1
                                    displayLabel: '1'
                                    previous: 12 × 22kg
                                    reps: 8
                                    weight: 50
                                    timeSeconds: null
                                    distanceMeters: null
                                    rpe: 8
                                    rest: 60
                                    restSeconds: 60
                                    completed: true
                                    targetReps: '8'
                                    targetWeight: 50
                                    targetTimeSeconds: null
                                    targetDistanceMeters: null
                                    targetRestSeconds: 60
                                    repsPlaceholderCoach: 12
                                    weightPlaceholderCoach: 40
                                    timeSecondsPlaceholderCoach: null
                                    distanceMetersPlaceholderCoach: null
                                    rpePlaceholderCoach: 7
                                    restSecondsPlaceholderCoach: 90
                                    repsPlaceholder: 12
                                    weightPlaceholder: 40
                                    timeSecondsPlaceholder: null
                                    distanceMetersPlaceholder: null
                                    rpePlaceholder: 7
                                    restSecondsPlaceholder: 90
                                    repsActual: 30
                                    weightActual: 42
                                    timeSecondsActual: null
                                    distanceMetersActual: null
                                    rpeActual: 8
                                    restSecondsActual: 90
                                notes: Last set close to failure.
                                nextSessionTarget:
                                  reps: 5-8
                                  weight: 80
                                  weightUnit: kg
                                  timeSeconds: null
                                  distanceMeters: null
                                  restSeconds: 120
                                  rpe: 8
                                  notes: Control the descent.
                                  sets:
                                    - {}
                                targetSnapshot:
                                  exerciseType: reps
                                  todayTarget:
                                    reps: 5-8
                                    weight: 80
                                    weightUnit: kg
                                    timeSeconds: null
                                    distanceMeters: null
                                    restSeconds: 120
                                    rpe: 8
                                    notes: Control the descent.
                                    sets:
                                      - {}
                                  lastSessionTarget:
                                    reps: 5-8
                                    weight: 80
                                    weightUnit: kg
                                    timeSeconds: null
                                    distanceMeters: null
                                    restSeconds: 120
                                    rpe: 8
                                    notes: Control the descent.
                                    sets:
                                      - {}
                                  personalRecord:
                                    metric: weight
                                    value: 82.5
                                    unit: kg
                                    reps: 6
                                    performedAt: null
                                    sessionId: null
                                    performanceId: null
                                  todaySetupValues: {}
                                  lastSetupValues: {}
                                  sourceSessionId: null
                                  sourcePerformanceId: null
                                setupFields:
                                  - key: seat
                                    label: Seat
                                    type: text
                                    unit: ''
                                    options:
                                      - '1'
                                      - '2'
                                      - '3'
                                      - '4'
                                    order: 1
                                    required: false
                                    enabled: true
                                    defaultValue: 3
                                setupValues:
                                  seat: '4'
                                  backrest: '2'
                                nextSetupValues:
                                  seat: '5'
                                showSetRpe: true
                                setupSettingsEnabled: true
                                hasMachineSettings: true
                                isMachineSetting: true
                                provenance:
                                  recordedByActorType: coach
                                  recordedByClientId: null
                                  recordedByCoachId: null
                                  lastUpdatedByActorType: coach
                                  lastUpdatedByClientId: null
                                  lastUpdatedByCoachId: null
                                type: reps
                                metrics:
                                  totalVolume: 1680
                                  maxWeight: 75
                                  totalReps: 24
                                isPersonalBest: true
                            summary:
                              totalVolume: 1680
                              totalReps: 24
                              totalPersonalBests: 1
                              muscleActivation:
                                raw:
                                  chest: 18
                                  shoulders: 12
                                  triceps: 8
                                normalized:
                                  chest: 18
                                  shoulders: 12
                                  triceps: 8
                                maxValue: 18
                                topMuscles:
                                  - muscle: chest
                                    value: 18
                          sessionErrorCode: ''
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '400':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                invalidRequest:
                  summary: Invalid request
                  value:
                    error:
                      code: 400
                      key: request.invalid
                      message: The request is invalid.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '401':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                missingBearer:
                  summary: Missing Bearer token
                  value:
                    error:
                      code: 401
                      key: auth.missing_bearer
                      message: Authorization Bearer token is required.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidToken:
                  summary: Invalid or expired token
                  value:
                    error:
                      code: 401
                      key: auth.invalid_token
                      message: The access token is invalid or expired.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidClient:
                  summary: Inactive or revoked client
                  value:
                    error:
                      code: 401
                      key: auth.invalid_client
                      message: The Public API client is inactive or revoked.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '403':
          description: Coach or company access denied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                insufficientScopes:
                  summary: Missing required scope
                  value:
                    error:
                      code: 403
                      key: scopes.insufficient
                      message: The access token does not include the required scope.
                      details:
                        requiredScopes:
                          - required:scope
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '404':
          description: Group run not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                notFound:
                  summary: Resource not found
                  value:
                    error:
                      code: 404
                      key: resource.not_found
                      message: The requested Public API resource was not found.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '409':
          $ref: '#/components/schemas/ErrorResponse'
        '422':
          $ref: '#/components/schemas/ErrorResponse'
        '429':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                rateLimitExceeded:
                  summary: Rate limit exceeded
                  value:
                    error:
                      code: 429
                      key: rate_limit.exceeded
                      message: Too many Public API requests. Retry later.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 0
                        resetSeconds: 1
                        retryAfterSeconds: 1
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                serverInternalError:
                  summary: Unexpected server error
                  value:
                    error:
                      code: 500
                      key: server.internal_error
                      message: An unexpected Public API server error occurred.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
      security:
        - PublicBearerAuth: []
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: >-
            curl -X GET
            "https://api.fitsociety.io/public/v1/workout/groups/runs/{runId}" \
              -H "Authorization: Bearer <access_token>"
components:
  schemas:
    PublicApiSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiMeta'
    PublicWorkoutSourceGETAppV1CoachWorkoutGroupRunsRunIdResponse200:
      type: object
      properties:
        run:
          type: object
          properties:
            runId:
              type: string
              example: 67f1234567890abcdef1234
            source:
              type: string
              enum:
                - calendar_event
                - manual
            status:
              type: string
              enum:
                - active
                - completed
                - cancelled
            calendarEventId:
              type:
                - string
                - 'null'
              example: null
            manualSessionKey:
              type: string
              example: small-group-2026-06-04-09
            startedAt:
              type:
                - string
                - 'null'
              format: date-time
              example: null
            endedAt:
              type:
                - string
                - 'null'
              format: date-time
              example: null
        participants:
          type: array
          items:
            allOf:
              - type: object
                properties:
                  clientId:
                    type: string
                    example: 67f1234567890abcdef1234
                  ok:
                    type: boolean
                    example: true
                  sessionId:
                    type:
                      - string
                      - 'null'
                    example: null
                  sessionStatus:
                    type: string
                    enum:
                      - planned
                      - in_progress
                      - paused
                      - completed
                      - stopped
                      - cancelled
                  workoutSource:
                    type: string
                    example: auto_assigned_plan
                  sourceLabel:
                    type: string
                    example: Full Body - Day 2
                  templateId:
                    type:
                      - string
                      - 'null'
                    example: null
                  errorCode:
                    type: string
                    example: ''
                  requiresConfirmation:
                    type: boolean
                    example: false
                  confirmationToken:
                    type:
                      - string
                      - 'null'
                    example: null
                  confirmationTokenExpiresAt:
                    type:
                      - string
                      - 'null'
                    format: date-time
                    example: null
                  timerStartedAt:
                    type:
                      - string
                      - 'null'
                    format: date-time
                    example: null
                  timerPausedAt:
                    type:
                      - string
                      - 'null'
                    format: date-time
                    example: null
                  timerElapsedMs:
                    type: number
                    example: 90000
                  runTimer:
                    type: object
                    description: >-
                      Current central group-run timer after the participant
                      status change.
                    properties:
                      timerStartedAt:
                        type:
                          - string
                          - 'null'
                        format: date-time
                        example: null
                      timerPausedAt:
                        type:
                          - string
                          - 'null'
                        format: date-time
                        example: null
                      timerElapsedMs:
                        type: number
                        example: 300000
              - type: object
                properties:
                  member:
                    oneOf:
                      - type: object
                        properties:
                          clientId:
                            type: string
                            example: 67f1234567890abcdef1234
                          firstName:
                            type: string
                            example: Joseph
                          lastName:
                            type: string
                            example: Quin
                          fullName:
                            type: string
                            example: Joseph Quin
                          email:
                            type: string
                            example: joseph@example.com
                          image:
                            type: string
                            example: https://cdn.example.com/avatar.jpg
                          isActive:
                            type: boolean
                            example: true
                          tags:
                            type: array
                            items:
                              type: object
                              properties:
                                _id:
                                  type: string
                                  example: 67f1234567890abcdef1234
                                id:
                                  type: string
                                  example: 67f1234567890abcdef1234
                                name:
                                  type: string
                                  example: VIP
                                label:
                                  type: string
                                  example: VIP
                                color:
                                  type: string
                                  example: '#105DFB'
                          memberships:
                            type: array
                            items:
                              type: object
                              properties:
                                _id:
                                  type: string
                                  example: 67f1234567890abcdef1234
                                id:
                                  type: string
                                  example: 67f1234567890abcdef1234
                                membershipId:
                                  type:
                                    - string
                                    - 'null'
                                  example: null
                                storeModuleMembershipId:
                                  type:
                                    - string
                                    - 'null'
                                  example: null
                                productName:
                                  type: string
                                  example: Premium Monthly
                                name:
                                  type: string
                                  example: Premium Monthly
                                status:
                                  type: string
                                  example: Active
                                startDate:
                                  type:
                                    - string
                                    - 'null'
                                  format: date-time
                                  example: null
                                endDate:
                                  type:
                                    - string
                                    - 'null'
                                  format: date-time
                                  example: null
                                expiresAt:
                                  type:
                                    - string
                                    - 'null'
                                  format: date-time
                                  example: null
                                nextBillingDate:
                                  type:
                                    - string
                                    - 'null'
                                  format: date-time
                                  example: null
                                autoRenewCheck:
                                  type: boolean
                                  example: false
                          activeMembership:
                            oneOf:
                              - type: object
                                properties:
                                  _id:
                                    type: string
                                    example: 67f1234567890abcdef1234
                                  id:
                                    type: string
                                    example: 67f1234567890abcdef1234
                                  membershipId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  storeModuleMembershipId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  productName:
                                    type: string
                                    example: Premium Monthly
                                  name:
                                    type: string
                                    example: Premium Monthly
                                  status:
                                    type: string
                                    example: Active
                                  startDate:
                                    type:
                                      - string
                                      - 'null'
                                    format: date-time
                                    example: null
                                  endDate:
                                    type:
                                      - string
                                      - 'null'
                                    format: date-time
                                    example: null
                                  expiresAt:
                                    type:
                                      - string
                                      - 'null'
                                    format: date-time
                                    example: null
                                  nextBillingDate:
                                    type:
                                      - string
                                      - 'null'
                                    format: date-time
                                    example: null
                                  autoRenewCheck:
                                    type: boolean
                                    example: false
                              - type: 'null'
                          membershipExpiresAt:
                            type:
                              - string
                              - 'null'
                            format: date-time
                            example: null
                          remainingCredits:
                            type: number
                            example: 23
                          creditBalance:
                            type: number
                            example: 23
                          nextTrainingAt:
                            type:
                              - string
                              - 'null'
                            format: date-time
                            example: null
                          nextTrainingBookingId:
                            type:
                              - string
                              - 'null'
                            example: null
                          groupWorkoutSession:
                            oneOf:
                              - type: object
                                properties:
                                  sessionId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  sessionStatus:
                                    type: string
                                    enum:
                                      - pending
                                      - in_progress
                                      - paused
                                      - completed
                                      - stopped
                                      - cancelled
                                      - error
                                    example: paused
                                  workoutSource:
                                    type: string
                                    example: auto_assigned_plan
                                  sourceLabel:
                                    type: string
                                    example: Assigned plan
                                  startedAt:
                                    type:
                                      - string
                                      - 'null'
                                    format: date-time
                                    example: null
                                  endedAt:
                                    type:
                                      - string
                                      - 'null'
                                    format: date-time
                                    example: null
                              - type: 'null'
                      - type: 'null'
                  sessionData:
                    oneOf:
                      - type: object
                        properties:
                          session:
                            type: object
                            properties:
                              id:
                                type: string
                                example: 67f1234567890abcdef1234
                              planId:
                                type:
                                  - string
                                  - 'null'
                                example: null
                              programmeScheduleItemId:
                                type:
                                  - string
                                  - 'null'
                                example: null
                              plannedDate:
                                oneOf:
                                  - type: string
                                    format: date
                                    pattern: ^\d{4}-\d{2}-\d{2}$
                                    example: '2026-09-08'
                                  - type: string
                                    enum:
                                      - ''
                                    example: ''
                                description: >-
                                  Canonical planned occurrence date, or an empty
                                  string for sessions not started from a
                                  calendar programme item.
                              locationId:
                                type:
                                  - string
                                  - 'null'
                                example: null
                              planMomentId:
                                type:
                                  - string
                                  - 'null'
                                example: null
                              status:
                                type: string
                                enum:
                                  - planned
                                  - in_progress
                                  - paused
                                  - completed
                                  - stopped
                                  - cancelled
                                example: in_progress
                              startedAt:
                                type: string
                                format: date-time
                                example: '2026-04-12T10:00:00.000Z'
                              endedAt:
                                type:
                                  - string
                                  - 'null'
                                format: date-time
                                example: null
                              rating:
                                type:
                                  - number
                                  - 'null'
                                example: 8
                              difficulty:
                                type:
                                  - string
                                  - 'null'
                                enum:
                                  - Easy
                                  - Moderate
                                  - Hard
                                  - null
                                example: Moderate
                              emojiRating:
                                type:
                                  - string
                                  - 'null'
                                enum:
                                  - Strong
                                  - Energized
                                  - Challenging
                                  - Intense
                                  - Exhausted
                                  - Satisfied
                                  - null
                                example: Energized
                              notes:
                                type: string
                                example: Session felt good overall.
                              showSetRpe:
                                type: boolean
                                example: true
                                description: >-
                                  Freestyle-session setting that shows optional
                                  per-set RPE inputs for every exercise in the
                                  session.
                              activeExerciseId:
                                type:
                                  - string
                                  - 'null'
                                example: null
                              activePerformanceId:
                                type:
                                  - string
                                  - 'null'
                                example: null
                              activeExerciseUpdatedAt:
                                type:
                                  - string
                                  - 'null'
                                format: date-time
                                example: null
                              provenance:
                                type: object
                                properties:
                                  origin:
                                    type: string
                                    enum:
                                      - ''
                                      - client
                                      - coach
                                      - system
                                    example: coach
                                  startedByActorType:
                                    type: string
                                    enum:
                                      - ''
                                      - client
                                      - coach
                                      - system
                                    example: coach
                                  startedByClientId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  startedByCoachId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  executedByCoachId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  completedByActorType:
                                    type: string
                                    enum:
                                      - ''
                                      - client
                                      - coach
                                      - system
                                    example: ''
                                  completedByClientId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  completedByCoachId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  endedByActorType:
                                    type: string
                                    enum:
                                      - ''
                                      - client
                                      - coach
                                      - system
                                    example: ''
                                  endedByClientId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  endedByCoachId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  lastUpdatedByActorType:
                                    type: string
                                    enum:
                                      - ''
                                      - client
                                      - coach
                                      - system
                                    example: coach
                                  lastUpdatedByClientId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                                  lastUpdatedByCoachId:
                                    type:
                                      - string
                                      - 'null'
                                    example: null
                              planMoment:
                                type:
                                  - object
                                  - 'null'
                                properties:
                                  id:
                                    type: string
                                    example: 67f1234567890abcdef1234
                                  name:
                                    type: string
                                    example: Day 1
                                  description:
                                    type: string
                                    example: Upper body push.
                                  date:
                                    type: string
                                    example: '2026-04-15'
                                  order:
                                    type: number
                                    example: 0
                                  scoring:
                                    type: object
                                    nullable: true
                                    description: >-
                                      Scoring of a plan day. Null for an
                                      ordinary standard day.
                                      `acceptsManualResult` is true only for
                                      exercise-free scored days
                                      (`descriptionOnly`), which take a
                                      `wodResult` on PATCH
                                      /app/v1/workout/performance/sessions/{sessionId}/complete.
                                      `result` is the saved score of the
                                      selected session, or null.
                                    properties:
                                      scoringType:
                                        type: string
                                        enum:
                                          - standard
                                          - forTime
                                          - amrap
                                          - emom
                                          - tabata
                                          - maxLoad
                                        example: forTime
                                      descriptionOnly:
                                        type: boolean
                                        example: true
                                      acceptsManualResult:
                                        type: boolean
                                        example: true
                                      targetValue:
                                        type: number
                                        nullable: true
                                        example: null
                                      timeDomain:
                                        type: object
                                        nullable: true
                                        description: >-
                                          Clock prescription, same contract as a
                                          WOD `timeDomain`. Allowed fields depend
                                          on `scoringType`: amrap → windowSeconds
                                          (required); forTime → timeCapSeconds,
                                          rounds (defaults to 1); emom →
                                          intervalSeconds, intervalCount (both
                                          required); tabata → workSeconds,
                                          restSeconds, intervalCount (all
                                          required); standard/maxLoad → none.
                                        properties:
                                          windowSeconds:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: null
                                          timeCapSeconds:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: 900
                                          rounds:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: 3
                                          intervalSeconds:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: null
                                          intervalCount:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: null
                                          workSeconds:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: null
                                          restSeconds:
                                            type: integer
                                            nullable: true
                                            minimum: 0
                                            example: null
                                      scoreValidation:
                                        type: object
                                        nullable: true
                                        description: >-
                                          Optional result caps. timeCapSeconds and
                                          expectedIntervals are derived from
                                          `timeDomain` when one is set.
                                        properties:
                                          timeCapSeconds:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: 900
                                          maxReps:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: null
                                          expectedIntervals:
                                            type: integer
                                            nullable: true
                                            minimum: 1
                                            example: null
                                      result:
                                        allOf:
                                          - type: object
                                            description: >-
                                              Type-specific manual score, the same
                                              shape as the WOD `wodResult`. Only the
                                              fields of the day's scoringType are
                                              accepted: amrap → roundsCompleted,
                                              repsPerRound, extraReps, totalReps
                                              (total = rounds × repsPerRound +
                                              extraReps, extraReps < repsPerRound);
                                              forTime → elapsedSeconds,
                                              finishedBeforeCap, totalReps (reps
                                              required when not finished before the
                                              cap); emom/tabata → intervalReps,
                                              totalReps (sum of intervals; count must
                                              match intervalCount when set); maxLoad →
                                              maxLoadKg. The stored copy of a forTime
                                              result also carries timeCapSeconds.
                                            properties:
                                              roundsCompleted:
                                                type: integer
                                                minimum: 0
                                                example: 5
                                              repsPerRound:
                                                type: integer
                                                minimum: 1
                                                example: 30
                                              extraReps:
                                                type: integer
                                                minimum: 0
                                                example: 12
                                              totalReps:
                                                type: integer
                                                minimum: 0
                                                example: 162
                                              intervalReps:
                                                type: array
                                                items:
                                                  type: integer
                                                  minimum: 0
                                                example:
                                                  - 12
                                                  - 11
                                                  - 10
                                              elapsedSeconds:
                                                type: number
                                                minimum: 0
                                                example: 742
                                              finishedBeforeCap:
                                                type: boolean
                                                example: true
                                              timeCapSeconds:
                                                type: integer
                                                nullable: true
                                                readOnly: true
                                                example: 900
                                              maxLoadKg:
                                                type: number
                                                minimum: 0
                                                example: 120
                                        nullable: true
                          medicalInfo:
                            type: object
                            description: >-
                              Medical information copied from the client's
                              objective profile.
                            additionalProperties: true
                            example:
                              anyInjuries:
                                showCheck: true
                                value: Knee replacement L (2023)
                              anyMedications:
                                showCheck: true
                                value: Metformin 500mg
                              anyAllergies:
                                showCheck: false
                                value: ''
                              anyHeartProblem: true
                              anyBloodPressureIssue: true
                              approvedPhysicalActivities: true
                          performances:
                            type: array
                            items:
                              type: object
                              properties:
                                id:
                                  type: string
                                  example: 67f1234567890abcdef1234
                                sessionId:
                                  type: string
                                  example: 67f1234567890abcdef1234
                                planId:
                                  type:
                                    - string
                                    - 'null'
                                  example: null
                                planMomentId:
                                  type:
                                    - string
                                    - 'null'
                                  example: null
                                exerciseId:
                                  type: string
                                  example: 67f1234567890abcdef1234
                                planExerciseId:
                                  type:
                                    - string
                                    - 'null'
                                  example: null
                                source:
                                  type: string
                                  enum:
                                    - plan
                                    - adhoc
                                  example: plan
                                name:
                                  type: string
                                  example: Barbell Bench Press
                                template:
                                  type:
                                    - object
                                    - 'null'
                                  properties:
                                    exerciseId:
                                      type: string
                                      example: 67f1234567890abcdef1234
                                    planExerciseId:
                                      type:
                                        - string
                                        - 'null'
                                      example: null
                                    sets:
                                      type: number
                                      example: 3
                                    minReps:
                                      type: number
                                      example: 8
                                    maxReps:
                                      type: number
                                      example: 10
                                    metric:
                                      type: string
                                      example: 45 sec
                                      description: >-
                                        Plan-prescribed metric label for time or
                                        distance based exercises.
                                    rest:
                                      type: number
                                      example: 75
                                    rpe:
                                      type: number
                                      example: 7
                                    notes:
                                      type: string
                                      description: >-
                                        Coach-prescribed note for this exercise
                                        in the plan. Use `description` for the
                                        catalog exercise description.
                                      example: Keep shoulder blades pinned.
                                    description:
                                      type: string
                                      description: >-
                                        Localized catalog exercise description,
                                        separate from the plan exercise notes.
                                      example: >-
                                        Flat horizontal press with controlled
                                        tempo.
                                    order:
                                      type: number
                                      example: 0
                                  additionalProperties: true
                                libraryExercise:
                                  oneOf:
                                    - type: object
                                      properties:
                                        primaryMuscle:
                                          type: string
                                          example: Chest
                                        description:
                                          type: string
                                          description: Localized catalog exercise description.
                                          example: >-
                                            Flat horizontal press with controlled
                                            tempo.
                                        secondaryMuscles:
                                          type: array
                                          items:
                                            type: string
                                            enum:
                                              - Chest
                                              - Back
                                              - Lats
                                              - Traps
                                              - Shoulders
                                              - Biceps
                                              - Triceps
                                              - Forearms
                                              - Core
                                              - Abs
                                              - Obliques
                                              - Glutes
                                              - Quads
                                              - Hamstrings
                                              - Calves
                                              - Adductors
                                              - Abductors
                                              - Hip Flexors
                                              - Full Body
                                              - Cardio / Conditioning
                                              - Neck
                                              - Lower Back
                                          example:
                                            - Shoulders
                                            - Triceps
                                        primaryJoint:
                                          type: string
                                          enum:
                                            - ''
                                            - Ankle
                                            - Combination
                                            - Core
                                            - Elbow
                                            - Fingers
                                            - Hip
                                            - Knee
                                            - Neck
                                            - Shoulder
                                            - Spine
                                            - Wrist
                                          example: Shoulder
                                        difficulty:
                                          type: string
                                          enum:
                                            - ''
                                            - Beginner
                                            - Intermediate
                                            - Advanced
                                          example: Intermediate
                                        intensity:
                                          type: string
                                          enum:
                                            - ''
                                            - Beginner
                                            - Below Average
                                            - Average
                                            - Above Average
                                            - High Intensity
                                          example: Above Average
                                        equipment:
                                          type: array
                                          items:
                                            type: string
                                            enum:
                                              - Dumbbells
                                              - AdjustableDumbbells
                                              - Kettlebell
                                              - AdjustableKettlebell
                                              - CompetitionKettlebell
                                              - Medicineball
                                              - SlamBall
                                              - WallBall
                                              - Weightplate
                                              - BumperPlates
                                              - FractionalPlates
                                              - LoadableDumbbellHandle
                                              - Sandbag
                                              - StrongmanSandbag
                                              - Bulgarianbag
                                              - Aquabag
                                              - Aquaball
                                              - Hydrovest
                                              - MagneticBell
                                              - Macebell
                                              - SteelClub
                                              - IndianClub
                                              - Barbell
                                              - OlympicBarbell
                                              - TechniqueBar
                                              - EZBar
                                              - TrapBar
                                              - SafetySquatBar
                                              - SwissBar
                                              - CamberedBar
                                              - AxleBar
                                              - Landmine
                                              - Bench
                                              - FlatBench
                                              - AdjustableBench
                                              - InclineBench
                                              - DeclineBench
                                              - SealRowBench
                                              - HipThrustBench
                                              - BenchPressRack
                                              - SquatRack
                                              - SquatStand
                                              - PowerRack
                                              - WallMountedRack
                                              - HalfRack
                                              - SmithMachine
                                              - Monolift
                                              - JammerArms
                                              - BarbellJack
                                              - WeightTree
                                              - PlateStorage
                                              - DeadliftPlatform
                                              - Rig
                                              - StrengthMachinesPlateloaded
                                              - StrengthMachinesWeightstack
                                              - StrengthMachinesPneumatic
                                              - MultiGym
                                              - LegPressMachine
                                              - VerticalLegPressMachine
                                              - LeverageSquatMachine
                                              - LinearHackSquatMachine
                                              - BeltSquatMachine
                                              - PendulumSquatMachine
                                              - VSquatMachine
                                              - HackSquatMachine
                                              - LegExtensionMachine
                                              - LegCurlMachine
                                              - SeatedLegCurlMachine
                                              - LyingLegCurlMachine
                                              - StandingLegCurlMachine
                                              - StandingCalfRaiseMachine
                                              - SeatedCalfRaiseMachine
                                              - CalfPressMachine
                                              - HipThrustMachine
                                              - GluteDriveMachine
                                              - GluteKickbackMachine
                                              - HipExtensionMachine
                                              - HipAbductionMachine
                                              - HipAdductionMachine
                                              - ChestPressMachine
                                              - VerticalChestPressMachine
                                              - InclineChestPressMachine
                                              - DeclineChestPressMachine
                                              - IsoLateralChestPressMachine
                                              - IsoLateralInclinePressMachine
                                              - ShoulderPressMachine
                                              - IsoLateralShoulderPressMachine
                                              - MultiPressMachine
                                              - LateralRaiseMachine
                                              - RearDeltMachine
                                              - PecDeckMachine
                                              - PulloverMachine
                                              - LatPulldownMachine
                                              - IsoLateralLatPulldownMachine
                                              - AssistedPullupMachine
                                              - AssistedDipMachine
                                              - SeatedDipMachine
                                              - SeatedRowMachine
                                              - LowRowMachine
                                              - HighRowMachine
                                              - IsoLateralRowMachine
                                              - ChestSupportedRowMachine
                                              - TBarRowMachine
                                              - BicepsCurlMachine
                                              - PreacherCurlMachine
                                              - TricepsExtensionMachine
                                              - AbCrunchMachine
                                              - AbCoasterMachine
                                              - RotaryTorsoMachine
                                              - BackExtensionMachine
                                              - SeatedBackExtensionMachine
                                              - HyperextensionBench
                                              - ReverseHyper
                                              - GHD
                                              - Kinesis
                                              - Pulley
                                              - CableMachine
                                              - CableStation
                                              - CableColumn
                                              - CableCrossover
                                              - DualAdjustablePulley
                                              - SingleCableTower
                                              - FunctionalTrainer
                                              - TotalGymGTS
                                              - Gymstick
                                              - ViPR
                                              - RipTrainer
                                              - Battlerope
                                              - ProwlerSled
                                              - FarmersHandles
                                              - Yoke
                                              - Tire
                                              - Sledgehammer
                                              - TorqueTank
                                              - SledTrack
                                              - WallBallTarget
                                              - AgilityPoles
                                              - MiniHurdles
                                              - SprintParachute
                                              - PullUpBar
                                              - Parallelbars
                                              - DipBars
                                              - Equalizer
                                              - Suspensiontrainer
                                              - SuspensionSlingTrainer
                                              - GymnasticRings
                                              - MonkeyBars
                                              - PegBoard
                                              - RopeClimb
                                              - Wall
                                              - StallBars
                                              - DoorPullUpBar
                                              - PushUpHandles
                                              - AbStraps
                                              - Boxstep
                                              - SoftPlyoBox
                                              - Hurdle
                                              - Speedladder
                                              - Parallettes
                                              - NordicBench
                                              - SissySquatBench
                                              - Cardio
                                              - Treadmill
                                              - CurvedTreadmill
                                              - AirRunner
                                              - AssaultRunner
                                              - StationaryBike
                                              - UprightBike
                                              - RecumbentBike
                                              - BikeErg
                                              - SpinBike
                                              - AirBike
                                              - Rower
                                              - WaterRower
                                              - FanRower
                                              - ArmErgometer
                                              - SkiErg
                                              - Elliptical
                                              - ArcTrainer
                                              - NuStep
                                              - StairClimber
                                              - StepMill
                                              - JacobsLadder
                                              - VersaClimber
                                              - Bosu
                                              - Balanceball
                                              - Exerciseball
                                              - PilatesTennisball
                                              - PilatesRing
                                              - YogaMat
                                              - YogaBlock
                                              - YogaWheel
                                              - StretchStrap
                                              - MobilityStick
                                              - MassageBall
                                              - PeanutMassageBall
                                              - Airpad
                                              - Balanceboard
                                              - BalancePad
                                              - WobbleBoard
                                              - Glidedisc
                                              - Foamroller
                                              - Elasticbands
                                              - TherapyBand
                                              - Resistanceband
                                              - MiniBand
                                              - PullUpAssistBand
                                              - Powertube
                                              - AnkleWeights
                                              - SlantBoard
                                              - Vibrationtraining
                                              - CableRope
                                              - StraightBarAttachment
                                              - CurlBarAttachment
                                              - LatBarAttachment
                                              - TricepsBarAttachment
                                              - RowHandle
                                              - DHandle
                                              - DoubleDHandle
                                              - AnkleCuff
                                              - CableCuff
                                              - LandmineHandle
                                              - MagGripAttachment
                                              - DipBelt
                                              - AbWheel
                                              - WristRoller
                                              - FatGrip
                                              - Chain
                                              - DoorAnchor
                                              - JumpRope
                                              - SpeedRope
                                              - WeightedJumpRope
                                              - SledHarness
                                              - LiftingStraps
                                              - LiftingHooks
                                              - WristWraps
                                              - WeightliftingBelt
                                              - Clubbel
                                              - Stick
                                              - Bodybow
                                              - BuddySystem
                                              - Multinet
                                              - Flowin
                                              - Aerialhoop
                                              - Dancingpole
                                              - Trapeze
                                              - HulaHoop
                                              - Trampoline
                                              - XCO
                                              - PilatesReformer
                                              - PilatesChair
                                              - PilatesCadillac
                                              - PilatesBarrel
                                              - PilatesSpringboard
                                              - BalanceBeam
                                              - TreatmentTable
                                              - RehabTable
                                              - SlideBoard
                                          example:
                                            - Barbell
                                            - Bench
                                        images:
                                          type: array
                                          items:
                                            type: object
                                            required:
                                              - url
                                            properties:
                                              url:
                                                type: string
                                                format: uri
                                                example: >-
                                                  https://cdn.example.com/workouts/plan-cover.jpg
                                              width:
                                                type:
                                                  - number
                                                  - 'null'
                                                example: 1280
                                              height:
                                                type:
                                                  - number
                                                  - 'null'
                                                example: 720
                                        videos:
                                          type: array
                                          items:
                                            type: object
                                            required:
                                              - url
                                              - platform
                                            properties:
                                              url:
                                                type: string
                                                format: uri
                                                example: >-
                                                  https://cdn.example.com/workouts/demo.mp4
                                              platform:
                                                type: string
                                                enum:
                                                  - s3
                                                  - youtube
                                                  - tiktok
                                                example: s3
                                              videoId:
                                                type: string
                                                example: ''
                                              thumbnail:
                                                type: string
                                                format: uri
                                                example: >-
                                                  https://cdn.example.com/workouts/demo-thumb.jpg
                                              duration:
                                                type:
                                                  - number
                                                  - 'null'
                                                example: 84
                                              width:
                                                type:
                                                  - number
                                                  - 'null'
                                                example: 1920
                                              height:
                                                type:
                                                  - number
                                                  - 'null'
                                                example: 1080
                                        defaultType:
                                          type: string
                                          enum:
                                            - ''
                                            - reps
                                            - time
                                            - distance
                                          description: >-
                                            Optional fallback tracking type for
                                            freestyle sessions.
                                          example: reps
                                    - type: 'null'
                                order:
                                  type:
                                    - number
                                    - 'null'
                                  example: 0
                                isActive:
                                  type: boolean
                                  example: true
                                  description: >-
                                    True only for the session's last-touched
                                    exercise performance.
                                isCompleted:
                                  type: boolean
                                  example: false
                                date:
                                  type: string
                                  format: date-time
                                  example: '2026-04-12T10:00:00.000Z'
                                startedAt:
                                  type:
                                    - string
                                    - 'null'
                                  format: date-time
                                  example: null
                                endedAt:
                                  type:
                                    - string
                                    - 'null'
                                  format: date-time
                                  example: null
                                groupId:
                                  type: string
                                  example: super-a
                                totals:
                                  type: object
                                  properties:
                                    totalReps:
                                      type: number
                                      example: 24
                                    totalTimeSeconds:
                                      type: number
                                      example: 0
                                    totalDistanceMeters:
                                      type: number
                                      example: 0
                                    totalVolume:
                                      type: number
                                      example: 1680
                                    maxWeight:
                                      type: number
                                      example: 75
                                    estimated1RM:
                                      type: number
                                      example: 95
                                    averageRPE:
                                      type: number
                                      example: 8.2
                                sets:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      setNumber:
                                        type: integer
                                        example: 1
                                      setType:
                                        type: string
                                        enum:
                                          - 'N'
                                          - W
                                          - D
                                          - F
                                        example: 'N'
                                        description: Normal / Warm-up / Drop / Failure.
                                      displayNumber:
                                        type:
                                          - integer
                                          - 'null'
                                        example: 1
                                        description: >-
                                          Sequential number for Normal sets only;
                                          null for W/D/F.
                                      displayLabel:
                                        type:
                                          - string
                                          - 'null'
                                        example: '1'
                                      previous:
                                        type:
                                          - string
                                          - 'null'
                                        example: 12 × 22kg
                                        description: >-
                                          The 'Previous' column for this set
                                          index, resolved against the client's
                                          most recent COMPLETED session (this
                                          session excluded).
                                      reps:
                                        type:
                                          - number
                                          - string
                                          - 'null'
                                        example: 8
                                      weight:
                                        type:
                                          - number
                                          - 'null'
                                        example: 50
                                      timeSeconds:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      distanceMeters:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      rpe:
                                        type:
                                          - number
                                          - 'null'
                                        example: 8
                                      rest:
                                        type:
                                          - number
                                          - 'null'
                                        example: 60
                                      restSeconds:
                                        type:
                                          - number
                                          - 'null'
                                        example: 60
                                      completed:
                                        type: boolean
                                        example: true
                                      targetReps:
                                        type: string
                                        example: '8'
                                      targetWeight:
                                        type:
                                          - number
                                          - 'null'
                                        example: 50
                                      targetTimeSeconds:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      targetDistanceMeters:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      targetRestSeconds:
                                        type:
                                          - number
                                          - 'null'
                                        example: 60
                                      repsPlaceholderCoach:
                                        type:
                                          - number
                                          - string
                                          - 'null'
                                        example: 12
                                        description: >-
                                          The greyed hint an EMPTY reps input
                                          shows, as prescribed by the coach for
                                          this set index (WorkoutPlan `setsData`).
                                          A reps range stays a string (`"8-12"`).
                                          Never logged work: placeholders are
                                          excluded from every total, volume, PR
                                          and completion check. `null` when this
                                          exercise type does not track reps, when
                                          nothing is prescribed for that set, and
                                          for a freestyle save, which has no
                                          prescription at all.
                                      weightPlaceholderCoach:
                                        type:
                                          - number
                                          - 'null'
                                        example: 40
                                      timeSecondsPlaceholderCoach:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      distanceMetersPlaceholderCoach:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      rpePlaceholderCoach:
                                        type:
                                          - number
                                          - 'null'
                                        example: 7
                                      restSecondsPlaceholderCoach:
                                        type:
                                          - number
                                          - 'null'
                                        example: 90
                                        description: >-
                                          The greyed hint an EMPTY rest input
                                          shows, as prescribed by the coach for
                                          this set index (WorkoutPlan `setsData`).
                                          Rest applies to every exercise type, so
                                          it is not type-masked. Never logged
                                          work. `null` when nothing is prescribed
                                          for that set, and for a freestyle save,
                                          which has no prescription at all.
                                      repsPlaceholder:
                                        type:
                                          - number
                                          - string
                                          - 'null'
                                        example: 12
                                        description: >-
                                          The hint to ACTUALLY show. **The coach
                                          wins**: this is the `*PlaceholderCoach`
                                          value beside it whenever there is one,
                                          falling back to the client's own stored
                                          placeholder only where the coach
                                          prescribed nothing (per-set tracking
                                          off, an extra set, a metric left blank,
                                          or any freestyle set). So it is
                                          identical to `*PlaceholderCoach` on any
                                          prescribed set and always reflects the
                                          CURRENT prescription. Emitted on logged
                                          rows too, because clearing a logged
                                          value is exactly when the hint has to
                                          reappear.
                                      weightPlaceholder:
                                        type:
                                          - number
                                          - 'null'
                                        example: 40
                                      timeSecondsPlaceholder:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      distanceMetersPlaceholder:
                                        type:
                                          - number
                                          - 'null'
                                        example: null
                                      rpePlaceholder:
                                        type:
                                          - number
                                          - 'null'
                                        example: 7
                                      restSecondsPlaceholder:
                                        type:
                                          - number
                                          - 'null'
                                        example: 90
                                      repsActual:
                                        type:
                                          - number
                                          - string
                                          - 'null'
                                        example: 30
                                        description: >-
                                          The athlete's ACTUALLY-logged reps for
                                          this set (mirrors `reps`), or `null`
                                          when they have not logged it — the
                                          visible `reps` may be a
                                          coach-prescription prefill. Additive:
                                          `reps` is unchanged.
                                      weightActual:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        example: 42
                                        description: >-
                                          Actually-logged weight (mirrors
                                          `weight`), or `null` if not logged. See
                                          `repsActual`.
                                      timeSecondsActual:
                                        type:
                                          - integer
                                          - 'null'
                                        minimum: 0
                                        example: null
                                        description: >-
                                          Actually-logged time (mirrors
                                          `timeSeconds`), or `null` if not logged.
                                          See `repsActual`.
                                      distanceMetersActual:
                                        type:
                                          - integer
                                          - 'null'
                                        minimum: 0
                                        example: null
                                        description: >-
                                          Actually-logged distance (mirrors
                                          `distanceMeters`), or `null` if not
                                          logged. See `repsActual`.
                                      rpeActual:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        maximum: 10
                                        example: 8
                                        description: >-
                                          Actually-logged RPE (mirrors `rpe`), or
                                          `null` if not logged or RPE is hidden.
                                          See `repsActual`.
                                      restSecondsActual:
                                        type:
                                          - integer
                                          - 'null'
                                        minimum: 0
                                        example: 90
                                        description: >-
                                          Actually-logged rest in seconds (mirrors
                                          `restSeconds`), or `null` if not logged.
                                          See `repsActual`.
                                notes:
                                  type: string
                                  example: Last set close to failure.
                                nextSessionTarget:
                                  type: object
                                  properties:
                                    reps:
                                      type: string
                                      example: 5-8
                                    weight:
                                      type:
                                        - number
                                        - 'null'
                                      example: 80
                                    weightUnit:
                                      type: string
                                      example: kg
                                    timeSeconds:
                                      type:
                                        - number
                                        - 'null'
                                      example: null
                                    distanceMeters:
                                      type:
                                        - number
                                        - 'null'
                                      example: null
                                    restSeconds:
                                      type:
                                        - number
                                        - 'null'
                                      example: 120
                                    rpe:
                                      type:
                                        - number
                                        - 'null'
                                      example: 8
                                    notes:
                                      type: string
                                      example: Control the descent.
                                    sets:
                                      type: array
                                      items:
                                        type: object
                                        additionalProperties: true
                                targetSnapshot:
                                  type: object
                                  description: >-
                                    The prescription and tracking type captured
                                    for this execution, independent of later
                                    plan edits.
                                  properties:
                                    exerciseType:
                                      type: string
                                      enum:
                                        - reps
                                        - time
                                        - distance
                                        - bodyweight
                                        - weighted_bodyweight
                                        - assisted_bodyweight
                                        - mixed
                                      description: >-
                                        Original execution type. Legacy records
                                        capture this before the linked
                                        prescription changes.
                                    todayTarget:
                                      type: object
                                      properties:
                                        reps:
                                          type: string
                                          example: 5-8
                                        weight:
                                          type:
                                            - number
                                            - 'null'
                                          example: 80
                                        weightUnit:
                                          type: string
                                          example: kg
                                        timeSeconds:
                                          type:
                                            - number
                                            - 'null'
                                          example: null
                                        distanceMeters:
                                          type:
                                            - number
                                            - 'null'
                                          example: null
                                        restSeconds:
                                          type:
                                            - number
                                            - 'null'
                                          example: 120
                                        rpe:
                                          type:
                                            - number
                                            - 'null'
                                          example: 8
                                        notes:
                                          type: string
                                          example: Control the descent.
                                        sets:
                                          type: array
                                          items:
                                            type: object
                                            additionalProperties: true
                                    lastSessionTarget:
                                      oneOf:
                                        - type: object
                                          properties:
                                            reps:
                                              type: string
                                              example: 5-8
                                            weight:
                                              type:
                                                - number
                                                - 'null'
                                              example: 80
                                            weightUnit:
                                              type: string
                                              example: kg
                                            timeSeconds:
                                              type:
                                                - number
                                                - 'null'
                                              example: null
                                            distanceMeters:
                                              type:
                                                - number
                                                - 'null'
                                              example: null
                                            restSeconds:
                                              type:
                                                - number
                                                - 'null'
                                              example: 120
                                            rpe:
                                              type:
                                                - number
                                                - 'null'
                                              example: 8
                                            notes:
                                              type: string
                                              example: Control the descent.
                                            sets:
                                              type: array
                                              items:
                                                type: object
                                                additionalProperties: true
                                        - type: 'null'
                                    personalRecord:
                                      type:
                                        - object
                                        - 'null'
                                      description: >-
                                        For assisted_bodyweight, metric weight
                                        is kilograms of assistance: lower is
                                        better, equal assistance compares higher
                                        reps, and zero is valid. Only completed
                                        sets with finite nonnegative assistance
                                        and positive reps qualify. Assistance is
                                        never lifted-load volume or estimated
                                        1RM.
                                      properties:
                                        metric:
                                          type: string
                                          enum:
                                            - weight
                                            - volume
                                            - reps
                                            - time
                                            - distance
                                            - ''
                                          example: weight
                                        value:
                                          type:
                                            - number
                                            - 'null'
                                          example: 82.5
                                        unit:
                                          type: string
                                          example: kg
                                        reps:
                                          type:
                                            - number
                                            - 'null'
                                          example: 6
                                        performedAt:
                                          type:
                                            - string
                                            - 'null'
                                          format: date-time
                                          example: null
                                        sessionId:
                                          type:
                                            - string
                                            - 'null'
                                          example: null
                                        performanceId:
                                          type:
                                            - string
                                            - 'null'
                                          example: null
                                    todaySetupValues:
                                      type: object
                                      additionalProperties: true
                                    lastSetupValues:
                                      type: object
                                      additionalProperties: true
                                    sourceSessionId:
                                      type:
                                        - string
                                        - 'null'
                                      example: null
                                    sourcePerformanceId:
                                      type:
                                        - string
                                        - 'null'
                                      example: null
                                setupFields:
                                  type: array
                                  maxItems: 8
                                  items:
                                    type: object
                                    required:
                                      - key
                                      - label
                                    properties:
                                      key:
                                        type: string
                                        example: seat
                                      label:
                                        type: string
                                        example: Seat
                                      type:
                                        type: string
                                        enum:
                                          - text
                                          - number
                                          - select
                                        example: text
                                      unit:
                                        type: string
                                        example: ''
                                      options:
                                        type: array
                                        items:
                                          type: string
                                        example:
                                          - '1'
                                          - '2'
                                          - '3'
                                          - '4'
                                      order:
                                        type: number
                                        example: 1
                                      required:
                                        type: boolean
                                        example: false
                                      enabled:
                                        type: boolean
                                        example: true
                                      defaultValue:
                                        oneOf:
                                          - type: string
                                          - type: number
                                        example: 3
                                setupValues:
                                  type: object
                                  additionalProperties: true
                                  example:
                                    seat: '4'
                                    backrest: '2'
                                nextSetupValues:
                                  type: object
                                  additionalProperties: true
                                  example:
                                    seat: '5'
                                showSetRpe:
                                  type: boolean
                                  example: true
                                  description: >-
                                    Resolved RPE-input visibility. Freestyle
                                    performances inherit the session setting;
                                    planned performances inherit their
                                    plan-exercise setting.
                                setupSettingsEnabled:
                                  type: boolean
                                  example: true
                                  description: >-
                                    Explicit machine-settings toggle for this
                                    performance. If unset, the backend falls
                                    back to resolved setup field availability.
                                hasMachineSettings:
                                  type: boolean
                                  example: true
                                  description: >-
                                    Derived machine-settings availability flag
                                    for clients that use this naming.
                                isMachineSetting:
                                  type: boolean
                                  example: true
                                  description: >-
                                    Legacy-compatible alias of
                                    hasMachineSettings for machine setup UI
                                    checks.
                                provenance:
                                  type: object
                                  properties:
                                    recordedByActorType:
                                      type: string
                                      enum:
                                        - ''
                                        - client
                                        - coach
                                        - system
                                      example: coach
                                    recordedByClientId:
                                      type:
                                        - string
                                        - 'null'
                                      example: null
                                    recordedByCoachId:
                                      type:
                                        - string
                                        - 'null'
                                      example: null
                                    lastUpdatedByActorType:
                                      type: string
                                      enum:
                                        - ''
                                        - client
                                        - coach
                                        - system
                                      example: coach
                                    lastUpdatedByClientId:
                                      type:
                                        - string
                                        - 'null'
                                      example: null
                                    lastUpdatedByCoachId:
                                      type:
                                        - string
                                        - 'null'
                                      example: null
                                type:
                                  type: string
                                  enum:
                                    - reps
                                    - time
                                    - distance
                                    - mixed
                                  example: reps
                                metrics:
                                  type: object
                                  properties:
                                    totalVolume:
                                      type: number
                                      example: 1680
                                    maxWeight:
                                      type: number
                                      example: 75
                                    totalReps:
                                      type: number
                                      example: 24
                                isPersonalBest:
                                  type: boolean
                                  example: true
                          summary:
                            type: object
                            properties:
                              totalVolume:
                                type: number
                                example: 1680
                              totalReps:
                                type: number
                                example: 24
                              totalPersonalBests:
                                type: number
                                example: 1
                              muscleActivation:
                                type: object
                                properties:
                                  raw:
                                    type: object
                                    additionalProperties:
                                      type: number
                                    example:
                                      chest: 18
                                      shoulders: 12
                                      triceps: 8
                                  normalized:
                                    type: object
                                    additionalProperties:
                                      type: number
                                    example:
                                      chest: 18
                                      shoulders: 12
                                      triceps: 8
                                  maxValue:
                                    type: number
                                    example: 18
                                  topMuscles:
                                    type: array
                                    items:
                                      type: object
                                      required:
                                        - muscle
                                        - value
                                      properties:
                                        muscle:
                                          type: string
                                          example: chest
                                        value:
                                          type: number
                                          example: 18
                      - type: 'null'
                  sessionErrorCode:
                    type: string
                    example: ''
    ErrorResponse:
      allOf:
        - $ref: '#/components/schemas/StandardResponse'
        - example:
            status: 401
            error: true
            message: MISSING_AUTH
    PublicApiError:
      type: object
      additionalProperties: false
      required:
        - error
        - meta
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - code
            - key
            - message
          properties:
            code:
              type: integer
              example: 401
            key:
              type: string
              example: auth.invalid_token
            message:
              type: string
              example: The access token is invalid.
            details:
              type: object
              additionalProperties: true
        meta:
          $ref: '#/components/schemas/PublicApiMeta'
    PublicApiMeta:
      type: object
      additionalProperties: false
      required:
        - requestId
      properties:
        requestId:
          type: string
          description: Stable request correlation id. Mirrors `X-Request-Id` when supplied.
          example: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
        rateLimit:
          $ref: '#/components/schemas/PublicApiRateLimitMeta'
    StandardResponse:
      type: object
      properties:
        status:
          type: integer
          example: 200
        error:
          type: boolean
          example: false
        message:
          type: string
          example: SUCCESS
      required:
        - status
        - error
        - message
    PublicApiRateLimitMeta:
      type: object
      additionalProperties: false
      properties:
        limit:
          type: integer
          example: 10
        remaining:
          type: integer
          example: 9
        resetSeconds:
          type: integer
          description: Seconds until the current rate limit window resets.
          example: 1
        retryAfterSeconds:
          type: integer
          description: Present when the request was rate limited.
          example: 1
  securitySchemes:
    PublicBearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Opaque
      description: >-
        Public API access token issued by `/public/v1/oauth/token`. Example:
        `Authorization: Bearer fspt_...`. Each resource request rechecks the
        token company's current provider access. Disabling access blocks
        existing tokens with `403 auth.provider_unavailable`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.