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

# Full template editor detail (all days in one call)

> Completion is progress information: completed days and exercises remain editable, including tracking type, set counts, targets, duplication and removal. Recorded sessions retain their own execution data. Returns the complete workout template editor view: plan metadata, a compact `overview`, the clients this template is assigned to, a plan-wide `planOverview` (totals + average intensity label), `weeks[]` muscle-focus aggregates, and a `days[]` array. Each day carries its own summary, the 'Muscle Focus' body diagram (`muscleActivation`), the 'Muscle Balance' radar, the volume-balance push/pull/legs/core distribution, and ONE ordered `exercises[]` array that merges standalone exercises and superset blocks (each entry is tagged `type: "exercise"` or `type: "superset"`). For calendar plans, legacy `days` remains workout-only while additive `weeks` includes all seven weekdays and mixed workout/activity items. Visibility is scoped the same way as plan detail.

Requires the workout_plans:read scope. This operation maps to /app/v1/workout/plans/template/:planId 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/plans/template/{planId}
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/plans/template/{planId}:
    get:
      tags:
        - Workout
      summary: Full template editor detail (all days in one call)
      description: >-
        Completion is progress information: completed days and exercises remain
        editable, including tracking type, set counts, targets, duplication and
        removal. Recorded sessions retain their own execution data. Returns the
        complete workout template editor view: plan metadata, a compact
        `overview`, the clients this template is assigned to, a plan-wide
        `planOverview` (totals + average intensity label), `weeks[]`
        muscle-focus aggregates, and a `days[]` array. Each day carries its own
        summary, the 'Muscle Focus' body diagram (`muscleActivation`), the
        'Muscle Balance' radar, the volume-balance push/pull/legs/core
        distribution, and ONE ordered `exercises[]` array that merges standalone
        exercises and superset blocks (each entry is tagged `type: "exercise"`
        or `type: "superset"`). For calendar plans, legacy `days` remains
        workout-only while additive `weeks` includes all seven weekdays and
        mixed workout/activity items. Visibility is scoped the same way as plan
        detail.


        Requires the workout_plans:read scope. This operation maps to
        /app/v1/workout/plans/template/:planId 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: publicWorkoutgetPublicV1WorkoutPlansTemplatePlanId
      parameters:
        - in: path
          name: planId
          required: true
          description: Workout plan id.
          schema:
            type: string
            example: 67f1234567890abcdef1234
        - in: query
          name: selectedWeekStart
          required: false
          description: >-
            Canonical company-local Monday for the requested programme week or
            recurring cycle. Omit to use the current company-local week.
          schema:
            type: string
            format: date
            pattern: ^\d{4}-\d{2}-\d{2}$
            example: '2026-09-14'
      responses:
        '200':
          description: Full workout template detail.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceGETAppV1WorkoutPlansTemplatePlanIdResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      overview:
                        totalDay: 3
                        minutesPerSession: 42
                        totalExercise: 43
                      clients:
                        - _id: 67f1234567890abcdef1234
                          firstName: Jane
                          lastName: Smith
                          fullName: Jane Smith
                          email: jane@example.com
                          image: https://cdn.example.com/clients/jane.jpg
                      plan:
                        _id: 67f1234567890abcdef1234
                        name: Intermediate General Fitness Plan
                        description: 3-day split
                        thumbnail: https://cdn.example.com/plan.jpg
                        images:
                          - url: https://cdn.example.com/workouts/plan-cover.jpg
                            width: 1280
                            height: 720
                        videos:
                          - - url: https://cdn.example.com/workouts/demo.mp4
                              platform: s3
                              videoId: ''
                              thumbnail: https://cdn.example.com/workouts/demo-thumb.jpg
                              duration: 84
                              width: 1920
                              height: 1080
                        difficulty: Advanced
                        intensity: Medium
                        category: Agility & Speed
                        goal: General Fitness
                        periodizationType: Linear
                        duration:
                          startDate: '2026-04-22T00:00:00.000Z'
                          endDate: '2026-04-29T00:00:00.000Z'
                          hasEndDate: true
                        schedule:
                          mode: multi_week
                          releasePolicy: weekly_from_start
                          startDate: '2026-09-08'
                          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
                        templateType: Template
                        status: Active
                        visibility: Everyone
                        defaultExerciseValues:
                          sets: 3
                          reps: 10-12
                          rest: 90
                          weight: 0
                          repTempo: '3010'
                          duration: 0
                        createdAt: '2026-04-12T10:00:00.000Z'
                        updatedAt: '2026-04-12T10:00:00.000Z'
                      planOverview:
                        totalDays: 3
                        totalWeeks: 4
                        totalExercises: 43
                        totalSets: 23
                        estimatedDurationMinutes: 42
                        avgRPE: 6.5
                        avgIntensityLabel: RP 6 - 7
                      weeks:
                        - weekNumber: 1
                          dayOrders:
                            - 1
                            - 2
                            - 3
                            - 4
                          summary:
                            exerciseCount: 5
                            totalSets: 18
                            estimatedTimeMinutes: 45
                            avgRPE: 7
                            muscles:
                              - Chest
                              - Triceps
                              - Back
                          muscleActivation:
                            total:
                              raw: {}
                              normalized: {}
                              maxValue: 24
                              topMuscles:
                                - muscle: chest
                                  value: 24
                          muscleBalance:
                            - muscle: Chest
                              value: 24
                              normalized: 1
                          volumeBalance:
                            push: 12
                            pull: 8
                            legs: 4
                            core: 0
                      days:
                        - planMomentId: 67f1234567890abcdef1234
                          scoring:
                            scoringType: forTime
                            descriptionOnly: true
                            acceptsManualResult: true
                            targetValue: null
                            timeDomain:
                              windowSeconds: null
                              timeCapSeconds: 900
                              rounds: 3
                              intervalSeconds: null
                              intervalCount: null
                              workSeconds: null
                              restSeconds: null
                            scoreValidation:
                              timeCapSeconds: 900
                              maxReps: null
                              expectedIntervals: null
                            result:
                              roundsCompleted: 5
                              repsPerRound: 30
                              extraReps: 12
                              totalReps: 162
                              intervalReps:
                                - 12
                                - 11
                                - 10
                              elapsedSeconds: 742
                              finishedBeforeCap: true
                              timeCapSeconds: 900
                              maxLoadKg: 120
                          isCompleted: true
                          isEditable: true
                          name: Day 1 - Upper Body Push & Pull
                          description: ''
                          dayOrder: 1
                          weekNumber: 1
                          sessionOrder: 1
                          summary:
                            exerciseCount: 5
                            totalSets: 18
                            estimatedTimeMinutes: 45
                            avgRPE: 7
                            muscles:
                              - Chest
                              - Triceps
                              - Back
                          muscleActivation:
                            total:
                              raw: {}
                              normalized: {}
                              maxValue: 24
                              topMuscles:
                                - muscle: chest
                                  value: 24
                          muscleBalance:
                            - muscle: Chest
                              value: 24
                              normalized: 1
                          volumeBalance:
                            push: 12
                            pull: 8
                            legs: 4
                            core: 0
                          exercises:
                            - planExerciseId: 67f1234567890abcdef1234
                              exerciseId: 67f1234567890abcdef1234
                              name: Incline Dumbbell Press
                              description: Flat horizontal press.
                              thumbnail: https://cdn.example.com/ex.jpg
                              primaryMuscle: Chest
                              secondaryMuscles:
                                - Shoulders
                                - Triceps
                              equipment:
                                - Dumbbell
                                - Bench
                              category: Strength
                              type: reps
                              sets: 4
                              repsDisplay: 8–12
                              minReps: 8
                              maxReps: 12
                              metric: kg
                              rest: 90
                              rpe: 8
                              rmPercentage: 75
                              tempo: '3010'
                              intensity: High
                              difficulty: Intermediate
                              groupId: ''
                              perSetTrackingEnabled: false
                              setsData:
                                - setNumber: 1
                                  setType: 'N'
                                  metric: '12'
                                  repetition: 8-12
                                  weight: 60
                                  rest: 90
                                  rpe: 7.5
                                  duration: 45
                                  distance: 250
                              setupFields:
                                - key: seat
                                  label: Seat
                                  type: text
                                  unit: ''
                                  options:
                                    - '1'
                                    - '2'
                                    - '3'
                                    - '4'
                                  order: 1
                                  required: false
                                  enabled: true
                                  defaultValue: 3
                              notes: ''
                              order: 0
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '400':
          description: >-
            Company context missing (`COMPANY_ID_REQUIRED`), invalid plan id
            (`INVALID_PLAN_ID`), or invalid selected recurring-week Monday.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                invalidRequest:
                  summary: Invalid request
                  value:
                    error:
                      code: 400
                      key: request.invalid
                      message: The request is invalid.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '401':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                missingBearer:
                  summary: Missing Bearer token
                  value:
                    error:
                      code: 401
                      key: auth.missing_bearer
                      message: Authorization Bearer token is required.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidToken:
                  summary: Invalid or expired token
                  value:
                    error:
                      code: 401
                      key: auth.invalid_token
                      message: The access token is invalid or expired.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidClient:
                  summary: Inactive or revoked client
                  value:
                    error:
                      code: 401
                      key: auth.invalid_client
                      message: The Public API client is inactive or revoked.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '403':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                insufficientScopes:
                  summary: Missing required scope
                  value:
                    error:
                      code: 403
                      key: scopes.insufficient
                      message: The access token does not include the required scope.
                      details:
                        requiredScopes:
                          - required:scope
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '404':
          description: Workout plan was not found in the caller's visible scope.
          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/plans/template/{planId}"
            \
              -H "Authorization: Bearer <access_token>"
