---
title: "PATCH /api/public/training-plans/{planId}"
method: PATCH
path: "/api/public/training-plans/{planId}"
tags: ["Training Plans"]
---

# PATCH /api/public/training-plans/{planId}

`PATCH /api/public/training-plans/{planId}`

Partially update a training plan. Pass only fields you want to change.

BREAKING CHANGE: the plan name is now "title"; the previous "name" field has been removed. Unknown fields are dropped during validation, so a PATCH sending only "name" is rejected with 400 "No updatable fields were supplied" rather than silently doing nothing.

If the plan is attached to more than one trainee, editing it changes the plan for all of them, so the request returns 409 CONFLICT until you confirm with applyToAllSharedTrainees.

## Path parameters

- `planId` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `title` string
  - `description` string
  - `level` 'Beginner' | 'Intermediate' | 'Advanced'
  - `maxDuration` number
  - `workouts` object[]
    - `trainingName` string — Display name of the day, e.g. "Day A — Push".
    - `trainingType` 'A' | 'B' | 'C' | 'D' | 'E' | 'FullBody' | 'CrossFit' | 'Tabata' | 'HIIT' | 'EMOM' | 'AMRAP' | 'Circuit' | 'ForTime' — Day label, e.g. "A", "B", "FullBody".
    - `exerciseOrder` 'Sequential' | 'Circuit' | 'Superset' | 'Complex' — How exercises are performed. Defaults to Sequential.
    - `notes` string — Free-text note for the whole day.
    - `timeBasedDetails` object — Timing configuration for circuit-style days (Tabata, HIIT, EMOM, AMRAP). Seconds unless noted.
      - `totalRounds` number
      - `timeLimit` number
      - `workInterval` number
      - `restInterval` number
      - `restBetweenRounds` number
    - `exercises` object[]
      - `exerciseDetails` string — Exercise catalog id, taken from GET /exercises.
      - `setsNumber` string — Number of sets, e.g. "3".
      - `repsNumber` string — Reps per set, e.g. "10" or "8-12".
      - `restTime` string — Rest between sets in seconds, e.g. "90".
      - `isDurationBased` boolean — True for timed exercises (e.g. plank) instead of reps.
      - `setDuration` string — Duration per set in seconds when isDurationBased is true.
      - `weightPercentage` number — Working weight as % of 1RM, e.g. 75.
      - `customNotes` string — Free-text note shown to the trainee for this exercise.
      - `weight` number — Working weight in kg for the exercise.
      - `sets` object[] — Per-set prescription. Takes precedence over setsNumber/repsNumber when present.
        - `setNumber` number — 1-based position of the set.
        - `reps` string — Reps for this set, e.g. "8".
        - `weight` number — Working weight for this set.
        - `restTime` string — Rest after this set in seconds.
        - `intensityValue` number — Intensity for this set, read against intensityType.
        - `dropSet` 'DropSet' | 'DoubleDropSet' | 'TripleDropSet'
        - `isWarmupSet` boolean — Warmup sets are not counted towards working volume.
      - `superSet` boolean — True when this exercise belongs to a superset.
      - `superSetGroup` string — Shared identifier grouping the exercises performed together in one superset.
      - `dropSet` 'DropSet' | 'DoubleDropSet' | 'TripleDropSet'
      - `restPause` boolean — Rest-pause technique.
      - `cluster` boolean — Cluster-set technique.
      - `trackingType` 'weight_reps' | 'reps_only' | 'duration' | 'completion' — What the trainee logs for this exercise.
      - `intensityType` 'Percentage' | 'RPE' | 'RIR' — How intensityValue is interpreted.
      - `intensityValue` number — Intensity target.
      - `tempo` object — Tempo in seconds per phase of the lift.
        - `eccentric` number
        - `hold` number
        - `concentric` number
        - `rest` number
      - `distance` number — Distance for cardio exercises.
      - `distanceUnit` 'meters' | 'km' | 'miles' | 'yards'
      - `specificAlternativeExercises` string[] — Catalog ids the trainee may swap in for this exercise.
  - `applyToAllSharedTrainees` boolean — Required (true) to edit a plan shared by multiple trainees; the change then applies to all of them. Without it, a shared plan returns 409.

