For app developers, performance staff and sports scientists
_
Secure and private by default. Athletes sign in and choose what to share. You get the raw data, plus the building blocks everyone needs, from training zones to best efforts.
from fastapi import FastAPI
from sweatstack.fastapi import configure, instrument, AuthenticatedUser
configure(
client_id="your-client-id",
client_secret="your-client-secret",
session_secret="your-fernet-key",
app_url="http://localhost:8000",
)
app = FastAPI()
instrument(app)
@app.get("/activities")
def activities(user: AuthenticatedUser):
return user.client.activities.list(limit=10)
from datetime import date, timedelta
from sweatstack import Client
coach = Client()
team_id = "team_123"
# Each athlete who authorized your team: best power at every duration, last 90 days
curves = {}
for athlete in coach.teams.users(team_id):
athlete_client = coach.delegated_client(athlete, team_id=team_id)
curves[athlete.display_name] = athlete_client.activities.longitudinal.mean_max(
sport="cycling",
metric="power",
start=date.today() - timedelta(days=90),
)
from datetime import date, timedelta
import polars as pl
import sweatstack
sweatstack.authenticate()
curves = sweatstack.activities.longitudinal.mean_max(
sport="cycling",
metric="power",
start=date.today() - timedelta(weeks=52),
after=[0, 1000, 2000],
output="polars",
)
# Durability: the share of your fresh power left after 1,000 and 2,000 kJ
durability = curves.with_columns(
retained=pl.col("power") / pl.col("power").first().over("duration", order_by="after")
)
# Best power at every duration, fresh and after 1,000 kJ of work
curl "https://app.sweatstack.no/api/v1/activities/longitudinal-mean-max?sport=cycling&metric=power&start=2026-01-01&after=0&after=1000" \
-H "Authorization: Bearer YOUR_TOKEN"
Who builds on SweatStack¶
-
App developers
Products athletes sign in to. Sign-in, consent and years of each athlete's history are there on the first day, so you start on the product.
-
Performance staff
Tools for your staff, built around your roster. Athletes consent to the team once, and every tool the team builds can use that consent.
-
Sports scientists
Analysis and research on your own data, or on data that athletes share with you. Activity data comes as Parquet, ready for the tools you already use: pandas, Polars, R or DuckDB.
Core vs context¶
Getting a training app to work is easy. Getting it to work for real athletes is where it gets hard: access tokens that don't leak, a FIT parser that copes with every device, webhooks nobody else can call, and a record of who agreed to share which health data. Hand-written or generated, that's usually the hacky part of an app. It works in the demo, then fails the first real user, the first security review or the first partner audit.
No athlete picks your app for any of it. SweatStack is that part, already built and running in production. You build the coaching logic, the performance models and the experience athletes do pick you for.
On a team or in a lab, the hacky part looks different: exported files, the spreadsheet rebuilt every Monday, the consent form on paper. SweatStack replaces that too.
What's in SweatStack¶
Built for sport¶
Raw timeseries when you want the data. Sports science on top when you want the answer.
-
A season in one request
Every sample of a season's activities, or the best effort at every duration, in one request. Ask for the best efforts after 1,000 kJ of work too, and see how an athlete holds up when tired.
-
The athlete's physiology
Training zones, thresholds and an intensity-duration model, from each athlete's own history. Every threshold says where it came from: the model, a lab test or a person. In beta.
-
Lab and field together
Lab tests, lactate readings and RPE sit next to the activities they belong to, with daily measures like resting heart rate and HRV.
-
Open where it should be
The workout format and the sport taxonomy the API uses are open, and so are our FIT parser and a library for intensity-duration modeling. Use them with SweatStack or without it.
Fast¶
A working app with real athletes' data in an afternoon.
-
Sign in with SweatStack
One button gives your app sign-in, registration and consent. Athletes connect the accounts they already record with, and a typical athlete's history is in within two minutes. No blank screen on launch.
-
A toolchain, not just an API
A Python SDK with FastAPI and Streamlit support, a CLI, a Python console in the browser, and SweatStack Pages to host what you build.
-
Works with your AI assistant
Install the SweatStack skills, and Claude Code, Cursor or Codex writes code against the real API: current imports, real method signatures, working sign-in.
Secure¶
The parts that usually go wrong, built on open standards you can check.
-
Tokens and webhooks, handled
OAuth 2.0 and OpenID Connect with PKCE, access tokens that reach only the data the athlete approved, and webhooks signed with HMAC-SHA256, so your server can check that each one came from SweatStack.
-
Know who's behind every app
Athletes' data reaches an app only after its owner has agreed to the developer terms, so someone always answers for it. Owners need two-factor authentication to change an app's secrets, redirect URIs or webhooks: the settings that decide where the data goes.
Privacy by default¶
Athletes choose which data your app sees, and can change their mind. You don't write any of it.
-
Consent per data category
Your consent screen lists each kind of data your app asks for, with your reason next to it. SweatStack records who agreed to what. Athletes can withdraw your app's access at any time.
-
A promise you can repeat
No ads, no sale of data, production in the EU, and rules for AI that every developer accepts. Export and account deletion are handled by SweatStack, not by your code.
Browse the full developer docs →
Start hosted. Move up when you need to.¶
Three ways to get athletes' data into SweatStack. Mix them per data source, and move up a rung without changing your code.
You bring nothing
Hosted
Athletes connect their accounts through SweatStack, and each gets a SweatStack account they can use with other apps too. The right start for almost every app.
Data sources today: Garmin Connect, Intervals.icu and Wahoo.
Data sources →You bring your keys
Bring your own keys
Your agreement with a data source, and your app's name on its consent screen. SweatStack runs the connection with your keys: incoming data, history and workouts sent to the watch.
Available for Garmin Connect.
Bring your own keys →You bring your data
Bring your own data
You collect the data, from your own device or a source you already connect to. Send SweatStack the files and use everything else: storage, analysis, webhooks and the Portal.
Choosing how athletes connect →On your own keys or your own data, athletes are users of your app. SweatStack runs their accounts for you: sign-in, email, recovery and deletion.
Same price on every rung. Free while you build. When you go commercial, $30 a month per app plus $1 per monthly active user, and each user's first month is free. Past 2,000 monthly active users, we agree a volume rate.
What stays yours¶
Your product, your brand, your users, and everything you build on top: the training scores, the models, the experience athletes pick you for. The physiology belongs to the athlete. What you make of it is yours.
You build on the data instead of warehousing it. Storing years of raw timeseries, keeping it exportable and ending your app's access when an athlete withdraws is SweatStack's job. The scores and notes your app stores in SweatStack are visible to your app alone.
Developers get rights too: versioned terms, at least 12 months' notice before a breaking change to the API, and no exit fee. Your data stays exportable through the same API you build on.
"So a user could take their data to a competitor?"
Yes, and they already can: the app their watch syncs to lets them export it. What they can't take is what your app built on top of it. We'd rather be straight about that than pretend switching costs are your moat.
Built with SweatStack¶
Build the part that matters
Start with a free account. Move to a paid tier when you go commercial.
Early-stage? Apply for the startup program →