For sports scientists, coaches and analysts
Ask a season of training a question.
An athlete's activities, best efforts, lab tests and daily measures, one request each, ready for analysis. Use the Python SDK, or read the Parquet in the tools you already use. Start with your own data, then add the athletes who share theirs with you.
from datetime import date, timedelta
import sweatstack
sweatstack.authenticate()
# Your best power at every duration this past year:
# fresh, and after 1,000 and 2,000 kJ of work
curves = sweatstack.activities.longitudinal.mean_max(
sport="cycling",
metric="power",
start=date.today() - timedelta(weeks=52),
after=[0, 1000, 2000],
output="pandas",
)
One request, no pipeline. The result is a DataFrame with one row per duration and fatigue state, and the activity that set each best effort.
What you can ask¶
-
A season of samples
Every sample of every activity in a date range, for the metrics you choose, in one DataFrame. Resample by week, compare sports, find the sessions that matter.
-
Best efforts, fresh and tired
The best power or speed at every duration, across a season or within one activity. Add fatigue states to see the curve after 1,000 or 2,000 kJ of work.
-
Time at or above any intensity
Accumulated work duration: for every intensity, how long the athlete was at least that hard. A record of demonstrated capacity, without zone boundaries. In beta.
-
Thresholds and zones
FatMax, thresholds, critical power and VO2max, from the athlete's history or from a lab test, each labeled with where it came from. Zones are cut from them. In beta, in the API.
-
Lab and field together
Lactate and VO2max tests, and single lactate or RPE readings. SweatStack links each reading to the activity it was taken in.
-
Daily measures
Body mass, resting heart rate, HRV and sleep, one value per day, next to the training that came before it.
Whose data¶
Your own. Sign in, connect the accounts you record with, or upload your FIT files. Everything above works on your own history from the first day.
Athletes who share with you. An athlete shares their data with you from their SweatStack account, and can stop sharing at any time. In Python, you act for each of them with a delegated client:
from datetime import date, timedelta
from sweatstack import Client
coach = Client()
me = coach.whoami()
seasons = {}
for athlete in coach.users.list():
if athlete.id == me.id:
continue
seasons[athlete.display_name] = coach.delegated_client(athlete).activities.longitudinal.data(
sport=["running"],
start=date.today() - timedelta(weeks=26),
metrics=["speed", "heart_rate"],
)
A team's roster. Athletes authorize the team once, and the whole staff works from the same consent. See SweatStack for Teams.
Where you work¶
-
A script or a notebook
The Python SDK returns pandas, Polars or Arrow, and caches responses on disk while you iterate. One
uv runand a script is running. -
The browser
SweatStack Console is a Python prompt in your browser, already signed in, with plotting. Nothing to install.
-
An app for others
When an analysis is worth sharing, turn it into a Streamlit app that your athletes or staff sign in to.
-
With your AI assistant
Install the SweatStack skills, and Claude Code, Cursor or Codex writes analysis code against the real SDK.
Built on open tools¶
The parts of sports analysis that every team rebuilds should be shared. Our FIT parser, a scikit-learn compatible library for intensity-duration modeling, the sport taxonomy and a corpus of broken FIT files are open source, and none of them needs a SweatStack account. Open source at SweatStack →
Planning a study?¶
Email us before you plan around SweatStack. We'll tell you what it does for a study today, and what it doesn't yet. [email protected]
Ask your first question today
Accounts are free. Sign in, connect your data, and run the first query in a few minutes.