Documentation

Keely for developers

Workouts

Every workout and activity with its sport, times, Load, heart rate and zones: a range of them, or one by its id.

Updated

On this page
  1. GET /v1/workouts
  2. GET /v1/workouts/{id}

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.

  • kind is training or recovery (a sauna, a cold plunge, a massage), and class the training workout’s zone mix: VO2 max, Threshold, Tempo, Endurance, Easy, Recovery or Mixed. How workouts are found and classed.
  • 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.
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"
}

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.