> ## 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 the assigned-plan session detail (available days)

> The coach-facing (and client-facing) "Assigned training day" detail screen. Returns the assigned plan with every currently available/startable day, plus the header/context the screen renders.

- **`client` / `membership` / `creditBalance` / `nextTrainingAt`**: header chips.
- **`medicalData`**: the Medical Data row (from the client's objective questionnaire).
- **`coachNotes[]`**: the Coach-notes panel (author-enriched; a client caller only sees notes flagged visible to client).
- **`progress`**: completed active moments across the programme. Recurring sequence days show only active attempts and become ready again after completion. Completion is permanent for multi-week/calendar programmes when an exact plan/moment has any non-deleted completed session, including a zero-exercise moment. Archived/deleted moments are excluded. Partial day progress uses one selected active attempt and never unions attempts.
- **`schedule` / `weeks[]`**: the normalized programme schedule and every week's availability. Future weeks stay in `weeks[]` with `isAvailable=false` but are excluded from startable `days[]`.
- **`days[]`**: currently available days. Each day's **`exercises[]`** is the SAME shape as `getClientWorkoutDay` (standalone `{ type:"exercise", …, data:[] }` and `{ type:"superset", …, data:[members] }` blocks, plan `targets`, per-set `previous` values, prefilled-or-logged `sets` (prescribed per-set rows prefill only until the client logs; afterwards their saved rows are authoritative — deletions persist and are never re-padded to the plan count), and the client's own `clientNotes`/`clientRestSeconds`), EXTENDED per exercise with `targetSnapshot` (Today / Last session target / Best PR), `nextSessionTarget`, and `history` (weight-progression).

Access: client tokens use their own id; a coach/admin must pass a linked `clientId`.

- **Per-set placeholders.** Every `sets[]` row carries twelve extra fields: `repsPlaceholderCoach`, `weightPlaceholderCoach`, `timeSecondsPlaceholderCoach`, `distanceMetersPlaceholderCoach`, `rpePlaceholderCoach`, `restSecondsPlaceholderCoach`, and the same six without the `Coach` suffix. A placeholder is the greyed hint an EMPTY input shows.
  · `*PlaceholderCoach` is the coach's prescription for that set index (WorkoutPlan `setsData`). `null` for a metric this exercise type does not track (a `time` exercise has no reps hint), for a set beyond the prescribed count, for a metric the coach left blank, and for freestyle, which has no prescription at all.
  · `*Placeholder` is the hint to actually show. **The coach wins**: it is the `*PlaceholderCoach` value whenever there is one, and falls back to the client's own stored placeholder only where the coach prescribed nothing. So it is identical to `*PlaceholderCoach` on any prescribed set, and always reflects the CURRENT prescription — a coach editing 8 reps to 12 changes the hint immediately, with no stale client copy able to outlive it.
  · The client's stored placeholder (sent per set on `PUT /app/v1/workout/performance/sessions/{sessionId}/exercises/{exerciseId}`) is therefore a FALLBACK for sets the coach never prescribed, not an override. Send one only where `*PlaceholderCoach` is `null`; sending it elsewhere is accepted but ignored.
  · **Placeholders are never logged work** — excluded from every total, volume, PR and completion check — so a hint left showing after a value is cleared does not make the set count. They are emitted on logged rows too, because clearing a logged value is exactly when the hint has to reappear.
  · **Committing a hint.** When the athlete marks a set completed without typing, send the shown NUMERIC hint as the real value (`{ reps: 22, completed: true }`); it then counts as their performance. A RANGE hint (`"8-12"`) must NOT be submitted on a completed set — the client should prompt the athlete to enter a value and skip the call, because a range reaching a completed set is stored as its MINIMUM (`"12-24"` → 12 reps, 120 volume), silently under-crediting them. An unticked set sends its metric as `null` with `completed: false` and simply keeps showing the hint.

