Workouts, sleep and recovery delivered:400,000
Garmin, COROS, Polar, Wahoo, Zepp, Hammerhead, Fitbit and more on the way, normalized into one FIT file. Then push structured workouts back to the watch.
link one of your users — no provider credential involved
// Your own id for your own user. No Stridee account needed.
const link = await stridee.post('/v1/connect', {
provider: 'coros',
external_user_id: 'user_4821',
return_uri: 'https://app.yourapp.com/settings/devices',
});
// Redirect their browser. Good for 30 minutes.
res.redirect(link.connect_url);Your users can connect these today


Checkout is the signup. No waitlist, no sales call.
Cancel any time from the Stripe billing portal, or email [email protected] within 30 days and we refund you.
Plans start at
Or 39 €/month, month to month. Paying annually gets you two months free.
Hacker, Startup, Scale and Enterprise differ on one thing: how many of your users may connect a watch. Everything else is on every plan.
See the plans14-day free trial · cancel any time
We create the account on the email you pay with, automatically. Sign in at platform.stridee.com/login. Nothing to wait for.
Checkout is the signup. Pick a plan on /pricing, pay on Stripe with whatever email you want the account under, and the console opens on it within seconds. Then sign in at /login with that address and the code we email you. There is no application to review, and nothing to wait for.
Plans start at 32.50 € a month billed annually, or 39 € a month if you would rather not commit to a year — paying annually gets you two months free. Every one of them is the whole API — every provider, every endpoint, never priced per connected athlete. What separates the tiers is how many of your users may connect a watch: Hacker is 250, for a project and its first users, Startup covers up to 5,000, Scale up to 250,000, and Enterprise lifts the ceiling entirely and adds a contract and invoicing. Every plan starts with a 14-day free trial, and there is a 30-day money-back guarantee on top of it.
Your users connect Garmin, COROS, Polar, Wahoo, Zepp, Hammerhead and Fitbit through a consent flow you did not build, and finished activities arrive as encrypted webhook deliveries. Sleep, daily activity, HRV, stress and VO₂max arrive the same way from Garmin and COROS. The console gives you signing keys, webhook endpoints, an event stream, connected accounts, activities, wellness, and a log of every signed request including the ones we refused. Anything not live yet is called out in the answers below.
Garmin, COROS, Polar, Wahoo, Zepp, Hammerhead and Fitbit. Anything else in a POST /v1/connect call comes back a 400 today. More are on the way — Apple Watch, Suunto, WHOOP, Oura and Health Connect all have a page under /integrations describing where they stand — and what developers ask for in Discord is what orders them.
No. Requests are signed with an Ed25519 key that never leaves your machine (RFC 9421). Each one names your key id, covers the method, the URL and a digest of the body, and carries a nonce we remember for five minutes, so a captured request cannot be replayed. GET /v1/whoami proves your client signs correctly before you call anything real.
An activity.created event carrying the provider’s summary — sport, start time, device, activity id — sealed to your key, plus a URL the recording is behind. Miss one and GET /v1/activities lists everything you have been granted, newest first. What that URL gives you is the file the device wrote: there is no canonical re-encoded FIT today, and no laps or per-second stream endpoint yet.
Yes, from Garmin and COROS today. A wellness.created event carries the summary — sleep stages and score, steps and resting heart rate, overnight HRV, stress and body battery, VO₂max — normalized across providers, with the provider’s own payload beside it. The minute-by-minute series is one call further in, behind a URL on the event, because it is around ninety percent of the bytes and most integrations never draw a curve. The one thing to know before you write the handler: these records get revised. Garmin sends a night tentatively and settles it hours later, and that correction arrives as wellness.updated rather than a second wellness.created — so handle both, or you will store the provisional sleep score forever. Polar, Wahoo and Zepp connect but send no wellness.
Yes. POST /v1/workouts takes a structured session — warmup, repeats, intervals with pace, heart-rate, power or cadence targets — and puts it on the athlete’s Garmin, Wahoo or COROS. The push is synchronous: the response tells you which providers took it, and a provider that cannot represent the workout says so beside the ones that did. Polar and Zepp have no workout surface. workout.completed — a pushed session coming back as done — is still designed and not emitted.
Four things, in order. Verify the detached JWS against our published JWKS before you parse anything. Check you have not seen the webhook-id before, since a resend reuses it. Decrypt the JWE and confirm the user_id inside is yours. Then return a 2xx carrying the nonce you decrypted. Decrypt before you ack — you cannot enqueue the raw bytes and return 200 blind.
Any 2xx is an ack. Today nothing is retried automatically: a non-2xx or a timeout is recorded against the delivery, with the reason, and it stays failed until you resend it from the console or the API. A resend keeps the same webhook-id, so deduping on it is safe, and it is sealed to the endpoint’s current key, so resending after a botched rotation fixes it. Treat downtime on your side as missed events and backfill from the activities API.
The full documentation is public and needs no account. Still have questions? Ask us in Discord