# ExerciseDB

> Look up exercises from a workflow: 1,500 of them, each with an animated GIF, the muscle it targets, the muscles it also works, the body part and the equipment it needs, plus step-by-step instructions. Search by name or by a rough idea, filter by body part, muscle and equipment at once, pull everything for one muscle, draw a random exercise, or build a whole workout spread evenly across the areas you name and the kit you actually have. Every action reads: nothing here changes anything. No account or API key required.

App · Health & Fitness · 16 actions. Web page: https://docs.lodol.com/docs/integrations/exercisedb

## Actions

### Build a workout

Put together a workout from the catalogue, spread evenly across the areas you name. Asking for six exercises over chest, back and legs gives two of each rather than five chest movements and a plank, and limiting the equipment keeps it to what is actually available. Set a seed for a plan that repeats, or leave it empty for a fresh one each run.

**Inputs**

- Body parts (`body_parts`, list): Keep only exercises for these areas of the body. Picking several widens the search: chest and back returns both. Leave it empty for every area.
- Equipment (`equipment`, list): Keep only exercises that use this equipment. Picking several widens the search, so list everything available and the result is what can actually be done with it. Leave it empty for every kind.
- How many exercises (`exercise_count`, number): How many exercises the workout should hold. Defaults to six. From 1 to 30. Default: `6`.
- Repeatable seed (`seed`, text): Set this to any text to make the draw repeatable: the same seed over the same catalogue always picks the same exercises. Leave it empty for a different set every run.

**Outputs**

- `areas_covered` (list): The body parts the workout touches
- `attribution` (text): The credit to carry
- `body_parts_requested` (list)
- `count` (number): How many the workout holds
- `covers` (object)
- `equipment_requested` (list)
- `exercise_ids` (list)
- `exercises` (list)
- `exercises_by_body_part` (object): The exercise names grouped under each body part
- `has_more` (true/false): Always false
- `limit` (number): The count asked for
- `names` (list)
- `pool_size` (number): How many exercises the criteria left to choose from
- `requested_count` (number): How many were asked for
- `returned` (number): How many were drawn
- `seed` (text): The seed used, if any
- `total_exercises` (number): The pool size

**Example output**

```json
{
  "areas_covered": [
    "chest"
  ],
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_parts_requested": [
    "chest"
  ],
  "count": 2,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "equipment_requested": [
    "barbell"
  ],
  "exercise_ids": [
    "EIeI8Vf",
    "3TZduzM"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    },
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "3TZduzM",
      "gif_url": "https://static.exercisedb.dev/media/3TZduzM.gif",
      "instructions": [
        "Set up an incline bench at a 45-degree angle.",
        "Lie down on the bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip, slightly wider than shoulder-width apart."
      ],
      "name": "barbell incline bench press",
      "secondary_muscles": [
        "shoulders",
        "triceps"
      ],
      "step_count": 6,
      "steps": [
        {
          "detail": "Set up an incline bench at a 45-degree angle.",
          "number": 1,
          "text": "Step:1 Set up an incline bench at a 45-degree angle."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "exercises_by_body_part": {
    "chest": [
      "barbell bench press",
      "barbell incline bench press"
    ]
  },
  "has_more": false,
  "limit": 2,
  "names": [
    "barbell bench press",
    "barbell incline bench press"
  ],
  "pool_size": 170,
  "requested_count": 2,
  "returned": 2,
  "seed": "week-1",
  "total_exercises": 170
}
```

### Check the API status

Ask ExerciseDB's health check whether the service is up. Use it to gate a longer workflow, or as a one-step check that the connection works. The free tier is rate limited, so this also surfaces a throttled connection before a bigger step hits it.

**Inputs**: None.

**Outputs**

