> ## 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 one coach group workout session detail

> Returns session detail with performances, stats, history, machine settings, and backend-calculated set-level progress. 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. 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/sessions/:sessionId 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/sessions/{sessionId}
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/sessions/{sessionId}:
    get:
      tags:
        - Workout
      summary: Get one coach group workout session detail
      description: >-
        Returns session detail with performances, stats, history, machine
        settings, and backend-calculated set-level progress. 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. 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/sessions/:sessionId 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: publicWorkoutgetPublicV1WorkoutGroupsSessionsSessionId
      parameters:
        - in: path
          name: sessionId
          required: true
          description: Individual group workout session id.
          schema:
            type: string
            example: 67f1234567890abcdef1234
      responses:
        '200':
          description: >-
            Session detail bundle with plan, performances, history, notes,
            machine settings and progress.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceGETAppV1CoachWorkoutGroupSessionsSessionIdResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      data:
                        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
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '400':
          description: Invalid session id.
          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':
          $ref: '#/components/schemas/ErrorResponse'
          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: Session was not found in an authorized group run.
          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/sessions/{sessionId}"
            \
              -H "Authorization: Bearer <access_token>"
components:
  schemas:
    PublicApiSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiMeta'
    PublicWorkoutSourceGETAppV1CoachWorkoutGroupSessionsSessionIdResponse200:
      type: object
      properties:
        data:
          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
      required:
        - data
    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'
    ErrorResponse:
      allOf:
        - $ref: '#/components/schemas/StandardResponse'
        - example:
            status: 401
            error: true
            message: MISSING_AUTH
    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.