All integrations

Zepp API integration

The Amazfit your user already owns, behind the same connect call as every other provider. They authorise once on a screen we host, and finished workouts arrive as FIT files.

From 32.50 € a month billed annually, no per-athlete fee, 30 days to change your mind.

link a zepp athlete — no zepp credential involved

// Your own id for your own user. You hold no zepp client secret.
const link = await stridee.post('/v1/connect', {
  provider: 'zepp',
  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);

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

  • Sport as Zepp classified it, mapped onto one vocabulary
  • Start time and Zepp’s own summary id for the workout
  • The device the workout came off — “Amazfit T-Rex 3”
  • A pre-signed URL to the FIT file Zepp wrote, which expires

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

01

First, find the right API

Zepp’s developer site documents Zepp OS — a JavaScript framework for apps that run on the watch. It has no server, no OAuth and no way to read a finished workout, and it is what every search for “Zepp API” finds first. The one that carries workout data is a separate platform on a different set of hosts. That is a day of your life before any code compiles.

02

Then get the consent URL exactly right

Zepp’s authorization request needs a parameter that is not a scope and does not look required. Omit it and the token exchange still succeeds — it just returns an access token with no refresh token. Everything works for one hour, and then every connection you have made dies at once. We found that in the docs so your first production incident is not it.

03

And parse a body that is JSON twice over

The activity webhook arrives as text/plain holding a JSON array whose elements are strings, each of which is itself JSON. You get thirty seconds to acknowledge, the file URL inside is one-time and the access token you need to spend it lives an hour — so a delivery that waits in your queue needs a refresh before it can be fetched. All of that is on our side of the line.

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

Connect a device

link a zepp athlete — no zepp credential involved

// Your own id for your own user. You hold no zepp client secret.
const link = await stridee.post('/v1/connect', {
  provider: 'zepp',
  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);

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

  • ConnectLive today
  • ActivitiesLive today
  • WellnessLive today
  • Workout pushThe provider doesn’t expose it

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

Outdoor & multisport

  • Amazfit T-Rex 3
  • Amazfit T-Rex Ultra
  • Amazfit Falcon

Running & triathlon

  • Amazfit Cheetah Pro
  • Amazfit Cheetah
  • Amazfit Stratos

Everyday

  • Amazfit GTR 4
  • Amazfit GTS 4
  • Amazfit Balance

Budget & lightweight

  • Amazfit Bip 6
  • Amazfit Active 2
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 and Fitbit behind one connect call
  • Every endpoint on every plan — never priced per athlete
  • 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 one thing: how many of your users may connect a watch. Everything else is 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.

Zepp API questions

No. That is the point of the integration. We hold the Zepp Open Platform 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 Zepp 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, Zepp 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 Zepp 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 the difference is the reason this page exists. Zepp OS is a JavaScript framework for building watch faces and mini-apps that run on the device — it cannot read a user’s workout from your server, because it does not have a server. This integration uses the Zepp Open Platform: server-side OAuth, and a webhook that delivers a FIT file per finished workout. If you have been reading @zos/ documentation and wondering where the activities endpoint is, there isn’t one.

All of them, because the integration is with the Zepp account rather than with a watch. Anything that syncs into a user’s Zepp app reaches you — T-Rex, Cheetah, GTR, GTS, Balance, Bip — and a model released next year works on the day it ships without a change on either side.

Yes — about 90 days of it. Zepp’s backfill endpoint replays past workouts into the same webhook that carries live ones, so they reach you as ordinary activities with no second code path on your side. The one caveat is timing: Zepp rate-limits backfill across an entire application rather than per athlete, so if you connect a large batch of users at once their history fills in over the following hours instead of at the moment they consent. New workouts are never delayed by this.

Yes — sleep, and sleep is the whole of it today. A night arrives as a `wellness.created` event with duration, the deep, light, REM and awake splits, Zepp’s own sleep score and the per-stage timeline behind `series_url`, on exactly the same terms and in exactly the same shape as a Garmin night. That is not a coincidence we engineered around: Zepp’s health API mirrors Garmin’s field for field, so if you already handle Garmin wellness you handle this with no branch. What you do not get is daily summaries — steps, calories, resting heart rate — because Zepp’s health push does not carry them. It does carry overnight HRV, which we acknowledge but do not yet publish: Zepp documents no schema for it and we will not put a resting-HRV number in front of your users that nobody has verified.

As fast as the watch syncs, which is the honest bound and is not ours. An Amazfit uploads when the phone app next opens rather than the moment a run ends, so the delay a user notices is between their watch and Zepp, not between Zepp and you. Once Zepp has it we are pushed the notification and fetch the file straight away.

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

One integration, not seven. Same connect call, same event shape, same plan. Your second provider is a string change.

GarminCOROSPolarWahooHammerheadFitbit