- `attribution` (text): The credit to carry
- `base_url` (text): The host that was checked
- `details` (object): The health check's whole body, or null
- `message` (text): Whatever the health check said, or null
- `reachable` (true/false): True when the health check answered without an error
- `status_code` (number): The HTTP status it sent

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "base_url": "https://oss.exercisedb.dev/api/v1",
  "details": {
    "message": "ok",
    "success": true
  },
  "message": "ok",
  "reachable": true,
  "status_code": 200
}
```

### Filter exercises

Find exercises matching several criteria at once. Choosing more than one value in a field widens the search and adding a second field narrows it, so chest or back, with a barbell or dumbbell, means exactly that. This is the action to reach for when planning around what somebody actually has to hand.

**Inputs**

- Body parts (`body_parts`, list): Keep only exercises for these areas of the body. Picking several widens the search: chest and back returns both. Leave it empty for every area.
- Muscles (`muscles`, list): Keep only exercises that work these muscles. Picking several widens the search. Leave it empty for every muscle.
- Supporting muscles (`secondary_muscles`, list): Keep only exercises that work these muscles in support, rather than targeting them. ExerciseDB filters on supporting muscles separately from target muscles, so this is the field for 'anything that also works the triceps'. Leave it empty to ignore supporting muscles.
- Equipment (`equipment`, list): Keep only exercises that use this equipment. Picking several widens the search, so list everything available and the result is what can actually be done with it. Leave it empty for every kind.
- Name contains (`name_contains`, text): Keep only exercises whose name contains this text. Case and accents are ignored, and the match is literal rather than fuzzy, so 'incline' finds the incline variations and nothing else.
- How many to return (`limit`, number): How many exercises to return. ExerciseDB serves 25 a page and this follows its cursor for as many pages as the number needs, so the 25-per-request cap is not a ceiling here. Defaults to 25; a larger number costs proportionally more requests. From 1 to 1500. Default: `25`.

**Outputs**

- `attribution` (text): The credit to carry
- `body_parts_requested` (list): The body parts the filter was given
- `count` (number): How many are in this result
- `covers` (object)
- `equipment_requested` (list): The equipment the filter was given
- `exercise_ids` (list)
- `exercises` (list)
- `has_more` (true/false): True when more match
- `hint` (text): Set only when a muscle filter came back empty for a fixable reason: the muscle is never a target muscle, only a supporting one. Names the switch that would find it
- `include_secondary` (true/false): Whether supporting muscles counted
- `limit` (number): The limit actually used
- `muscles_requested` (list): The target muscles the filter was given
- `name_contains` (text): The text the names had to contain
- `names` (list)
- `returned` (number): How many came back
- `secondary_muscles_requested` (list): The supporting muscles the filter was given
- `total_exercises` (number): How many matched the filters before paging

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_parts_requested": [
    "chest"
  ],
  "count": 2,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "equipment_requested": [
    "barbell"
  ],
  "exercise_ids": [
    "EIeI8Vf",
    "3TZduzM"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    },
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "3TZduzM",
      "gif_url": "https://static.exercisedb.dev/media/3TZduzM.gif",
      "instructions": [
        "Set up an incline bench at a 45-degree angle.",
        "Lie down on the bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip, slightly wider than shoulder-width apart."
      ],
      "name": "barbell incline bench press",
      "secondary_muscles": [
        "shoulders",
        "triceps"
      ],
      "step_count": 6,
      "steps": [
        {
          "detail": "Set up an incline bench at a 45-degree angle.",
          "number": 1,
          "text": "Step:1 Set up an incline bench at a 45-degree angle."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "has_more": true,
  "hint": null,
  "include_secondary": false,
  "limit": 2,
  "muscles_requested": [],
  "name_contains": null,
  "names": [
    "barbell bench press",
    "barbell incline bench press"
  ],
  "returned": 2,
  "secondary_muscles_requested": [],
  "total_exercises": 191
}
```

### Find an exercise by name

Turn an exercise name into its record, without guessing. The name is matched exactly first and then as a substring, and a name matching several exercises is refused with the candidates listed rather than resolved to an arbitrary one. Use it to look up something a person named, where picking the wrong movement would be worse than asking again.

**Inputs**

- Exercise name (`name`, text, required): The name to look up. Case and accents are ignored.

**Outputs**