components:
  schemas:
    PublicApiSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiMeta'
    PublicWorkoutSourceGETAppV1WorkoutPlansTemplatePlanIdResponse200:
      type: object
      properties:
        overview:
          type: object
          description: Compact header counts.
          properties:
            totalDay:
              type: integer
              example: 3
            minutesPerSession:
              type: integer
              example: 42
              description: Average estimated minutes per day/session.
            totalExercise:
              type: integer
              example: 43
        clients:
          type: array
          description: Clients this template is currently assigned to (deduped).
          items:
            type: object
            properties:
              _id:
                type: string
                example: 67f1234567890abcdef1234
              firstName:
                type: string
                example: Jane
              lastName:
                type: string
                example: Smith
              fullName:
                type: string
                example: Jane Smith
              email:
                type: string
                example: jane@example.com
              image:
                type: string
                example: https://cdn.example.com/clients/jane.jpg
        plan:
          type: object
          properties:
            _id:
              type: string
              example: 67f1234567890abcdef1234
            name:
              type: string
              example: Intermediate General Fitness Plan
            description:
              type: string
              example: 3-day split
            thumbnail:
              type: string
              example: https://cdn.example.com/plan.jpg
            images:
              type: array
              items:
                $ref: '#/components/schemas/PublicWorkoutSourceWorkoutImageAsset'
            videos:
              type: array
              items:
                type: array
                items:
                  $ref: '#/components/schemas/PublicWorkoutSourceWorkoutVideoAsset'
            difficulty:
              type: string
              example: Advanced
            intensity:
              type: string
              example: Medium
            category:
              type: string
              example: Agility & Speed
            goal:
              type: string
              example: General Fitness
            periodizationType:
              type: string
              example: Linear
            duration:
              type: object
              properties:
                startDate:
                  type: string
                  example: '2026-04-22T00:00:00.000Z'
                endDate:
                  type: string
                  example: '2026-04-29T00:00:00.000Z'
                hasEndDate:
                  type: boolean
                  example: true
            schedule:
              type: object
              additionalProperties: false
              required:
                - mode
                - releasePolicy
                - startDate
              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`).
                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
            templateType:
              type: string
              example: Template
            status:
              type: string
              example: Active
            visibility:
              type: string
              example: Everyone
            defaultExerciseValues:
              $ref: >-
                #/components/schemas/PublicWorkoutSourceWorkoutDefaultExerciseValues
            createdAt:
              type: string
              format: date-time
              example: '2026-04-12T10:00:00.000Z'
            updatedAt:
              type: string
              format: date-time
              example: '2026-04-12T10:00:00.000Z'
        planOverview:
          type: object
          properties:
            totalDays:
              type: integer
              example: 3
            totalWeeks:
              type: integer
              example: 4
              description: >-
                For multi-week plans, the maximum stored `weekNumber` among
                active moments; recurring plans report one structural week.
                Archived/deleted moments are excluded.
            totalExercises:
              type: integer
              example: 43
            totalSets:
              type: integer
              example: 23
            estimatedDurationMinutes:
              type: integer
              example: 42
            avgRPE:
              type: number
              nullable: true
              example: 6.5
            avgIntensityLabel:
              type: string
              example: RP 6 - 7
              description: Average RPE band; empty string when no RPE is set.
        weeks:
          type: array
          description: >-
            Structural programme-week aggregates for legacy sequence plans,
            grouped by stored `weekNumber`. Calendar plans add all seven
            weekdays, occurrence dates, mixed workout/activity items,
            availability, and execution status.
          items:
            description: >-
              Legacy weeks use stored `weekNumber` aggregates; calendar weeks
              use the enriched occurrence projection.
            anyOf:
              - type: object
                description: >-
                  One structural programme week. Multi-week plans use each
                  active moment's stored `weekNumber`; recurring plans always
                  expose one structural week. Archived/deleted moments are
                  excluded.
                properties:
                  weekNumber:
                    type: integer
                    example: 1
                  dayOrders:
                    type: array
                    items:
                      type: integer
                    example:
                      - 1
                      - 2
                      - 3
                      - 4
                  summary:
                    type: object
                    properties:
                      exerciseCount:
                        type: integer
                        example: 5
                      totalSets:
                        type: integer
                        example: 18
                      estimatedTimeMinutes:
                        type: integer
                        example: 45
                      avgRPE:
                        type: number
                        nullable: true
                        example: 7
                      muscles:
                        type: array
                        items:
                          type: string
                        example:
                          - Chest
                          - Triceps
                          - Back
                  muscleActivation:
                    type: object
                    description: >-
                      'Muscle Focus' body diagram for this day's planned
                      exercises. Same shape as the client training page (no
                      `range` — a template day is not time-bound).
                    properties:
                      total:
                        type: object
                        properties:
                          raw:
                            type: object
                            description: Activation score per muscle group.
                            additionalProperties:
                              type: number
                          normalized:
                            type: object
                            additionalProperties:
                              type: number
                            description: Scores normalized 0–1.
                          maxValue:
                            type: number
                            example: 24
                          topMuscles:
                            type: array
                            items:
                              type: object
                              properties:
                                muscle:
                                  type: string
                                  example: chest
                                value:
                                  type: number
                                  example: 24
                  muscleBalance:
                    type: array
                    description: Radar 'Muscle Balance' chart values for this day.
                    items:
                      type: object
                      properties:
                        muscle:
                          type: string
                          example: Chest
                        value:
                          type: number
                          example: 24
                        normalized:
                          type: number
                          example: 1
                  volumeBalance:
                    type: object
                    description: '''Weekly Volume Balance'' set distribution for this day.'
                    properties:
                      push:
                        type: integer
                        example: 12
                      pull:
                        type: integer
                        example: 8
                      legs:
                        type: integer
                        example: 4
                      core:
                        type: integer
                        example: 0
              - allOf:
                  - 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
                  - type: object
                    required:
                      - days
                    properties:
                      days:
                        type: array
                        minItems: 7
                        maxItems: 7
                        description: All seven ISO weekdays in Monday-to-Sunday order.
                        items:
                          type: object
                          required:
                            - weekday
                            - date
                            - isRestDay
                            - items
                          properties:
                            weekday:
                              type: integer
                              minimum: 1
                              maximum: 7
                              example: 1
                              description: 'ISO weekday number: 1 is Monday and 7 is Sunday.'
                            date:
                              oneOf:
                                - type: string
                                  format: date
                                  pattern: ^\d{4}-\d{2}-\d{2}$
                                  example: '2026-09-08'
                                - type: string
                                  enum:
                                    - ''
                                  example: ''
                              readOnly: true
                              description: >-
                                Canonical company-local occurrence date.
                                Template calendar days use an empty string.
                            isBeforeStart:
                              type: boolean
                              readOnly: true
                              example: false
                              description: >-
                                True for week-1 days before a mid-week
                                multi-week schedule.startDate. Such days are
                                returned as rest days (isRestDay true, items
                                empty); computed per response, never stored.
                                Starting one of their occurrences is rejected.
                                Always false for templates.
                            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
        days:
          type: array
          description: >-
            Legacy workout-only plan-moment list. Calendar activities are
            exposed only in additive `weeks`.
          items:
            type: object
            properties:
              planMomentId:
                type: string
                example: 67f1234567890abcdef1234
              scoring:
                type: object
                nullable: true
                description: >-
                  Scoring of a plan day. Null for an ordinary standard day.
                  `acceptsManualResult` is true only for exercise-free scored
                  days (`descriptionOnly`), which take a `wodResult` on PATCH
                  /app/v1/workout/performance/sessions/{sessionId}/complete.
                  `result` is the saved score of the selected session, or null.
                properties:
                  scoringType:
                    type: string
                    enum:
                      - standard
                      - forTime
                      - amrap
                      - emom
                      - tabata
                      - maxLoad
                    example: forTime
                  descriptionOnly:
                    type: boolean
                    example: true
                  acceptsManualResult:
                    type: boolean
                    example: true
                  targetValue:
                    type: number
                    nullable: true
                    example: null
                  timeDomain:
                    type: object
                    nullable: true
                    description: >-
                      Clock prescription, same contract as a WOD `timeDomain`.
                      Allowed fields depend on `scoringType`: amrap →
                      windowSeconds (required); forTime → timeCapSeconds, rounds
                      (defaults to 1); emom → intervalSeconds, intervalCount
                      (both required); tabata → workSeconds, restSeconds,
                      intervalCount (all required); standard/maxLoad → none.
                    properties:
                      windowSeconds:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: null
                      timeCapSeconds:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: 900
                      rounds:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: 3
                      intervalSeconds:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: null
                      intervalCount:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: null
                      workSeconds:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: null
                      restSeconds:
                        type: integer
                        nullable: true
                        minimum: 0
                        example: null
                  scoreValidation:
                    type: object
                    nullable: true
                    description: >-
                      Optional result caps. timeCapSeconds and expectedIntervals
                      are derived from `timeDomain` when one is set.
                    properties:
                      timeCapSeconds:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: 900
                      maxReps:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: null
                      expectedIntervals:
                        type: integer
                        nullable: true
                        minimum: 1
                        example: null
                  result:
                    allOf:
                      - type: object
                        description: >-
                          Type-specific manual score, the same shape as the WOD
                          `wodResult`. Only the fields of the day's scoringType
                          are accepted: amrap → roundsCompleted, repsPerRound,
                          extraReps, totalReps (total = rounds × repsPerRound +
                          extraReps, extraReps < repsPerRound); forTime →
                          elapsedSeconds, finishedBeforeCap, totalReps (reps
                          required when not finished before the cap);
                          emom/tabata → intervalReps, totalReps (sum of
                          intervals; count must match intervalCount when set);
                          maxLoad → maxLoadKg. The stored copy of a forTime
                          result also carries timeCapSeconds.
                        properties:
                          roundsCompleted:
                            type: integer
                            minimum: 0
                            example: 5
                          repsPerRound:
                            type: integer
                            minimum: 1
                            example: 30
                          extraReps:
                            type: integer
                            minimum: 0
                            example: 12
                          totalReps:
                            type: integer
                            minimum: 0
                            example: 162
                          intervalReps:
                            type: array
                            items:
                              type: integer
                              minimum: 0
                            example:
                              - 12
                              - 11
                              - 10
                          elapsedSeconds:
                            type: number
                            minimum: 0
                            example: 742
                          finishedBeforeCap:
                            type: boolean
                            example: true
                          timeCapSeconds:
                            type: integer
                            nullable: true
                            readOnly: true
                            example: 900
                          maxLoadKg:
                            type: number
                            minimum: 0
                            example: 120
                    nullable: true
              isCompleted:
                type: boolean
                description: Whether this day has a completed session; informational only.
              isEditable:
                type: boolean
                const: true
                description: >-
                  Completion never locks plan authoring. Authorization and
                  feature gates still apply.
              name:
                type: string
                example: Day 1 - Upper Body Push & Pull
              description:
                type: string
                example: ''
              dayOrder:
                type: integer
                example: 1
              weekNumber:
                type: integer
                example: 1
              sessionOrder:
                type: integer
                minimum: 1
                example: 1
                description: Training position within the programme week.
              summary:
                type: object
                properties:
                  exerciseCount:
                    type: integer
                    example: 5
                  totalSets:
                    type: integer
                    example: 18
                  estimatedTimeMinutes:
                    type: integer
                    example: 45
                  avgRPE:
                    type: number
                    nullable: true
                    example: 7
                  muscles:
                    type: array
                    items:
                      type: string
                    example:
                      - Chest
                      - Triceps
                      - Back
              muscleActivation:
                type: object
                description: >-
                  'Muscle Focus' body diagram for this day's planned exercises.
                  Same shape as the client training page (no `range` — a
                  template day is not time-bound).
                properties:
                  total:
                    type: object
                    properties:
                      raw:
                        type: object
                        description: Activation score per muscle group.
                        additionalProperties:
                          type: number
                      normalized:
                        type: object
                        additionalProperties:
                          type: number
                        description: Scores normalized 0–1.
                      maxValue:
                        type: number
                        example: 24
                      topMuscles:
                        type: array
                        items:
                          type: object
                          properties:
                            muscle:
                              type: string
                              example: chest
                            value:
                              type: number
                              example: 24
              muscleBalance:
                type: array
                description: Radar 'Muscle Balance' chart values for this day.
                items:
                  type: object
                  properties:
                    muscle:
                      type: string
                      example: Chest
                    value:
                      type: number
                      example: 24
                    normalized:
                      type: number
                      example: 1
              volumeBalance:
                type: object
                description: '''Weekly Volume Balance'' set distribution for this day.'
                properties:
                  push:
                    type: integer
                    example: 12
                  pull:
                    type: integer
                    example: 8
                  legs:
                    type: integer
                    example: 4
                  core:
                    type: integer
                    example: 0
              exercises:
                type: array
                description: >-
                  ONE ordered array. A standalone exercise is `{ type:
                  "exercise", …all exercise fields…, data: [] }`. A superset
                  (groupId shared by ≥2 exercises) is `{ type: "superset",
                  groupId, order, exerciseCount, rounds,
                  restBetweenRoundsSeconds, data: [member exercises] }` placed
                  at its first member's position.
                items:
                  allOf:
                    - type: object
                      properties:
                        planExerciseId:
                          type: string
                          example: 67f1234567890abcdef1234
                        exerciseId:
                          type: string
                          example: 67f1234567890abcdef1234
                        name:
                          type: string
                          example: Incline Dumbbell Press
                        description:
                          type: string
                          example: Flat horizontal press.
                        thumbnail:
                          type: string
                          example: https://cdn.example.com/ex.jpg
                        primaryMuscle:
                          type: string
                          example: Chest
                        secondaryMuscles:
                          type: array
                          items:
                            type: string
                          example:
                            - Shoulders
                            - Triceps
                        equipment:
                          type: array
                          items:
                            type: string
                          example:
                            - Dumbbell
                            - Bench
                        category:
                          type: string
                          example: Strength
                        type:
                          type: string
                          enum:
                            - reps
                            - time
                            - distance
                          example: reps
                        sets:
                          type: integer
                          example: 4
                        repsDisplay:
                          type: string
                          example: 8–12
                          description: >-
                            Human-readable reps/metric badge: rep range, single
                            value, or metric (e.g. `30 sec`, `100 m`).
                        minReps:
                          type: integer
                          example: 8
                        maxReps:
                          type: integer
                          example: 12
                        metric:
                          type: string
                          example: kg
                        rest:
                          type: integer
                          example: 90
                          description: Rest seconds.
                        rpe:
                          type: number
                          example: 8
                        rmPercentage:
                          type: number
                          example: 75
                        tempo:
                          type: string
                          example: '3010'
                        intensity:
                          type: string
                          enum:
                            - Low
                            - Medium
                            - High
                          example: High
                        difficulty:
                          type: string
                          enum:
                            - Beginner
                            - Intermediate
                            - Advanced
                          example: Intermediate
                        groupId:
                          type: string
                          example: ''
                          description: Non-empty when this exercise belongs to a superset.
                        perSetTrackingEnabled:
                          type: boolean
                          example: false
                        setsData:
                          type: array
                          items:
                            $ref: >-
                              #/components/schemas/PublicWorkoutSourceWorkoutSetData
                          description: >-
                            Per-set planned targets (when
                            perSetTrackingEnabled). Each row also carries the
                            coach's per-set PLACEHOLDERS — the greyed hint an
                            empty input shows on the logging screen:
                            `repsPlaceholder` (string; a range such as `"8-12"`
                            is allowed), `weightPlaceholder`,
                            `durationPlaceholder`, `distancePlaceholder`,
                            `rpePlaceholder`. Send them to pin a hint that
                            differs from the target; omit them and each is
                            derived from the prescribed `repetition` / `weight`
                            / `duration` / `distance` / `rpe` on save, masked to
                            the metrics the exercise `type` tracks (so a `time`
                            exercise stores no reps hint). `""` / `0` mean no
                            hint. These are what the read endpoints return as
                            `*PlaceholderCoach`, and they WIN over any
                            placeholder the client stored, so editing the
                            prescription updates the hint immediately.
                            Placeholders are never logged work and never reach
                            totals, volume, PRs or completion.
                        setupFields:
                          type: array
                          items:
                            $ref: >-
                              #/components/schemas/PublicWorkoutSourceWorkoutExerciseSetupField
                          description: Custom setup fields (e.g. seat height).
                        notes:
                          type: string
                          example: ''
                        order:
                          type: integer
                          example: 0
                  type: object
                  properties:
                    type:
                      type: string
                      enum:
                        - exercise
                        - superset
                      example: exercise
                    groupId:
                      type: string
                      example: ''
                      description: Superset group id (empty when standalone).
                    exerciseCount:
                      type: integer
                      example: 2
                      description: Superset wrappers only — member count.
                    rounds:
                      type: integer
                      example: 4
                      description: >-
                        Superset wrappers only — max sets among members (≈
                        rounds).
                    restBetweenRoundsSeconds:
                      type: integer
                      example: 90
                      description: Superset wrappers only.
                    data:
                      type: array
                      description: >-
                        Empty `[]` for a standalone exercise; the member
                        exercises for a `type: "superset"` block.
                      items:
                        type: object
                        properties:
                          planExerciseId:
                            type: string
                            example: 67f1234567890abcdef1234
                          exerciseId:
                            type: string
                            example: 67f1234567890abcdef1234
                          name:
                            type: string
                            example: Incline Dumbbell Press
                          description:
                            type: string
                            example: Flat horizontal press.
                          thumbnail:
                            type: string
                            example: https://cdn.example.com/ex.jpg
                          primaryMuscle:
                            type: string
                            example: Chest
                          secondaryMuscles:
                            type: array
                            items:
                              type: string
                            example:
                              - Shoulders
                              - Triceps
                          equipment:
                            type: array
                            items:
                              type: string
                            example:
                              - Dumbbell
                              - Bench
                          category:
                            type: string
                            example: Strength
                          type:
                            type: string
                            enum:
                              - reps
                              - time
                              - distance
                            example: reps
                          sets:
                            type: integer
                            example: 4
                          repsDisplay:
                            type: string
                            example: 8–12
                            description: >-
                              Human-readable reps/metric badge: rep range,
                              single value, or metric (e.g. `30 sec`, `100 m`).
                          minReps:
                            type: integer
                            example: 8
                          maxReps:
                            type: integer
                            example: 12
                          metric:
                            type: string
                            example: kg
                          rest:
                            type: integer
                            example: 90
                            description: Rest seconds.
                          rpe:
                            type: number
                            example: 8
                          rmPercentage:
                            type: number
                            example: 75
                          tempo:
                            type: string
                            example: '3010'
                          intensity:
                            type: string
                            enum:
                              - Low
                              - Medium
                              - High
                            example: High
                          difficulty:
                            type: string
                            enum:
                              - Beginner
                              - Intermediate
                              - Advanced
                            example: Intermediate
                          groupId:
                            type: string
                            example: ''
                            description: >-
                              Non-empty when this exercise belongs to a
                              superset.
                          perSetTrackingEnabled:
                            type: boolean
                            example: false
                          setsData:
                            type: array
                            items:
                              $ref: >-
                                #/components/schemas/PublicWorkoutSourceWorkoutSetData
                            description: >-
                              Per-set planned targets (when
                              perSetTrackingEnabled). Each row also carries the
                              coach's per-set PLACEHOLDERS — the greyed hint an
                              empty input shows on the logging screen:
                              `repsPlaceholder` (string; a range such as
                              `"8-12"` is allowed), `weightPlaceholder`,
                              `durationPlaceholder`, `distancePlaceholder`,
                              `rpePlaceholder`. Send them to pin a hint that
                              differs from the target; omit them and each is
                              derived from the prescribed `repetition` /
                              `weight` / `duration` / `distance` / `rpe` on
                              save, masked to the metrics the exercise `type`
                              tracks (so a `time` exercise stores no reps hint).
                              `""` / `0` mean no hint. These are what the read
                              endpoints return as `*PlaceholderCoach`, and they
                              WIN over any placeholder the client stored, so
                              editing the prescription updates the hint
                              immediately. Placeholders are never logged work
                              and never reach totals, volume, PRs or completion.
                          setupFields:
                            type: array
                            items:
                              $ref: >-
                                #/components/schemas/PublicWorkoutSourceWorkoutExerciseSetupField
                            description: Custom setup fields (e.g. seat height).
                          notes:
                            type: string
                            example: ''
                          order:
                            type: integer
                            example: 0
    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'
    PublicWorkoutSourceWorkoutImageAsset:
      type: object
      required:
        - url
      properties:
        url:
          type: string
          format: uri
          example: https://cdn.example.com/workouts/plan-cover.jpg
        width:
          type:
            - number
            - 'null'
          example: 1280
        height:
          type:
            - number
            - 'null'
          example: 720
    PublicWorkoutSourceWorkoutVideoAsset:
      type: object
      required:
        - url
        - platform
      properties:
        url:
          type: string
          format: uri
          example: https://cdn.example.com/workouts/demo.mp4
        platform:
          type: string
          enum:
            - s3
            - youtube
            - tiktok
          example: s3
        videoId:
          type: string
          example: ''
        thumbnail:
          type: string
          format: uri
          example: https://cdn.example.com/workouts/demo-thumb.jpg
        duration:
          type:
            - number
            - 'null'
          example: 84
        width:
          type:
            - number
            - 'null'
          example: 1920
        height:
          type:
            - number
            - 'null'
          example: 1080
    PublicWorkoutSourceWorkoutDefaultExerciseValues:
      type: object
      required:
        - sets
        - reps
        - rest
        - repTempo
      properties:
        sets:
          type: number
          minimum: 1
          example: 3
        reps:
          oneOf:
            - type: string
              pattern: ^\d+(-\d+)?$
            - type: number
              minimum: 1
          example: 10-12
        rest:
          type: number
          minimum: 0
          example: 90
        weight:
          type: number
          example: 0
        repTempo:
          type: string
          example: '3010'
        duration:
          type: number
          example: 0
    PublicWorkoutSourceWorkoutSetData:
      type: object
      properties:
        setNumber:
          type: integer
          minimum: 1
          example: 1
        setType:
          type: string
          enum:
            - 'N'
            - W
            - D
            - F
          example: 'N'
          description: 'Planned set type: N normal, W warm-up, D drop set, F to failure.'
        metric:
          type: string
          example: '12'
        repetition:
          type: string
          example: 8-12
        weight:
          type: number
          example: 60
        rest:
          type: number
          example: 90
        rpe:
          type:
            - number
            - 'null'
          minimum: 0
          maximum: 10
          example: 7.5
          description: >-
            Optional target RPE for this set. It does not inherit the
            exercise-level RPE value.
        duration:
          type: number
          example: 45
        distance:
          type: number
          example: 250
    PublicWorkoutSourceWorkoutExerciseSetupField:
      type: object
      required:
        - key
        - label
      properties:
        key:
          type: string
          example: seat
        label:
          type: string
          example: Seat
        type:
          type: string
          enum:
            - text
            - number
            - select
          example: text
        unit:
          type: string
          example: ''
        options:
          type: array
          items:
            type: string
          example:
            - '1'
            - '2'
            - '3'
            - '4'
        order:
          type: number
          example: 1
        required:
          type: boolean
          example: false
        enabled:
          type: boolean
          example: true
        defaultValue:
          oneOf:
            - type: string
            - type: number
          example: 3
    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.