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

# Workout History search (workoutPlans / exercises / activities)

> Requires the workout_progress:read scope. This operation maps to /app/v1/workout/plans/client/workout-history/search and retains its Workout V2 permission, feature-flag, and resource-scope checks.

The clientId path parameter identifies the client represented by the request context.



## OpenAPI

````yaml /openapi/public-v1.json post /public/v1/workout/clients/{clientId}/plans/workout-history/search
openapi: 3.1.0
info:
  title: FITsociety Public API v1
  version: 1.0.0
  description: >-
    Developer Public API endpoints under `/public/v1`. This reference is
    filtered to OAuth/Bearer Public API resources and excludes provider callback
    receivers, storefront routes, public widgets, wishlist routes, and
    access-device validation endpoints.
  contact:
    name: FITsociety Engineering
servers:
  - url: https://api.fitsociety.io
    description: Production
security: []
tags:
  - name: Workout
    description: >-
      Workout V2 libraries, programmes, client plans, calendars, sessions,
      groups, settings and progress. AI operations are excluded.
  - name: OAuth
    description: Public API OAuth endpoints for server-to-server client credentials.
  - name: Health
    description: Public API token health checks.
  - name: Platform
    description: >-
      Inspect Public API client context, capabilities, scopes, and redacted
      audit logs.
  - name: Company Catalog
    description: Read and manage company profile metadata and locations.
  - name: Clients
    description: >-
      Create and manage clients through the Public API using Bearer access
      tokens.
  - name: Coaches
    description: Retrieve coaches for the authenticated company via integrations.
  - name: Calendar Events
    description: Read Public API calendar events.
  - name: Calendar Templates
    description: >-
      Read and manage event types and event templates used by calendar
      availability and bookings.
  - name: Calendar Extensions
    description: >-
      Read recurring bookings, booking requests, calendar tasks, and
      availability closure metadata.
  - name: Availability
    description: Read bookable availability slots and signed availability tokens.
  - name: Availability Management
    description: >-
      Manage coach and location availability templates used to derive bookable
      slots.
  - name: Bookings
    description: Read and manage Public API bookings.
  - name: Finance
    description: >-
      Read invoices, transactions, products, subscriptions, and memberships with
      guarded finance writes.
  - name: Credits
    description: >-
      Read company-wide and client-scoped credit allocations, mutations, and
      guarded credit adjustments.
  - name: Exports
    description: >-
      Create and monitor asynchronous company exports through Public API Bearer
      endpoints.
  - name: Webhooks
    description: >-
      Manage outbound webhook subscriptions and inspect delivery attempts
      through Public API Bearer endpoints.
  - name: Measurements
    description: Read and write client measurement entries.
  - name: Progress Photos
    description: Read client progress photo metadata and short-lived signed media URLs.
  - name: Forms
    description: Read, create, update, and archive company form templates.
  - name: Intakes
    description: Assign intake forms and read client intake assignments and submissions.
  - name: Check-ups
    description: >-
      Schedule and cancel client check-ups and read their status and
      submissions.
  - name: Documents
    description: >-
      Read client document and folder metadata, register external document
      links, update metadata, and archive documents from Public API listings.
      Binary upload, permanent deletion, and company-wide document management
      are not exposed.
  - name: Habits
    description: Read habits and habit entries.
  - name: Goals
    description: Read client goal summaries.
  - name: Conversations
    description: >-
      Read and manage direct and group chat conversations through the Public
      API.
  - name: Reports
    description: Read aggregate attendance, revenue, and retention summaries.
