All integrations

Polar API integration

Vantage, Grit X and Pacer training sessions, delivered to your server as they finish — without registering an AccessLink client, and without the three-call transaction dance Polar makes you do to read them.

From 32.50 € a month billed annually, 30 days to change your mind.

your polar user finishes a session — 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) {
    // event.data.device → "Vantage V3"

    // 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 });
}

A Polar workout finishes. An activity.created event carrying Polar’s own summary, sealed to your public key.

  • Sport as Polar classified it, mapped onto one vocabulary
  • Start time, duration and the Polar exercise id
  • The device the session came off
  • A pre-signed URL to the Polar FIT file, which expires

The Polar integration you’re not writing. The registration, the consent screen and the token refresh are ours.

01

Register the user with Polar, separately

AccessLink is not done when OAuth is done. After the athlete authorises, you make a further call to register them against your client before Polar will give you anything — a step that has no equivalent at any other provider, and a step whose failure mode is a connected user who silently returns no data.

02

Then commit a transaction to read anything

Polar does not simply let you list exercises. You create a transaction, read the list it pins, fetch each item, and then commit the transaction to mark it consumed — and if you crash between the fetch and the commit, you re-read; if you commit early, the data is gone. It is a genuinely stateful read protocol, and it is the single most common reason a Polar integration ships late.

03

And stay inside the rate limits

AccessLink meters you, so a naive implementation that polls per user per minute stops working at exactly the point your product starts working. We hold that budget on one client across every developer, and you hold none of it — you get a push when a session finishes and write no polling loop at all.

All of it is one POST /v1/connect naming polar, and a webhook handler you write once for every provider.

Connect a device

your polar user finishes a session — 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) {
    // event.data.device → "Vantage V3"

    // 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 });
}

What Polar covers. Nothing is marked live unless an endpoint serves it today.

  • ConnectLive today
  • ActivitiesLive today
  • WellnessDesigned, not yet shipped
  • Workout pushThe provider doesn’t expose it

Every Polar device. The link is with the athlete’s account, not a watch, so models released after you ship reach you unchanged.

Performance

  • Vantage V3
  • Vantage M3

Outdoor

  • Grit X2 Pro
  • Grit X2 Pro Titan
  • Grit X2

Running

  • Pacer Pro
  • Pacer

Everyday

  • Ignite 3
  • Unite

Sensors

  • H10 heart rate sensor
  • Verity Sense
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.

Polar API questions

No. That is the point of the integration. We hold the Polar AccessLink 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 Polar 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 charge for calls. What separates the plans is how many of your users may connect a watch. Hacker is up to 100, for a project and its first users; Startup covers up to 500; Scale includes 1,500 and bills the ones past that at a published per-user rate, with no ceiling; Enterprise is a contract with a better rate again; and none of them charges for 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, Polar 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 Polar 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.

No, and that is the single biggest thing this page is offering you. The transaction lifecycle — create, list, fetch, commit — lives on our side, including the crash-safety around committing only what you actually received. What reaches you is an activity.created webhook with the session in it. There is no transaction in your codebase and no commit you can get wrong.

It covers training sessions from Polar Flow, which is where a Polar watch syncs to. Finished exercises are pushed to you as they land. Daily activity summaries and sleep are on the roadmap rather than live — Polar exposes them, we have designed the events, and no endpoint emits them today.

The full documentation is public and needs no account. Still have questions? Ask us in Discord

One integration, not ten. Same event shape, same handler, same plan. Your second provider is a string change — or, for Apple Watch, a Swift package.

GarminCOROSWahooZeppHammerheadFitbitSuuntoWHOOPApple Watch