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

# Replace a workout programme calendar schedule

> Atomically validates and replaces the complete calendar-week definition for a Workout V2 plan. Every referenced workout item must point to an active plan moment in the same plan. Supplied cardio requires the composite workoutsectionv2 + workoutV2ProgrammeCalendar + workoutV2CardioBuilder gate; otherwise 403 WORKOUT_V2_CARDIO_BUILDER_DISABLED and nothing is saved. Items that omit cardio preserve stored cardio by matching _id, whether the cardio flag is on or off. Cardio totals replace plannedDurationMinutes and targetDistanceMeters. Disabled responses omit cardio. New swimming/rowing items require the cardio gate even without blocks; matching stored items remain editable while disabled.

Requires the workout_plans:write scope. This operation maps to /app/v1/workout/plans/:planId/calendar-schedule 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 put /public/v1/workout/plans/{planId}/calendar-schedule
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/{planId}/calendar-schedule:
    put:
      tags:
        - Workout
      summary: Replace a workout programme calendar schedule
      description: >-
        Atomically validates and replaces the complete calendar-week definition
        for a Workout V2 plan. Every referenced workout item must point to an
        active plan moment in the same plan. Supplied cardio requires the
        composite workoutsectionv2 + workoutV2ProgrammeCalendar +
        workoutV2CardioBuilder gate; otherwise 403
        WORKOUT_V2_CARDIO_BUILDER_DISABLED and nothing is saved. Items that omit
        cardio preserve stored cardio by matching _id, whether the cardio flag
        is on or off. Cardio totals replace plannedDurationMinutes and
        targetDistanceMeters. Disabled responses omit cardio. New
        swimming/rowing items require the cardio gate even without blocks;
        matching stored items remain editable while disabled.


        Requires the workout_plans:write scope. This operation maps to
        /app/v1/workout/plans/:planId/calendar-schedule 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: publicWorkoutputPublicV1WorkoutPlansPlanIdCalendarSchedule
      parameters:
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 200
            example: booking-create-20260714-001
          description: >-
            Required for Public API write requests. Reusing the same key with
            the same method, path, and body replays the stored successful
            response; reusing it with a different request returns `409
            idempotency.conflict`.
        - in: path
          name: planId
          required: true
          description: Workout plan id.
          schema:
            type: string
            example: 67f1234567890abcdef1234
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/PublicWorkoutSourcePUTAppV1WorkoutPlansPlanIdCalendarScheduleRequest
      responses:
        '200':
          description: Normalized calendar schedule replacement.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiWriteSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourcePUTAppV1WorkoutPlansPlanIdCalendarScheduleResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      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
                      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
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                      idempotency:
                        replayed: false
        '400':
          description: Malformed plan id or invalid calendar schedule definition.
          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
                idempotencyRequired:
                  summary: Missing Idempotency-Key
                  value:
                    error:
                      code: 400
                      key: idempotency.required
                      message: >-
                        Idempotency-Key header is required for Public API write
                        requests.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                idempotencyInvalid:
                  summary: Invalid Idempotency-Key
                  value:
                    error:
                      code: 400
                      key: idempotency.invalid
                      message: Idempotency-Key header must be 200 characters or fewer.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '401':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                missingBearer:
                  summary: Missing Bearer token
                  value:
                    error:
                      code: 401
                      key: auth.missing_bearer
                      message: Authorization Bearer token is required.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidToken:
                  summary: Invalid or expired token
                  value:
                    error:
                      code: 401
                      key: auth.invalid_token
                      message: The access token is invalid or expired.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidClient:
                  summary: Inactive or revoked client
                  value:
                    error:
                      code: 401
                      key: auth.invalid_client
                      message: The Public API client is inactive or revoked.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '403':
          description: >-
            Workout V2 programme calendar is disabled for the active company
            (`WORKOUT_V2_PROGRAMME_CALENDAR_DISABLED`) or the caller lacks
            access. Cardio input also requires workoutV2CardioBuilder; returns
            WORKOUT_V2_CARDIO_BUILDER_DISABLED otherwise.
          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.
          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'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                idempotencyConflict:
                  summary: Idempotency-Key conflict
                  value:
                    error:
                      code: 409
                      key: idempotency.conflict
                      message: >-
                        Idempotency-Key was already used with a different
                        request.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                idempotencyInProgress:
                  summary: Idempotency-Key in progress
                  value:
                    error:
                      code: 409
                      key: idempotency.in_progress
                      message: >-
                        Idempotency-Key is already processing for this Public
                        API client.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '422':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                emptyBody:
                  summary: Empty or invalid JSON object body
                  value:
                    error:
                      code: 422
                      key: EMPTY_BODY
                      message: Request body must be a non-empty JSON object.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '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 PUT
            "https://api.fitsociety.io/public/v1/workout/plans/{planId}/calendar-schedule"
            \
              -H "Authorization: Bearer <access_token>" \
              -H "Idempotency-Key: <stable_request_key>" \
              -H "Content-Type: application/json" \
              -d '{}'
