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

# List company templates eligible to assign to a client

> Returns active company Template plans that can be assigned to a specific client. Templates are **excluded** when the client already has an Active assignment for that template (i.e. at least one non-archived/non-deleted moment has no exact completed session). Templates are **included** when not yet assigned, or when every active moment in a prior multi-week/calendar assignment has an all-time non-deleted completed session. Recurring sequence assignments stay active and do not require reassignment to train again. Supports search and pagination.

Requires the workout_plans:read scope. This operation maps to /app/v1/workout/plans/workouts-to-assign and retains its Workout V2 permission, feature-flag, and resource-scope checks.

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



## OpenAPI

````yaml /openapi/public-v1.json get /public/v1/workout/plans/workouts-to-assign
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/workouts-to-assign:
    get:
      tags:
        - Workout
      summary: List company templates eligible to assign to a client
      description: >-
        Returns active company Template plans that can be assigned to a specific
        client. Templates are **excluded** when the client already has an Active
        assignment for that template (i.e. at least one non-archived/non-deleted
        moment has no exact completed session). Templates are **included** when
        not yet assigned, or when every active moment in a prior
        multi-week/calendar assignment has an all-time non-deleted completed
        session. Recurring sequence assignments stay active and do not require
        reassignment to train again. Supports search and pagination.


        Requires the workout_plans:read scope. This operation maps to
        /app/v1/workout/plans/workouts-to-assign 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: publicWorkoutgetPublicV1WorkoutPlansWorkoutsToAssign
      parameters:
        - in: query
          name: clientId
          schema:
            type: string
            example: 67f1234567890abcdef1234
          required: false
          description: >-
            Client id. Required when the caller is a coach; inferred from token
            when the caller is a client.
        - in: query
          name: page
          schema:
            type: integer
            minimum: 1
            example: 1
        - in: query
          name: limit
          schema:
            type: integer
            minimum: 1
            maximum: 100
            example: 20
        - in: query
          name: search
          schema:
            type: string
          description: Case-insensitive search on plan name.
      responses:
        '200':
          description: >-
            Paginated list of assignable template plans with exercise count and
            estimated duration.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceGETAppV1WorkoutPlansWorkoutsToAssignResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      plans:
                        - _id: 67f1234567890abcdef1234
                          name: Core Conditioning B
                          thumbnail: https://cdn.example.com/plan.jpg
                          difficulty: Beginner
                          intensity: Medium
                          category: Strength
                          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
                          requiresProgrammeCalendarFeature: true
                          exerciseCount: 5
                          estimatedDurationMinutes: 30
                      pagination:
                        page: 1
                        limit: 20
                        totalItems: 8
                        totalPages: 1
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '400':
          description: >-
            Company context missing (`COMPANY_ID_REQUIRED`), invalid or missing
            client id (`INVALID_CLIENT_ID`), or invalid pagination.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                invalidRequest:
                  summary: Invalid request
                  value:
                    error:
                      code: 400
                      key: request.invalid
                      message: The request is invalid.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '401':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                missingBearer:
                  summary: Missing Bearer token
                  value:
                    error:
                      code: 401
                      key: auth.missing_bearer
                      message: Authorization Bearer token is required.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidToken:
                  summary: Invalid or expired token
                  value:
                    error:
                      code: 401
                      key: auth.invalid_token
                      message: The access token is invalid or expired.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                invalidClient:
                  summary: Inactive or revoked client
                  value:
                    error:
                      code: 401
                      key: auth.invalid_client
                      message: The Public API client is inactive or revoked.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '403':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                insufficientScopes:
                  summary: Missing required scope
                  value:
                    error:
                      code: 403
                      key: scopes.insufficient
                      message: The access token does not include the required scope.
                      details:
                        requiredScopes:
                          - required:scope
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '404':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                notFound:
                  summary: Resource not found
                  value:
                    error:
                      code: 404
                      key: resource.not_found
                      message: The requested Public API resource was not found.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '409':
          $ref: '#/components/schemas/ErrorResponse'
        '422':
          $ref: '#/components/schemas/ErrorResponse'
        '429':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                rateLimitExceeded:
                  summary: Rate limit exceeded
                  value:
                    error:
                      code: 429
                      key: rate_limit.exceeded
                      message: Too many Public API requests. Retry later.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 0
                        resetSeconds: 1
                        retryAfterSeconds: 1
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                serverInternalError:
                  summary: Unexpected server error
                  value:
                    error:
                      code: 500
                      key: server.internal_error
                      message: An unexpected Public API server error occurred.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
      security:
        - PublicBearerAuth: []
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: >-
            curl -X GET
            "https://api.fitsociety.io/public/v1/workout/plans/workouts-to-assign"
            \
              -H "Authorization: Bearer <access_token>"