- `attribution` (text): The credit to carry
- `exercise` (object)

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "exercise": {
    "all_muscles": [
      "pectorals",
      "shoulders",
      "triceps"
    ],
    "body_part": "chest",
    "body_parts": [
      "chest"
    ],
    "equipment": "barbell",
    "equipments": [
      "barbell"
    ],
    "exercise_id": "EIeI8Vf",
    "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
    "instructions": [
      "Lie flat on a bench with your feet flat on the ground.",
      "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
      "Lift the barbell off the rack and hold it directly above your chest.",
      "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
      "Pause for a moment when the barbell touches your chest.",
      "Push the barbell back up to the starting position.",
      "Repeat for the desired number of repetitions."
    ],
    "name": "barbell bench press",
    "secondary_muscles": [
      "triceps",
      "shoulders"
    ],
    "step_count": 7,
    "steps": [
      {
        "detail": "Lie flat on a bench with your feet flat on the ground.",
        "number": 1,
        "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
      },
      {
        "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "number": 2,
        "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
      },
      {
        "detail": "Lift the barbell off the rack and hold it directly above your chest.",
        "number": 3,
        "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
      }
    ],
    "target_muscle": "pectorals",
    "target_muscles": [
      "pectorals"
    ]
  }
}
```

### Get an exercise

Get one exercise in full: its GIF, the muscle it targets, the muscles it also works, the body part, the equipment and every instruction step. Takes an exercise id or a name, so a step can feed it either an id from an earlier search or a name a person typed.

**Inputs**

- Exercise (`exercise`, text, required): The exercise to look up, by its id or by its name. An id such as 'EIeI8Vf' is used as given; anything else is matched against the catalogue's names, exactly first and then as a substring. A name that matches several exercises is refused with the candidates listed, rather than resolved to whichever happened to come first.

**Outputs**

- `attribution` (text): The credit to carry
- `exercise` (object)

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "exercise": {
    "all_muscles": [
      "pectorals",
      "shoulders",
      "triceps"
    ],
    "body_part": "chest",
    "body_parts": [
      "chest"
    ],
    "equipment": "barbell",
    "equipments": [
      "barbell"
    ],
    "exercise_id": "EIeI8Vf",
    "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
    "instructions": [
      "Lie flat on a bench with your feet flat on the ground.",
      "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
      "Lift the barbell off the rack and hold it directly above your chest.",
      "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
      "Pause for a moment when the barbell touches your chest.",
      "Push the barbell back up to the starting position.",
      "Repeat for the desired number of repetitions."
    ],
    "name": "barbell bench press",
    "secondary_muscles": [
      "triceps",
      "shoulders"
    ],
    "step_count": 7,
    "steps": [
      {
        "detail": "Lie flat on a bench with your feet flat on the ground.",
        "number": 1,
        "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
      },
      {
        "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "number": 2,
        "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
      },
      {
        "detail": "Lift the barbell off the rack and hold it directly above your chest.",
        "number": 3,
        "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
      }
    ],
    "target_muscle": "pectorals",
    "target_muscles": [
      "pectorals"
    ]
  }
}
```

### Get how to do an exercise

Get one exercise's instructions, numbered and ready to send. The steps come back both as a list and as one block of text, with the demonstration GIF and the muscles worked alongside them, so a workflow can drop the whole thing into an email or a message without assembling it.

**Inputs**

- Exercise (`exercise`, text, required): The exercise to look up, by its id or by its name. An id such as 'EIeI8Vf' is used as given; anything else is matched against the catalogue's names, exactly first and then as a substring. A name that matches several exercises is refused with the candidates listed, rather than resolved to whichever happened to come first.

**Outputs**

