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

# Create a workout plan assigned to one client

> Creates an assigned plan directly for the target client without a library template. The server sets templateType=Assigned, clientId from the path and sourceTemplateId=null. Client tokens can create only for themselves. Accepts application/json or multipart/form-data; send structured multipart fields as JSON strings. Description is optional. Supply visibility and either valid defaultExerciseValues or useDefaultExerciseSettings=false. The response planId is used to add days with POST /app/v1/workout/plans/moments/{planId}, then add exercises with POST /app/v1/workout/plans/moments/exercises/{planId}/{planMomentId}. Per-set prescriptions, rest and tempo belong to those exercise requests; supersets use the separate plan-moment superset operations. This request does not create nested workout days or exercises. Coaches must supply scheduleStartDate or schedule.startDate for multi_week or calendar_week schedules. A recurring calendar_week start must be a company-local Monday. Create workout days first, then reference their returned IDs with PUT /app/v1/workout/plans/{planId}/calendar-schedule. Calendar-week definitions cannot reference days that do not yet exist. Programme calendar features remain gated by company settings.

Requires the workout_plans:write scope. This operation maps to /app/v1/workout/plans/create-and-assign/:clientId 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 post /public/v1/workout/plans/create-and-assign/{clientId}
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/create-and-assign/{clientId}:
    post:
      tags:
        - Workout
      summary: Create a workout plan assigned to one client
      description: >-
        Creates an assigned plan directly for the target client without a
        library template. The server sets templateType=Assigned, clientId from
        the path and sourceTemplateId=null. Client tokens can create only for
        themselves. Accepts application/json or multipart/form-data; send
        structured multipart fields as JSON strings. Description is optional.
        Supply visibility and either valid defaultExerciseValues or
        useDefaultExerciseSettings=false. The response planId is used to add
        days with POST /app/v1/workout/plans/moments/{planId}, then add
        exercises with POST
        /app/v1/workout/plans/moments/exercises/{planId}/{planMomentId}. Per-set
        prescriptions, rest and tempo belong to those exercise requests;
        supersets use the separate plan-moment superset operations. This request
        does not create nested workout days or exercises. Coaches must supply
        scheduleStartDate or schedule.startDate for multi_week or calendar_week
        schedules. A recurring calendar_week start must be a company-local
        Monday. Create workout days first, then reference their returned IDs
        with PUT /app/v1/workout/plans/{planId}/calendar-schedule. Calendar-week
        definitions cannot reference days that do not yet exist. Programme
        calendar features remain gated by company settings.


        Requires the workout_plans:write scope. This operation maps to
        /app/v1/workout/plans/create-and-assign/:clientId 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: publicWorkoutpostPublicV1WorkoutPlansCreateAndAssignClientId
      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: clientId
          required: true
          description: Client receiving the assigned plan.
          schema:
            type: string
            example: 67f1234567890abcdef1234
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/PublicWorkoutSourcePOSTAppV1WorkoutPlansCreateAndAssignClientIdRequest
            example:
              name:
                - lang: en
                  value: Strength programme
              description:
                - lang: en
                  value: Progressive strength training.
              category: Strength
              visibility: Company
              schedule:
                mode: recurring
                releasePolicy: all_at_once
                startDate: ''
              useDefaultExerciseSettings: true
              defaultExerciseValues:
                sets: 3
                reps: 8-12
                rest: 90
                weight: 0
                repTempo: '3010'
                duration: 0
          multipart/form-data:
            schema:
              type: object
              required:
                - name
                - visibility
              properties:
                name:
                  type: string
                  description: Multipart JSON string for `WorkoutLocalizedTextArray`.
                  example: >-
                    [{"lang":"en","value":"4-Day Strength
                    Block"},{"lang":"nl","value":"4-Daags Krachtblok"}]
                description:
                  type: string
                  description: Multipart JSON string for `WorkoutLocalizedTextArray`.
                  example: >-
                    [{"lang":"en","value":"Progressive upper/lower
                    split."},{"lang":"nl","value":"Progressieve upper/lower
                    split."}]
                category:
                  type: string
                  enum:
                    - Agility & Speed
                    - Strength
                    - Hypertrophy
                    - Strength - Dynamic
                    - Strength - Explosive
                    - Strength - Static
                    - Cardio
                    - Cardio - Duration
                    - Cardio - Interval
                    - HIIT
                    - Crossfit
                    - Mobility
                    - Stretching
                    - Core
                    - Coordination & Balance
                    - Movement Prep
                    - Functional Training
                    - Recovery
                    - Sports
                    - Martial Arts
                    - Yoga
                    - Other
                    - GROUP_WORKOUT_TEMPLATE
                    - Plyometric
                    - Cycling
                    - Cardio - interval
                    - Mobilisation
                    - Stabilisation
                    - Daily Living
                    - Target zone
                    - Respiration
                    - Breathing
                    - Massage
                    - Outdoor sports
                    - Indoor sports
                    - Dance
                    - Group Lessons
                    - Martial arts
                    - Material Arts
                    - Fight skills
                    - Mind and body
                    - ''
                    - default
                  example: Strength
                goal:
                  type: string
                  enum:
                    - Weight Loss
                    - Hypertrophy
                    - Endurance
                    - Flexibility
                    - General Fitness
                    - Strength
                  example: Strength
                periodizationType:
                  type: string
                  enum:
                    - Linear
                    - Non-Linear
                    - Block
                    - Undulating
                    - None
                  example: Linear
                difficulty:
                  type: string
                  enum:
                    - Beginner
                    - Intermediate
                    - Advanced
                  example: Intermediate
                intensity:
                  type: string
                  enum:
                    - Low
                    - Medium
                    - High
                  example: High
                visibility:
                  type: string
                  enum:
                    - Everyone
                    - Company
                    - Fitsociety
                  example: Company
                status:
                  type: string
                  enum:
                    - Active
                    - Inactive
                  default: Active
                  description: Assigned plans default to Active; Draft is not supported.
                duration:
                  type: string
                  description: Multipart JSON string for `WorkoutPlanDuration`.
                  example: >-
                    {"startDate":"2026-04-15","endDate":"2026-06-15","hasEndDate":true}
                schedule:
                  type: string
                  description: >-
                    Multipart JSON string for WorkoutProgrammeTemplateSchedule.
                    An assigned multi_week or calendar_week schedule requires
                    schedule.startDate or scheduleStartDate for coach requests.
                    Add workout days before referencing their IDs in the
                    calendar-schedule update endpoint.
                  example: >-
                    {"mode":"recurring","releasePolicy":"all_at_once","startDate":""}
                useDefaultExerciseSettings:
                  type: string
                  enum:
                    - 'true'
                    - 'false'
                  example: 'true'
                  description: >-
                    Whether new exercises use plan-level defaults. Send false
                    with defaultExerciseValues set to the JSON literal null to
                    disable defaults.
                defaultExerciseValues:
                  type: string
                  description: >-
                    Multipart JSON string for `WorkoutDefaultExerciseValues`, or
                    the JSON literal null when useDefaultExerciseSettings is
                    false.
                  example: >-
                    {"sets":4,"reps":8,"rest":120,"weight":0,"repTempo":"3010","duration":0}
                images:
                  type: string
                  description: >-
                    Multipart JSON string for `WorkoutImageAsset[]`. Combine
                    with uploaded `imageFiles` when you want to attach uploaded
                    media.
                  example: >-
                    [{"url":"https://cdn.example.com/workouts/plan-cover.jpg","width":1280,"height":720}]
                videos:
                  type: string
                  description: >-
                    Multipart JSON string for `WorkoutVideoAsset[]`. Combine
                    with uploaded `videoFiles` when you want to attach uploaded
                    media.
                  example: >-
                    [{"url":"https://cdn.example.com/workouts/plan-demo.mp4","platform":"s3","videoId":"","thumbnail":"https://cdn.example.com/workouts/plan-demo-thumb.jpg","duration":95,"width":1920,"height":1080}]
                imageFiles:
                  type: array
                  items:
                    type: string
                    format: binary
                  maxItems: 5
                  description: >-
                    Preferred binary fields are `imageFiles` and `videoFiles`.
                    Legacy binary aliases `images` and `videos` remain accepted
                    by the backend for backward compatibility. Structured
                    array/object fields must be sent as JSON strings. Max 5
                    image files.
                videoFiles:
                  type: array
                  items:
                    type: string
                    format: binary
                  maxItems: 3
                  description: >-
                    Preferred binary fields are `imageFiles` and `videoFiles`.
                    Legacy binary aliases `images` and `videos` remain accepted
                    by the backend for backward compatibility. Structured
                    array/object fields must be sent as JSON strings. Max 3
                    video files.
                scheduleStartDate:
                  type: string
                  format: date
                  pattern: ^\d{4}-\d{2}-\d{2}$
                  example: '2026-09-08'
                  description: >-
                    Optional alias for schedule.startDate, taking precedence
                    when supplied. Coaches must provide a start date for
                    multi_week or calendar_week schedules. A recurring
                    calendar_week schedule requires a company-local Monday.
      responses:
        '200':
          description: Assigned plan created. Add its days and exercises using planId.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiWriteSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourcePOSTAppV1WorkoutPlansCreateAndAssignClientIdResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      planId: 67f1234567890abcdef1234
                      clientId: 67f1234567890abcdef1234
                      templateType: Assigned
                      status: Active
                      externalReference:
                        externalId: 66f7b8b1e13c8d25f4d3d90a
                        revision: 1
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                      idempotency:
                        replayed: false
        '400':
          description: >-
            Invalid client id, missing name/visibility, invalid plan defaults or
            invalid schedule/start date.
          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.
          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'
          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
        '413':
          description: One or more uploads exceeded the allowed size.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                serverInternalError:
                  summary: Unexpected server error
                  value:
                    error:
                      code: 413
                      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
        '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 POST
            'https://api.fitsociety.io/public/v1/workout/plans/create-and-assign/66f7b8b1e13c8d25f4d3d90c'
            \
              -H 'Authorization: Bearer <access_token>' \
              -H 'Idempotency-Key: public-v1-workout-plans-create-and-assign-clientId-001' \
              -H 'Content-Type: application/json' \
              -d '{"name":[{"lang":"en","value":"Strength programme"}],"description":[{"lang":"en","value":"Progressive strength training."}],"category":"Strength","visibility":"Company","schedule":{"mode":"recurring","releasePolicy":"all_at_once","startDate":""},"useDefaultExerciseSettings":true,"defaultExerciseValues":{"sets":3,"reps":"8-12","rest":90,"weight":0,"repTempo":"3010","duration":0}}'
components:
  schemas:
    PublicWorkoutSourcePOSTAppV1WorkoutPlansCreateAndAssignClientIdRequest:
      type: object
      required:
        - name
        - visibility
      properties:
        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
          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
        category:
          type: string
          enum:
            - Agility & Speed
            - Strength
            - Hypertrophy
            - Strength - Dynamic
            - Strength - Explosive
            - Strength - Static
            - Cardio
            - Cardio - Duration
            - Cardio - Interval
            - HIIT
            - Crossfit
            - Mobility
            - Stretching
            - Core
            - Coordination & Balance
            - Movement Prep
            - Functional Training
            - Recovery
            - Sports
            - Martial Arts
            - Yoga
            - Other
            - GROUP_WORKOUT_TEMPLATE
            - Plyometric
            - Cycling
            - Cardio - interval
            - Mobilisation
            - Stabilisation
            - Daily Living
            - Target zone
            - Respiration
            - Breathing
            - Massage
            - Outdoor sports
            - Indoor sports
            - Dance
            - Group Lessons
            - Martial arts
            - Material Arts
            - Fight skills
            - Mind and body
            - ''
            - default
          example: Strength
        goal:
          type: string
          enum:
            - Weight Loss
            - Hypertrophy
            - Endurance
            - Flexibility
            - General Fitness
            - Strength
          example: Strength
        periodizationType:
          type: string
          enum:
            - Linear
            - Non-Linear
            - Block
            - Undulating
            - None
          example: Linear
        difficulty:
          type: string
          enum:
            - Beginner
            - Intermediate
            - Advanced
          example: Intermediate
        intensity:
          type: string
          enum:
            - Low
            - Medium
            - High
          example: Medium
        visibility:
          type: string
          enum:
            - Everyone
            - Company
            - Fitsociety
          example: Company
        status:
          type: string
          enum:
            - Active
            - Inactive
          default: Active
          description: Assigned plans default to Active; Draft is not supported.
        duration:
          type: object
          properties:
            startDate:
              type: string
              example: '2026-04-15'
            endDate:
              type: string
              example: '2026-06-15'
            hasEndDate:
              type: boolean
              example: true
        schedule:
          type: object
          additionalProperties: false
          required:
            - mode
            - releasePolicy
          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:
                                    anyOf:
                                      - 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
                                      - type: 'null'
                                    description: >-
                                      Omit on update to preserve the stored
                                      prescription; null removes it. Writing or
                                      removing cardio requires the cardio
                                      builder feature.
                                  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
          description: >-
            Initial assigned schedule. Supply startDate here or through
            scheduleStartDate for multi_week or calendar_week. New plans have no
            workout days to reference; populate their workout calendar after
            creating the days.
        useDefaultExerciseSettings:
          type: boolean
          default: true
          description: >-
            Whether new exercises use the plan-level defaults. When false,
            defaultExerciseValues must be null.
        defaultExerciseValues:
          oneOf:
            - type: object
              required:
                - sets
                - reps
                - rest
                - repTempo
              properties:
                sets:
                  type: number
                  minimum: 1
                  example: 3
                reps:
                  oneOf:
                    - type: string
                      pattern: ^\d+(-\d+)?$
                    - type: number
                      minimum: 1
                  example: 10-12
                rest:
                  type: number
                  minimum: 0
                  example: 90
                weight:
                  type: number
                  example: 0
                repTempo:
                  type: string
                  example: '3010'
                duration:
                  type: number
                  example: 0
            - type: 'null'
        images:
          type: array
          items:
            type: object
            required:
              - url
            properties:
              url:
                type: string
                format: uri
                example: https://cdn.example.com/workouts/plan-cover.jpg
              width:
                type:
                  - number
                  - 'null'
                example: 1280
              height:
                type:
                  - number
                  - 'null'
                example: 720
        videos:
          type: array
          items:
            type: object
            required:
              - url
              - platform
            properties:
              url:
                type: string
                format: uri
                example: https://cdn.example.com/workouts/demo.mp4
              platform:
                type: string
                enum:
                  - s3
                  - youtube
                  - tiktok
                example: s3
              videoId:
                type: string
                example: ''
              thumbnail:
                type: string
                format: uri
                example: https://cdn.example.com/workouts/demo-thumb.jpg
              duration:
                type:
                  - number
                  - 'null'
                example: 84
              width:
                type:
                  - number
                  - 'null'
                example: 1920
              height:
                type:
                  - number
                  - 'null'
                example: 1080
        scheduleStartDate:
          type: string
          format: date
          pattern: ^\d{4}-\d{2}-\d{2}$
          example: '2026-09-08'
          description: >-
            Optional alias for schedule.startDate, taking precedence when
            supplied. Coaches must provide a start date for multi_week or
            calendar_week schedules. A recurring calendar_week schedule requires
            a company-local Monday.
        externalReference:
          type: string
          minLength: 1
          maxLength: 200
          pattern: ^[^\u0000-\u001F\u007F]+$
          description: >-
            Optional opaque resource reference owned by the authenticated API
            client and company. Available only for application/json creation
            without file uploads. Trimmed, nonempty and at most 200 characters;
            control characters are rejected. Repeating the reference with the
            same creation content returns the existing resource; conflicting
            content returns 409.
          example: programme-v1
      description: >-
        Plan metadata and exercise defaults. Description is optional. Supply
        defaultExerciseValues unless useDefaultExerciseSettings is false; when
        disabled, omit the defaults or send null. Create workout days and their
        exercises through the separate moment/exercise endpoints after receiving
        planId.
    PublicApiWriteSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiWriteMeta'
    PublicWorkoutSourcePOSTAppV1WorkoutPlansCreateAndAssignClientIdResponse200:
      type: object
      required:
        - planId
        - clientId
        - templateType
        - status
      properties:
        planId:
          type: string
          example: 67f1234567890abcdef1234
        clientId:
          type: string
          example: 67f1234567890abcdef1234
        templateType:
          type: string
          enum:
            - Assigned
        status:
          type: string
          enum:
            - Active
            - Inactive
        externalReference:
          $ref: '#/components/schemas/PublicWorkoutExternalReferenceReceipt'
    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
    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
    PublicWorkoutExternalReferenceReceipt:
      type: object
      required:
        - externalId
        - revision
      properties:
        externalId:
          type: string
          minLength: 1
          maxLength: 200
        revision:
          type: integer
          enum:
            - 1
      additionalProperties: false
    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.