components:
  schemas:
    PublicApiSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiMeta'
    PublicWorkoutSourceGETAppV1WorkoutPlansWorkoutsToAssignResponse200:
      type: object
      properties:
        plans:
          type: array
          items:
            type: object
            properties:
              _id:
                type: string
                example: 67f1234567890abcdef1234
              name:
                type: string
                example: Core Conditioning B
              thumbnail:
                type: string
                example: https://cdn.example.com/plan.jpg
              difficulty:
                type: string
                example: Beginner
              intensity:
                type: string
                example: Medium
              category:
                type: string
                example: Strength
              schedule:
                type: object
                additionalProperties: false
                required:
                  - mode
                  - releasePolicy
                  - startDate
                properties:
                  mode:
                    type: string
                    enum:
                      - recurring
                      - multi_week
                    example: multi_week
                  releasePolicy:
                    type: string
                    enum:
                      - all_at_once
                      - weekly_from_start
                    example: weekly_from_start
                  startDate:
                    oneOf:
                      - type: string
                        format: date
                        pattern: ^\d{4}-\d{2}-\d{2}$
                        example: '2026-09-08'
                      - type: string
                        enum:
                          - ''
                        example: ''
                    description: >-
                      Blank for templates and legacy sequence recurring
                      schedules. Assigned recurring calendar_week schedules
                      require the canonical company-local Monday anchor.
                      Assigned multi-week schedules accept any canonical date;
                      for calendar_week, week 1 is the Monday-Sunday week
                      containing it and days before it are not scheduled
                      (`isBeforeStart`).
                  layout:
                    type: string
                    enum:
                      - sequence
                      - calendar_week
                    example: calendar_week
                  weeks:
                    type: array
                    items:
                      type: object
                      required:
                        - weekNumber
                        - days
                      properties:
                        weekNumber:
                          type: integer
                          minimum: 1
                          example: 1
                        days:
                          type: array
                          items:
                            type: object
                            required:
                              - weekday
                              - isRestDay
                              - items
                            properties:
                              weekday:
                                type: integer
                                minimum: 1
                                maximum: 7
                                example: 1
                                description: >-
                                  ISO weekday number: 1 is Monday and 7 is
                                  Sunday.
                              isRestDay:
                                type: boolean
                                example: false
                              items:
                                type: array
                                items:
                                  oneOf:
                                    - type: object
                                      additionalProperties: false
                                      required:
                                        - type
                                        - order
                                        - planMomentId
                                      properties:
                                        _id:
                                          type: string
                                          example: 67f1234567890abcdef1234
                                        order:
                                          type: integer
                                          minimum: 1
                                          example: 1
                                        startTime:
                                          type: string
                                          pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                          example: '08:30'
                                        plannedDurationMinutes:
                                          type:
                                            - number
                                            - 'null'
                                          minimum: 0
                                          example: 45
                                          description: >-
                                            Planned duration in minutes; null when
                                            no target is set.
                                        status:
                                          type:
                                            - string
                                            - 'null'
                                          enum:
                                            - in_progress
                                            - completed
                                            - overdue
                                            - today
                                            - upcoming
                                            - null
                                          readOnly: true
                                          example: today
                                          description: >-
                                            Occurrence presentation status. Template
                                            items use null; cancelled occurrences
                                            fall back to overdue, today, or
                                            upcoming.
                                        plannedDate:
                                          oneOf:
                                            - type: string
                                              format: date
                                              pattern: ^\d{4}-\d{2}-\d{2}$
                                              example: '2026-09-08'
                                            - type: string
                                              enum:
                                                - ''
                                              example: ''
                                          readOnly: true
                                          description: >-
                                            Original authored occurrence date for a
                                            calendar response item.
                                        scheduledDate:
                                          oneOf:
                                            - type: string
                                              format: date
                                              pattern: ^\d{4}-\d{2}-\d{2}$
                                              example: '2026-09-08'
                                            - type: string
                                              enum:
                                                - ''
                                              example: ''
                                          readOnly: true
                                          description: >-
                                            Effective calendar date after a client
                                            move; otherwise plannedDate.
                                        source:
                                          type: string
                                          enum:
                                            - programme
                                          readOnly: true
                                        clientAdjustment:
                                          oneOf:
                                            - type: object
                                              required:
                                                - action
                                                - occurrenceDate
                                                - scheduledDate
                                                - changedAt
                                              properties:
                                                action:
                                                  type: string
                                                  enum:
                                                    - moved
                                                    - skipped
                                                occurrenceDate:
                                                  type: string
                                                  format: date
                                                  pattern: ^\d{4}-\d{2}-\d{2}$
                                                  example: '2026-09-08'
                                                scheduledDate:
                                                  oneOf:
                                                    - type: string
                                                      format: date
                                                      pattern: ^\d{4}-\d{2}-\d{2}$
                                                      example: '2026-09-08'
                                                    - type: string
                                                      enum:
                                                        - ''
                                                      example: ''
                                                changedAt:
                                                  type:
                                                    - string
                                                    - 'null'
                                                  format: date-time
                                                  example: null
                                            - type: 'null'
                                          readOnly: true
                                        canClientRestore:
                                          type: boolean
                                          readOnly: true
                                        type:
                                          type: string
                                          enum:
                                            - workout
                                          example: workout
                                        planMomentId:
                                          type: string
                                          example: 67f1234567890abcdef1234
                                    - type: object
                                      additionalProperties: false
                                      required:
                                        - type
                                        - order
                                        - activityType
                                        - name
                                      properties:
                                        _id:
                                          type: string
                                          example: 67f1234567890abcdef1234
                                        order:
                                          type: integer
                                          minimum: 1
                                          example: 1
                                        startTime:
                                          type: string
                                          pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
                                          example: '08:30'
                                        plannedDurationMinutes:
                                          type:
                                            - number
                                            - 'null'
                                          minimum: 0
                                          example: 45
                                          description: >-
                                            Planned duration in minutes; null when
                                            no target is set.
                                        status:
                                          type:
                                            - string
                                            - 'null'
                                          enum:
                                            - in_progress
                                            - completed
                                            - overdue
                                            - today
                                            - upcoming
                                            - null
                                          readOnly: true
                                          example: today
                                          description: >-
                                            Occurrence presentation status. Template
                                            items use null; cancelled occurrences
                                            fall back to overdue, today, or
                                            upcoming.
                                        plannedDate:
                                          oneOf:
                                            - type: string
                                              format: date
                                              pattern: ^\d{4}-\d{2}-\d{2}$
                                              example: '2026-09-08'
                                            - type: string
                                              enum:
                                                - ''
                                              example: ''
                                          readOnly: true
                                          description: >-
                                            Original authored occurrence date for a
                                            calendar response item.
                                        scheduledDate:
                                          oneOf:
                                            - type: string
                                              format: date
                                              pattern: ^\d{4}-\d{2}-\d{2}$
                                              example: '2026-09-08'
                                            - type: string
                                              enum:
                                                - ''
                                              example: ''
                                          readOnly: true
                                          description: >-
                                            Effective calendar date after a client
                                            move; otherwise plannedDate.
                                        source:
                                          type: string
                                          enum:
                                            - programme
                                          readOnly: true
                                        clientAdjustment:
                                          oneOf:
                                            - type: object
                                              required:
                                                - action
                                                - occurrenceDate
                                                - scheduledDate
                                                - changedAt
                                              properties:
                                                action:
                                                  type: string
                                                  enum:
                                                    - moved
                                                    - skipped
                                                occurrenceDate:
                                                  type: string
                                                  format: date
                                                  pattern: ^\d{4}-\d{2}-\d{2}$
                                                  example: '2026-09-08'
                                                scheduledDate:
                                                  oneOf:
                                                    - type: string
                                                      format: date
                                                      pattern: ^\d{4}-\d{2}-\d{2}$
                                                      example: '2026-09-08'
                                                    - type: string
                                                      enum:
                                                        - ''
                                                      example: ''
                                                changedAt:
                                                  type:
                                                    - string
                                                    - 'null'
                                                  format: date-time
                                                  example: null
                                            - type: 'null'
                                          readOnly: true
                                        canClientRestore:
                                          type: boolean
                                          readOnly: true
                                        type:
                                          type: string
                                          enum:
                                            - activity
                                          example: activity
                                        activityType:
                                          type: string
                                          enum:
                                            - running
                                            - cycling
                                            - walking
                                            - swimming
                                            - rowing
                                            - padel
                                            - mobility
                                            - other
                                          example: running
                                        name:
                                          type: array
                                          minItems: 1
                                          items:
                                            type: object
                                            required:
                                              - lang
                                              - value
                                            properties:
                                              lang:
                                                type: string
                                                enum:
                                                  - en
                                                  - nl
                                                  - fr
                                                  - de
                                                  - es
                                                example: en
                                              value:
                                                type: string
                                                example: Full Body Strength
                                          example:
                                            - lang: en
                                              value: Full Body Strength
                                            - lang: nl
                                              value: Full Body Kracht
                                        description:
                                          type: array
                                          items:
                                            type: object
                                            required:
                                              - lang
                                              - value
                                            properties:
                                              lang:
                                                type: string
                                                enum:
                                                  - en
                                                  - nl
                                                  - fr
                                                  - de
                                                  - es
                                                example: en
                                              value:
                                                type: string
                                                example: Full Body Strength
                                        cardio:
                                          type: object
                                          additionalProperties: false
                                          description: >-
                                            Optional structured activity
                                            prescription. Requires workoutsectionv2
                                            + workoutV2ProgrammeCalendar +
                                            workoutV2CardioBuilder. Omitted from
                                            disabled reads. Supported sports:
                                            running (paceZone E/T/I/R/RP, absolute
                                            pace, absolute HR, RPE), walking (pace,
                                            HR, RPE), cycling (power, HR, RPE),
                                            rowing (pace, power, HR, RPE), swimming
                                            (pace, RPE). Rejected for workout,
                                            padel, mobility and other items. Totals
                                            overwrite planned duration/distance;
                                            unknown time or distance contributes
                                            zero.
                                          properties:
                                            slotKey:
                                              type: string
                                              description: >-
                                                Generated when missing; retain across
                                                edits, copies and weeks.
                                            sessionType:
                                              type: string
                                              enum:
                                                - easy
                                                - zone2
                                                - long_run
                                                - threshold_continuous
                                                - threshold_reps
                                                - interval
                                                - race_pace
                                                - time_trial
                                                - race
                                              description: >-
                                                Running only. Template session codes:
                                                threshold_continuous = drempel_c,
                                                threshold_reps = drempel_r, interval,
                                                race_pace = doeltempo, zone2. A typed
                                                session with empty blocks is a skeleton
                                                to be filled later.
                                            controlMode:
                                              type: string
                                              enum:
                                                - pace
                                                - hr
                                              description: >-
                                                Binding signal. Defaults from
                                                sessionType: hr for easy, zone2 and
                                                long_run; pace for threshold_continuous,
                                                threshold_reps, interval and race_pace;
                                                none for time_trial and race. A
                                                contradicting value is rejected.
                                            ladderStep:
                                              type: integer
                                              minimum: 1
                                              description: >-
                                                Ladder position: interval 1–8,
                                                threshold_reps 1–7, threshold_continuous
                                                1–5 (15/18/20/22/25 min). Rejected for
                                                other session types.
                                            poolLengthM:
                                              type: number
                                              enum:
                                                - 25
                                                - 50
                                              description: Swimming only.
                                            blocks:
                                              type: array
                                              maxItems: 10
                                              items:
                                                type: object
                                                additionalProperties: false
                                                properties:
                                                  _id:
                                                    type: string
                                                    example: 67f1234567890abcdef1234
                                                  repeat:
                                                    type: integer
                                                    minimum: 1
                                                    maximum: 50
                                                    default: 1
                                                  steps:
                                                    type: array
                                                    maxItems: 20
                                                    items:
                                                      type: object
                                                      additionalProperties: false
                                                      required:
                                                        - kind
                                                        - durationType
                                                      properties:
                                                        _id:
                                                          type: string
                                                          example: 67f1234567890abcdef1234
                                                        kind:
                                                          type: string
                                                          enum:
                                                            - warmup
                                                            - work
                                                            - recovery
                                                            - rest
                                                            - cooldown
                                                        durationType:
                                                          type: string
                                                          enum:
                                                            - time
                                                            - distance
                                                            - open
                                                        durationValue:
                                                          type:
                                                            - number
                                                            - 'null'
                                                          minimum: 0
                                                          default: null
                                                          description: >-
                                                            Required seconds for time or metres for
                                                            distance; null/omitted for open.
                                                        target:
                                                          type: object
                                                          additionalProperties: false
                                                          required:
                                                            - kind
                                                          description: >-
                                                            Allowed kinds and zones depend on the
                                                            sport. Zone targets require zone; other
                                                            targets require ordered low/high bounds.
                                                            Pace is seconds/km for running/walking,
                                                            seconds/500m for rowing, seconds/100m
                                                            for swimming. Percentages are percent
                                                            values; HR is bpm, power is watts, RPE
                                                            is 1–10. Numeric strings with dot or
                                                            comma decimals are accepted.
                                                          properties:
                                                            kind:
                                                              type: string
                                                              enum:
                                                                - paceZone
                                                                - pacePct
                                                                - pace
                                                                - hrZone
                                                                - hrPct
                                                                - hr
                                                                - powerZone
                                                                - powerPct
                                                                - power
                                                                - rpe
                                                            zone:
                                                              type: string
                                                              enum:
                                                                - E
                                                                - T
                                                                - I
                                                                - R
                                                                - RP
                                                                - Z1
                                                                - Z2
                                                                - Z3
                                                                - Z4
                                                                - Z5
                                                                - Z6
                                                                - Z7
                                                                - easy
                                                                - endurance
                                                                - threshold
                                                                - speed
                                                              description: >-
                                                                Run pace: E (easy), T (threshold), I
                                                                (interval), R (repetition), RP (race
                                                                pace = goal time / goal distance, never
                                                                derived from T). Running has no HR
                                                                zones; HR bands are absolute bpm from
                                                                athlete data. Walking/rowing pace and
                                                                five-zone HR: Z1–Z5. Bike/row power:
                                                                Z1–Z7. Swimming pace: easy, endurance,
                                                                threshold, speed.
                                                            basis:
                                                              type: string
                                                              enum:
                                                                - lthr
                                                                - maxHr
                                                              description: HR zone/percentage targets only.
                                                            low:
                                                              type: number
                                                              minimum: 0
                                                            high:
                                                              type: number
                                                              minimum: 0
                                                        secondaryTarget:
                                                          type: object
                                                          additionalProperties: false
                                                          required:
                                                            - kind
                                                          description: >-
                                                            Allowed kinds and zones depend on the
                                                            sport. Zone targets require zone; other
                                                            targets require ordered low/high bounds.
                                                            Pace is seconds/km for running/walking,
                                                            seconds/500m for rowing, seconds/100m
                                                            for swimming. Percentages are percent
                                                            values; HR is bpm, power is watts, RPE
                                                            is 1–10. Numeric strings with dot or
                                                            comma decimals are accepted.
                                                          properties:
                                                            kind:
                                                              type: string
                                                              enum:
                                                                - paceZone
                                                                - pacePct
                                                                - pace
                                                                - hrZone
                                                                - hrPct
                                                                - hr
                                                                - powerZone
                                                                - powerPct
                                                                - power
                                                                - rpe
                                                            zone:
                                                              type: string
                                                              enum:
                                                                - E
                                                                - T
                                                                - I
                                                                - R
                                                                - RP
                                                                - Z1
                                                                - Z2
                                                                - Z3
                                                                - Z4
                                                                - Z5
                                                                - Z6
                                                                - Z7
                                                                - easy
                                                                - endurance
                                                                - threshold
                                                                - speed
                                                              description: >-
                                                                Run pace: E (easy), T (threshold), I
                                                                (interval), R (repetition), RP (race
                                                                pace = goal time / goal distance, never
                                                                derived from T). Running has no HR
                                                                zones; HR bands are absolute bpm from
                                                                athlete data. Walking/rowing pace and
                                                                five-zone HR: Z1–Z5. Bike/row power:
                                                                Z1–Z7. Swimming pace: easy, endurance,
                                                                threshold, speed.
                                                            basis:
                                                              type: string
                                                              enum:
                                                                - lthr
                                                                - maxHr
                                                              description: HR zone/percentage targets only.
                                                            low:
                                                              type: number
                                                              minimum: 0
                                                            high:
                                                              type: number
                                                              minimum: 0
                                                        notes:
                                                          type: string
                                                          default: ''
                                                        stroke:
                                                          type: string
                                                          enum:
                                                            - free
                                                            - back
                                                            - breast
                                                            - fly
                                                            - im
                                                            - choice
                                                            - kick
                                                            - drill
                                                          description: Swimming only.
                                                        equipment:
                                                          type: array
                                                          items:
                                                            type: string
                                                            enum:
                                                              - pullBuoy
                                                              - paddles
                                                              - fins
                                                              - kickboard
                                                              - snorkel
                                                          description: Swimming only.
                                                        restMode:
                                                          type: string
                                                          enum:
                                                            - rest
                                                            - sendOff
                                                          description: >-
                                                            Swimming only. sendOff requires
                                                            sendOffSec.
                                                        sendOffSec:
                                                          type: number
                                                          minimum: 1
                                                          description: Swimming sendOff only.
                                                        cadence:
                                                          type: object
                                                          additionalProperties: false
                                                          required:
                                                            - low
                                                            - high
                                                          properties:
                                                            low:
                                                              type: number
                                                              minimum: 0
                                                            high:
                                                              type: number
                                                              minimum: 0
                                                    default: []
                                              default: []
                                            sourceTemplateId:
                                              type:
                                                - string
                                                - 'null'
                                              example: null
                                        targetDistanceMeters:
                                          type:
                                            - number
                                            - 'null'
                                          minimum: 0
                                          example: 5000
                                          description: >-
                                            Planned distance in meters; null when no
                                            target is set.
                                  discriminator:
                                    propertyName: type
                                    mapping:
                                      workout: >-
                                        #/components/schemas/WorkoutProgrammeCalendarWorkoutItem
                                      activity: >-
                                        #/components/schemas/WorkoutProgrammeCalendarActivityItem
              requiresProgrammeCalendarFeature:
                type: boolean
                example: true
                description: >-
                  `true` for `calendar_week`, `multi_week`, or legacy later-week
                  content (`weekNumber > 1`); `false` for ordinary sequence
                  plans. Clients use this capability to gate programme-calendar
                  UI and actions.
              exerciseCount:
                type: integer
                example: 5
                description: Total non-deleted exercises across all plan moments.
              estimatedDurationMinutes:
                type: integer
                example: 30
                description: Rough estimate based on sets, per-set time, and rest periods.
        pagination:
          type: object
          properties:
            page:
              type: integer
              example: 1
            limit:
              type: integer
              example: 20
            totalItems:
              type: integer
              example: 8
            totalPages:
              type: integer
              example: 1
    PublicApiError:
      type: object
      additionalProperties: false
      required:
        - error
        - meta
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - code
            - key
            - message
          properties:
            code:
              type: integer
              example: 401
            key:
              type: string
              example: auth.invalid_token
            message:
              type: string
              example: The access token is invalid.
            details:
              type: object
              additionalProperties: true
        meta:
          $ref: '#/components/schemas/PublicApiMeta'
    ErrorResponse:
      allOf:
        - $ref: '#/components/schemas/StandardResponse'
        - example:
            status: 401
            error: true
            message: MISSING_AUTH
    PublicApiMeta:
      type: object
      additionalProperties: false
      required:
        - requestId
      properties:
        requestId:
          type: string
          description: Stable request correlation id. Mirrors `X-Request-Id` when supplied.
          example: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
        rateLimit:
          $ref: '#/components/schemas/PublicApiRateLimitMeta'
    StandardResponse:
      type: object
      properties:
        status:
          type: integer
          example: 200
        error:
          type: boolean
          example: false
        message:
          type: string
          example: SUCCESS
      required:
        - status
        - error
        - message
    PublicApiRateLimitMeta:
      type: object
      additionalProperties: false
      properties:
        limit:
          type: integer
          example: 10
        remaining:
          type: integer
          example: 9
        resetSeconds:
          type: integer
          description: Seconds until the current rate limit window resets.
          example: 1
        retryAfterSeconds:
          type: integer
          description: Present when the request was rate limited.
          example: 1
  securitySchemes:
    PublicBearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Opaque
      description: >-
        Public API access token issued by `/public/v1/oauth/token`. Example:
        `Authorization: Bearer fspt_...`. Each resource request rechecks the
        token company's current provider access. Disabling access blocks
        existing tokens with `403 auth.provider_unavailable`.

````

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