Requires the workout_client_plans:read scope. This operation maps to /app/v1/workout/plans/client/assigned/:templateId/session-detail 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/clients/{clientId}/plans/assigned/{templateId}/session-detail
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/clients/{clientId}/plans/assigned/{templateId}/session-detail:
    get:
      tags:
        - Workout
      summary: Get the assigned-plan session detail (available days)
      description: >-
        The coach-facing (and client-facing) "Assigned training day" detail
        screen. Returns the assigned plan with every currently
        available/startable day, plus the header/context the screen renders.


        - **`client` / `membership` / `creditBalance` / `nextTrainingAt`**:
        header chips.

        - **`medicalData`**: the Medical Data row (from the client's objective
        questionnaire).

        - **`coachNotes[]`**: the Coach-notes panel (author-enriched; a client
        caller only sees notes flagged visible to client).

        - **`progress`**: completed active moments across the programme.
        Recurring sequence days show only active attempts and become ready again
        after completion. Completion is permanent for multi-week/calendar
        programmes when an exact plan/moment has any non-deleted completed
        session, including a zero-exercise moment. Archived/deleted moments are
        excluded. Partial day progress uses one selected active attempt and
        never unions attempts.

        - **`schedule` / `weeks[]`**: the normalized programme schedule and
        every week's availability. Future weeks stay in `weeks[]` with
        `isAvailable=false` but are excluded from startable `days[]`.

        - **`days[]`**: currently available days. Each day's **`exercises[]`**
        is the SAME shape as `getClientWorkoutDay` (standalone `{
        type:"exercise", …, data:[] }` and `{ type:"superset", …, data:[members]
        }` blocks, plan `targets`, per-set `previous` values,
        prefilled-or-logged `sets` (prescribed per-set rows prefill only until
        the client logs; afterwards their saved rows are authoritative —
        deletions persist and are never re-padded to the plan count), and the
        client's own `clientNotes`/`clientRestSeconds`), EXTENDED per exercise
        with `targetSnapshot` (Today / Last session target / Best PR),
        `nextSessionTarget`, and `history` (weight-progression).


        Access: client tokens use their own id; a coach/admin must pass a linked
        `clientId`.


        - **Per-set placeholders.** Every `sets[]` row carries twelve extra
        fields: `repsPlaceholderCoach`, `weightPlaceholderCoach`,
        `timeSecondsPlaceholderCoach`, `distanceMetersPlaceholderCoach`,
        `rpePlaceholderCoach`, `restSecondsPlaceholderCoach`, and the same six
        without the `Coach` suffix. A placeholder is the greyed hint an EMPTY
        input shows.
          · `*PlaceholderCoach` is the coach's prescription for that set index (WorkoutPlan `setsData`). `null` for a metric this exercise type does not track (a `time` exercise has no reps hint), for a set beyond the prescribed count, for a metric the coach left blank, and for freestyle, which has no prescription at all.
          · `*Placeholder` is the hint to actually show. **The coach wins**: it is the `*PlaceholderCoach` value whenever there is one, and falls back to the client's own stored placeholder only where the coach prescribed nothing. So it is identical to `*PlaceholderCoach` on any prescribed set, and always reflects the CURRENT prescription — a coach editing 8 reps to 12 changes the hint immediately, with no stale client copy able to outlive it.
          · The client's stored placeholder (sent per set on `PUT /app/v1/workout/performance/sessions/{sessionId}/exercises/{exerciseId}`) is therefore a FALLBACK for sets the coach never prescribed, not an override. Send one only where `*PlaceholderCoach` is `null`; sending it elsewhere is accepted but ignored.
          · **Placeholders are never logged work** — excluded from every total, volume, PR and completion check — so a hint left showing after a value is cleared does not make the set count. They are emitted on logged rows too, because clearing a logged value is exactly when the hint has to reappear.
          · **Committing a hint.** When the athlete marks a set completed without typing, send the shown NUMERIC hint as the real value (`{ reps: 22, completed: true }`); it then counts as their performance. A RANGE hint (`"8-12"`) must NOT be submitted on a completed set — the client should prompt the athlete to enter a value and skip the call, because a range reaching a completed set is stored as its MINIMUM (`"12-24"` → 12 reps, 120 volume), silently under-crediting them. An unticked set sends its metric as `null` with `completed: false` and simply keeps showing the hint.

        Requires the workout_client_plans:read scope. This operation maps to
        /app/v1/workout/plans/client/assigned/:templateId/session-detail 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: >-
        publicWorkoutgetPublicV1WorkoutClientsClientIdPlansAssignedTemplateIdSessionDetail
      parameters:
        - in: path
          name: templateId
          required: true
          description: Assigned workout plan id.
          schema:
            type: string
            example: 67f1234567890abcdef1234
        - in: query
          name: clientId
          required: false
          schema:
            type: string
            example: 67f1234567890abcdef1234
          description: Only for coach/admin callers; clients resolve from the token.
        - name: clientId
          in: path
          required: true
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
          description: Client in the company bound to the Public API token.
      responses:
        '200':
          description: Assigned-plan session detail (currently available days).
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceGETAppV1WorkoutPlansClientAssignedTemplateIdSessionDetailResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      client:
                        _id: 67f1234567890abcdef1234
                        firstName: Joseph
                        lastName: Quin
                        fullName: Joseph Quin
                        email: joseph@example.com
                        image: https://cdn.example.com/clients/joseph.jpg
                      membership:
                        name: Premium Monthly
                        status: Active
                        startDate: '2026-04-12T10:00:00.000Z'
                        expiresAt: '2026-04-12T10:00:00.000Z'
                      creditBalance: 23
                      nextTrainingAt: '2026-04-12T10:00:00.000Z'
                      medicalData:
                        injuries: Knee replacement L (2023)
                        medication: Metformin 500mg
                        allergies: None
                        heartProblem: true
                        bloodPressureIssue: true
                        doctorApproved: true
                        additionalNotes: ''
                      coachNotes:
                        - _id: 67f1234567890abcdef1234
                          title: Injury / pain
                          notes: Mild knee discomfort after leg press.
                          tags:
                            - string
                          pinned: false
                          date: '2026-04-12T10:00:00.000Z'
                          editedAt: '2026-04-12T10:00:00.000Z'
                          author:
                            coachId: 67f1234567890abcdef1234
                            firstName: Matthijs
                            lastName: Wessels
                            fullName: Matthijs Wessels
                            image: ''
                      plan:
                        _id: 67f1234567890abcdef1234
                        name: Weekly Strength Program
                        description: Progressive overload.
                        thumbnail: https://cdn.example.com/workouts/cover.jpg
                        difficulty: Intermediate
                        intensity: High
                        category: Strength
                        goal: Strength
                        schedule:
                          mode: multi_week
                          releasePolicy: weekly_from_start
                          startDate: '2026-09-08'
                          timeZone: Europe/Amsterdam
                          totalWeeks: 4
                          layout: calendar_week
                          weeks:
                            - weekNumber: 1
                              days:
                                - weekday: 1
                                  isRestDay: false
                                  items:
                                    - _id: 67f1234567890abcdef1234
                                      order: 1
                                      startTime: '08:30'
                                      plannedDurationMinutes: 45
                                      status: today
                                      plannedDate: '2026-09-08'
                                      scheduledDate: '2026-09-08'
                                      source: programme
                                      clientAdjustment:
                                        action: moved
                                        occurrenceDate: '2026-09-08'
                                        scheduledDate: '2026-09-08'
                                        changedAt: null
                                      canClientRestore: true
                                      type: workout
                                      planMomentId: 67f1234567890abcdef1234
                      progress:
                        total: 6
                        completed: 2
                        progressPercentage: 33
                        isCompleted: false
                      totalDays: 4
                      schedule:
                        mode: multi_week
                        releasePolicy: weekly_from_start
                        startDate: '2026-09-08'
                        timeZone: Europe/Amsterdam
                        totalWeeks: 4
                        layout: calendar_week
                        weeks:
                          - weekNumber: 1
                            days:
                              - weekday: 1
                                isRestDay: false
                                items:
                                  - _id: 67f1234567890abcdef1234
                                    order: 1
                                    startTime: '08:30'
                                    plannedDurationMinutes: 45
                                    status: today
                                    plannedDate: '2026-09-08'
                                    scheduledDate: '2026-09-08'
                                    source: programme
                                    clientAdjustment:
                                      action: moved
                                      occurrenceDate: '2026-09-08'
                                      scheduledDate: '2026-09-08'
                                      changedAt: null
                                    canClientRestore: true
                                    type: workout
                                    planMomentId: 67f1234567890abcdef1234
                      weeks:
                        - weekNumber: 2
                          availableFrom: '2026-09-08'
                          isAvailable: false
                          progressPercentage: 50
                          isCompleted: false
                      days:
                        - planMomentId: 67f1234567890abcdef1234
                          name: Day 1 – Upper Body Push & Pull
                          description: ''
                          dayOrder: 1
                          order: 0
                          weekNumber: 1
                          sessionOrder: 1
                          progress:
                            total: 6
                            completed: 2
                            progressPercentage: 33
                            isCompleted: false
                          stats:
                            durationMinutes: 0
                            exerciseCount: 0
                            expectedDurationMinutes: 110
                            totalVolume: 312
                            totalReps: 104
                          session:
                            id: 67f1234567890abcdef1234
                            status: in_progress
                            startedAt: '2026-04-12T10:00:00.000Z'
                            programmeScheduleItemId: 67f1234567890abcdef1234
                            plannedDate: '2026-09-08'
                          exercises:
                            - type: exercise
                              planExerciseId: 67f1234567890abcdef1234
                              exerciseId: 67f1234567890abcdef1234
                              name: Dumbbell Bench Press
                              thumbnail: https://cdn.example.com/exercises/bench.jpg
                              media:
                                - type: image
                                  url: https://cdn.example.com/ex/bench.jpg
                                  platform: null
                                  videoId: null
                                  thumbnail: null
                                  duration: null
                                  width: 1080
                                  height: 720
                              primaryMuscle: Chest
                              secondaryMuscles:
                                - Triceps
                              equipment:
                                - Dumbbell
                              groupId: ''
                              order: 0
                              isFavourite: false
                              hasHistory: false
                              targets:
                                type: reps
                                sets: 4
                                reps: 8–12
                                rest: 60
                                rpe: 8
                                rmPercentage: 0
                                tempo: ''
                                notes: Keep elbows tucked.
                              previousBestSet: 12 × 24kg
                              performanceId: 67f1234567890abcdef1234
                              isCompleted: false
                              clientNotes: ''
                              clientRestSeconds: null
                              notes: ''
                              sets:
                                - setNumber: 1
                                  setType: 'N'
                                  displayNumber: 1
                                  displayLabel: '1'
                                  previous: 12 × 22kg
                                  reps: 10
                                  weight: 22
                                  timeSeconds: null
                                  distanceMeters: null
                                  rpe: null
                                  completed: false
                              exerciseCount: 2
                              rounds: 4
                              data:
                                - id: 67f1234567890abcdef1234
                                  name: Barbell Bench Press
                                  primaryMuscle: Chest
                                  secondaryMuscles:
                                    - Chest
                                  primaryJoint: Shoulder
                                  equipment:
                                    - Dumbbells
                                  difficulty: Intermediate
                                  intensity: Above Average
                                  visibility: Company
                                  tags:
                                    - string
                                  thumbnail: >-
                                    https://cdn.example.com/exercises/bench-thumb.jpg
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '400':
          description: >-
            Malformed template id (`INVALID_TEMPLATE_ID`), company context
            missing (`COMPANY_ID_REQUIRED`), or invalid client id
            (`INVALID_CLIENT_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':
          description: >-
            Coach/admin requested a client they are not linked to
            (`CLIENT_NOT_CONNECTED`).
          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: Assigned plan not found (`TEMPLATE_NOT_FOUND`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                notFound:
                  summary: Resource not found
                  value:
                    error:
                      code: 404
                      key: resource.not_found
                      message: The requested Public API resource was not found.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '409':
          $ref: '#/components/schemas/ErrorResponse'
        '422':
          $ref: '#/components/schemas/ErrorResponse'
        '429':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                rateLimitExceeded:
                  summary: Rate limit exceeded
                  value:
                    error:
                      code: 429
                      key: rate_limit.exceeded
                      message: Too many Public API requests. Retry later.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 0
                        resetSeconds: 1
                        retryAfterSeconds: 1
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                serverInternalError:
                  summary: Unexpected server error
                  value:
                    error:
                      code: 500
                      key: server.internal_error
                      message: An unexpected Public API server error occurred.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
      security:
        - PublicBearerAuth: []
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: >-
            curl -X GET
            "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/plans/assigned/{templateId}/session-detail"
            \
              -H "Authorization: Bearer <access_token>"
components:
  schemas:
    PublicApiSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiMeta'
    PublicWorkoutSourceGETAppV1WorkoutPlansClientAssignedTemplateIdSessionDetailResponse200:
      type: object
      properties:
        client:
          type: object
          properties:
            _id:
              type: string
              example: 67f1234567890abcdef1234
            firstName:
              type: string
              example: Joseph
            lastName:
              type: string
              example: Quin
            fullName:
              type: string
              example: Joseph Quin
            email:
              type: string
              example: joseph@example.com
            image:
              type: string
              example: https://cdn.example.com/clients/joseph.jpg
        membership:
          type: object
          nullable: true
          properties:
            name:
              type: string
              example: Premium Monthly
            status:
              type: string
              example: Active
            startDate:
              type: string
              format: date-time
              example: '2026-04-12T10:00:00.000Z'
              nullable: true
            expiresAt:
              type: string
              format: date-time
              example: '2026-04-12T10:00:00.000Z'
              nullable: true
        creditBalance:
          type: number
          example: 23
        nextTrainingAt:
          type: string
          format: date-time
          example: '2026-04-12T10:00:00.000Z'
          nullable: true
        medicalData:
          type: object
          properties:
            injuries:
              type: string
              example: Knee replacement L (2023)
            medication:
              type: string
              example: Metformin 500mg
            allergies:
              type: string
              example: None
            heartProblem:
              type: boolean
              example: true
            bloodPressureIssue:
              type: boolean
              example: true
            doctorApproved:
              type: boolean
              example: true
            additionalNotes:
              type: string
              example: ''
        coachNotes:
          type: array
          items:
            type: object
            properties:
              _id:
                type: string
                example: 67f1234567890abcdef1234
              title:
                type: string
                example: Injury / pain
                description: >-
                  Doubles as the section heading (e.g. General / Injury-pain /
                  Progress).
              notes:
                type: string
                example: Mild knee discomfort after leg press.
              tags:
                type: array
                items:
                  type: string
              pinned:
                type: boolean
                example: false
              date:
                type: string
                format: date-time
                example: '2026-04-12T10:00:00.000Z'
                nullable: true
              editedAt:
                type: string
                format: date-time
                example: '2026-04-12T10:00:00.000Z'
                nullable: true
              author:
                type: object
                properties:
                  coachId:
                    type: string
                    example: 67f1234567890abcdef1234
                    nullable: true
                  firstName:
                    type: string
                    example: Matthijs
                  lastName:
                    type: string
                    example: Wessels
                  fullName:
                    type: string
                    example: Matthijs Wessels
                  image:
                    type: string
                    example: ''
        plan:
          type: object
          properties:
            _id:
              type: string
              example: 67f1234567890abcdef1234
            name:
              type: string
              example: Weekly Strength Program
            description:
              type: string
              example: Progressive overload.
            thumbnail:
              type: string
              example: https://cdn.example.com/workouts/cover.jpg
            difficulty:
              type: string
              example: Intermediate
            intensity:
              type: string
              example: High
            category:
              type: string
              example: Strength
            goal:
              type: string
              example: Strength
            schedule:
              type: object
              required:
                - mode
                - releasePolicy
                - startDate
                - timeZone
                - totalWeeks
              properties:
                mode:
                  type: string
                  enum:
                    - recurring
                    - multi_week
                  example: multi_week
                releasePolicy:
                  type: string
                  enum:
                    - all_at_once
                    - weekly_from_start
                  example: weekly_from_start
                startDate:
                  oneOf:
                    - type: string
                      format: date
                      pattern: ^\d{4}-\d{2}-\d{2}$
                      example: '2026-09-08'
                    - type: string
                      enum:
                        - ''
                      example: ''
                  description: >-
                    Blank for templates and legacy sequence recurring schedules.
                    Assigned recurring calendar_week schedules require the
                    canonical company-local Monday anchor. Assigned multi-week
                    schedules accept any canonical date; for calendar_week, week
                    1 is the Monday-Sunday week containing it and days before it
                    are not scheduled (`isBeforeStart`).
                timeZone:
                  type: string
                  example: Europe/Amsterdam
                  description: Company time zone used to evaluate weekly availability.
                totalWeeks:
                  type: integer
                  minimum: 0
                  example: 4
                layout:
                  type: string
                  enum:
                    - sequence
                    - calendar_week
                  example: calendar_week
                weeks:
                  type: array
                  items:
                    type: object
                    required:
                      - weekNumber
                      - days
                    properties:
                      weekNumber:
                        type: integer
                        minimum: 1
                        example: 1
                      days:
                        type: array
                        items:
                          type: object
                          required:
                            - weekday
                            - isRestDay
                            - items
                          properties:
                            weekday:
                              type: integer
                              minimum: 1
                              maximum: 7
                              example: 1
                              description: 'ISO weekday number: 1 is Monday and 7 is Sunday.'
                            isRestDay:
                              type: boolean
                              example: false
                            items:
                              type: array
                              items:
                                oneOf:
                                  - type: object
                                    additionalProperties: false
                                    required:
                                      - type
                                      - order
                                      - planMomentId
                                    properties:
                                      _id:
                                        type: string
                                        example: 67f1234567890abcdef1234
                                      order:
                                        type: integer
                                        minimum: 1
                                        example: 1
                                      startTime:
                                        type: string
                                        pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                        example: '08:30'
                                      plannedDurationMinutes:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        example: 45
                                        description: >-
                                          Planned duration in minutes; null when
                                          no target is set.
                                      status:
                                        type:
                                          - string
                                          - 'null'
                                        enum:
                                          - in_progress
                                          - completed
                                          - overdue
                                          - today
                                          - upcoming
                                          - null
                                        readOnly: true
                                        example: today
                                        description: >-
                                          Occurrence presentation status. Template
                                          items use null; cancelled occurrences
                                          fall back to overdue, today, or
                                          upcoming.
                                      plannedDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Original authored occurrence date for a
                                          calendar response item.
                                      scheduledDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Effective calendar date after a client
                                          move; otherwise plannedDate.
                                      source:
                                        type: string
                                        enum:
                                          - programme
                                        readOnly: true
                                      clientAdjustment:
                                        oneOf:
                                          - type: object
                                            required:
                                              - action
                                              - occurrenceDate
                                              - scheduledDate
                                              - changedAt
                                            properties:
                                              action:
                                                type: string
                                                enum:
                                                  - moved
                                                  - skipped
                                              occurrenceDate:
                                                type: string
                                                format: date
                                                pattern: ^\d{4}-\d{2}-\d{2}$
                                                example: '2026-09-08'
                                              scheduledDate:
                                                oneOf:
                                                  - type: string
                                                    format: date
                                                    pattern: ^\d{4}-\d{2}-\d{2}$
                                                    example: '2026-09-08'
                                                  - type: string
                                                    enum:
                                                      - ''
                                                    example: ''
                                              changedAt:
                                                type:
                                                  - string
                                                  - 'null'
                                                format: date-time
                                                example: null
                                          - type: 'null'
                                        readOnly: true
                                      canClientRestore:
                                        type: boolean
                                        readOnly: true
                                      type:
                                        type: string
                                        enum:
                                          - workout
                                        example: workout
                                      planMomentId:
                                        type: string
                                        example: 67f1234567890abcdef1234
                                  - type: object
                                    additionalProperties: false
                                    required:
                                      - type
                                      - order
                                      - activityType
                                      - name
                                    properties:
                                      _id:
                                        type: string
                                        example: 67f1234567890abcdef1234
                                      order:
                                        type: integer
                                        minimum: 1
                                        example: 1
                                      startTime:
                                        type: string
                                        pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                        example: '08:30'
                                      plannedDurationMinutes:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        example: 45
                                        description: >-
                                          Planned duration in minutes; null when
                                          no target is set.
                                      status:
                                        type:
                                          - string
                                          - 'null'
                                        enum:
                                          - in_progress
                                          - completed
                                          - overdue
                                          - today
                                          - upcoming
                                          - null
                                        readOnly: true
                                        example: today
                                        description: >-
                                          Occurrence presentation status. Template
                                          items use null; cancelled occurrences
                                          fall back to overdue, today, or
                                          upcoming.
                                      plannedDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Original authored occurrence date for a
                                          calendar response item.
                                      scheduledDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Effective calendar date after a client
                                          move; otherwise plannedDate.
                                      source:
                                        type: string
                                        enum:
                                          - programme
                                        readOnly: true
                                      clientAdjustment:
                                        oneOf:
                                          - type: object
                                            required:
                                              - action
                                              - occurrenceDate
                                              - scheduledDate
                                              - changedAt
                                            properties:
                                              action:
                                                type: string
                                                enum:
                                                  - moved
                                                  - skipped
                                              occurrenceDate:
                                                type: string
                                                format: date
                                                pattern: ^\d{4}-\d{2}-\d{2}$
                                                example: '2026-09-08'
                                              scheduledDate:
                                                oneOf:
                                                  - type: string
                                                    format: date
                                                    pattern: ^\d{4}-\d{2}-\d{2}$
                                                    example: '2026-09-08'
                                                  - type: string
                                                    enum:
                                                      - ''
                                                    example: ''
                                              changedAt:
                                                type:
                                                  - string
                                                  - 'null'
                                                format: date-time
                                                example: null
                                          - type: 'null'
                                        readOnly: true
                                      canClientRestore:
                                        type: boolean
                                        readOnly: true
                                      type:
                                        type: string
                                        enum:
                                          - activity
                                        example: activity
                                      activityType:
                                        type: string
                                        enum:
                                          - running
                                          - cycling
                                          - walking
                                          - swimming
                                          - rowing
                                          - padel
                                          - mobility
                                          - other
                                        example: running
                                      name:
                                        type: array
                                        minItems: 1
                                        items:
                                          type: object
                                          required:
                                            - lang
                                            - value
                                          properties:
                                            lang:
                                              type: string
                                              enum:
                                                - en
                                                - nl
                                                - fr
                                                - de
                                                - es
                                              example: en
                                            value:
                                              type: string
                                              example: Full Body Strength
                                        example:
                                          - lang: en
                                            value: Full Body Strength
                                          - lang: nl
                                            value: Full Body Kracht
                                      description:
                                        type: array
                                        items:
                                          type: object
                                          required:
                                            - lang
                                            - value
                                          properties:
                                            lang:
                                              type: string
                                              enum:
                                                - en
                                                - nl
                                                - fr
                                                - de
                                                - es
                                              example: en
                                            value:
                                              type: string
                                              example: Full Body Strength
                                      cardio:
                                        type: object
                                        additionalProperties: false
                                        description: >-
                                          Optional structured activity
                                          prescription. Requires workoutsectionv2
                                          + workoutV2ProgrammeCalendar +
                                          workoutV2CardioBuilder. Omitted from
                                          disabled reads. Supported sports:
                                          running (paceZone E/T/I/R/RP, absolute
                                          pace, absolute HR, RPE), walking (pace,
                                          HR, RPE), cycling (power, HR, RPE),
                                          rowing (pace, power, HR, RPE), swimming
                                          (pace, RPE). Rejected for workout,
                                          padel, mobility and other items. Totals
                                          overwrite planned duration/distance;
                                          unknown time or distance contributes
                                          zero.
                                        properties:
                                          slotKey:
                                            type: string
                                            description: >-
                                              Generated when missing; retain across
                                              edits, copies and weeks.
                                          sessionType:
                                            type: string
                                            enum:
                                              - easy
                                              - zone2
                                              - long_run
                                              - threshold_continuous
                                              - threshold_reps
                                              - interval
                                              - race_pace
                                              - time_trial
                                              - race
                                            description: >-
                                              Running only. Template session codes:
                                              threshold_continuous = drempel_c,
                                              threshold_reps = drempel_r, interval,
                                              race_pace = doeltempo, zone2. A typed
                                              session with empty blocks is a skeleton
                                              to be filled later.
                                          controlMode:
                                            type: string
                                            enum:
                                              - pace
                                              - hr
                                            description: >-
                                              Binding signal. Defaults from
                                              sessionType: hr for easy, zone2 and
                                              long_run; pace for threshold_continuous,
                                              threshold_reps, interval and race_pace;
                                              none for time_trial and race. A
                                              contradicting value is rejected.
                                          ladderStep:
                                            type: integer
                                            minimum: 1
                                            description: >-
                                              Ladder position: interval 1–8,
                                              threshold_reps 1–7, threshold_continuous
                                              1–5 (15/18/20/22/25 min). Rejected for
                                              other session types.
                                          poolLengthM:
                                            type: number
                                            enum:
                                              - 25
                                              - 50
                                            description: Swimming only.
                                          blocks:
                                            type: array
                                            maxItems: 10
                                            items:
                                              type: object
                                              additionalProperties: false
                                              properties:
                                                _id:
                                                  type: string
                                                  example: 67f1234567890abcdef1234
                                                repeat:
                                                  type: integer
                                                  minimum: 1
                                                  maximum: 50
                                                  default: 1
                                                steps:
                                                  type: array
                                                  maxItems: 20
                                                  items:
                                                    type: object
                                                    additionalProperties: false
                                                    required:
                                                      - kind
                                                      - durationType
                                                    properties:
                                                      _id:
                                                        type: string
                                                        example: 67f1234567890abcdef1234
                                                      kind:
                                                        type: string
                                                        enum:
                                                          - warmup
                                                          - work
                                                          - recovery
                                                          - rest
                                                          - cooldown
                                                      durationType:
                                                        type: string
                                                        enum:
                                                          - time
                                                          - distance
                                                          - open
                                                      durationValue:
                                                        type:
                                                          - number
                                                          - 'null'
                                                        minimum: 0
                                                        default: null
                                                        description: >-
                                                          Required seconds for time or metres for
                                                          distance; null/omitted for open.
                                                      target:
                                                        type: object
                                                        additionalProperties: false
                                                        required:
                                                          - kind
                                                        description: >-
                                                          Allowed kinds and zones depend on the
                                                          sport. Zone targets require zone; other
                                                          targets require ordered low/high bounds.
                                                          Pace is seconds/km for running/walking,
                                                          seconds/500m for rowing, seconds/100m
                                                          for swimming. Percentages are percent
                                                          values; HR is bpm, power is watts, RPE
                                                          is 1–10. Numeric strings with dot or
                                                          comma decimals are accepted.
                                                        properties:
                                                          kind:
                                                            type: string
                                                            enum:
                                                              - paceZone
                                                              - pacePct
                                                              - pace
                                                              - hrZone
                                                              - hrPct
                                                              - hr
                                                              - powerZone
                                                              - powerPct
                                                              - power
                                                              - rpe
                                                          zone:
                                                            type: string
                                                            enum:
                                                              - E
                                                              - T
                                                              - I
                                                              - R
                                                              - RP
                                                              - Z1
                                                              - Z2
                                                              - Z3
                                                              - Z4
                                                              - Z5
                                                              - Z6
                                                              - Z7
                                                              - easy
                                                              - endurance
                                                              - threshold
                                                              - speed
                                                            description: >-
                                                              Run pace: E (easy), T (threshold), I
                                                              (interval), R (repetition), RP (race
                                                              pace = goal time / goal distance, never
                                                              derived from T). Running has no HR
                                                              zones; HR bands are absolute bpm from
                                                              athlete data. Walking/rowing pace and
                                                              five-zone HR: Z1–Z5. Bike/row power:
                                                              Z1–Z7. Swimming pace: easy, endurance,
                                                              threshold, speed.
                                                          basis:
                                                            type: string
                                                            enum:
                                                              - lthr
                                                              - maxHr
                                                            description: HR zone/percentage targets only.
                                                          low:
                                                            type: number
                                                            minimum: 0
                                                          high:
                                                            type: number
                                                            minimum: 0
                                                      secondaryTarget:
                                                        type: object
                                                        additionalProperties: false
                                                        required:
                                                          - kind
                                                        description: >-
                                                          Allowed kinds and zones depend on the
                                                          sport. Zone targets require zone; other
                                                          targets require ordered low/high bounds.
                                                          Pace is seconds/km for running/walking,
                                                          seconds/500m for rowing, seconds/100m
                                                          for swimming. Percentages are percent
                                                          values; HR is bpm, power is watts, RPE
                                                          is 1–10. Numeric strings with dot or
                                                          comma decimals are accepted.
                                                        properties:
                                                          kind:
                                                            type: string
                                                            enum:
                                                              - paceZone
                                                              - pacePct
                                                              - pace
                                                              - hrZone
                                                              - hrPct
                                                              - hr
                                                              - powerZone
                                                              - powerPct
                                                              - power
                                                              - rpe
                                                          zone:
                                                            type: string
                                                            enum:
                                                              - E
                                                              - T
                                                              - I
                                                              - R
                                                              - RP
                                                              - Z1
                                                              - Z2
                                                              - Z3
                                                              - Z4
                                                              - Z5
                                                              - Z6
                                                              - Z7
                                                              - easy
                                                              - endurance
                                                              - threshold
                                                              - speed
                                                            description: >-
                                                              Run pace: E (easy), T (threshold), I
                                                              (interval), R (repetition), RP (race
                                                              pace = goal time / goal distance, never
                                                              derived from T). Running has no HR
                                                              zones; HR bands are absolute bpm from
                                                              athlete data. Walking/rowing pace and
                                                              five-zone HR: Z1–Z5. Bike/row power:
                                                              Z1–Z7. Swimming pace: easy, endurance,
                                                              threshold, speed.
                                                          basis:
                                                            type: string
                                                            enum:
                                                              - lthr
                                                              - maxHr
                                                            description: HR zone/percentage targets only.
                                                          low:
                                                            type: number
                                                            minimum: 0
                                                          high:
                                                            type: number
                                                            minimum: 0
                                                      notes:
                                                        type: string
                                                        default: ''
                                                      stroke:
                                                        type: string
                                                        enum:
                                                          - free
                                                          - back
                                                          - breast
                                                          - fly
                                                          - im
                                                          - choice
                                                          - kick
                                                          - drill
                                                        description: Swimming only.
                                                      equipment:
                                                        type: array
                                                        items:
                                                          type: string
                                                          enum:
                                                            - pullBuoy
                                                            - paddles
                                                            - fins
                                                            - kickboard
                                                            - snorkel
                                                        description: Swimming only.
                                                      restMode:
                                                        type: string
                                                        enum:
                                                          - rest
                                                          - sendOff
                                                        description: >-
                                                          Swimming only. sendOff requires
                                                          sendOffSec.
                                                      sendOffSec:
                                                        type: number
                                                        minimum: 1
                                                        description: Swimming sendOff only.
                                                      cadence:
                                                        type: object
                                                        additionalProperties: false
                                                        required:
                                                          - low
                                                          - high
                                                        properties:
                                                          low:
                                                            type: number
                                                            minimum: 0
                                                          high:
                                                            type: number
                                                            minimum: 0
                                                  default: []
                                            default: []
                                          sourceTemplateId:
                                            type:
                                              - string
                                              - 'null'
                                            example: null
                                      targetDistanceMeters:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        example: 5000
                                        description: >-
                                          Planned distance in meters; null when no
                                          target is set.
                                discriminator:
                                  propertyName: type
                                  mapping:
                                    workout: >-
                                      #/components/schemas/WorkoutProgrammeCalendarWorkoutItem
                                    activity: >-
                                      #/components/schemas/WorkoutProgrammeCalendarActivityItem
        progress:
          type: object
          description: >-
            Completed active moments across the programme (top-right ring);
            archived/deleted moments are excluded.
          properties:
            total:
              type: integer
              example: 6
            completed:
              type: integer
              example: 2
            progressPercentage:
              type: integer
              example: 33
            isCompleted:
              type: boolean
              example: false
        totalDays:
          type: integer
          example: 4
        schedule:
          type: object
          required:
            - mode
            - releasePolicy
            - startDate
            - timeZone
            - totalWeeks
          properties:
            mode:
              type: string
              enum:
                - recurring
                - multi_week
              example: multi_week
            releasePolicy:
              type: string
              enum:
                - all_at_once
                - weekly_from_start
              example: weekly_from_start
            startDate:
              oneOf:
                - type: string
                  format: date
                  pattern: ^\d{4}-\d{2}-\d{2}$
                  example: '2026-09-08'
                - type: string
                  enum:
                    - ''
                  example: ''
              description: >-
                Blank for templates and legacy sequence recurring schedules.
                Assigned recurring calendar_week schedules require the canonical
                company-local Monday anchor. Assigned multi-week schedules
                accept any canonical date; for calendar_week, week 1 is the
                Monday-Sunday week containing it and days before it are not
                scheduled (`isBeforeStart`).
            timeZone:
              type: string
              example: Europe/Amsterdam
              description: Company time zone used to evaluate weekly availability.
            totalWeeks:
              type: integer
              minimum: 0
              example: 4
            layout:
              type: string
              enum:
                - sequence
                - calendar_week
              example: calendar_week
            weeks:
              type: array
              items:
                type: object
                required:
                  - weekNumber
                  - days
                properties:
                  weekNumber:
                    type: integer
                    minimum: 1
                    example: 1
                  days:
                    type: array
                    items:
                      type: object
                      required:
                        - weekday
                        - isRestDay
                        - items
                      properties:
                        weekday:
                          type: integer
                          minimum: 1
                          maximum: 7
                          example: 1
                          description: 'ISO weekday number: 1 is Monday and 7 is Sunday.'
                        isRestDay:
                          type: boolean
                          example: false
                        items:
                          type: array
                          items:
                            oneOf:
                              - type: object
                                additionalProperties: false
                                required:
                                  - type
                                  - order
                                  - planMomentId
                                properties:
                                  _id:
                                    type: string
                                    example: 67f1234567890abcdef1234
                                  order:
                                    type: integer
                                    minimum: 1
                                    example: 1
                                  startTime:
                                    type: string
                                    pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                    example: '08:30'
                                  plannedDurationMinutes:
                                    type:
                                      - number
                                      - 'null'
                                    minimum: 0
                                    example: 45
                                    description: >-
                                      Planned duration in minutes; null when no
                                      target is set.
                                  status:
                                    type:
                                      - string
                                      - 'null'
                                    enum:
                                      - in_progress
                                      - completed
                                      - overdue
                                      - today
                                      - upcoming
                                      - null
                                    readOnly: true
                                    example: today
                                    description: >-
                                      Occurrence presentation status. Template
                                      items use null; cancelled occurrences fall
                                      back to overdue, today, or upcoming.
                                  plannedDate:
                                    oneOf:
                                      - type: string
                                        format: date
                                        pattern: ^\d{4}-\d{2}-\d{2}$
                                        example: '2026-09-08'
                                      - type: string
                                        enum:
                                          - ''
                                        example: ''
                                    readOnly: true
                                    description: >-
                                      Original authored occurrence date for a
                                      calendar response item.
                                  scheduledDate:
                                    oneOf:
                                      - type: string
                                        format: date
                                        pattern: ^\d{4}-\d{2}-\d{2}$
                                        example: '2026-09-08'
                                      - type: string
                                        enum:
                                          - ''
                                        example: ''
                                    readOnly: true
                                    description: >-
                                      Effective calendar date after a client
                                      move; otherwise plannedDate.
                                  source:
                                    type: string
                                    enum:
                                      - programme
                                    readOnly: true
                                  clientAdjustment:
                                    oneOf:
                                      - type: object
                                        required:
                                          - action
                                          - occurrenceDate
                                          - scheduledDate
                                          - changedAt
                                        properties:
                                          action:
                                            type: string
                                            enum:
                                              - moved
                                              - skipped
                                          occurrenceDate:
                                            type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          scheduledDate:
                                            oneOf:
                                              - type: string
                                                format: date
                                                pattern: ^\d{4}-\d{2}-\d{2}$
                                                example: '2026-09-08'
                                              - type: string
                                                enum:
                                                  - ''
                                                example: ''
                                          changedAt:
                                            type:
                                              - string
                                              - 'null'
                                            format: date-time
                                            example: null
                                      - type: 'null'
                                    readOnly: true
                                  canClientRestore:
                                    type: boolean
                                    readOnly: true
                                  type:
                                    type: string
                                    enum:
                                      - workout
                                    example: workout
                                  planMomentId:
                                    type: string
                                    example: 67f1234567890abcdef1234
                              - type: object
                                additionalProperties: false
                                required:
                                  - type
                                  - order
                                  - activityType
                                  - name
                                properties:
                                  _id:
                                    type: string
                                    example: 67f1234567890abcdef1234
                                  order:
                                    type: integer
                                    minimum: 1
                                    example: 1
                                  startTime:
                                    type: string
                                    pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                    example: '08:30'
                                  plannedDurationMinutes:
                                    type:
                                      - number
                                      - 'null'
                                    minimum: 0
                                    example: 45
                                    description: >-
                                      Planned duration in minutes; null when no
                                      target is set.
                                  status:
                                    type:
                                      - string
                                      - 'null'
                                    enum:
                                      - in_progress
                                      - completed
                                      - overdue
                                      - today
                                      - upcoming
                                      - null
                                    readOnly: true
                                    example: today
                                    description: >-
                                      Occurrence presentation status. Template
                                      items use null; cancelled occurrences fall
                                      back to overdue, today, or upcoming.
                                  plannedDate:
                                    oneOf:
                                      - type: string
                                        format: date
                                        pattern: ^\d{4}-\d{2}-\d{2}$
                                        example: '2026-09-08'
                                      - type: string
                                        enum:
                                          - ''
                                        example: ''
                                    readOnly: true
                                    description: >-
                                      Original authored occurrence date for a
                                      calendar response item.
                                  scheduledDate:
                                    oneOf:
                                      - type: string
                                        format: date
                                        pattern: ^\d{4}-\d{2}-\d{2}$
                                        example: '2026-09-08'
                                      - type: string
                                        enum:
                                          - ''
                                        example: ''
                                    readOnly: true
                                    description: >-
                                      Effective calendar date after a client
                                      move; otherwise plannedDate.
                                  source:
                                    type: string
                                    enum:
                                      - programme
                                    readOnly: true
                                  clientAdjustment:
                                    oneOf:
                                      - type: object
                                        required:
                                          - action
                                          - occurrenceDate
                                          - scheduledDate
                                          - changedAt
                                        properties:
                                          action:
                                            type: string
                                            enum:
                                              - moved
                                              - skipped
                                          occurrenceDate:
                                            type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          scheduledDate:
                                            oneOf:
                                              - type: string
                                                format: date
                                                pattern: ^\d{4}-\d{2}-\d{2}$
                                                example: '2026-09-08'
                                              - type: string
                                                enum:
                                                  - ''
                                                example: ''
                                          changedAt:
                                            type:
                                              - string
                                              - 'null'
                                            format: date-time
                                            example: null
                                      - type: 'null'
                                    readOnly: true
                                  canClientRestore:
                                    type: boolean
                                    readOnly: true
                                  type:
                                    type: string
                                    enum:
                                      - activity
                                    example: activity
                                  activityType:
                                    type: string
                                    enum:
                                      - running
                                      - cycling
                                      - walking
                                      - swimming
                                      - rowing
                                      - padel
                                      - mobility
                                      - other
                                    example: running
                                  name:
                                    type: array
                                    minItems: 1
                                    items:
                                      type: object
                                      required:
                                        - lang
                                        - value
                                      properties:
                                        lang:
                                          type: string
                                          enum:
                                            - en
                                            - nl
                                            - fr
                                            - de
                                            - es
                                          example: en
                                        value:
                                          type: string
                                          example: Full Body Strength
                                    example:
                                      - lang: en
                                        value: Full Body Strength
                                      - lang: nl
                                        value: Full Body Kracht
                                  description:
                                    type: array
                                    items:
                                      type: object
                                      required:
                                        - lang
                                        - value
                                      properties:
                                        lang:
                                          type: string
                                          enum:
                                            - en
                                            - nl
                                            - fr
                                            - de
                                            - es
                                          example: en
                                        value:
                                          type: string
                                          example: Full Body Strength
                                  cardio:
                                    type: object
                                    additionalProperties: false
                                    description: >-
                                      Optional structured activity prescription.
                                      Requires workoutsectionv2 +
                                      workoutV2ProgrammeCalendar +
                                      workoutV2CardioBuilder. Omitted from
                                      disabled reads. Supported sports: running
                                      (paceZone E/T/I/R/RP, absolute pace,
                                      absolute HR, RPE), walking (pace, HR,
                                      RPE), cycling (power, HR, RPE), rowing
                                      (pace, power, HR, RPE), swimming (pace,
                                      RPE). Rejected for workout, padel,
                                      mobility and other items. Totals overwrite
                                      planned duration/distance; unknown time or
                                      distance contributes zero.
                                    properties:
                                      slotKey:
                                        type: string
                                        description: >-
                                          Generated when missing; retain across
                                          edits, copies and weeks.
                                      sessionType:
                                        type: string
                                        enum:
                                          - easy
                                          - zone2
                                          - long_run
                                          - threshold_continuous
                                          - threshold_reps
                                          - interval
                                          - race_pace
                                          - time_trial
                                          - race
                                        description: >-
                                          Running only. Template session codes:
                                          threshold_continuous = drempel_c,
                                          threshold_reps = drempel_r, interval,
                                          race_pace = doeltempo, zone2. A typed
                                          session with empty blocks is a skeleton
                                          to be filled later.
                                      controlMode:
                                        type: string
                                        enum:
                                          - pace
                                          - hr
                                        description: >-
                                          Binding signal. Defaults from
                                          sessionType: hr for easy, zone2 and
                                          long_run; pace for threshold_continuous,
                                          threshold_reps, interval and race_pace;
                                          none for time_trial and race. A
                                          contradicting value is rejected.
                                      ladderStep:
                                        type: integer
                                        minimum: 1
                                        description: >-
                                          Ladder position: interval 1–8,
                                          threshold_reps 1–7, threshold_continuous
                                          1–5 (15/18/20/22/25 min). Rejected for
                                          other session types.
                                      poolLengthM:
                                        type: number
                                        enum:
                                          - 25
                                          - 50
                                        description: Swimming only.
                                      blocks:
                                        type: array
                                        maxItems: 10
                                        items:
                                          type: object
                                          additionalProperties: false
                                          properties:
                                            _id:
                                              type: string
                                              example: 67f1234567890abcdef1234
                                            repeat:
                                              type: integer
                                              minimum: 1
                                              maximum: 50
                                              default: 1
                                            steps:
                                              type: array
                                              maxItems: 20
                                              items:
                                                type: object
                                                additionalProperties: false
                                                required:
                                                  - kind
                                                  - durationType
                                                properties:
                                                  _id:
                                                    type: string
                                                    example: 67f1234567890abcdef1234
                                                  kind:
                                                    type: string
                                                    enum:
                                                      - warmup
                                                      - work
                                                      - recovery
                                                      - rest
                                                      - cooldown
                                                  durationType:
                                                    type: string
                                                    enum:
                                                      - time
                                                      - distance
                                                      - open
                                                  durationValue:
                                                    type:
                                                      - number
                                                      - 'null'
                                                    minimum: 0
                                                    default: null
                                                    description: >-
                                                      Required seconds for time or metres for
                                                      distance; null/omitted for open.
                                                  target:
                                                    type: object
                                                    additionalProperties: false
                                                    required:
                                                      - kind
                                                    description: >-
                                                      Allowed kinds and zones depend on the
                                                      sport. Zone targets require zone; other
                                                      targets require ordered low/high bounds.
                                                      Pace is seconds/km for running/walking,
                                                      seconds/500m for rowing, seconds/100m
                                                      for swimming. Percentages are percent
                                                      values; HR is bpm, power is watts, RPE
                                                      is 1–10. Numeric strings with dot or
                                                      comma decimals are accepted.
                                                    properties:
                                                      kind:
                                                        type: string
                                                        enum:
                                                          - paceZone
                                                          - pacePct
                                                          - pace
                                                          - hrZone
                                                          - hrPct
                                                          - hr
                                                          - powerZone
                                                          - powerPct
                                                          - power
                                                          - rpe
                                                      zone:
                                                        type: string
                                                        enum:
                                                          - E
                                                          - T
                                                          - I
                                                          - R
                                                          - RP
                                                          - Z1
                                                          - Z2
                                                          - Z3
                                                          - Z4
                                                          - Z5
                                                          - Z6
                                                          - Z7
                                                          - easy
                                                          - endurance
                                                          - threshold
                                                          - speed
                                                        description: >-
                                                          Run pace: E (easy), T (threshold), I
                                                          (interval), R (repetition), RP (race
                                                          pace = goal time / goal distance, never
                                                          derived from T). Running has no HR
                                                          zones; HR bands are absolute bpm from
                                                          athlete data. Walking/rowing pace and
                                                          five-zone HR: Z1–Z5. Bike/row power:
                                                          Z1–Z7. Swimming pace: easy, endurance,
                                                          threshold, speed.
                                                      basis:
                                                        type: string
                                                        enum:
                                                          - lthr
                                                          - maxHr
                                                        description: HR zone/percentage targets only.
                                                      low:
                                                        type: number
                                                        minimum: 0
                                                      high:
                                                        type: number
                                                        minimum: 0
                                                  secondaryTarget:
                                                    type: object
                                                    additionalProperties: false
                                                    required:
                                                      - kind
                                                    description: >-
                                                      Allowed kinds and zones depend on the
                                                      sport. Zone targets require zone; other
                                                      targets require ordered low/high bounds.
                                                      Pace is seconds/km for running/walking,
                                                      seconds/500m for rowing, seconds/100m
                                                      for swimming. Percentages are percent
                                                      values; HR is bpm, power is watts, RPE
                                                      is 1–10. Numeric strings with dot or
                                                      comma decimals are accepted.
                                                    properties:
                                                      kind:
                                                        type: string
                                                        enum:
                                                          - paceZone
                                                          - pacePct
                                                          - pace
                                                          - hrZone
                                                          - hrPct
                                                          - hr
                                                          - powerZone
                                                          - powerPct
                                                          - power
                                                          - rpe
                                                      zone:
                                                        type: string
                                                        enum:
                                                          - E
                                                          - T
                                                          - I
                                                          - R
                                                          - RP
                                                          - Z1
                                                          - Z2
                                                          - Z3
                                                          - Z4
                                                          - Z5
                                                          - Z6
                                                          - Z7
                                                          - easy
                                                          - endurance
                                                          - threshold
                                                          - speed
                                                        description: >-
                                                          Run pace: E (easy), T (threshold), I
                                                          (interval), R (repetition), RP (race
                                                          pace = goal time / goal distance, never
                                                          derived from T). Running has no HR
                                                          zones; HR bands are absolute bpm from
                                                          athlete data. Walking/rowing pace and
                                                          five-zone HR: Z1–Z5. Bike/row power:
                                                          Z1–Z7. Swimming pace: easy, endurance,
                                                          threshold, speed.
                                                      basis:
                                                        type: string
                                                        enum:
                                                          - lthr
                                                          - maxHr
                                                        description: HR zone/percentage targets only.
                                                      low:
                                                        type: number
                                                        minimum: 0
                                                      high:
                                                        type: number
                                                        minimum: 0
                                                  notes:
                                                    type: string
                                                    default: ''
                                                  stroke:
                                                    type: string
                                                    enum:
                                                      - free
                                                      - back
                                                      - breast
                                                      - fly
                                                      - im
                                                      - choice
                                                      - kick
                                                      - drill
                                                    description: Swimming only.
                                                  equipment:
                                                    type: array
                                                    items:
                                                      type: string
                                                      enum:
                                                        - pullBuoy
                                                        - paddles
                                                        - fins
                                                        - kickboard
                                                        - snorkel
                                                    description: Swimming only.
                                                  restMode:
                                                    type: string
                                                    enum:
                                                      - rest
                                                      - sendOff
                                                    description: >-
                                                      Swimming only. sendOff requires
                                                      sendOffSec.
                                                  sendOffSec:
                                                    type: number
                                                    minimum: 1
                                                    description: Swimming sendOff only.
                                                  cadence:
                                                    type: object
                                                    additionalProperties: false
                                                    required:
                                                      - low
                                                      - high
                                                    properties:
                                                      low:
                                                        type: number
                                                        minimum: 0
                                                      high:
                                                        type: number
                                                        minimum: 0
                                              default: []
                                        default: []
                                      sourceTemplateId:
                                        type:
                                          - string
                                          - 'null'
                                        example: null
                                  targetDistanceMeters:
                                    type:
                                      - number
                                      - 'null'
                                    minimum: 0
                                    example: 5000
                                    description: >-
                                      Planned distance in meters; null when no
                                      target is set.
                            discriminator:
                              propertyName: type
                              mapping:
                                workout: >-
                                  #/components/schemas/WorkoutProgrammeCalendarWorkoutItem
                                activity: >-
                                  #/components/schemas/WorkoutProgrammeCalendarActivityItem
        weeks:
          type: array
          description: >-
            All programme weeks, including future weeks with
            `isAvailable=false`.
          items:
            type: object
            required:
              - weekNumber
              - availableFrom
              - isAvailable
              - progressPercentage
              - isCompleted
            properties:
              weekNumber:
                type: integer
                minimum: 1
                example: 2
              availableFrom:
                oneOf:
                  - type: string
                    format: date
                    pattern: ^\d{4}-\d{2}-\d{2}$
                    example: '2026-09-08'
                  - type: string
                    enum:
                      - ''
                    example: ''
                description: >-
                  Canonical company-local release date; blank for recurring
                  plans and templates.
              isAvailable:
                type: boolean
                example: false
              progressPercentage:
                type: integer
                minimum: 0
                maximum: 100
                example: 50
                description: >-
                  Percentage of active moments in this programme week with a
                  completed session. Ordinary recurring sequence days remain
                  reusable and do not retain historical completion in progress.
              isCompleted:
                type: boolean
                example: false
        days:
          type: array
          items:
            type: object
            properties:
              planMomentId:
                type: string
                example: 67f1234567890abcdef1234
              name:
                type: string
                example: Day 1 – Upper Body Push & Pull
              description:
                type: string
                example: ''
              dayOrder:
                type: integer
                example: 1
              order:
                type: integer
                example: 0
              weekNumber:
                type: integer
                minimum: 1
                example: 1
              sessionOrder:
                type: integer
                minimum: 1
                example: 1
              progress:
                type: object
                description: >-
                  Recurring sequence days show the selected active attempt and
                  return to zero after completion, preserving history. Permanent
                  completion applies to multi-week/calendar programmes: any
                  non-deleted completed session for the exact plan and moment
                  makes it 100%, including a zero-exercise day. Performances are
                  never unioned across attempts.
                properties:
                  total:
                    type: integer
                    example: 6
                  completed:
                    type: integer
                    example: 2
                  progressPercentage:
                    type: integer
                    example: 33
                  isCompleted:
                    type: boolean
                    example: false
              stats:
                allOf:
                  - type: object
                    properties:
                      durationMinutes:
                        type: integer
                        example: 0
                        description: >-
                          Actual session duration (live elapsed for an active
                          session); 0 with no session.
                      exerciseCount:
                        type: integer
                        example: 0
                        description: Exercises logged in the current session.
                      expectedDurationMinutes:
                        type: integer
                        example: 110
                        description: >-
                          Estimated from the plan-day prescription; 0 for
                          freestyle.
                  - type: object
                    properties:
                      totalVolume:
                        type: number
                        example: 312
                      totalReps:
                        type: integer
                        example: 104
              session:
                type: object
                nullable: true
                description: >-
                  The current/navigation session, or null. Recurring sequence
                  days select only the newest active attempt and return null
                  after completion. Multi-week/calendar programmes fall back to
                  the latest completed attempt. Stopped/cancelled attempts are
                  excluded from current/resumable selection.
                properties:
                  id:
                    type: string
                    example: 67f1234567890abcdef1234
                  status:
                    type: string
                    enum:
                      - in_progress
                      - paused
                      - completed
                    example: in_progress
                  startedAt:
                    type: string
                    format: date-time
                    example: '2026-04-12T10:00:00.000Z'
                    nullable: true
                  programmeScheduleItemId:
                    oneOf:
                      - type: string
                        example: 67f1234567890abcdef1234
                      - type: 'null'
                  plannedDate:
                    type: string
                    format: date
                    pattern: ^\d{4}-\d{2}-\d{2}$
                    example: '2026-09-08'
              exercises:
                type: array
                items:
                  type: object
                  properties:
                    type:
                      type: string
                      enum:
                        - exercise
                        - superset
                      example: exercise
                    planExerciseId:
                      type: string
                      example: 67f1234567890abcdef1234
                      nullable: true
                      description: Null for freestyle / superset wrappers.
                    exerciseId:
                      type: string
                      example: 67f1234567890abcdef1234
                      nullable: true
                    name:
                      type: string
                      example: Dumbbell Bench Press
                    thumbnail:
                      type: string
                      example: https://cdn.example.com/exercises/bench.jpg
                    media:
                      type: array
                      description: >-
                        Combined ordered media (images first, then videos) —
                        same shape as getExerciseHistory. Empty for superset
                        wrappers.
                      items:
                        type: object
                        properties:
                          type:
                            type: string
                            enum:
                              - image
                              - video
                              - link
                            example: image
                          url:
                            type: string
                            example: https://cdn.example.com/ex/bench.jpg
                          platform:
                            type:
                              - string
                              - 'null'
                            example: null
                          videoId:
                            type:
                              - string
                              - 'null'
                            example: null
                          thumbnail:
                            type:
                              - string
                              - 'null'
                            example: null
                          duration:
                            type:
                              - number
                              - 'null'
                            example: null
                          width:
                            type:
                              - number
                              - 'null'
                            example: 1080
                          height:
                            type:
                              - number
                              - 'null'
                            example: 720
                    primaryMuscle:
                      type: string
                      example: Chest
                    secondaryMuscles:
                      type: array
                      items:
                        type: string
                      example:
                        - Triceps
                    equipment:
                      type: array
                      items:
                        type: string
                      example:
                        - Dumbbell
                    groupId:
                      type: string
                      example: ''
                      description: Superset group id (empty when standalone).
                    order:
                      type: integer
                      example: 0
                    isFavourite:
                      type: boolean
                      example: false
                    hasHistory:
                      type: boolean
                      example: false
                      description: >-
                        Whether this exercise has viewable completed-session
                        history (same basis as getExerciseHistory). Exercise
                        items only; omitted from superset wrappers.
                    targets:
                      type: object
                      nullable: true
                      description: >-
                        Plan-prescribed targets. `null` for freestyle and
                        superset wrappers.
                      properties:
                        type:
                          type: string
                          example: reps
                        sets:
                          type: integer
                          example: 4
                        reps:
                          type: string
                          example: 8–12
                        rest:
                          type: integer
                          example: 60
                          description: Prescribed rest seconds.
                        rpe:
                          type: number
                          example: 8
                        rmPercentage:
                          type: number
                          example: 0
                        tempo:
                          type: string
                          example: ''
                        notes:
                          type: string
                          example: Keep elbows tucked.
                          description: Coach's prescribed note for this exercise.
                    previousBestSet:
                      type: string
                      nullable: true
                      example: 12 × 24kg
                    performanceId:
                      type: string
                      example: 67f1234567890abcdef1234
                      nullable: true
                      description: Current-session performance id; null if not started.
                    isCompleted:
                      type: boolean
                      example: false
                    clientNotes:
                      type: string
                      example: ''
                      description: Client's own note for this exercise (this session).
                    clientRestSeconds:
                      type:
                        - number
                        - 'null'
                      example: null
                      description: >-
                        Client's own exercise-level rest this session (does NOT
                        fall back to targets.rest).
                    notes:
                      type: string
                      example: ''
                      description: Superset-wrapper note (always empty for exercise items).
                    sets:
                      type: array
                      items:
                        type: object
                        properties:
                          setNumber:
                            type: integer
                            example: 1
                          setType:
                            type: string
                            enum:
                              - 'N'
                              - W
                              - D
                              - F
                            example: 'N'
                          displayNumber:
                            type: integer
                            nullable: true
                            example: 1
                            description: >-
                              Sequential number for normal sets only. Warm-up,
                              drop set, and failure sets return null.
                          displayLabel:
                            type: string
                            example: '1'
                            description: >-
                              Backend-ready display string: normal sets use
                              their sequential number, other set types use W, D,
                              or F.
                          previous:
                            type: string
                            nullable: true
                            example: 12 × 22kg
                            description: >-
                              Same-index set from the last performance of this
                              exercise (`reps × weightkg`, `30s`, `100m`), or
                              null.
                          reps:
                            type: integer
                            nullable: true
                            example: 10
                          weight:
                            type: number
                            nullable: true
                            example: 22
                          timeSeconds:
                            type: number
                            nullable: true
                            example: null
                          distanceMeters:
                            type: number
                            nullable: true
                            example: null
                          rpe:
                            type: number
                            nullable: true
                            example: null
                          completed:
                            type: boolean
                            example: false
                    exerciseCount:
                      type: integer
                      example: 2
                      description: Superset wrappers only.
                    rounds:
                      type: integer
                      example: 4
                      description: Superset wrappers only.
                    data:
                      type: array
                      description: >-
                        Empty for a standalone exercise; the member exercise
                        items for a `type: "superset"` block.
                      items:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceWorkoutGroupedExerciseItem
                description: >-
                  Same item shape as getClientWorkoutDay, additionally carrying
                  `targetSnapshot`, `nextSessionTarget`, and `history` per
                  exercise.
    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'
    PublicWorkoutSourceWorkoutGroupedExerciseItem:
      type: object
      properties:
        id:
          type: string
          example: 67f1234567890abcdef1234
        name:
          type: string
          example: Barbell Bench Press
        primaryMuscle:
          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: Chest
        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
        primaryJoint:
          type: string
          enum:
            - ''
            - Ankle
            - Combination
            - Core
            - Elbow
            - Fingers
            - Hip
            - Knee
            - Neck
            - Shoulder
            - Spine
            - Wrist
          example: Shoulder
        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
        difficulty:
          type: string
          enum:
            - ''
            - Beginner
            - Intermediate
            - Advanced
          example: Intermediate
        intensity:
          type: string
          enum:
            - ''
            - Beginner
            - Below Average
            - Average
            - Above Average
            - High Intensity
          example: Above Average
        visibility:
          type: string
          enum:
            - Everyone
            - Company
            - Fitsociety
          example: Company
        tags:
          type: array
          items:
            type: string
        thumbnail:
          type:
            - string
            - 'null'
          format: uri
          example: https://cdn.example.com/exercises/bench-thumb.jpg
    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.