paths:
  /public/v1/workout/clients/{clientId}/plans/workout-history/search:
    post:
      tags:
        - Workout
      summary: Workout History search (workoutPlans / exercises / activities)
      description: >-
        Requires the workout_progress:read scope. This operation maps to
        /app/v1/workout/plans/client/workout-history/search and retains its
        Workout V2 permission, feature-flag, and resource-scope checks.


        The clientId path parameter identifies the client represented by the
        request context.
      operationId: publicWorkoutpostPublicV1WorkoutClientsClientIdPlansWorkoutHistorySearch
      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`.
        - name: clientId
          in: path
          required: true
          schema:
            type: string
            pattern: ^[a-fA-F0-9]{24}$
          description: Client in the company bound to the Public API token.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/PublicWorkoutSourcePOSTAppV1WorkoutPlansClientWorkoutHistorySearchRequest
            example:
              search: fitness
      responses:
        '200':
          description: The three search arrays for the client's assigned training.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/PublicApiWriteSuccessResponse'
                  - type: object
                    properties:
                      data:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourcePOSTAppV1WorkoutPlansClientWorkoutHistorySearchResponse200
              examples:
                success:
                  summary: Successful response
                  value:
                    data:
                      search: string
                      workoutPlans:
                        - planId: 67f1234567890abcdef1234
                          name: Fitness Strength Program
                          scheduleMode: recurring
                          status: in_progress
                          programmeEndDate: string
                          averageRating: 3.2
                          ratedDayCount: 5
                          dayCount: 8
                          days:
                            - date: '2026-07-14'
                              weekday: 1
                              dayNumber: 1
                              isRestDay: true
                              itemCount: 1
                              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
                              exercises:
                                - id: 67f1234567890abcdef1234
                                  name: Barbell Bench Press
                                  primaryMuscle: Chest
                                  secondaryMuscles:
                                    - Chest
                                  primaryJoint: Shoulder
                                  equipment:
                                    - Dumbbells
                                  difficulty: Intermediate
                                  intensity: Above Average
                                  visibility: Company
                                  tags:
                                    - string
                                  thumbnail: >-
                                    https://cdn.example.com/exercises/bench-thumb.jpg
                              workouts:
                                - id: 67f1234567890abcdef1234
                                  name: Barbell Bench Press
                                  primaryMuscle: Chest
                                  secondaryMuscles:
                                    - Chest
                                  primaryJoint: Shoulder
                                  equipment:
                                    - Dumbbells
                                  difficulty: Intermediate
                                  intensity: Above Average
                                  visibility: Company
                                  tags:
                                    - string
                                  thumbnail: >-
                                    https://cdn.example.com/exercises/bench-thumb.jpg
                      exercises:
                        - exerciseId: 67f1234567890abcdef1234
                          name: Lat Pulldown
                          thumbnail: string
                          primaryMuscle: Chest
                          sets: 12
                          reps: 120
                          volume: 5400
                          timeSeconds: 0
                          distanceMeters: 0
                          timesPerformed: 4
                          lastPerformedAt: '2026-04-12T10:00:00.000Z'
                          hasHistory: true
                      activities:
                        - activityPerformanceId: 67f1234567890abcdef1234
                          programmeScheduleItemId: 67f1234567890abcdef1234
                          activityType: running
                          name: Fitness & Stretching Power
                          description: Example description
                          status: completed
                          plannedDate: '2026-09-30'
                          planned:
                            startTime: string
                            durationMinutes: 1
                            distanceMeters: 1
                          results:
                            durationMinutes: 1
                            distanceMeters: 1
                            rpe: 1
                          notes: string
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                      idempotency:
                        replayed: false
        '400':
          description: 'Validation error. Keys: `COMPANY_ID_REQUIRED`, `INVALID_CLIENT_ID`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                invalidRequest:
                  summary: Invalid request
                  value:
                    error:
                      code: 400
                      key: request.invalid
                      message: The request is invalid.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                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':
          $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'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                idempotencyConflict:
                  summary: Idempotency-Key conflict
                  value:
                    error:
                      code: 409
                      key: idempotency.conflict
                      message: >-
                        Idempotency-Key was already used with a different
                        request.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
                idempotencyInProgress:
                  summary: Idempotency-Key in progress
                  value:
                    error:
                      code: 409
                      key: idempotency.in_progress
                      message: >-
                        Idempotency-Key is already processing for this Public
                        API client.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '422':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                emptyBody:
                  summary: Empty or invalid JSON object body
                  value:
                    error:
                      code: 422
                      key: EMPTY_BODY
                      message: Request body must be a non-empty JSON object.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
        '429':
          $ref: '#/components/schemas/ErrorResponse'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                rateLimitExceeded:
                  summary: Rate limit exceeded
                  value:
                    error:
                      code: 429
                      key: rate_limit.exceeded
                      message: Too many Public API requests. Retry later.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 0
                        resetSeconds: 1
                        retryAfterSeconds: 1
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
              examples:
                serverInternalError:
                  summary: Unexpected server error
                  value:
                    error:
                      code: 500
                      key: server.internal_error
                      message: An unexpected Public API server error occurred.
                    meta:
                      requestId: 4f849d7d-f4f1-45cc-b4b7-3984a3d17f83
                      rateLimit:
                        limit: 10
                        remaining: 9
                        resetSeconds: 1
      security:
        - PublicBearerAuth: []
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: >-
            curl -X POST
            "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/plans/workout-history/search"
            \
              -H "Authorization: Bearer <access_token>" \
              -H "Idempotency-Key: <stable_request_key>" \
              -H "Content-Type: application/json" \
              -d '{}'
components:
  schemas:
    PublicWorkoutSourcePOSTAppV1WorkoutPlansClientWorkoutHistorySearchRequest:
      type: object
      properties:
        clientId:
          type: string
          example: 67f1234567890abcdef1234
          description: >-
            Required when the caller is a coach/admin; a client token resolves
            its own id.
        search:
          type: string
          example: fitness
          description: >-
            Case-insensitive substring, applied to EACH array on its own name
            field (plan / exercise / activity). Blank/absent returns everything.
            Also accepted as `?search=`.
    PublicApiWriteSuccessResponse:
      type: object
      additionalProperties: false
      required:
        - data
        - meta
      properties:
        data:
          type: object
        meta:
          $ref: '#/components/schemas/PublicApiWriteMeta'
    PublicWorkoutSourcePOSTAppV1WorkoutPlansClientWorkoutHistorySearchResponse200:
      type: object
      properties:
        search:
          type: string
          description: Echoed back so the caller can confirm what applied.
        workoutPlans:
          type: array
          description: >-
            Assigned plans with logged history, ONE entry per plan (no date
            grouping), sorted by name. Each entry has the EXACT SAME nested
            structure as a plan object in the feed tab of POST
            /app/v1/workout/plans/client/workout-history — `days[]` →
            `workouts[]` (with grouped `exercises[]`) + `activities[]` — for
            both recurring and multi-week plans. It is the feed's plan object
            with every date's days merged under it (`days[]` newest first);
            `averageRating` / `ratedDayCount` / `dayCount` are recomputed over
            that merged list.
          items:
            type: object
            properties:
              planId:
                type: string
                example: 67f1234567890abcdef1234
              name:
                type: string
                example: Fitness Strength Program
              scheduleMode:
                type: string
                enum:
                  - recurring
                  - multi_week
              status:
                type: string
                enum:
                  - in_progress
                  - completed
              programmeEndDate:
                type: string
                description: >-
                  Multi-week programme end date (local, "YYYY-MM-DD"); "" for
                  recurring or an undated programme.
              averageRating:
                type: number
                nullable: true
                example: 3.2
                description: >-
                  All-time mean of the plan's DAY ratings (a day = one plan
                  moment on one date); null when nothing was rated.
              ratedDayCount:
                type: integer
                example: 5
              dayCount:
                type: integer
                example: 8
              days:
                type: array
                description: >-
                  All of the plan's trained days, newest first — the SAME day
                  objects the feed nests under each date. Each day:
                  `plannedDate`, `weekday`, `weekNumber`, `title`, `rating`,
                  `durationMinutes`, `totalVolume`, `totalReps`, `workoutCount`,
                  `activityCount`, `workouts[]` (each with `sessionId`, `name`,
                  `exerciseCount`, grouped `exercises[]`, `rating`, `emoji`,
                  totals) and `activities[]` (the same activity-row shape as the
                  top-level `activities` below).
                items:
                  type: object
                  properties:
                    date:
                      type:
                        - string
                        - 'null'
                      format: date
                    weekday:
                      type:
                        - integer
                        - 'null'
                      minimum: 1
                      maximum: 7
                    dayNumber:
                      type:
                        - integer
                        - 'null'
                    isRestDay:
                      type: boolean
                    itemCount:
                      type: integer
                      minimum: 0
                    items:
                      type: array
                      items:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarItem
                    exercises:
                      type: array
                      items:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceWorkoutGroupedExerciseItem
                    workouts:
                      type: array
                      items:
                        $ref: >-
                          #/components/schemas/PublicWorkoutSourceWorkoutGroupedExerciseItem
                  additionalProperties: false
        exercises:
          type: array
          description: >-
            Identical rows to the Workout History exercises tab, the whole list,
            most-recently-performed first.
          items:
            type: object
            properties:
              exerciseId:
                type: string
                example: 67f1234567890abcdef1234
              name:
                type: string
                example: Lat Pulldown
              thumbnail:
                type: string
              primaryMuscle:
                type: string
                enum:
                  - Chest
                  - Back
                  - Lats
                  - Traps
                  - Shoulders
                  - Biceps
                  - Triceps
                  - Forearms
                  - Core
                  - Abs
                  - Obliques
                  - Glutes
                  - Quads
                  - Hamstrings
                  - Calves
                  - Adductors
                  - Abductors
                  - Hip Flexors
                  - Full Body
                  - Cardio / Conditioning
                  - Neck
                  - Lower Back
              sets:
                type: integer
                example: 12
              reps:
                type: integer
                example: 120
              volume:
                type: number
                example: 5400
              timeSeconds:
                type: integer
                example: 0
              distanceMeters:
                type: number
                example: 0
              timesPerformed:
                type: integer
                example: 4
              lastPerformedAt:
                type: string
                format: date-time
                example: '2026-04-12T10:00:00.000Z'
                nullable: true
              hasHistory:
                type: boolean
                example: true
        activities:
          type: array
          description: >-
            The feed's activity rows, one per completed occurrence, newest
            first.
          items:
            type: object
            properties:
              activityPerformanceId:
                type: string
                example: 67f1234567890abcdef1234
                nullable: true
              programmeScheduleItemId:
                type: string
                example: 67f1234567890abcdef1234
                nullable: true
              activityType:
                type: string
                example: running
              name:
                type: string
                example: Fitness & Stretching Power
              description:
                type: string
              status:
                type: string
                example: completed
              plannedDate:
                type: string
                example: '2026-09-30'
              planned:
                type: object
                properties:
                  startTime:
                    type: string
                  durationMinutes:
                    type: integer
                    nullable: true
                  distanceMeters:
                    type: number
                    nullable: true
              results:
                type: object
                properties:
                  durationMinutes:
                    type: integer
                    nullable: true
                  distanceMeters:
                    type: number
                    nullable: true
                  rpe:
                    type: number
                    nullable: true
              notes:
                type: string
    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
    PublicWorkoutSourceWorkoutProgrammeCalendarItem:
      oneOf:
        - $ref: >-
            #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarWorkoutItem
        - $ref: >-
            #/components/schemas/PublicWorkoutSourceWorkoutProgrammeCalendarActivityItem
      discriminator:
        propertyName: type
        mapping:
          workout: '#/components/schemas/WorkoutProgrammeCalendarWorkoutItem'
          activity: '#/components/schemas/WorkoutProgrammeCalendarActivityItem'
    PublicWorkoutSourceWorkoutGroupedExerciseItem:
      type: object
      properties:
        id:
          type: string
          example: 67f1234567890abcdef1234
        name:
          type: string
          example: Barbell Bench Press
        primaryMuscle:
          type: string
          enum:
            - Chest
            - Back
            - Lats
            - Traps
            - Shoulders
            - Biceps
            - Triceps
            - Forearms
            - Core
            - Abs
            - Obliques
            - Glutes
            - Quads
            - Hamstrings
            - Calves
            - Adductors
            - Abductors
            - Hip Flexors
            - Full Body
            - Cardio / Conditioning
            - Neck
            - Lower Back
          example: Chest
        secondaryMuscles:
          type: array
          items:
            type: string
            enum:
              - Chest
              - Back
              - Lats
              - Traps
              - Shoulders
              - Biceps
              - Triceps
              - Forearms
              - Core
              - Abs
              - Obliques
              - Glutes
              - Quads
              - Hamstrings
              - Calves
              - Adductors
              - Abductors
              - Hip Flexors
              - Full Body
              - Cardio / Conditioning
              - Neck
              - Lower Back
        primaryJoint:
          type: string
          enum:
            - ''
            - Ankle
            - Combination
            - Core
            - Elbow
            - Fingers
            - Hip
            - Knee
            - Neck
            - Shoulder
            - Spine
            - Wrist
          example: Shoulder
        equipment:
          type: array
          items:
            type: string
            enum:
              - Dumbbells
              - AdjustableDumbbells
              - Kettlebell
              - AdjustableKettlebell
              - CompetitionKettlebell
              - Medicineball
              - SlamBall
              - WallBall
              - Weightplate
              - BumperPlates
              - FractionalPlates
              - LoadableDumbbellHandle
              - Sandbag
              - StrongmanSandbag
              - Bulgarianbag
              - Aquabag
              - Aquaball
              - Hydrovest
              - MagneticBell
              - Macebell
              - SteelClub
              - IndianClub
              - Barbell
              - OlympicBarbell
              - TechniqueBar
              - EZBar
              - TrapBar
              - SafetySquatBar
              - SwissBar
              - CamberedBar
              - AxleBar
              - Landmine
              - Bench
              - FlatBench
              - AdjustableBench
              - InclineBench
              - DeclineBench
              - SealRowBench
              - HipThrustBench
              - BenchPressRack
              - SquatRack
              - SquatStand
              - PowerRack
              - WallMountedRack
              - HalfRack
              - SmithMachine
              - Monolift
              - JammerArms
              - BarbellJack
              - WeightTree
              - PlateStorage
              - DeadliftPlatform
              - Rig
              - StrengthMachinesPlateloaded
              - StrengthMachinesWeightstack
              - StrengthMachinesPneumatic
              - MultiGym
              - LegPressMachine
              - VerticalLegPressMachine
              - LeverageSquatMachine
              - LinearHackSquatMachine
              - BeltSquatMachine
              - PendulumSquatMachine
              - VSquatMachine
              - HackSquatMachine
              - LegExtensionMachine
              - LegCurlMachine
              - SeatedLegCurlMachine
              - LyingLegCurlMachine
              - StandingLegCurlMachine
              - StandingCalfRaiseMachine
              - SeatedCalfRaiseMachine
              - CalfPressMachine
              - HipThrustMachine
              - GluteDriveMachine
              - GluteKickbackMachine
              - HipExtensionMachine
              - HipAbductionMachine
              - HipAdductionMachine
              - ChestPressMachine
              - VerticalChestPressMachine
              - InclineChestPressMachine
              - DeclineChestPressMachine
              - IsoLateralChestPressMachine
              - IsoLateralInclinePressMachine
              - ShoulderPressMachine
              - IsoLateralShoulderPressMachine
              - MultiPressMachine
              - LateralRaiseMachine
              - RearDeltMachine
              - PecDeckMachine
              - PulloverMachine
              - LatPulldownMachine
              - IsoLateralLatPulldownMachine
              - AssistedPullupMachine
              - AssistedDipMachine
              - SeatedDipMachine
              - SeatedRowMachine
              - LowRowMachine
              - HighRowMachine
              - IsoLateralRowMachine
              - ChestSupportedRowMachine
              - TBarRowMachine
              - BicepsCurlMachine
              - PreacherCurlMachine
              - TricepsExtensionMachine
              - AbCrunchMachine
              - AbCoasterMachine
              - RotaryTorsoMachine
              - BackExtensionMachine
              - SeatedBackExtensionMachine
              - HyperextensionBench
              - ReverseHyper
              - GHD
              - Kinesis
              - Pulley
              - CableMachine
              - CableStation
              - CableColumn
              - CableCrossover
              - DualAdjustablePulley
              - SingleCableTower
              - FunctionalTrainer
              - TotalGymGTS
              - Gymstick
              - ViPR
              - RipTrainer
              - Battlerope
              - ProwlerSled
              - FarmersHandles
              - Yoke
              - Tire
              - Sledgehammer
              - TorqueTank
              - SledTrack
              - WallBallTarget
              - AgilityPoles
              - MiniHurdles
              - SprintParachute
              - PullUpBar
              - Parallelbars
              - DipBars
              - Equalizer
              - Suspensiontrainer
              - SuspensionSlingTrainer
              - GymnasticRings
              - MonkeyBars
              - PegBoard
              - RopeClimb
              - Wall
              - StallBars
              - DoorPullUpBar
              - PushUpHandles
              - AbStraps
              - Boxstep
              - SoftPlyoBox
              - Hurdle
              - Speedladder
              - Parallettes
              - NordicBench
              - SissySquatBench
              - Cardio
              - Treadmill
              - CurvedTreadmill
              - AirRunner
              - AssaultRunner
              - StationaryBike
              - UprightBike
              - RecumbentBike
              - BikeErg
              - SpinBike
              - AirBike
              - Rower
              - WaterRower
              - FanRower
              - ArmErgometer
              - SkiErg
              - Elliptical
              - ArcTrainer
              - NuStep
              - StairClimber
              - StepMill
              - JacobsLadder
              - VersaClimber
              - Bosu
              - Balanceball
              - Exerciseball
              - PilatesTennisball
              - PilatesRing
              - YogaMat
              - YogaBlock
              - YogaWheel
              - StretchStrap
              - MobilityStick
              - MassageBall
              - PeanutMassageBall
              - Airpad
              - Balanceboard
              - BalancePad
              - WobbleBoard
              - Glidedisc
              - Foamroller
              - Elasticbands
              - TherapyBand
              - Resistanceband
              - MiniBand
              - PullUpAssistBand
              - Powertube
              - AnkleWeights
              - SlantBoard
              - Vibrationtraining
              - CableRope
              - StraightBarAttachment
              - CurlBarAttachment
              - LatBarAttachment
              - TricepsBarAttachment
              - RowHandle
              - DHandle
              - DoubleDHandle
              - AnkleCuff
              - CableCuff
              - LandmineHandle
              - MagGripAttachment
              - DipBelt
              - AbWheel
              - WristRoller
              - FatGrip
              - Chain
              - DoorAnchor
              - JumpRope
              - SpeedRope
              - WeightedJumpRope
              - SledHarness
              - LiftingStraps
              - LiftingHooks
              - WristWraps
              - WeightliftingBelt
              - Clubbel
              - Stick
              - Bodybow
              - BuddySystem
              - Multinet
              - Flowin
              - Aerialhoop
              - Dancingpole
              - Trapeze
              - HulaHoop
              - Trampoline
              - XCO
              - PilatesReformer
              - PilatesChair
              - PilatesCadillac
              - PilatesBarrel
              - PilatesSpringboard
              - BalanceBeam
              - TreatmentTable
              - RehabTable
              - SlideBoard
        difficulty:
          type: string
          enum:
            - ''
            - Beginner
            - Intermediate
            - Advanced
          example: Intermediate
        intensity:
          type: string
          enum:
            - ''
            - Beginner
            - Below Average
            - Average
            - Above Average
            - High Intensity
          example: Above Average
        visibility:
          type: string
          enum:
            - Everyone
            - Company
            - Fitsociety
          example: Company
        tags:
          type: array
          items:
            type: string
        thumbnail:
          type:
            - string
            - 'null'
          format: uri
          example: https://cdn.example.com/exercises/bench-thumb.jpg
    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
    PublicWorkoutSourceWorkoutProgrammeCalendarWorkoutItem:
      type: object
      additionalProperties: false
      required:
        - type
        - order
        - planMomentId
      properties:
        _id:
          type: string
          example: 67f1234567890abcdef1234
        order:
          type: integer
          minimum: 1
          example: 1
        startTime:
          type: string
          pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
          example: '08:30'
        plannedDurationMinutes:
          type:
            - number
            - 'null'
          minimum: 0
          example: 45
          description: Planned duration in minutes; null when no target is set.
        status:
          type:
            - string
            - 'null'
          enum:
            - in_progress
            - completed
            - overdue
            - today
            - upcoming
            - null
          readOnly: true
          example: today
          description: >-
            Occurrence presentation status. Template items use null; cancelled
            occurrences fall back to overdue, today, or upcoming.
        plannedDate:
          oneOf:
            - type: string
              format: date
              pattern: ^\d{4}-\d{2}-\d{2}$
              example: '2026-09-08'
            - type: string
              enum:
                - ''
              example: ''
          readOnly: true
          description: Original authored occurrence date for a calendar response item.
        scheduledDate:
          oneOf:
            - type: string
              format: date
              pattern: ^\d{4}-\d{2}-\d{2}$
              example: '2026-09-08'
            - type: string
              enum:
                - ''
              example: ''
          readOnly: true
          description: Effective calendar date after a client move; otherwise plannedDate.
        source:
          type: string
          enum:
            - programme
          readOnly: true
        clientAdjustment:
          oneOf:
            - type: object
              required:
                - action
                - occurrenceDate
                - scheduledDate
                - changedAt
              properties:
                action:
                  type: string
                  enum:
                    - moved
                    - skipped
                occurrenceDate:
                  type: string
                  format: date
                  pattern: ^\d{4}-\d{2}-\d{2}$
                  example: '2026-09-08'
                scheduledDate:
                  oneOf:
                    - type: string
                      format: date
                      pattern: ^\d{4}-\d{2}-\d{2}$
                      example: '2026-09-08'
                    - type: string
                      enum:
                        - ''
                      example: ''
                changedAt:
                  type:
                    - string
                    - 'null'
                  format: date-time
                  example: null
            - type: 'null'
          readOnly: true
        canClientRestore:
          type: boolean
          readOnly: true
        type:
          type: string
          enum:
            - workout
          example: workout
        planMomentId:
          type: string
          example: 67f1234567890abcdef1234
    PublicWorkoutSourceWorkoutProgrammeCalendarActivityItem:
      type: object
      additionalProperties: false
      required:
        - type
        - order
        - activityType
        - name
      properties:
        _id:
          type: string
          example: 67f1234567890abcdef1234
        order:
          type: integer
          minimum: 1
          example: 1
        startTime:
          type: string
          pattern: ^(?:[01]\d|2[0-3]):[0-5]\d$|^$
          example: '08:30'
        plannedDurationMinutes:
          type:
            - number
            - 'null'
          minimum: 0
          example: 45
          description: Planned duration in minutes; null when no target is set.
        status:
          type:
            - string
            - 'null'
          enum:
            - in_progress
            - completed
            - overdue
            - today
            - upcoming
            - null
          readOnly: true
          example: today
          description: >-
            Occurrence presentation status. Template items use null; cancelled
            occurrences fall back to overdue, today, or upcoming.
        plannedDate:
          oneOf:
            - type: string
              format: date
              pattern: ^\d{4}-\d{2}-\d{2}$
              example: '2026-09-08'
            - type: string
              enum:
                - ''
              example: ''
          readOnly: true
          description: Original authored occurrence date for a calendar response item.
        scheduledDate:
          oneOf:
            - type: string
              format: date
              pattern: ^\d{4}-\d{2}-\d{2}$
              example: '2026-09-08'
            - type: string
              enum:
                - ''
              example: ''
          readOnly: true
          description: Effective calendar date after a client move; otherwise plannedDate.
        source:
          type: string
          enum:
            - programme
          readOnly: true
        clientAdjustment:
          oneOf:
            - type: object
              required:
                - action
                - occurrenceDate
                - scheduledDate
                - changedAt
              properties:
                action:
                  type: string
                  enum:
                    - moved
                    - skipped
                occurrenceDate:
                  type: string
                  format: date
                  pattern: ^\d{4}-\d{2}-\d{2}$
                  example: '2026-09-08'
                scheduledDate:
                  oneOf:
                    - type: string
                      format: date
                      pattern: ^\d{4}-\d{2}-\d{2}$
                      example: '2026-09-08'
                    - type: string
                      enum:
                        - ''
                      example: ''
                changedAt:
                  type:
                    - string
                    - 'null'
                  format: date-time
                  example: null
            - type: 'null'
          readOnly: true
        canClientRestore:
          type: boolean
          readOnly: true
        type:
          type: string
          enum:
            - activity
          example: activity
        activityType:
          type: string
          enum:
            - running
            - cycling
            - walking
            - swimming
            - rowing
            - padel
            - mobility
            - other
          example: running
        name:
          $ref: '#/components/schemas/PublicWorkoutSourceWorkoutLocalizedTextArray'
        description:
          type: array
          items:
            $ref: '#/components/schemas/PublicWorkoutSourceWorkoutLocalizedTextEntry'
        cardio:
          $ref: '#/components/schemas/PublicWorkoutSourceProgrammeScheduleItemCardio'
        targetDistanceMeters:
          type:
            - number
            - 'null'
          minimum: 0
          example: 5000
          description: Planned distance in meters; null when no target is set.
    PublicWorkoutSourceWorkoutLocalizedTextArray:
      type: array
      minItems: 1
      items:
        $ref: '#/components/schemas/PublicWorkoutSourceWorkoutLocalizedTextEntry'
      example:
        - lang: en
          value: Full Body Strength
        - lang: nl
          value: Full Body Kracht
    PublicWorkoutSourceWorkoutLocalizedTextEntry:
      type: object
      required:
        - lang
        - value
      properties:
        lang:
          type: string
          enum:
            - en
            - nl
            - fr
            - de
            - es
          example: en
        value:
          type: string
          example: Full Body Strength
    PublicWorkoutSourceProgrammeScheduleItemCardio:
      type: object
      additionalProperties: false
      description: >-
        Optional structured activity prescription. Requires workoutsectionv2 +
        workoutV2ProgrammeCalendar + workoutV2CardioBuilder. Omitted from
        disabled reads. Supported sports: running (paceZone E/T/I/R/RP, absolute
        pace, absolute HR, RPE), walking (pace, HR, RPE), cycling (power, HR,
        RPE), rowing (pace, power, HR, RPE), swimming (pace, RPE). Rejected for
        workout, padel, mobility and other items. Totals overwrite planned
        duration/distance; unknown time or distance contributes zero.
      properties:
        slotKey:
          type: string
          description: Generated when missing; retain across edits, copies and weeks.
        sessionType:
          type: string
          enum:
            - easy
            - zone2
            - long_run
            - threshold_continuous
            - threshold_reps
            - interval
            - race_pace
            - time_trial
            - race
          description: >-
            Running only. Template session codes: threshold_continuous =
            drempel_c, threshold_reps = drempel_r, interval, race_pace =
            doeltempo, zone2. A typed session with empty blocks is a skeleton to
            be filled later.
        controlMode:
          type: string
          enum:
            - pace
            - hr
          description: >-
            Binding signal. Defaults from sessionType: hr for easy, zone2 and
            long_run; pace for threshold_continuous, threshold_reps, interval
            and race_pace; none for time_trial and race. A contradicting value
            is rejected.
        ladderStep:
          type: integer
          minimum: 1
          description: >-
            Ladder position: interval 1–8, threshold_reps 1–7,
            threshold_continuous 1–5 (15/18/20/22/25 min). Rejected for other
            session types.
        poolLengthM:
          type: number
          enum:
            - 25
            - 50
          description: Swimming only.
        blocks:
          type: array
          maxItems: 10
          items:
            $ref: '#/components/schemas/PublicWorkoutSourceCardioBlock'
          default: []
        sourceTemplateId:
          type:
            - string
            - 'null'
          example: null
    PublicWorkoutSourceCardioBlock:
      type: object
      additionalProperties: false
      properties:
        _id:
          type: string
          example: 67f1234567890abcdef1234
        repeat:
          type: integer
          minimum: 1
          maximum: 50
          default: 1
        steps:
          type: array
          maxItems: 20
          items:
            $ref: '#/components/schemas/PublicWorkoutSourceCardioStep'
          default: []
    PublicWorkoutSourceCardioStep:
      type: object
      additionalProperties: false
      required:
        - kind
        - durationType
      properties:
        _id:
          type: string
          example: 67f1234567890abcdef1234
        kind:
          type: string
          enum:
            - warmup
            - work
            - recovery
            - rest
            - cooldown
        durationType:
          type: string
          enum:
            - time
            - distance
            - open
        durationValue:
          type:
            - number
            - 'null'
          minimum: 0
          default: null
          description: >-
            Required seconds for time or metres for distance; null/omitted for
            open.
        target:
          $ref: '#/components/schemas/PublicWorkoutSourceCardioTarget'
          description: >-
            Binding target. When the session has a controlMode, its kind must
            match it (pace: paceZone/pacePct/pace; hr: hrZone/hrPct/hr).
        secondaryTarget:
          $ref: '#/components/schemas/PublicWorkoutSourceCardioTarget'
          description: >-
            Informational guidance only, never a second hard limit. With a
            controlMode it must use the other signal and requires target.
        notes:
          type: string
          default: ''
        stroke:
          type: string
          enum:
            - free
            - back
            - breast
            - fly
            - im
            - choice
            - kick
            - drill
          description: Swimming only.
        equipment:
          type: array
          items:
            type: string
            enum:
              - pullBuoy
              - paddles
              - fins
              - kickboard
              - snorkel
          description: Swimming only.
        restMode:
          type: string
          enum:
            - rest
            - sendOff
          description: Swimming only. sendOff requires sendOffSec.
        sendOffSec:
          type: number
          minimum: 1
          description: Swimming sendOff only.
        cadence:
          $ref: '#/components/schemas/PublicWorkoutSourceCardioCadence'
          description: Cycling rpm or rowing strokes/minute only.
    PublicWorkoutSourceCardioTarget:
      type: object
      additionalProperties: false
      required:
        - kind
      description: >-
        Allowed kinds and zones depend on the sport. Zone targets require zone;
        other targets require ordered low/high bounds. Pace is seconds/km for
        running/walking, seconds/500m for rowing, seconds/100m for swimming.
        Percentages are percent values; HR is bpm, power is watts, RPE is 1–10.
        Numeric strings with dot or comma decimals are accepted.
      properties:
        kind:
          type: string
          enum:
            - paceZone
            - pacePct
            - pace
            - hrZone
            - hrPct
            - hr
            - powerZone
            - powerPct
            - power
            - rpe
        zone:
          type: string
          enum:
            - E
            - T
            - I
            - R
            - RP
            - Z1
            - Z2
            - Z3
            - Z4
            - Z5
            - Z6
            - Z7
            - easy
            - endurance
            - threshold
            - speed
          description: >-
            Run pace: E (easy), T (threshold), I (interval), R (repetition), RP
            (race pace = goal time / goal distance, never derived from T).
            Running has no HR zones; HR bands are absolute bpm from athlete
            data. Walking/rowing pace and five-zone HR: Z1–Z5. Bike/row power:
            Z1–Z7. Swimming pace: easy, endurance, threshold, speed.
        basis:
          type: string
          enum:
            - lthr
            - maxHr
          description: HR zone/percentage targets only.
        low:
          type: number
          minimum: 0
        high:
          type: number
          minimum: 0
    PublicWorkoutSourceCardioCadence:
      type: object
      additionalProperties: false
      required:
        - low
        - high
      properties:
        low:
          type: number
          minimum: 0
        high:
          type: number
          minimum: 0
  securitySchemes:
    PublicBearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Opaque
      description: >-
        Public API access token issued by `/public/v1/oauth/token`. Example:
        `Authorization: Bearer fspt_...`. Each resource request rechecks the
        token company's current provider access. Disabling access blocks
        existing tokens with `403 auth.provider_unavailable`.

````

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