Skip to content

Changelog

What's new on the SweatStack platform.

2026-06-17

Duration-indexed fatigue mean-max (by=duration). GET /api/v1/activities/longitudinal-mean-max accepts by=duration (with after, for power) to return the curve indexed by duration instead of by intensity, sampled at your durations (or a default grid). It is computed by a new segment-level engine that is exact on the adaptive data and several times faster on heavy multi-state requests.

Fatigue after fixes. Some after values returned HTTP 500 or an inconsistent curve (a lower fatigue state reading below a higher one); both are fixed. Fatigue states that no ride reaches are now omitted from the response rather than returned as an empty placeholder row, so derive which requested states were empty by comparing against your request.

2026-06-16

Fatigue-state mean-max. GET /api/v1/activities/longitudinal-mean-max accepts an optional, repeatable after parameter. Each value computes the mean-max over the part of every ride after that much accumulated work (kJ for power) or distance (meters for speed), then envelopes across rides. Compare your 5-minute power fresh versus after 1500 kJ, for example. Up to 5 states per request. The date range is capped at one year when after is used, and the response gains an after column. Distance-based fatigue (for speed) is experimental.

2026-06-15

Sport values now follow the Open Sport Taxonomy. Sports across the API are modeled by OpenSportTaxonomy (OST): a dotted code plus + modifiers, e.g. cycling.road, cycling+stationary, cycling.time_trial. Responses return OST values, requests should send them, and sports newer than the platform's bundled taxonomy are preserved rather than rejected.

Breaking change. Some sport values changed. Update any hardcoded sport strings. We coordinated with affected app developers ahead of the rollout so existing integrations kept working.

  • cycling.trainercycling+stationary
  • running.treadmillrunning+stationary
  • cycling.ttcycling.time_trial
  • cycling.mountainbikecycling.mountain
  • cross_country_skiingxc_skiing
  • unknowngeneric

Faster longitudinal queries. /api/v1/activities/longitudinal-data and /api/v1/activities/longitudinal-mean-max are substantially faster, most noticeably over large date ranges.

2026-06-05

Auto-filled dailies from Garmin Health. Connect Garmin Health and your daily measures (resting heart rate, HRV, sleep duration, body mass, body fat %) fill in automatically via push, with historical backfill. Dailies responses now separate status (stored / estimated / missing) from source (provenance). GET /api/v1/dailies/{measure} returns stored values by default. Pass interpolate=true for estimates.

Co-branded coach portal. Apps can request a co-branded SweatStack Portal link (carrying your app's name and logo, with an optional return URL) so coaches land on a familiar page to create and manage teams, invite athletes, and view rosters. Sign-in and email verification are handled inline.

2026-05-22

Scheduled workouts (beta). POST / GET / DELETE /api/v1/workouts/schedule schedule structured workouts, with asynchronous fanout to Garmin Connect (running and speed-based sports in this first version). Workout responses include application_id / application_name, and the list endpoint accepts an ?application_id= filter.

2026-04-22

Team listing endpoints. GET /api/v1/teams/ lists teams you own or are a member of. GET /api/v1/teams/authorized lists teams you've authorized to access your data.

2026-03-27

Dailies. Daily health measures (body mass, resting heart rate, HRV, sleep) now have a dedicated API.

Tests. Structured performance evaluations (lactate, VO2max, FTP) are now a first-class entity.

Application metadata. Apps can attach per-app JSON to activities, traces, and users via PUT /api/v1/{entity}/app-metadata. Lets you store app-specific annotations without running your own database. Limits: 1 KB on activities and traces, 4 KB on users.

Roller skiing is now a sub-sport of cross-country skiing.

Breaking change. Trace.vo2 is now mL/min absolute (previously L/min). Relative VO2 (mL/kg/min) can be derived from body mass via dailies.

2026-03-13

Date-range queries on longitudinal endpoints. /api/v1/activities/longitudinal-mean-max and /api/v1/activities/longitudinal-accumulated-work-duration accept start and end query parameters.

Multi-sport longitudinal queries. Both endpoints support repeated sport parameters (e.g. ?sport=cycling.road&sport=cycling.time_trial).

Deprecation: date and window_days on the longitudinal endpoints. Use start and end instead. The old parameters still work.

Deprecation: plural sports query parameter. Use repeated singular sport instead. The old parameter still works on every endpoint.

2026-03-12

CSV upload. The activity upload endpoint accepts .csv alongside .fit. Required: timestamp column (ISO 8601), sport form parameter, internal metric names for the data columns.

Team-delegated tokens. POST /oauth/delegated-token accepts an optional team_id, letting team members obtain delegated tokens for users authorized to the team. The issued token includes an org claim.

Team user listing. GET /api/v1/teams/{team_id}/users returns users authorized to a team. Available to any team member.

Managed users get full history regardless of subscription plan. Previously they inherited the FREE plan's 10-day cap.

2026-02-25

App publishing flow. /applications/{id}/publish walks you through publishing your app to the App Directory. Client-side apps hosted on SweatStack Pages get a one-click publish path with sensible defaults.

2026-02-24

List your applications. GET /api/v1/applications returns the applications owned by the authenticated user.

2026-02-13

You can now manage and delete your own applications from the /apps page.

2026-02-12

Refresh tokens for public clients. Add the offline_access scope to your authorization request to get a refresh token.

Create applications via API. POST /api/v1/applications creates applications, primarily for local development workflows.

2026-02-11

SweatStack Pages static assets. Upload static assets directly for your application's hosted page.

2026-02-10

Faster timeseries queries. Activity Parquet files are now 50–70% smaller, with optimized dtypes and zstd compression. Reads are noticeably faster.

2026-01-23

Passwordless authentication. SweatStack uses magic links via email exclusively. Passwords are gone. Verification emails now include the name of the third-party app that triggered registration.

2026-01-07

Custom durations on mean-max endpoints. Optional durations query parameter to request specific durations.

Private applications. You can now create applications that aren't publicly listed in the App Directory.

2026-01-05

Managed users. Create and manage users on behalf of someone else (e.g. a coach managing an athlete's account). Useful for team and delegated-access scenarios.

2025-12-23

Teams. Group users and applications, manage permissions across multiple parties.

2025-12-12

Profile status. GET /api/v1/profile/status returns the health of an account's data connections (Garmin, Intervals.icu, etc.).

2025-12-09

Garmin Connect permissions. Integration responses now include the user's Garmin permission set. The app warns when the historical-data-export permission is missing, which is what enables backfill.


For the Python client release history, see PyPI.