- `attribution` (text): The credit to carry
- `body_part` (text): The area of the body
- `equipment` (text): The equipment needed
- `exercise_id` (text): The dataset's id
- `gif_url` (text): The demonstration GIF
- `instructions` (list): The same steps as plain sentences
- `instructions_text` (text): Every step as one numbered block, ready to send
- `name` (text): The exercise's name
- `secondary_muscles` (list): The muscles worked as supporting ones
- `step_count` (number): How many steps
- `steps` (list): The steps, numbered
- `target_muscle` (text): The muscle targeted

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_part": "chest",
  "equipment": "barbell",
  "exercise_id": "EIeI8Vf",
  "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
  "instructions": [
    "Lie flat on a bench with your feet flat on the ground."
  ],
  "instructions_text": "1. Lie flat on a bench with your feet flat on the ground.",
  "name": "barbell bench press",
  "secondary_muscles": [
    "triceps",
    "shoulders"
  ],
  "step_count": 7,
  "steps": [
    {
      "detail": "Lie flat on a bench with your feet flat on the ground.",
      "number": 1,
      "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
    }
  ],
  "target_muscle": "pectorals"
}
```

### Get random exercises

Draw exercises at random, optionally from a narrowed pool. Use it for an exercise of the day, or to vary a routine without repeating yourself. Set a seed to make the draw repeatable, or leave it empty for something different each run.

**Inputs**

- How many (`count`, number): How many exercises to draw. Defaults to one. From 1 to 50. Default: `1`.
- Body parts (`body_parts`, list): Keep only exercises for these areas of the body. Picking several widens the search: chest and back returns both. Leave it empty for every area.
- Muscles (`muscles`, list): Keep only exercises that work these muscles. Picking several widens the search. Leave it empty for every muscle.
- Equipment (`equipment`, list): Keep only exercises that use this equipment. Picking several widens the search, so list everything available and the result is what can actually be done with it. Leave it empty for every kind.
- Repeatable seed (`seed`, text): Set this to any text to make the draw repeatable: the same seed over the same catalogue always picks the same exercises. Leave it empty for a different set every run.

**Outputs**

- `attribution` (text): The credit to carry
- `count` (number): How many were drawn
- `covers` (object)
- `exercise_ids` (list)
- `exercises` (list)
- `has_more` (true/false): Always false
- `limit` (number): The count asked for
- `names` (list)
- `pool_size` (number): How many were available to draw from
- `requested_count` (number): How many were asked for
- `returned` (number): How many were drawn
- `seed` (text): The seed used, if any
- `total_exercises` (number): The pool size

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "count": 1,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "exercise_ids": [
    "EIeI8Vf"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "has_more": false,
  "limit": 1,
  "names": [
    "barbell bench press"
  ],
  "pool_size": 1500,
  "requested_count": 1,
  "returned": 1,
  "seed": null,
  "total_exercises": 1500
}
```

### List body parts

The ten areas of the body the dataset files its exercises under, from ExerciseDB's own body-part endpoint. Use it to check a value before filtering on it, or to drive a loop over every area.

**Inputs**: None.

**Outputs**

- `attribution` (text): The credit to carry
- `body_parts` (list): The body part names, sorted
- `count` (number): How many there are
- `source` (text): The endpoint the names came from

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_parts": [
    "back",
    "cardio",
    "chest",
    "lower arms",
    "lower legs",
    "neck",
    "shoulders",
    "upper arms",
    "upper legs",
    "waist"
  ],
  "count": 10,
  "source": "/bodyparts"
}
```

### List equipment

The twenty-eight kinds of equipment the dataset names, from ExerciseDB's own equipment endpoint. These are the values the equipment filters accept, 'body weight' among them.

**Inputs**: None.

**Outputs**

- `attribution` (text): The credit to carry
- `count` (number): How many there are
- `equipments` (list): The equipment names, sorted
- `source` (text): The endpoint the names came from

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "count": 28,
  "equipments": [
    "assisted",
    "band",
    "barbell",
    "body weight",
    "cable",
    "dumbbell",
    "ez barbell",
    "kettlebell",
    "leverage machine",
    "medicine ball",
    "resistance band",
    "smith machine",
    "stability ball"
  ],
  "source": "/equipments"
}
```

### List exercises

Read the catalogue of 1,500 exercises, optionally narrowed to names matching some text. Each exercise comes back with its GIF, the muscles it works, the equipment it needs and its step-by-step instructions. Use 'Filter exercises' to narrow by body part, muscle or equipment.

**Inputs**

- Name contains (`name`, text): Keep only exercises whose name matches this text. ExerciseDB applies it itself, so it is one request rather than a search over everything.
- How many to return (`limit`, number): How many exercises to return. ExerciseDB serves 25 a page and this follows its cursor for as many pages as the number needs, so the 25-per-request cap is not a ceiling here. Defaults to 25; a larger number costs proportionally more requests. From 1 to 1500. Default: `25`.

**Outputs**

