Workouts, sleep and recovery delivered:4,419,696

One API for every wearable.Read and write.

Every watch and bike computer, normalized into one FIT file. Then push structured workouts back.

your user finishes a run — this is all you write

// decrypt() and stridee() are in /docs
export async function onStrideeEvent(rawBody, res) {
  const event = await decrypt(rawBody);

  if (event.type === 'activity.created' && event.data.file) {
    // garmin, coros, polar… one shape for all

    // The original FIT file, from the device.
    const file = await stridee('GET', event.data.file.url);
    await saveActivity(event.user_id, file);
  }

  res.json({ nonce: event.nonce });
}

Your users can connect these today

GarminCOROSPolarWahooZeppHammerheadFitbitSuuntoWHOOPApple Watch

One integration instead of 20+. Your users consent on a screen we host, and their workouts, sleep and recovery arrive at your endpoint, sealed to your key.

+20 morenormalize · encryptone FIT fileYour backendPOST /webhooksYour appGET /v1/activities
Pricing

Two weeks free. Then from 32.50 € a month.

Checkout is the signup. No waitlist, no sales call.

  • Garmin, COROS, Polar, Wahoo, Zepp, Hammerhead, Fitbit, Suunto, WHOOP and Apple Watch behind one integration
  • Every endpoint on every plan — never priced per call
  • 14 days free, and no card charged until they are up
  • 30-day money-back guarantee

Cancel any time from the Stripe billing portal, or email [email protected] within 30 days and we refund you.

Plans start at

32.50 €/month, billed annually

Or 39 €/month, month to month. Paying annually gets you two months free.

Hacker, Startup, Scale and Enterprise differ on how many of your users may connect a watch. The API is the same on every plan.

See the plans

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

Before you start

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, with its laps and its timestamped samples — heart rate, power, speed, GPS — inside it. We do not parse those into JSON for you yet, and there is no canonical re-encoded FIT today.

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.

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