Stride

Search Documentation

Search for articles, guides, and more

← API overview

Upload a recorded activity file

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

Send a recording and Stride imports it, returning the activity it created.

The body is multipart/form-data with the recording in a file part. FIT and TCX are accepted, gzipped or not, up to 32MB. Import is synchronous: when this returns 201 the activity exists and its analysis is under way.

A file that produces no activity returns 422. That covers both a recording Stride already holds, which deduplication drops, and a file we cannot read - the two are not distinguishable at import, so the response says both rather than guessing.

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}/uploads" \
  -H "Authorization: Bearer $STRIDE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ }'

Response 201

Created. The Location header points at the new resource.

  • ascent_metersinteger

    Total climbing in metres.

  • avg_power_wattsinteger

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

  • descriptionstring
  • distance_metersinteger

    Distance covered in metres.

  • duration_secondsinteger

    Total elapsed time in seconds.

  • feelinteger

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

  • idstringalways present
  • 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_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_pace_seconds_per_kmnumber

    Planned pace in seconds per kilometre.

  • planned_training_scoreinteger

    Planned training load for the session.

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

  • 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 its code, 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.