- `attribution` (text): The credit AscendAPI asks projects to carry
- `body_parts_requested` (list): The body parts the filter was given
- `count` (number): How many are in this result
- `covers` (object): What this result set spans, at a glance
- `equipment_requested` (list): The equipment the filter was given
- `exercise_ids` (list): Just the ids, ready to feed a later step
- `exercises` (list): The exercises returned
- `has_more` (true/false): True when the match is larger than what was returned
- `limit` (number): The limit actually used
- `muscles_requested` (list): The target muscles the filter was given
- `name_contains` (text): The text the names had to match, or null
- `names` (list): Just the names, ready to feed a later step
- `returned` (number): How many came back
- `secondary_muscles_requested` (list): The supporting muscles the filter was given
- `total_exercises` (number): How many ExerciseDB says match, before the limit

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_parts_requested": [],
  "count": 2,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "equipment_requested": [],
  "exercise_ids": [
    "EIeI8Vf",
    "3TZduzM"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    },
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "3TZduzM",
      "gif_url": "https://static.exercisedb.dev/media/3TZduzM.gif",
      "instructions": [
        "Set up an incline bench at a 45-degree angle.",
        "Lie down on the bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip, slightly wider than shoulder-width apart."
      ],
      "name": "barbell incline bench press",
      "secondary_muscles": [
        "shoulders",
        "triceps"
      ],
      "step_count": 6,
      "steps": [
        {
          "detail": "Set up an incline bench at a 45-degree angle.",
          "number": 1,
          "text": "Step:1 Set up an incline bench at a 45-degree angle."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "has_more": true,
  "limit": 2,
  "muscles_requested": [],
  "name_contains": null,
  "names": [
    "barbell bench press",
    "barbell incline bench press"
  ],
  "returned": 2,
  "secondary_muscles_requested": [],
  "total_exercises": 1500
}
```

### List exercises for a body part

Every exercise for one area of the body, matched exactly rather than fuzzily, so 'chest' returns the 191 chest exercises and nothing that merely mentions the word. The body part is picked from the ten the dataset uses.

**Inputs**

- Body part (`body_part`, text, required): The area of the body to pull exercises for, chosen from the ten the dataset uses. Matching is exact and case-insensitive, so this returns every chest exercise rather than everything that sounds like 'chest'.
- How many to return (`limit`, number): How many exercises to return. ExerciseDB serves 25 a page and this follows its cursor for as many pages as the number needs, so the 25-per-request cap is not a ceiling here. Defaults to 25; a larger number costs proportionally more requests. From 1 to 1500. Default: `25`.

**Outputs**

- `attribution` (text): The credit to carry
- `body_parts_requested` (list): The body parts the filter was given
- `count` (number): How many are in this result
- `covers` (object)
- `equipment_requested` (list): The equipment the filter was given
- `exercise_ids` (list)
- `exercises` (list)
- `has_more` (true/false): True when more match
- `hint` (text): Set only when a muscle filter came back empty for a fixable reason: the muscle is never a target muscle, only a supporting one. Names the switch that would find it
- `include_secondary` (true/false): Whether supporting muscles counted
- `limit` (number): The limit actually used
- `muscles_requested` (list): The target muscles the filter was given
- `name_contains` (text): The text the names had to contain
- `names` (list)
- `returned` (number): How many came back
- `secondary_muscles_requested` (list): The supporting muscles the filter was given
- `total_exercises` (number): How many matched the filters before paging

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_parts_requested": [
    "chest"
  ],
  "count": 2,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "equipment_requested": [
    "barbell"
  ],
  "exercise_ids": [
    "EIeI8Vf",
    "3TZduzM"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    },
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "3TZduzM",
      "gif_url": "https://static.exercisedb.dev/media/3TZduzM.gif",
      "instructions": [
        "Set up an incline bench at a 45-degree angle.",
        "Lie down on the bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip, slightly wider than shoulder-width apart."
      ],
      "name": "barbell incline bench press",
      "secondary_muscles": [
        "shoulders",
        "triceps"
      ],
      "step_count": 6,
      "steps": [
        {
          "detail": "Set up an incline bench at a 45-degree angle.",
          "number": 1,
          "text": "Step:1 Set up an incline bench at a 45-degree angle."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "has_more": true,
  "hint": null,
  "include_secondary": false,
  "limit": 2,
  "muscles_requested": [],
  "name_contains": null,
  "names": [
    "barbell bench press",
    "barbell incline bench press"
  ],
  "returned": 2,
  "secondary_muscles_requested": [],
  "total_exercises": 191
}
```

### List exercises for a muscle

Every exercise that works one muscle. By default this means the exercises that target it; turn on secondary muscles to also get the ones that work it as a supporting muscle, which roughly triples the answer for a muscle like the triceps. Only 19 of the 50 published muscles are ever targeted directly (the hands and the shins are only ever worked in support), so a muscle with no direct exercises comes back with a hint saying to turn secondary muscles on, rather than with a bare empty list.

**Inputs**

- Muscle (`muscle`, text, required): The muscle to pull exercises for, chosen from the fifty the dataset names. By default this finds the exercises that target it; turn on 'Include secondary muscles' to also find the ones that work it as a supporting muscle.
- Include secondary muscles (`include_secondary`, true/false): Also count an exercise when the muscle is worked as a supporting one rather than the one being targeted. Off by default, which is the stricter reading: a barbell bench press targets the pectorals and works the triceps, so this decides whether it counts as a triceps exercise. Default: `false`.
- How many to return (`limit`, number): How many exercises to return. ExerciseDB serves 25 a page and this follows its cursor for as many pages as the number needs, so the 25-per-request cap is not a ceiling here. Defaults to 25; a larger number costs proportionally more requests. From 1 to 1500. Default: `25`.

**Outputs**

- `attribution` (text): The credit to carry
- `body_parts_requested` (list): The body parts the filter was given
- `count` (number): How many are in this result
- `covers` (object)
- `equipment_requested` (list): The equipment the filter was given
- `exercise_ids` (list)
- `exercises` (list)
- `has_more` (true/false): True when more match
- `hint` (text): Set only when a muscle filter came back empty for a fixable reason: the muscle is never a target muscle, only a supporting one. Names the switch that would find it
- `include_secondary` (true/false): Whether supporting muscles counted
- `limit` (number): The limit actually used
- `muscles_requested` (list): The target muscles the filter was given
- `name_contains` (text): The text the names had to contain
- `names` (list)
- `returned` (number): How many came back
- `secondary_muscles_requested` (list): The supporting muscles the filter was given
- `total_exercises` (number): How many matched the filters before paging

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_parts_requested": [
    "chest"
  ],
  "count": 2,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "equipment_requested": [
    "barbell"
  ],
  "exercise_ids": [
    "EIeI8Vf",
    "3TZduzM"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    },
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "3TZduzM",
      "gif_url": "https://static.exercisedb.dev/media/3TZduzM.gif",
      "instructions": [
        "Set up an incline bench at a 45-degree angle.",
        "Lie down on the bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip, slightly wider than shoulder-width apart."
      ],
      "name": "barbell incline bench press",
      "secondary_muscles": [
        "shoulders",
        "triceps"
      ],
      "step_count": 6,
      "steps": [
        {
          "detail": "Set up an incline bench at a 45-degree angle.",
          "number": 1,
          "text": "Step:1 Set up an incline bench at a 45-degree angle."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "has_more": true,
  "hint": null,
  "include_secondary": false,
  "limit": 2,
  "muscles_requested": [],
  "name_contains": null,
  "names": [
    "barbell bench press",
    "barbell incline bench press"
  ],
  "returned": 2,
  "secondary_muscles_requested": [],
  "total_exercises": 191
}
```

### List exercises for a piece of equipment

Every exercise that uses one piece of equipment. Answers 'what can I do with only a kettlebell', and picking 'body weight' answers 'what can I do with nothing at all'.

**Inputs**

- Equipment (`equipment`, text, required): The equipment to pull exercises for, chosen from the twenty-eight kinds the dataset names. Pick 'body weight' for the exercises that need no kit at all.
- How many to return (`limit`, number): How many exercises to return. ExerciseDB serves 25 a page and this follows its cursor for as many pages as the number needs, so the 25-per-request cap is not a ceiling here. Defaults to 25; a larger number costs proportionally more requests. From 1 to 1500. Default: `25`.

**Outputs**

- `attribution` (text): The credit to carry
- `body_parts_requested` (list): The body parts the filter was given
- `count` (number): How many are in this result
- `covers` (object)
- `equipment_requested` (list): The equipment the filter was given
- `exercise_ids` (list)
- `exercises` (list)
- `has_more` (true/false): True when more match
- `hint` (text): Set only when a muscle filter came back empty for a fixable reason: the muscle is never a target muscle, only a supporting one. Names the switch that would find it
- `include_secondary` (true/false): Whether supporting muscles counted
- `limit` (number): The limit actually used
- `muscles_requested` (list): The target muscles the filter was given
- `name_contains` (text): The text the names had to contain
- `names` (list)
- `returned` (number): How many came back
- `secondary_muscles_requested` (list): The supporting muscles the filter was given
- `total_exercises` (number): How many matched the filters before paging

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_parts_requested": [
    "chest"
  ],
  "count": 2,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "equipment_requested": [
    "barbell"
  ],
  "exercise_ids": [
    "EIeI8Vf",
    "3TZduzM"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    },
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "3TZduzM",
      "gif_url": "https://static.exercisedb.dev/media/3TZduzM.gif",
      "instructions": [
        "Set up an incline bench at a 45-degree angle.",
        "Lie down on the bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip, slightly wider than shoulder-width apart."
      ],
      "name": "barbell incline bench press",
      "secondary_muscles": [
        "shoulders",
        "triceps"
      ],
      "step_count": 6,
      "steps": [
        {
          "detail": "Set up an incline bench at a 45-degree angle.",
          "number": 1,
          "text": "Step:1 Set up an incline bench at a 45-degree angle."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "has_more": true,
  "hint": null,
  "include_secondary": false,
  "limit": 2,
  "muscles_requested": [],
  "name_contains": null,
  "names": [
    "barbell bench press",
    "barbell incline bench press"
  ],
  "returned": 2,
  "secondary_muscles_requested": [],
  "total_exercises": 191
}
```

### List muscles

The fifty muscles the dataset names, from ExerciseDB's own muscle endpoint. These are the values the muscle filters accept, target and secondary alike.

**Inputs**: None.

**Outputs**

- `attribution` (text): The credit to carry
- `count` (number): How many there are
- `muscles` (list): The muscle names, sorted
- `source` (text): The endpoint the names came from

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "count": 50,
  "muscles": [
    "abs",
    "biceps",
    "calves",
    "delts",
    "forearms",
    "glutes",
    "hamstrings",
    "lats",
    "pectorals",
    "quads",
    "traps",
    "triceps",
    "upper back"
  ],
  "source": "/muscles"
}
```

### Search exercises

Search the catalogue when you do not know the exact words. The match is fuzzy across names, target muscles, body parts, equipment and secondary muscles, so 'chest push' finds press and push-up variations. Results keep their relevance ranking, best first, and the threshold sets how loose the matching is. This endpoint has no paging, so it returns every match at once; use the threshold to narrow a search that returns too much.

**Inputs**

- Search for (`query`, text, required): What to search for. It is matched against names, muscles, body parts and equipment at once, so a phrase like 'dumbbell shoulder' works.
- Fuzziness (`threshold`, number): How loose the matching is, from 0 for an exact match to 1 for very loose. Defaults to 0.3. Raise it when a search finds nothing, lower it when it finds too much. From 0 to 1. Default: `0.3`.

**Outputs**

- `attribution` (text): The credit to carry
- `count` (number): How many are in this result
- `covers` (object)
- `exercise_ids` (list)
- `exercises` (list)
- `has_more` (true/false): True when more match
- `limit` (number): The limit actually used
- `names` (list)
- `query` (text): What was searched for
- `ranked_by_relevance` (true/false): Always true here: this endpoint keeps its ranking
- `returned` (number): How many came back
- `threshold` (number): The fuzziness used, 0 exact to 1 very loose
- `total_exercises` (number): How many matched

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "count": 2,
  "covers": {
    "body_parts": [
      "chest"
    ],
    "equipments": [
      "barbell"
    ],
    "target_muscles": [
      "pectorals"
    ]
  },
  "exercise_ids": [
    "EIeI8Vf",
    "3TZduzM"
  ],
  "exercises": [
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "EIeI8Vf",
      "gif_url": "https://static.exercisedb.dev/media/EIeI8Vf.gif",
      "instructions": [
        "Lie flat on a bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
        "Lift the barbell off the rack and hold it directly above your chest.",
        "Lower the barbell slowly towards your chest, keeping your elbows tucked in.",
        "Pause for a moment when the barbell touches your chest.",
        "Push the barbell back up to the starting position.",
        "Repeat for the desired number of repetitions."
      ],
      "name": "barbell bench press",
      "secondary_muscles": [
        "triceps",
        "shoulders"
      ],
      "step_count": 7,
      "steps": [
        {
          "detail": "Lie flat on a bench with your feet flat on the ground.",
          "number": 1,
          "text": "Step:1 Lie flat on a bench with your feet flat on the ground."
        },
        {
          "detail": "Grasp the barbell with an overhand grip slightly wider than shoulder-width.",
          "number": 2,
          "text": "Step:2 Grasp the barbell with an overhand grip slightly wider than shoulder-width."
        },
        {
          "detail": "Lift the barbell off the rack and hold it directly above your chest.",
          "number": 3,
          "text": "Step:3 Lift the barbell off the rack and hold it directly above your chest."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    },
    {
      "all_muscles": [
        "pectorals",
        "shoulders",
        "triceps"
      ],
      "body_part": "chest",
      "body_parts": [
        "chest"
      ],
      "equipment": "barbell",
      "equipments": [
        "barbell"
      ],
      "exercise_id": "3TZduzM",
      "gif_url": "https://static.exercisedb.dev/media/3TZduzM.gif",
      "instructions": [
        "Set up an incline bench at a 45-degree angle.",
        "Lie down on the bench with your feet flat on the ground.",
        "Grasp the barbell with an overhand grip, slightly wider than shoulder-width apart."
      ],
      "name": "barbell incline bench press",
      "secondary_muscles": [
        "shoulders",
        "triceps"
      ],
      "step_count": 6,
      "steps": [
        {
          "detail": "Set up an incline bench at a 45-degree angle.",
          "number": 1,
          "text": "Step:1 Set up an incline bench at a 45-degree angle."
        }
      ],
      "target_muscle": "pectorals",
      "target_muscles": [
        "pectorals"
      ]
    }
  ],
  "has_more": false,
  "limit": 2,
  "names": [
    "barbell bench press",
    "barbell incline bench press"
  ],
  "query": "bench press",
  "ranked_by_relevance": true,
  "returned": 2,
  "threshold": 0.3,
  "total_exercises": 2
}
```

