Stride

Search Documentation

Search for articles, guides, and more

← API overview

Plan an activity

POST/v1/athletes/{athlete_id}/activitiesrequires activities.write

Put a planned session on the athlete's calendar.

To prescribe a structured workout, send its workout_id (or slug) from the workout endpoints: the session gets the workout's intervals, which sync to the athlete's devices, and its duration, distance and training score. type and name then default to the workout's.

Without a workout, supply any two of duration, distance, intensity, training score and pace, and Stride derives the rest: a two-hour ride at 0.75 intensity has a training score whether or not you send one. planned_at is local wall-clock time, on the same terms as every other timestamp in this API.

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.

Example

bash
curl -X POST "https://api.stride.is/v1/athletes/{athlete_id}/activities" \
  -H "Authorization: Bearer $STRIDE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ }'

Response201

Created. The Location header points at the new resource.

  • 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.

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.
  • 422The request was understood but could not be carried out: most often an upload that produced no activity.
  • 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.