---
title: "The exercise catalogue"
method: GET
path: "/exercises"
tags: ["Strength"]
---

# The exercise catalogue

`GET /exercises`

## Request

- Base URL: `https://bodylab.lol/api/v1`
- URL: `https://bodylab.lol/api/v1/exercises`
- Auth: HTTP bearer

Seeded by Body Lab and the same for everyone. With `q`, only the exercises every word of it matches, by name or by any of their aliases — "rdl", "skull crusher", "pushup". Includes exercises that are never offered (`offered: false`), since a routine may still name them.

## Query parameters

- `q` string: Words to match against each exercise's name and aliases. Every word must match, either whole or as the start of a word (at least two letters, so 'sq' finds squats); plurals find singulars. Exact names come first, then whole words, then prefixes.

## Headers

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

## Response `200`

OK

- object[]
  - `id` string, required: Opaque identifier.
  - `name` string, required
  - `notes` string, nullable, required
  - `movementPattern` string, required: Movement pattern. 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".
  - `loadType` string, required: Equipment. Known values: barbell, dumbbell, kettlebell, machine, bodyweight, band. Treat unknown values as "other".
  - `isUnilateral` boolean, required
  - `implementCount` integer, required
  - `allowsAssistance` boolean, required: Negative weight (assistance) is meaningful, e.g. an assisted pull-up.
  - `defaultUnit` 'reps' | 'seconds', required
  - `howToUrl` string, nullable, required
  - `aliases` string[], required: Other names the movement goes by — "OHP", "RDL", "skull crusher". No alias names two exercises, so one that matches is an answer rather than a guess.
  - `primaryMuscles` string[], required: What the movement is chosen for. calves covers the whole lower leg.
  - `requires` array[], required: What has to exist to do it at all: every inner list must be met, each by any one of its items. [["barbell"],["rack"]] is a barbell and a rack; [["dumbbells","kettlebells"]] is either. [] needs nothing. When `offered` is false this is only the nearest statement the equipment list can make, not a complete one.
    - string[]
  - `loadableBy` string[], required: What can add load to it. Empty when nothing can: the movement is done for reps or time, never with a weight.
  - `offered` boolean, required: Whether Body Lab ever offers it, in a swap or a prescription. False for a movement whose equipment isn't on the list an athlete can say they own — parallel bars, a sled, an incline bench — so it may be scheduled and logged, but Body Lab won't hand it to someone who may not have the thing.

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