---
title: "The strength session the engine would prescribe now"
method: GET
path: "/training/strength-template"
tags: ["Strength"]
---

# The strength session the engine would prescribe now

`GET /training/strength-template`

## Request

- Base URL: `https://bodylab.lol/api/v1`
- URL: `https://bodylab.lol/api/v1/training/strength-template`
- Auth: HTTP bearer

Whether or not it's today's primary session; the workout runner pre-fills from it.

## Headers

- `X-Client-Platform` string
- `X-Client-Version` string

## Response `200`

OK

- object
  - `session` object, required
    - `kind` 'strength', required
    - `template` string, required
    - `durationMin` number, required
    - `exercises` object[], required
      - `exerciseId` string, required: Opaque identifier.
      - `name` string, required
      - `sets` integer, required
      - `reps` integer, required: Reps, or seconds when unit is seconds.
      - `unit` 'reps' | 'seconds', required
      - `weightKg` number, nullable, required: The total load, in kilograms, including the bar or both dumbbells — never the weight of one implement or one side of a bar. Negative is assistance: the part of the athlete's bodyweight a machine or band is taking off. Null when the movement carries no external load, or when there is no history to prescribe one from.
      - `rir` number, required: Reps in reserve to stop at.
      - `intensity` number, nullable, required
      - `progression` object, nullable, required
        - `axis` 'reps' | 'load', required
        - `direction` 'up' | 'hold', required
        - `previous` number, required
        - `daysAgo` number, required
        - `reason` string, required
      - `perSide` 'leg' | 'side', nullable, required: Reps are per leg or per side.
      - `implementCount` union, required: 2 when the load is split across two dumbbells or kettlebells; weightKg is still the total, so each hand holds half of it.
        - unknown
        - unknown
      - `restSeconds` integer, required: Suggested rest between this exercise's sets, in seconds: shorter for jumps and accessories, longer for the heaviest lifts.
      - `restReason` string, required: Why restSeconds is the length it is: a jump, lighter accessory work, one of the heaviest lifts, or nothing in particular. Stated rather than left to be inferred from the number, which an athlete's own adjustment moves off the table. Known values: jump, accessory, heavy, standard. Treat unknown values as "other".
      - `note` string
      - `cue` string: The routine's own cue for this exercise, as whoever scheduled it wrote it (`routine.scheduledBy`). Show it attributed to them, never as Body Lab's words, and apart from `note`, which is Body Lab's. Absent when there is none.
      - `supersetGroup` string: The routine's superset letter: exercises sharing one are done alternately, in the order listed. Absent when the exercise stands alone.
      - `weightCheck` string: A sentence to show where this exercise's sets are recorded, when the routine stated a weight more than 10% above the athlete's estimated one-rep max for it — the shape of pounds read as kilograms. It names the lift and the likely slip. Advice about the number only: `weightKg` is still the routine's, and logging is never blocked. Absent otherwise, including whenever there is no estimate to compare with.
    - `note` string, required
    - `tradeoff` string, nullable, required: What choosing this instead of today's session costs or gains, one sentence. Set only on alternates; null on the prescribed session and on variants.
    - `routine` object, nullable: The routine this session is. Absent or null for one of Body Lab's own; `template` is "routine" when it's set.
      - `id` string, required: The routine, as `GET /strength-routines` lists it and `POST /strength-sessions` takes it as `routineId`.
      - `name` string, required: What the routine was called: "Upper day".
      - `scheduledBy` string, nullable, required: The connected app that put this on the calendar, as its OAuth client id — the `clientId` that `GET /schedule/apps` names and `POST /schedule/apps/withdraw` takes. Null when the athlete entered it themselves, in any of their own apps.
  - `routine` object, nullable, required: The routine on the calendar for today that this session is, or null when it is Body Lab's own. A runner names it in its header and sends its id as `routineId` when the session is logged.
    - `id` string, required: The routine, as `GET /strength-routines` lists it and `POST /strength-sessions` takes it as `routineId`.
    - `name` string, required: What the routine was called: "Upper day".
    - `scheduledBy` string, nullable, required: The connected app that put this on the calendar, as its OAuth client id — the `clientId` that `GET /schedule/apps` names and `POST /schedule/apps/withdraw` takes. Null when the athlete entered it themselves, in any of their own apps.
  - `oneRepMaxes` object, required: Estimated one-rep max in kg, by exercise id.
  - `deload` boolean, required
  - `units` 'metric' | 'imperial', required: How to display quantities; the API always speaks SI.
  - `barWeightKg` number, nullable, required: The barbell the athlete loads, in kilograms, with their profile's choice already resolved. Null when they said not to guess (a Smith machine or a trap bar), in which case a barbell weight should be shown as a total only. Advice about weightKg; it never changes it.
  - `clipWeightKg` number, required: The weight of ONE clip or collar, in kilograms; both sleeves get one, so twice this comes off the total before the rest is split between the sides. Zero unless the athlete said otherwise — gym spring clips weigh next to nothing while competition collars are 2.5 kg each, and assuming the latter would add 5 kg to every barbell lift.
  - `swaps` object[]: For each slot of session.exercises, what it may be swapped to today, each option prescribed as the engine would have prescribed it there. A runner's picker reads its candidates and note from here, and a swap takes the option's numbers as they are. Absent from a server that predates it.
    - `slot` integer, required: Index into session.exercises.
    - `exerciseId` string, required: The slot's prescribed exercise: a guard against a misaligned index.
    - `movementPattern` string, required: The prescribed exercise's pattern, which these are the options in. Known values: squat, hinge, lunge, horizontal_push, vertical_push, horizontal_pull, vertical_pull, carry, core, calf, isolation, jump, olympic, conditioning. Treat unknown values as "other".
    - `options` object[], required: What the slot may be swapped to today, in picker order, each prescribed as the engine would have prescribed it there. The prescribed exercise is not repeated.
      - `exerciseId` string, required: Opaque identifier.
      - `name` string, required
      - `sets` integer, required
      - `reps` integer, required: Reps, or seconds when unit is seconds.
      - `unit` 'reps' | 'seconds', required
      - `weightKg` number, nullable, required: The total load, in kilograms, including the bar or both dumbbells — never the weight of one implement or one side of a bar. Negative is assistance: the part of the athlete's bodyweight a machine or band is taking off. Null when the movement carries no external load, or when there is no history to prescribe one from.
      - `rir` number, required: Reps in reserve to stop at.
      - `intensity` number, nullable, required
      - `progression` object, nullable, required
        - `axis` 'reps' | 'load', required
        - `direction` 'up' | 'hold', required
        - `previous` number, required
        - `daysAgo` number, required
        - `reason` string, required
      - `perSide` 'leg' | 'side', nullable, required: Reps are per leg or per side.
      - `restSeconds` integer, required: Suggested rest between this exercise's sets, in seconds: shorter for jumps and accessories, longer for the heaviest lifts.
      - `restReason` string, required: Why restSeconds is the length it is: a jump, lighter accessory work, one of the heaviest lifts, or nothing in particular. Stated rather than left to be inferred from the number, which an athlete's own adjustment moves off the table. Known values: jump, accessory, heavy, standard. Treat unknown values as "other".
      - `note` string
    - `excludedCount` integer, required: As ExerciseSwapOptions: how many exercises in the pattern today's report or the athlete's equipment left out.
    - `note` string, nullable, required: As ExerciseSwapOptions: why they were left out. Show it whenever it is set, including when there are no options.

## Other responses

- `401`: Error: UNAUTHORIZED.

---

[API](https://skmtc.dev/bodylab/apis/body-lab-api.md) · [All operations](https://skmtc.dev/bodylab/apis/body-lab-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bodylab/apis/body-lab-api/revisions/544c201eaf88?raw)
