PACE, APEX, VERTIX and NOMAD, behind the same connect call as every other provider. Your users authorise once on a screen we host, and their workouts start arriving.
From 32.50 € a month billed annually, no per-athlete fee, 30 days to change your mind.
link a coros athlete — no coros credential involved
// Your own id for your own user. You hold no coros client secret.
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);The COROS Open API is not a self-service signup. You request partner access, describe your product and wait for a human, which makes "can we support COROS?" a question with no answer you can plan a sprint around. Through us it is a string in a connect call.
Every provider on this list disagrees about token lifetime, refresh semantics and what a revocation looks like — one rotates both halves on a short clock, one issues no refresh token at all. Supporting COROS alongside Garmin means two of those models in your codebase, and a fifth provider means five.
COROS does not report back which scopes the athlete actually granted. We leave that field null rather than filling it with the scopes we asked for, because a null you can branch on is worth more than a confident wrong answer — and that is the kind of decision you would otherwise be making yourself, per provider, forever.
All of it is one POST /v1/connect naming coros, and a webhook handler you write once for every provider.
Connect a devicelink a coros athlete — no coros credential involved
// Your own id for your own user. You hold no coros client secret.
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);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.
No. That is the point of the integration. We hold the COROS Open API registration, the client credentials and the redirect URI; you call POST /v1/connect with your own id for your own user and redirect their browser to the URL that comes back. There is no COROS secret in your environment, no callback route in your router, and no approval queue between you and your first connected athlete.
Two weeks free, then from 32.50 € a month billed annually — or 39 € a month with no year to commit to — for the whole API, every provider and every endpoint, with no per-athlete metering. Plans differ on one thing: 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 of them; Scale up to 250,000; Enterprise removes the ceiling; and none of them meters calls, activities or endpoints. The usual price for a unified wearable API starts in the hundreds of dollars a month and charges again for each connected user, which is a pricing model that punishes exactly the thing you are trying to do. There is a 30-day money-back guarantee on any charge, and cancelling is a button in the Stripe billing portal; access ends when the period does.
You get push, not polling. When an athlete finishes a workout, COROS notifies us and we send you an activity.created delivery — sealed to your public key as a JWE and signed with a detached JWS you verify against our published JWKS. Latency is whatever COROS takes to process the upload from the watch, which is theirs to own and typically a matter of minutes. You never write a polling loop and never hold a rate-limit budget.
There is no API key anywhere in this, in either direction. You authenticate to us with an Ed25519 signature over the request itself — RFC 9421 HTTP Message Signatures — using a private key that never leaves your machine, so there is no bearer token sitting in a log line, a CI variable or a backup. And we never hand you the provider's own credentials either.
All of them, because the integration is with the COROS account rather than with a watch. Anything that syncs into a user’s COROS account reaches you — PACE, APEX, VERTIX, NOMAD and the DURA bike computer — and a model released next year works on the day it ships without a change on either side.
Usually the last 90 days, and sometimes years — the athlete decides, on COROS’s own consent screen. That screen carries a checkbox offering the app access to their previous workouts; left alone it grants 90 days, ticked it grants their whole history, and we walk back through it until COROS tells us to stop. Past workouts arrive through the same fan-out as live ones, so on your side they are ordinary activities with nothing marking them as historical. Two caveats worth designing around, and both are COROS’s rather than ours. The deep grant expires 24 hours after the athlete connects, so history is collected at once rather than being something you can offer as a setting later — and COROS serves only what was recorded on a COROS device, so a FIT the athlete imported into Training Hub from somewhere else never appears. There is no field telling us which of the two grants we got, so we cannot tell you in advance how deep a given user will go.
No, and we do not paper over it. COROS does not report granted scopes, so a connection’s scope field comes back null rather than echoing what we requested. Wahoo is the one provider on the platform that reports what the athlete actually granted, and there the field is verbatim.
The full documentation is public and needs no account. Still have questions? Ask us in Discord