Stride

Search Documentation

Search for articles, guides, and more

← API overview

Get the calendar day by day

GET/v1/athletes/{athlete_id}/daysrequires activities.read

One row per date, carrying everything Stride holds against that date rather than against a workout: the annotations on the athlete's calendar (races, holidays, illness, injury, rest days, notes), that day's wellness readings, the night's sleep, where the date falls in the menstrual cycle, and the sessions on it.

This is the endpoint for questions about context and readiness - why a session went the way it did, what the athlete had on around it, whether they were ill or away - where the activities endpoint shows only the training itself.

The cycle section requires the cycle.read scope and is omitted without it. The sleep section requires sleep.read, and annotations requires calendar.read; sections a token cannot see are left out rather than failing the request.

Path parameters

  • athlete_idstringrequired

    The athlete to act on. `me` is the athlete who authorized this token; any other ID must be an athlete they coach.

Query parameters

  • startstring

    Start of the window, as RFC 3339 or YYYY-MM-DD. May be in the future.

    e.g. 2026-08-01

  • endstring

    End of the window, as RFC 3339 or YYYY-MM-DD. May be in the future, to include planned sessions.

    e.g. 2026-09-01

  • datesstring

    Comma-separated explicit dates (YYYY-MM-DD) instead of a continuous window, for cherry-picking days that are not adjacent.

  • includestring

    Comma-separated sections to return, to keep the response small. Omit for all of them.

    e.g. annotations,activities

Example

bash
curl -X GET "https://api.stride.is/v1/athletes/{athlete_id}/days" \
  -H "Authorization: Bearer $STRIDE_TOKEN"

Response200

Success.

  • daysobject[]always present
    • activitiesobject[]
      • ascent_metersinteger

        Total climbing in metres. A value the athlete entered wins over the recorded one.

      • avg_heart_rateinteger

        Average heart rate in bpm: the plain mean of the recording, sensor dropouts excluded. For a session synced without a file, the average its provider reported.

      • avg_power_wattsinteger

        Average power in watts, where a power meter was recording.

      • descriptionstring
      • distance_metersinteger

        Distance covered in metres. A value the athlete entered wins over the recorded one.

      • duration_secondsinteger

        Total elapsed time in seconds. Present once the session is completed, whether recorded or entered by hand; a value the athlete entered wins over the recorded one.

      • feelinteger

        How the session felt to the athlete, 1 (terrible) to 5 (great).

      • has_workoutboolean

        True when a structured workout, with intervals, is prescribed for the session. A planned session without one is a placeholder that sends no intervals to the athlete's devices.

      • idstringalways present
      • kilojoulesinteger

        Mechanical work done in kilojoules, from a power meter. Absent without one.

      • moving_time_secondsinteger

        Time spent moving in seconds, pauses excluded. Present once the session is completed, whether recorded or entered by hand; a value the athlete entered wins over the recorded one.

      • namestring
      • planned_atstring

        When the session is planned for, in the athlete's local wall-clock time with a Z suffix, on the same terms as started_at. Absent for an unplanned session.

      • planned_avg_power_wattsinteger

        Planned average power in watts: the plain time-weighted mean, not normalised power. For a structured ride it is read from the intervals against the athlete's FTP on the day; otherwise it is what the coach entered, or derived from planned work and duration.

      • planned_distance_metersinteger

        Planned distance in metres.

      • planned_duration_secondsinteger

        Planned duration in seconds.

      • planned_intensitynumber

        Planned intensity as a fraction of threshold, e.g. 0.75.

      • planned_kilojoulesinteger

        Planned mechanical work in kilojoules. For a structured ride it is the sum of every interval's power times its duration; otherwise it is what the coach entered, or derived from planned average power and duration. Always consistent with planned_avg_power_watts x planned_duration_seconds / 1000, to rounding.

      • planned_pace_seconds_per_kmnumber

        Planned pace in seconds per kilometre.

      • planned_training_scoreinteger

        Planned training load for the session.

      • recording_withheldboolean

        True when the session was completed but its recording came from Garmin Connect, which Stride may not share with other apps. The planned fields are present; the recorded ones are absent.

      • rpeinteger

        The athlete's rate of perceived exertion, 1 (easy) to 10 (maximal).

      • sourcestring

        Where the recording came from, e.g. GARMIN, WAHOO, STRIDE. STRIDE means the Stride app recorded it.

      • started_atstring

        When the session started, in the athlete's local wall-clock time with a Z suffix. This is NOT a UTC instant: read the athlete's timezone from the athlete endpoint to interpret it. Absent for a session that has not happened yet.

      • training_scoreinteger

        Training load of the completed session, scored against the athlete's thresholds on the day. Absent for a session that has not happened.

      • typestringalways present

        The sport, e.g. RIDE, RUN, SWIM.

      • weighted_heart_rateinteger

        Heart rate in bpm, weighted towards the harder parts of the session rather than a flat average.

    • annotationsobject[]
      • all_daybooleanalways present
      • descriptionstring
      • end_datestringalways present
      • end_timestring
      • event_prioritystring
      • event_typestring
      • idstringalways present
      • sourcestring
      • start_datestringalways present
      • start_timestring
      • titlestringalways present
      • typestringalways present
    • cycleobject
      • basal_body_temp_celsiusnumber
      • cervical_mucusstring
      • cycle_lengthinteger
      • day_in_cycleinteger
      • flowstring
      • in_fertile_windowboolean
      • in_periodboolean
      • is_period_startboolean
      • is_predicted_cycleboolean
      • is_pregnantboolean
      • notesstring
      • ovulation_teststring
      • period_lengthinteger
      • period_start_datestring
      • phase_typestring
      • sourcestring
      • symptomsstring[]
    • datestringalways present
    • metricsobject
    • sleepobject[]
      • average_heart_ratenumber
      • average_hrvnumber
      • awake_secondsinteger
      • consistency_percentagenumber
      • datestringalways present
      • deep_sleep_secondsinteger
      • disturbancesinteger
      • efficiency_percentagenumber
      • end_timestring
      • idstringalways present
      • is_napboolean
      • light_sleep_secondsinteger
      • lowest_heart_ratenumber
      • performance_percentagenumber
      • rem_sleep_secondsinteger
      • respiratory_ratenumber
      • sleep_cyclesinteger
      • sourcestring
      • start_timestring
      • total_in_bed_secondsinteger
      • total_sleep_secondsinteger
  • noticestring

    Set when data synced from Garmin Connect was left out: sessions, wellness readings, sleep or cycle records. Read it before concluding the athlete did not train or did not record.

Errors

Every error is an RFC 9457 problem document. Branch on itscode, which is stable;detail is prose and may be reworded.

  • 400The request was malformed: an unparseable date, an unknown enum value, or a parameter combination that cannot be satisfied.
  • 401No access token was supplied, or it is not valid for this API.
  • 402The Stride account the token belongs to has no active subscription or trial.
  • 403The token does not hold the scope this endpoint requires, or may not act on the athlete or team named.
  • 404No such resource, or it is not visible to this token. The two are deliberately indistinguishable.
  • 405The path exists but does not serve this method. The Allow header lists the ones it does.
  • 429A rate limit was exceeded. Retry after the period in the Retry-After header.
  • 500Something failed on Stride's side. The failure is logged with a trace ID.