# Workouts

> https://meetkeely.com/developers/api/workouts · Updated 2026-11-06 · Keely, by Metrica Fit LLC

## GET /v1/workouts

- **Scope:** `workouts`; with `days` too, each workout carries the local `date` of the day that lists it
- **Query:** `from`, `to` (`YYYY-MM-DD`), at most 92 days; the last 14 by default

Without `days`, workouts are listed by their start, between `from` at 00:00 UTC and `to` at 24:00 UTC, `date` is `null`, and a `note` says so.

```json Response
{
  "from": "2026-09-14",
  "to": "2026-09-27",
  "count": 1,
  "workouts": [
    {
      "date": "2026-09-27",
      "id": "5f3c0e1d2b4a6978",
      "start": "2026-09-27T09:20:00Z", "end": "2026-09-27T10:14:00Z", "duration_minutes": 54,
      "activity": "Running", "activity_id": "run", "kind": "training",
      "added_by_person": false, "measured": true,
      "measured_from": "a recording another app saved to Apple Health (a watch or chest strap)",
      "load": 176.4, "average_hr_bpm": 158.2, "max_hr_bpm": 181,
      "zone_minutes": { "z1": 0, "z2": 12, "z3": 10, "z4": 24, "z5": 2 },
      "class": "Threshold", "recovery_hours": 19.8, "hr_recovery_1min_bpm": 31,
      "legs": [
        { "kind": "run", "start": "2026-09-27T09:20:00Z", "end": "2026-09-27T09:45:00Z", "duration_minutes": 25, "activity": "Running", "load": 82.1, "average_hr_bpm": 159.4 },
        { "kind": "walk", "start": "2026-09-27T09:45:00Z", "end": "2026-09-27T09:55:00Z", "duration_minutes": 10, "activity": "Walking", "load": 6.2, "average_hr_bpm": 128.3 },
        { "kind": "run", "start": "2026-09-27T09:55:00Z", "end": "2026-09-27T10:14:00Z", "duration_minutes": 19, "activity": "Running", "load": 88.1, "average_hr_bpm": 160.8 }
      ]
    }
  ],
  "as_of": "2026-09-27T15:20:00Z",
  "methodology": "https://meetkeely.com/methodology"
}
```

- **`kind`** is `training` or `recovery` (a sauna, a cold plunge, a massage), and **`class`** the training workout’s zone mix: VO₂ max, Threshold, Tempo, Endurance, Easy, Recovery or Mixed. [How workouts are found and classed](https://meetkeely.com/methodology#workouts).
- **`measured`** is `false` for an activity the person added for a time the band has no heart rate for: its Load, zones and heart rate are `null`, and a `note` says why. **`measured_from`** says whether the heart rate came from the band or from a recording another app saved to Apple Health.
- **`legs`** appear on an event of several sports (a triathlon, a brick), each leg with its own Load and heart rate; a `transition` leg has neither.
- **`unnamed`** marks a workout the person hasn’t named yet; **`suggested_activity`** is Keely’s guess from their past workouts.

## GET /v1/workouts/{id}

- **Scope:** `workouts`
- **Path:** `id`, the workout’s
- **Errors:** `404 not_found` for an id that doesn’t exist, or a workout the person removed

One workout, shaped as above, in `workout`.
