COROS API integration
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.
Live today for connections and activities. Three days free, then $20 a month, flat — no per-athlete fee.
All integrationslink 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);Deliveries
What you get when a COROS workout finishes
An activity.created event carrying COROS’s own summary, sealed to your public key. The FIT file isn’t in it — that is a pre-signed provider URL that expires, because re-hosting your athletes’ activity files is a retention decision rather than something to slip into a webhook payload.
- Sport as COROS classified it, mapped onto one vocabulary
- Start time, duration and the COROS activity id
- The device name — “PACE 3”, straight from the watch
- A pre-signed URL to the COROS FIT file, which expires
COROS Open API
The COROS integration you’re not writing
COROS grants API access through a partnership request rather than self-service signup, so the first step of a direct integration is an email and a wait. We already made it.
Ask for access first
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.
Handle a token model that differs from everyone else’s
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.
And accept what the API won’t tell you
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.
What replaces all of it
One POST /v1/connect naming coros, and a webhook handler you write once for every provider. The registration is ours, the consent screen is ours, and the token refresh is ours.
Connecting 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);Coverage
What COROS does, and what it doesn’t yet
Nothing below is marked live unless an endpoint serves it today. Where COROS doesn’t send something, the field is absent rather than estimated — a null you can branch on is worth more than a number nobody measured.
- ConnectLive today
- ActivitiesLive today
- Daily summariesDesigned, not yet shipped
- Workout pushDesigned, not yet shipped
Devices
Which COROS devices are covered
The integration is with the athlete’s COROS account rather than with a watch, so anything that syncs into it reaches you — including models released after you shipped, with no change on either side.
Running & triathlon
- PACE 4
- PACE 3
- PACE Pro
Trail & multisport
- APEX 4
- APEX 2 Pro
- APEX 2
Ultra & expedition
- VERTIX 2S
- VERTIX 2
Outdoor & cycling
- NOMAD
- DURA
Pricing
Flat, and not per athlete.
A unified wearable API normally costs hundreds of dollars a month and meters every connected user on top — so the moment your product works, your bill grows with it. This is $20 a month for the whole API, whatever you connect.
$20
per month, flat
Every provider and every endpoint. Three days free first, and cancelling is a button in the Stripe billing portal.
No per-athlete fee
connect as many as you like
The bill is the same at ten connected athletes and at ten thousand. There is no credit balance to watch and no overage to model.
No approval queue
checkout is the signup
You are not applying to COROS Open API. Paying creates the account and opens the console, automatically, in the seconds it takes Stripe to tell us.
Three days free. Then $20 a month.
The private beta is open, and checkout is the whole signup — pay and your account exists, with the console switched on, before you have finished reading the receipt. No waitlist, no sales call, and nobody approving you.
- Keys the moment checkout finishes — no waitlist, no approval
- Garmin, COROS, Polar and Wahoo behind one connect call
- $20/month for the whole API — every provider, every endpoint
- One of only 50 founding slots, and the price they keep
- A private Discord channel with the engineers who wrote the integrations
- A vote on what we build next — the founding 50 order the roadmap
Cancel in one click from the billing portal, at any point in the three days or any month after. If something goes wrong on our side, 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.
Card required, nothing charged for three days. Flat rate for the whole API, not per connected athlete.
Start building — free for 3 daysStripe checkout · cancel any time · keys the moment it clears
What happens next
You pay
Stripe collects the card. Three days free first, then $20/month, and cancelling is a button in the same billing portal.
We create your account
Against the email you paid with, automatically, the moment Stripe confirms. Nobody reviews it.
You log in
platform.stridee.fit/login, same email, code in your inbox. Mint a signing key and your first call works.
Already bought and want the console? platform.stridee.fit/login
Not ready to claim?
Come talk to us in Discord first. We answer questions there before anywhere else.
Join the DiscordCOROS API questions
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.
Three days free, then $20 a month, flat — for the whole API, every provider and every endpoint, with no per-athlete metering. 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. Cancel from the Stripe billing portal whenever; 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.
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
Other integrations
One integration, not six
Every provider below is the same connect call, the same event shape and the same $20 a month. Adding your second one is a string change.