## Response `200`

Successful response

- object — Successful response
  - `data` object
    - `id` string
    - `coach` string
    - `escorts` string[]
    - `title` string
    - `notes` string
    - `level` 'Beginner' | 'Intermediate' | 'Advanced'
    - `maxDuration` number — Target session length in minutes.
    - `isTemplate` boolean — True when the plan is a reusable template.
    - `workouts` object[]
      - `trainingName` string — Display name of the day, e.g. "Day A — Push".
      - `trainingType` 'A' | 'B' | 'C' | 'D' | 'E' | 'FullBody' | 'CrossFit' | 'Tabata' | 'HIIT' | 'EMOM' | 'AMRAP' | 'Circuit' | 'ForTime' — Day label, e.g. "A", "B", "FullBody".
      - `exerciseOrder` 'Sequential' | 'Circuit' | 'Superset' | 'Complex' — How exercises are performed. Defaults to Sequential.
      - `notes` string — Free-text note for the whole day.
      - `timeBasedDetails` object — Timing configuration for circuit-style days (Tabata, HIIT, EMOM, AMRAP). Seconds unless noted.
        - `totalRounds` number
        - `timeLimit` number
        - `workInterval` number
        - `restInterval` number
        - `restBetweenRounds` number
      - `exercises` object[]
        - `exerciseDetails` object — The exercise catalog entry. On write, pass exerciseDetails as the catalog id string (from GET /exercises).
          - `id` string
          - `name` string
        - `setsNumber` string — Number of sets, e.g. "3".
        - `repsNumber` string — Reps per set, e.g. "10" or "8-12".
        - `restTime` string — Rest between sets in seconds, e.g. "90".
        - `isDurationBased` boolean — True for timed exercises (e.g. plank) instead of reps.
        - `setDuration` string — Duration per set in seconds when isDurationBased is true.
        - `weightPercentage` number — Working weight as % of 1RM, e.g. 75.
        - `customNotes` string — Free-text note shown to the trainee for this exercise.
        - `weight` number — Working weight in kg for the exercise.
        - `sets` object[] — Per-set prescription. Takes precedence over setsNumber/repsNumber when present.
          - `setNumber` number — 1-based position of the set.
          - `reps` string — Reps for this set, e.g. "8".
          - `weight` number — Working weight for this set.
          - `restTime` string — Rest after this set in seconds.
          - `intensityValue` number — Intensity for this set, read against intensityType.
          - `dropSet` 'DropSet' | 'DoubleDropSet' | 'TripleDropSet'
          - `isWarmupSet` boolean — Warmup sets are not counted towards working volume.
        - `superSet` boolean — True when this exercise belongs to a superset.
        - `superSetGroup` string — Shared identifier grouping the exercises performed together in one superset.
        - `dropSet` 'DropSet' | 'DoubleDropSet' | 'TripleDropSet'
        - `restPause` boolean — Rest-pause technique.
        - `cluster` boolean — Cluster-set technique.
        - `trackingType` 'weight_reps' | 'reps_only' | 'duration' | 'completion' — What the trainee logs for this exercise.
        - `intensityType` 'Percentage' | 'RPE' | 'RIR' — How intensityValue is interpreted.
        - `intensityValue` number — Intensity target.
        - `tempo` object — Tempo in seconds per phase of the lift.
          - `eccentric` number
          - `hold` number
          - `concentric` number
          - `rest` number
        - `distance` number — Distance for cardio exercises.
        - `distanceUnit` 'meters' | 'km' | 'miles' | 'yards'
        - `specificAlternativeExercises` string[] — Catalog ids the trainee may swap in for this exercise.
    - `createdAt` string, date-time

## Other responses

- `400` — Default Response
- `401` — Default Response
- `403` — Default Response
- `404` — Default Response
- `409` — Default Response
- `429` — Default Response
- `500` — Default Response

---

[API](https://skmtc.dev/coach-platform/apis/coach-platform-api.md) · [All operations](https://skmtc.dev/coach-platform/apis/coach-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/coach-platform/coach-platform-api/revisions/3d18b514ae8c/schema)
