Stride

Search Documentation

Search for articles, guides, and more

← API overview

Get the mean-max power curve

GET/v1/athletes/{athlete_id}/power-curverequires activities.read

Best average power for every duration from one second to two hours over a window, each point carrying its change against a comparison window.

fatigue_curves is the durability picture: best power sustained *after* the athlete had already done 10, 20, 30, 40 or 50 kJ/kg of work. Comparing a fatigue curve to the fresh curve at the same duration is how you assess whether an athlete holds power deep into long rides.

The comparison window defaults to the equally long period immediately before the primary one, which is what a coach means by "versus last block". Power curves are a cycling concept, so this defaults to RIDE.

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

  • comparison_startstring

    Start of the window to compare against. Defaults to the equally long period immediately before the primary window.

  • comparison_endstring

    End of the comparison window. Defaults to the start of the primary window.

  • activity_typeenum

    Restrict to one sport. Defaults to RIDE.

    GENERIC · RUN · RIDE · SWIM · STRENGTH · YOGA · WALK · HIKE · SKI

  • include_heart_rateboolean

    Include the matching mean-max heart rate curve.

  • full_curveboolean

    Return every recorded window instead of the curated set of key durations. Verbose; only worth it when you need the exact shape of the curve.

Example

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

Response 200

Success.

  • activity_typestringalways present
  • comparison_windowstring
  • fatigue_curvesobject[]
    • kjnumber
    • kj_per_kgnumberalways present
    • pointsobject[]always present
      • activity_idstring
      • comparison_wattsinteger
      • delta_percentnumber
      • delta_wattsinteger
      • durationstringalways present
      • improved_on_comparisonboolean
      • offset_secondsinteger
      • secondsintegeralways present
      • wattsintegeralways present
      • watts_per_kgnumber
    • start_offset_secondsinteger
    • weight_kgnumber
  • heart_rateobject[]
    • activity_idstring
    • bpmintegeralways present
    • durationstringalways present
    • secondsintegeralways present
  • pointsobject[]always present
    • activity_idstring
    • comparison_wattsinteger
    • delta_percentnumber
    • delta_wattsinteger
    • durationstringalways present
    • improved_on_comparisonboolean
    • offset_secondsinteger
    • secondsintegeralways present
    • wattsintegeralways present
    • watts_per_kgnumber
  • power_distributionobject
    • bucket_width_wattsintegeralways present
    • bucketsobject[]always present
      • from_wattsintegeralways present
      • secondsintegeralways present
      • to_wattsintegeralways present
  • user_idstringalways present
  • windowstringalways present

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