One API for every wearable.Read and write.
Garmin, COROS, Polar, Wahoo, Apple Watch and Strava — normalized into one FIT file, so you interpret one format instead of six APIs. Then push structured workouts straight back to the athlete’s watch.
Private beta opens September 1, 2026. Your $20 converts into month one — you pay early, not extra. Only 50 slots.
read — any vendor, one shape
const { data } = await stridee.activities.list({
user: 'usr_e9f1c40a',
since: '2026-07-01',
});
data[0].provider; // 'polar'
data[0].distance; // 16093.4 metres
data[0].avg_heart_rate; // 152
data[0].fit_url; // one canonical FIT fileAlready syncing in production

Coverage
Devices we support
Not a list of logos on a pitch deck. Every row below is live behind the Stridee apps today.
| Provider | Activities | Wellness | Workout push |
|---|---|---|---|
COROSPACE, APEX, VERTIX | |||
Apple Watch reads through HealthKit and schedules with WorkoutKit — both on-device by design, so that one runs through our iOS SDK inside your app rather than server-to-server.
Strava backfills an athlete’s entire history, deduplicated against whatever their watch already sent you.
Next on the roadmap
Not shipped yet. The founding 50 decide the order — say which one you need and it moves up.
Normalization
Every vendor, re-encoded into one FIT file.
Garmin hands you FIT. Polar hands you its own JSON. COROS, Wahoo and Strava each do something else again — different sport names, different units, a different idea of what a lap is. We decode all of it and re-encode a single canonical FIT, the format your tooling already reads.
You get an event, not a blob
The webhook carries the normalized summary plus a short-lived signed fit_url. Download the file only for the activities you actually care about.
You acknowledge with a 2xx
Anything else counts as undelivered and we retry with exponential backoff for 72 hours. Ack first, process after — a slow handler should not look like a failed one.
Replay whenever you need
Every event is stored. Re-send it from the dashboard, or POST /v1/events/{id}/retry once you have shipped the fix — no vendor backfill required.
And it goes the other way
Post a structured session and we encode it into each vendor’s native workout format, so pace, power and heart-rate targets survive the trip to the wrist.
server/webhooks.ts
// Return any 2xx to acknowledge. Anything else — or nothing
// at all — and we retry with backoff for 72 hours.
app.post('/webhooks/stridee', async (req, res) => {
const event = stridee.webhooks.verify(
req.body,
req.headers['stridee-signature'],
process.env.STRIDEE_WEBHOOK_SECRET,
);
// Ack first, work after. We only need to know it landed.
res.sendStatus(200);
if (event.type === 'activity.created') {
// One canonical FIT. Same encoder for all six vendors.
const file = await fetch(event.data.fit_url);
await ingestFit(await file.arrayBuffer());
}
});Claim your slot for $20.
A deposit, but not one you lose. Your $20 is charged today, holds one of only fifty beta slots, and converts into your first month when the private beta opens on September 1, 2026. You are paying early, not paying extra.
- Your $20 converts into month one — you pay early, not extra
- One of only 50 beta slots, reserved by name
- $20/month for the whole API — every provider, reading and writing
- Production keys on September 1, 2026, when the private beta opens
- Every provider we support, and the ones we add next
- A private Discord channel with the engineers who wrote the integrations
If we never ship, or you change your mind before we hand you keys, email hi@stridee.fit and we refund you. No forms, no conditions.
Founding slots
50
Only 50 founding slots exist. When they are gone, they are gone.
Private beta opens September 1, 2026
Charged today. $20/month for the whole API.
Claim my slotStripe checkout · converts to month one · refundable until we hand you keys
Not ready to claim?
Come talk to us in Discord first. We answer questions there before anywhere else.
Join the DiscordBefore you claim
Your first month, paid early. It is a deposit, charged today, but not one you lose — it reserves one of fifty beta slots and converts into your first month when the private beta opens on September 1, 2026. You pay early, not extra. If we never ship, or you change your mind before you get keys, email us and we refund you.
$20 a month, flat, for the whole API — every provider, reading and writing. Flat rather than priced per connected user, and no contract.
The private beta opens on September 1, 2026, and that is when founding partners get production keys. Your $20 is charged when you claim your slot and converts into your first month.
Garmin, COROS, Polar, Wahoo, Apple Watch and Strava history import — all in production behind the Stridee apps right now. Suunto, Whoop, Oura, Fitbit, Health Connect, Samsung Health, Zwift and Peloton are on the roadmap; founding partners decide the order.
Only if you want to. Every event carries a normalized JSON summary, and laps and per-second streams are one REST call away. The FIT file sits behind a short-lived signed URL for when you need the raw record messages — and it is the same canonical FIT whether the session came off a Garmin, a Polar, a COROS, a Wahoo or a Strava import, so your parser has exactly one shape to handle.
Yes, and it is the part most aggregation APIs skip. Post a structured session — warmup, intervals with pace, power or heart-rate targets, cooldown — and it lands on the athlete’s Garmin, COROS or Wahoo, or is scheduled on their Apple Watch through WorkoutKit. You get a per-device sync status back.
You redirect to a hosted connect flow, the athlete authorizes their vendor, and we hand you back a stable user id. Apple Watch is the exception: HealthKit and WorkoutKit are on-device by design, so that one runs through our iOS SDK inside your app.
Return any 2xx and the event is acknowledged. Anything else — an error, a timeout, nothing at all — and we retry with exponential backoff for 72 hours. Every event is stored either way, so you can replay from the dashboard or POST /v1/events/{id}/retry once you are back, without asking the vendor for a backfill.
Still have questions? Ask us in Discord