components:
  schemas:
    PublicWorkoutSourcePUTAppV1WorkoutPlansPlanIdCalendarScheduleRequest:
      type: object
      additionalProperties: false
      required:
        - layout
        - weeks
      properties:
        layout:
          type: string
          enum:
            - calendar_week
          example: calendar_week
        weeks:
          type: array
          items:
            $ref: >-
              #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarWeek
    PublicApiWriteSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiWriteMeta'
    PublicWorkoutSourcePUTAppV1WorkoutPlansPlanIdCalendarScheduleResponse200:
      type: object
      required:
        - schedule
        - weeks
      properties:
        schedule:
          allOf:
            - 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
            - type: object
              required:
                - layout
                - weeks
              properties:
                layout:
                  type: string
                  enum:
                    - calendar_week
                weeks:
                  type: array
                  items:
                    type: object
                    required:
                      - weekNumber
                      - days
                    properties:
                      weekNumber:
                        type: integer
                        minimum: 1
                        example: 1
                      days:
                        type: array
                        items:
                          type: object
                          required:
                            - weekday
                            - isRestDay
                            - items
                          properties:
                            weekday:
                              type: integer
                              minimum: 1
                              maximum: 7
                              example: 1
                              description: 'ISO weekday number: 1 is Monday and 7 is Sunday.'
                            isRestDay:
                              type: boolean
                              example: false
                            items:
                              type: array
                              items:
                                oneOf:
                                  - type: object
                                    additionalProperties: false
                                    required:
                                      - type
                                      - order
                                      - planMomentId
                                    properties:
                                      _id:
                                        type: string
                                        example: 67f1234567890abcdef1234
                                      order:
                                        type: integer
                                        minimum: 1
                                        example: 1
                                      startTime:
                                        type: string
                                        pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                        example: '08:30'
                                      plannedDurationMinutes:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        example: 45
                                        description: >-
                                          Planned duration in minutes; null when
                                          no target is set.
                                      status:
                                        type:
                                          - string
                                          - 'null'
                                        enum:
                                          - in_progress
                                          - completed
                                          - overdue
                                          - today
                                          - upcoming
                                          - null
                                        readOnly: true
                                        example: today
                                        description: >-
                                          Occurrence presentation status. Template
                                          items use null; cancelled occurrences
                                          fall back to overdue, today, or
                                          upcoming.
                                      plannedDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Original authored occurrence date for a
                                          calendar response item.
                                      scheduledDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Effective calendar date after a client
                                          move; otherwise plannedDate.
                                      source:
                                        type: string
                                        enum:
                                          - programme
                                        readOnly: true
                                      clientAdjustment:
                                        oneOf:
                                          - type: object
                                            required:
                                              - action
                                              - occurrenceDate
                                              - scheduledDate
                                              - changedAt
                                            properties:
                                              action:
                                                type: string
                                                enum:
                                                  - moved
                                                  - skipped
                                              occurrenceDate:
                                                type: string
                                                format: date
                                                pattern: ^\d{4}-\d{2}-\d{2}$
                                                example: '2026-09-08'
                                              scheduledDate:
                                                oneOf:
                                                  - type: string
                                                    format: date
                                                    pattern: ^\d{4}-\d{2}-\d{2}$
                                                    example: '2026-09-08'
                                                  - type: string
                                                    enum:
                                                      - ''
                                                    example: ''
                                              changedAt:
                                                type:
                                                  - string
                                                  - 'null'
                                                format: date-time
                                                example: null
                                          - type: 'null'
                                        readOnly: true
                                      canClientRestore:
                                        type: boolean
                                        readOnly: true
                                      type:
                                        type: string
                                        enum:
                                          - workout
                                        example: workout
                                      planMomentId:
                                        type: string
                                        example: 67f1234567890abcdef1234
                                  - type: object
                                    additionalProperties: false
                                    required:
                                      - type
                                      - order
                                      - activityType
                                      - name
                                    properties:
                                      _id:
                                        type: string
                                        example: 67f1234567890abcdef1234
                                      order:
                                        type: integer
                                        minimum: 1
                                        example: 1
                                      startTime:
                                        type: string
                                        pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                        example: '08:30'
                                      plannedDurationMinutes:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        example: 45
                                        description: >-
                                          Planned duration in minutes; null when
                                          no target is set.
                                      status:
                                        type:
                                          - string
                                          - 'null'
                                        enum:
                                          - in_progress
                                          - completed
                                          - overdue
                                          - today
                                          - upcoming
                                          - null
                                        readOnly: true
                                        example: today
                                        description: >-
                                          Occurrence presentation status. Template
                                          items use null; cancelled occurrences
                                          fall back to overdue, today, or
                                          upcoming.
                                      plannedDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Original authored occurrence date for a
                                          calendar response item.
                                      scheduledDate:
                                        oneOf:
                                          - type: string
                                            format: date
                                            pattern: ^\d{4}-\d{2}-\d{2}$
                                            example: '2026-09-08'
                                          - type: string
                                            enum:
                                              - ''
                                            example: ''
                                        readOnly: true
                                        description: >-
                                          Effective calendar date after a client
                                          move; otherwise plannedDate.
                                      source:
                                        type: string
                                        enum:
                                          - programme
                                        readOnly: true
                                      clientAdjustment:
                                        oneOf:
                                          - type: object
                                            required:
                                              - action
                                              - occurrenceDate
                                              - scheduledDate
                                              - changedAt
                                            properties:
                                              action:
                                                type: string
                                                enum:
                                                  - moved
                                                  - skipped
                                              occurrenceDate:
                                                type: string
                                                format: date
                                                pattern: ^\d{4}-\d{2}-\d{2}$
                                                example: '2026-09-08'
                                              scheduledDate:
                                                oneOf:
                                                  - type: string
                                                    format: date
                                                    pattern: ^\d{4}-\d{2}-\d{2}$
                                                    example: '2026-09-08'
                                                  - type: string
                                                    enum:
                                                      - ''
                                                    example: ''
                                              changedAt:
                                                type:
                                                  - string
                                                  - 'null'
                                                format: date-time
                                                example: null
                                          - type: 'null'
                                        readOnly: true
                                      canClientRestore:
                                        type: boolean
                                        readOnly: true
                                      type:
                                        type: string
                                        enum:
                                          - activity
                                        example: activity
                                      activityType:
                                        type: string
                                        enum:
                                          - running
                                          - cycling
                                          - walking
                                          - swimming
                                          - rowing
                                          - padel
                                          - mobility
                                          - other
                                        example: running
                                      name:
                                        type: array
                                        minItems: 1
                                        items:
                                          type: object
                                          required:
                                            - lang
                                            - value
                                          properties:
                                            lang:
                                              type: string
                                              enum:
                                                - en
                                                - nl
                                                - fr
                                                - de
                                                - es
                                              example: en
                                            value:
                                              type: string
                                              example: Full Body Strength
                                        example:
                                          - lang: en
                                            value: Full Body Strength
                                          - lang: nl
                                            value: Full Body Kracht
                                      description:
                                        type: array
                                        items:
                                          type: object
                                          required:
                                            - lang
                                            - value
                                          properties:
                                            lang:
                                              type: string
                                              enum:
                                                - en
                                                - nl
                                                - fr
                                                - de
                                                - es
                                              example: en
                                            value:
                                              type: string
                                              example: Full Body Strength
                                      cardio:
                                        type: object
                                        additionalProperties: false
                                        description: >-
                                          Optional structured activity
                                          prescription. Requires workoutsectionv2
                                          + workoutV2ProgrammeCalendar +
                                          workoutV2CardioBuilder. Omitted from
                                          disabled reads. Supported sports:
                                          running (paceZone E/T/I/R/RP, absolute
                                          pace, absolute HR, RPE), walking (pace,
                                          HR, RPE), cycling (power, HR, RPE),
                                          rowing (pace, power, HR, RPE), swimming
                                          (pace, RPE). Rejected for workout,
                                          padel, mobility and other items. Totals
                                          overwrite planned duration/distance;
                                          unknown time or distance contributes
                                          zero.
                                        properties:
                                          slotKey:
                                            type: string
                                            description: >-
                                              Generated when missing; retain across
                                              edits, copies and weeks.
                                          sessionType:
                                            type: string
                                            enum:
                                              - easy
                                              - zone2
                                              - long_run
                                              - threshold_continuous
                                              - threshold_reps
                                              - interval
                                              - race_pace
                                              - time_trial
                                              - race
                                            description: >-
                                              Running only. Template session codes:
                                              threshold_continuous = drempel_c,
                                              threshold_reps = drempel_r, interval,
                                              race_pace = doeltempo, zone2. A typed
                                              session with empty blocks is a skeleton
                                              to be filled later.
                                          controlMode:
                                            type: string
                                            enum:
                                              - pace
                                              - hr
                                            description: >-
                                              Binding signal. Defaults from
                                              sessionType: hr for easy, zone2 and
                                              long_run; pace for threshold_continuous,
                                              threshold_reps, interval and race_pace;
                                              none for time_trial and race. A
                                              contradicting value is rejected.
                                          ladderStep:
                                            type: integer
                                            minimum: 1
                                            description: >-
                                              Ladder position: interval 1–8,
                                              threshold_reps 1–7, threshold_continuous
                                              1–5 (15/18/20/22/25 min). Rejected for
                                              other session types.
                                          poolLengthM:
                                            type: number
                                            enum:
                                              - 25
                                              - 50
                                            description: Swimming only.
                                          blocks:
                                            type: array
                                            maxItems: 10
                                            items:
                                              type: object
                                              additionalProperties: false
                                              properties:
                                                _id:
                                                  type: string
                                                  example: 67f1234567890abcdef1234
                                                repeat:
                                                  type: integer
                                                  minimum: 1
                                                  maximum: 50
                                                  default: 1
                                                steps:
                                                  type: array
                                                  maxItems: 20
                                                  items:
                                                    type: object
                                                    additionalProperties: false
                                                    required:
                                                      - kind
                                                      - durationType
                                                    properties:
                                                      _id:
                                                        type: string
                                                        example: 67f1234567890abcdef1234
                                                      kind:
                                                        type: string
                                                        enum:
                                                          - warmup
                                                          - work
                                                          - recovery
                                                          - rest
                                                          - cooldown
                                                      durationType:
                                                        type: string
                                                        enum:
                                                          - time
                                                          - distance
                                                          - open
                                                      durationValue:
                                                        type:
                                                          - number
                                                          - 'null'
                                                        minimum: 0
                                                        default: null
                                                        description: >-
                                                          Required seconds for time or metres for
                                                          distance; null/omitted for open.
                                                      target:
                                                        type: object
                                                        additionalProperties: false
                                                        required:
                                                          - kind
                                                        description: >-
                                                          Allowed kinds and zones depend on the
                                                          sport. Zone targets require zone; other
                                                          targets require ordered low/high bounds.
                                                          Pace is seconds/km for running/walking,
                                                          seconds/500m for rowing, seconds/100m
                                                          for swimming. Percentages are percent
                                                          values; HR is bpm, power is watts, RPE
                                                          is 1–10. Numeric strings with dot or
                                                          comma decimals are accepted.
                                                        properties:
                                                          kind:
                                                            type: string
                                                            enum:
                                                              - paceZone
                                                              - pacePct
                                                              - pace
                                                              - hrZone
                                                              - hrPct
                                                              - hr
                                                              - powerZone
                                                              - powerPct
                                                              - power
                                                              - rpe
                                                          zone:
                                                            type: string
                                                            enum:
                                                              - E
                                                              - T
                                                              - I
                                                              - R
                                                              - RP
                                                              - Z1
                                                              - Z2
                                                              - Z3
                                                              - Z4
                                                              - Z5
                                                              - Z6
                                                              - Z7
                                                              - easy
                                                              - endurance
                                                              - threshold
                                                              - speed
                                                            description: >-
                                                              Run pace: E (easy), T (threshold), I
                                                              (interval), R (repetition), RP (race
                                                              pace = goal time / goal distance, never
                                                              derived from T). Running has no HR
                                                              zones; HR bands are absolute bpm from
                                                              athlete data. Walking/rowing pace and
                                                              five-zone HR: Z1–Z5. Bike/row power:
                                                              Z1–Z7. Swimming pace: easy, endurance,
                                                              threshold, speed.
                                                          basis:
                                                            type: string
                                                            enum:
                                                              - lthr
                                                              - maxHr
                                                            description: HR zone/percentage targets only.
                                                          low:
                                                            type: number
                                                            minimum: 0
                                                          high:
                                                            type: number
                                                            minimum: 0
                                                      secondaryTarget:
                                                        type: object
                                                        additionalProperties: false
                                                        required:
                                                          - kind
                                                        description: >-
                                                          Allowed kinds and zones depend on the
                                                          sport. Zone targets require zone; other
                                                          targets require ordered low/high bounds.
                                                          Pace is seconds/km for running/walking,
                                                          seconds/500m for rowing, seconds/100m
                                                          for swimming. Percentages are percent
                                                          values; HR is bpm, power is watts, RPE
                                                          is 1–10. Numeric strings with dot or
                                                          comma decimals are accepted.
                                                        properties:
                                                          kind:
                                                            type: string
                                                            enum:
                                                              - paceZone
                                                              - pacePct
                                                              - pace
                                                              - hrZone
                                                              - hrPct
                                                              - hr
                                                              - powerZone
                                                              - powerPct
                                                              - power
                                                              - rpe
                                                          zone:
                                                            type: string
                                                            enum:
                                                              - E
                                                              - T
                                                              - I
                                                              - R
                                                              - RP
                                                              - Z1
                                                              - Z2
                                                              - Z3
                                                              - Z4
                                                              - Z5
                                                              - Z6
                                                              - Z7
                                                              - easy
                                                              - endurance
                                                              - threshold
                                                              - speed
                                                            description: >-
                                                              Run pace: E (easy), T (threshold), I
                                                              (interval), R (repetition), RP (race
                                                              pace = goal time / goal distance, never
                                                              derived from T). Running has no HR
                                                              zones; HR bands are absolute bpm from
                                                              athlete data. Walking/rowing pace and
                                                              five-zone HR: Z1–Z5. Bike/row power:
                                                              Z1–Z7. Swimming pace: easy, endurance,
                                                              threshold, speed.
                                                          basis:
                                                            type: string
                                                            enum:
                                                              - lthr
                                                              - maxHr
                                                            description: HR zone/percentage targets only.
                                                          low:
                                                            type: number
                                                            minimum: 0
                                                          high:
                                                            type: number
                                                            minimum: 0
                                                      notes:
                                                        type: string
                                                        default: ''
                                                      stroke:
                                                        type: string
                                                        enum:
                                                          - free
                                                          - back
                                                          - breast
                                                          - fly
                                                          - im
                                                          - choice
                                                          - kick
                                                          - drill
                                                        description: Swimming only.
                                                      equipment:
                                                        type: array
                                                        items:
                                                          type: string
                                                          enum:
                                                            - pullBuoy
                                                            - paddles
                                                            - fins
                                                            - kickboard
                                                            - snorkel
                                                        description: Swimming only.
                                                      restMode:
                                                        type: string
                                                        enum:
                                                          - rest
                                                          - sendOff
                                                        description: >-
                                                          Swimming only. sendOff requires
                                                          sendOffSec.
                                                      sendOffSec:
                                                        type: number
                                                        minimum: 1
                                                        description: Swimming sendOff only.
                                                      cadence:
                                                        type: object
                                                        additionalProperties: false
                                                        required:
                                                          - low
                                                          - high
                                                        properties:
                                                          low:
                                                            type: number
                                                            minimum: 0
                                                          high:
                                                            type: number
                                                            minimum: 0
                                                  default: []
                                            default: []
                                          sourceTemplateId:
                                            type:
                                              - string
                                              - 'null'
                                            example: null
                                      targetDistanceMeters:
                                        type:
                                          - number
                                          - 'null'
                                        minimum: 0
                                        example: 5000
                                        description: >-
                                          Planned distance in meters; null when no
                                          target is set.
                                discriminator:
                                  propertyName: type
                                  mapping:
                                    workout: >-
                                      #/components/schemas/WorkoutProgrammeCalendarWorkoutItem
                                    activity: >-
                                      #/components/schemas/WorkoutProgrammeCalendarActivityItem
        weeks:
          type: array
          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
    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
    PublicWorkoutSourceWorkoutProgrammeCalendarWeek:
      type: object
      required:
        - weekNumber
        - days
      properties:
        weekNumber:
          type: integer
          minimum: 1
          example: 1
        days:
          type: array
          items:
            $ref: >-
              #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarDay
    PublicApiWriteMeta:
      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'
        idempotency:
          type: object
          additionalProperties: false
          properties:
            replayed:
              type: boolean
              description: >-
                True when the response was replayed from a previous request with
                the same `Idempotency-Key`.
              example: true
    PublicApiMeta:
      type: object
      additionalProperties: false
      required:
        - requestId
      properties:
        requestId:
          type: string
          description: Stable request correlation id. Mirrors `X-Request-Id` when supplied.
          example: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
        rateLimit:
          $ref: '#/components/schemas/PublicApiRateLimitMeta'
    StandardResponse:
      type: object
      properties:
        status:
          type: integer
          example: 200
        error:
          type: boolean
          example: false
        message:
          type: string
          example: SUCCESS
      required:
        - status
        - error
        - message
    PublicWorkoutSourceWorkoutProgrammeCalendarDay:
      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:
            $ref: >-
              #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarItem
    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
    PublicWorkoutSourceWorkoutProgrammeCalendarItem:
      oneOf:
        - $ref: >-
            #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarWorkoutItem
        - $ref: >-
            #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarActivityItem
      discriminator:
        propertyName: type
        mapping:
          workout: '#/components/schemas/WorkoutProgrammeCalendarWorkoutItem'
          activity: '#/components/schemas/WorkoutProgrammeCalendarActivityItem'
    PublicWorkoutSourceWorkoutProgrammeCalendarWorkoutItem:
      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
    PublicWorkoutSourceWorkoutProgrammeCalendarActivityItem:
      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:
          $ref: '#/components/schemas/PublicWorkoutSourceWorkoutLocalizedTextArray'
        description:
          type: array
          items:
            $ref: '#/components/schemas/PublicWorkoutSourceWorkoutLocalizedTextEntry'
        cardio:
          $ref: '#/components/schemas/PublicWorkoutSourceProgrammeScheduleItemCardio'
        targetDistanceMeters:
          type:
            - number
            - 'null'
          minimum: 0
          example: 5000
          description: Planned distance in meters; null when no target is set.
    PublicWorkoutSourceWorkoutLocalizedTextArray:
      type: array
      minItems: 1
      items:
        $ref: '#/components/schemas/PublicWorkoutSourceWorkoutLocalizedTextEntry'
      example:
        - lang: en
          value: Full Body Strength
        - lang: nl
          value: Full Body Kracht
    PublicWorkoutSourceWorkoutLocalizedTextEntry:
      type: object
      required:
        - lang
        - value
      properties:
        lang:
          type: string
          enum:
            - en
            - nl
            - fr
            - de
            - es
          example: en
        value:
          type: string
          example: Full Body Strength
    PublicWorkoutSourceProgrammeScheduleItemCardio:
      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:
            $ref: '#/components/schemas/PublicWorkoutSourceCardioBlock'
          default: []
        sourceTemplateId:
          type:
            - string
            - 'null'
          example: null
    PublicWorkoutSourceCardioBlock:
      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:
            $ref: '#/components/schemas/PublicWorkoutSourceCardioStep'
          default: []
    PublicWorkoutSourceCardioStep:
      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:
          $ref: '#/components/schemas/PublicWorkoutSourceCardioTarget'
          description: >-
            Binding target. When the session has a controlMode, its kind must
            match it (pace: paceZone/pacePct/pace; hr: hrZone/hrPct/hr).
        secondaryTarget:
          $ref: '#/components/schemas/PublicWorkoutSourceCardioTarget'
          description: >-
            Informational guidance only, never a second hard limit. With a
            controlMode it must use the other signal and requires target.
        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:
          $ref: '#/components/schemas/PublicWorkoutSourceCardioCadence'
          description: Cycling rpm or rowing strokes/minute only.
    PublicWorkoutSourceCardioTarget:
      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
    PublicWorkoutSourceCardioCadence:
      type: object
      additionalProperties: false
      required:
        - low
        - high
      properties:
        low:
          type: number
          minimum: 0
        high:
          type: number
          minimum: 0
  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.