Skip to content
skcal
Esc
↑↓navigate↵open⌘Jpreview

List a day's workouts

Returns the caller’s workouts whose start time falls on the given local day, newest first.

GET/api/workouts
Authorization
__Secure-better-auth.session_tokenAPI key · cookierequired

Better Auth session. Signing in (Google or email magic link) sets an HttpOnly session cookie that scopes every request to that account. The web app and CLI use this; agents use the OAuth 2.1 flow of the MCP server.

or
AuthorizationBearer token · headerrequired

Personal API key sent as Authorization: Bearer skcal_…. Create and scope keys in the app under your profile → API keys. Keys default to full access; a scoped key is limited to its granted resource:action permissions and cannot manage other keys.

Query parameters
datestring<date>

Local day (YYYY-MM-DD). Defaults to today.

tzinteger

Client timezone offset in minutes (getTimezoneOffset) used to bound the local day.

Responses
200

The day's workouts.

Array of Workout
idstring<uuid>required

Workout identifier.

sourcestringrequired

Where the workout came from; manual for described/photographed logs.

Allowed:manualapple_healthgarminstrava
activityTypestringrequired

Normalized activity type (run, ride, swim, walk, hike, strength_training, yoga, rowing, elliptical, crossfit, other).

summarystringrequired

Short AI-generated title.

descriptionstringrequired

The user's original words (or the summary for photo-only logs).

startedAtintegerrequired

Start time as Unix milliseconds.

durationSinteger | nullrequired

Elapsed duration in seconds.

movingDurationSinteger | nullrequired

Moving time in seconds, when distinct from elapsed.

distanceMnumber | nullrequired

Distance in meters.

elevationGainMnumber | nullrequired

Elevation gain in meters.

energyKcalnumber | nullrequired

Active energy in kilocalories.

avgHrinteger | nullrequired

Average heart rate in bpm.

maxHrinteger | nullrequired

Max heart rate in bpm.

avgPowerWnumber | nullrequired

Average power in watts.

avgCadencenumber | nullrequired

Average cadence (spm or rpm as reported).

exercisesWorkoutExercise[]required

Strength breakdown; empty for pure cardio.

Show properties
Array of WorkoutExercise
exercisestringrequired

Exercise name as the user gave it.

setsinteger | nullrequired

Number of sets, when stated.

repsinteger | nullrequired

Reps per set, when stated.

weightLbnumber | nullrequired

Working weight in pounds, when stated.

durationSinteger | nullrequired

Duration in seconds for timed pieces, when stated.

distanceMnumber | nullrequired

Distance in meters for distance pieces, when stated.

notesstring | nullrequired

Anything else the user said about the exercise.

createdAtintegerrequired

Row creation time as Unix milliseconds.

400

The request body or parameters failed validation.

errorstringrequired

Human-readable failure reason.

detailstring

Optional extra context, present on upstream failures.

Try it
Server
Authorization
Parameters
Request
curl -X GET 'https://app.skcal.fit/api/workouts' \
  -H 'Cookie: __Secure-better-auth.session_token=YOUR_API_KEY' \
  -H 'Accept: application/json'
Response
[
  {
    "id": "9c2d1e4f-7a8b-4c5d-9e0f-1a2b3c4d5e6f",
    "source": "manual",
    "activityType": "run",
    "summary": "5k run + pullups",
    "description": "ran 5k easy, then 3x10 pullups",
    "startedAt": 1783100000000,
    "durationS": 1680,
    "movingDurationS": null,
    "distanceM": 5000,
    "elevationGainM": null,
    "energyKcal": 320,
    "avgHr": 148,
    "maxHr": null,
    "avgPowerW": null,
    "avgCadence": null,
    "exercises": [
      {
        "exercise": "pullups",
        "sets": 3,
        "reps": 10,
        "weightLb": null,
        "durationS": null,
        "distanceM": null,
        "notes": null
      }
    ],
    "createdAt": 1783100001000
  }
]

Was this page helpful?