### Summarise the catalogue

See what the dataset actually holds: every body part, target muscle and piece of equipment, each with how many exercises carry it, commonest first. One step that says what is worth asking for, instead of paging through 1,500 records to find out.

**Inputs**: None.

**Outputs**

- `attribution` (text): The credit to carry
- `body_part_count` (number): How many body parts
- `body_parts` (list): Every body part with its exercise count, commonest first
- `equipment_count` (number): How many kinds
- `equipments` (list): Every kind of equipment with its count
- `target_muscle_count` (number): How many muscles
- `target_muscles` (list): Every target muscle with its count, commonest first
- `total_exercises` (number): How many exercises the catalogue holds

**Example output**

```json
{
  "attribution": "Exercise data by AscendAPI (ExerciseDB v1) - ascendapi.com",
  "body_part_count": 10,
  "body_parts": [
    {
      "exercise_count": 323,
      "name": "upper arms"
    },
    {
      "exercise_count": 257,
      "name": "upper legs"
    },
    {
      "exercise_count": 239,
      "name": "back"
    },
    {
      "exercise_count": 195,
      "name": "waist"
    },
    {
      "exercise_count": 191,
      "name": "chest"
    },
    {
      "exercise_count": 156,
      "name": "shoulders"
    },
    {
      "exercise_count": 63,
      "name": "lower legs"
    },
    {
      "exercise_count": 40,
      "name": "lower arms"
    },
    {
      "exercise_count": 33,
      "name": "cardio"
    },
    {
      "exercise_count": 3,
      "name": "neck"
    }
  ],
  "equipment_count": 28,
  "equipments": [
    {
      "exercise_count": 372,
      "name": "body weight"
    },
    {
      "exercise_count": 319,
      "name": "dumbbell"
    },
    {
      "exercise_count": 181,
      "name": "cable"
    },
    {
      "exercise_count": 170,
      "name": "barbell"
    },
    {
      "exercise_count": 91,
      "name": "leverage machine"
    }
  ],
  "target_muscle_count": 50,
  "target_muscles": [
    {
      "exercise_count": 195,
      "name": "abs"
    },
    {
      "exercise_count": 185,
      "name": "pectorals"
    },
    {
      "exercise_count": 162,
      "name": "glutes"
    },
    {
      "exercise_count": 162,
      "name": "biceps"
    },
    {
      "exercise_count": 161,
      "name": "triceps"
    }
  ],
  "total_exercises": 1500
}
```
