Cloud wearables

Let patients connect their Oura, WHOOP, Strava, Withings, Polar, Ultrahuman or Suunto accounts to your project and receive the readings as FHIR Observations.

Patients can connect the account they already use at a wearable provider, such as Oura, WHOOP, Withings or Polar, to your Ovok project. Ovok then pulls their readings from the provider every day, and sooner when the provider notifies Ovok of new data, and writes them as FHIR Observation resources about the Patient, in your project.

Each project brings its own OAuth app at each provider. Your patients see your app's name on the provider's consent page, and the provider's terms apply between you and the provider. Ovok stores the app's credentials encrypted, runs the OAuth flow, refreshes the tokens and turns the provider's data into FHIR.

Read this first

What wearable data is and is not

  • Wearable readings never reach Signals. They are not device telemetry, so Ovok does not forward them for alert evaluation, even for patients enrolled in Signals. Do not build an alerting workflow on them.
  • They sit next to device readings. A wearable heart rate uses the same LOINC code as a heart rate from a connected device. $lastn and plain Observation searches return both. Filter by the source tag when you need one or the other.
  • The backfill is 30 days. A new connection brings the last 30 days. A connection that cannot be synced for longer than that loses the oldest days. Polar keeps sleep and nightly recharge for 28 days only, so a first Polar sync has 28 days of those.
  • On-demand sync has a 15-minute cooldown per connection. The daily sync is the main path.
  • A connection can need reconnecting. When the patient removes your app's access at the provider, or the provider stops accepting the grant, the connection is marked reconnectRequired until the patient connects again.

What each provider gives you today

ProviderPatients can connectSynced into FHIRWhat is synced
OuraYesYesSleep: average and lowest heart rate, HRV (RMSSD), respiratory rate, sleep duration and stages. Daily SpO₂ and steps.
WHOOPYesYesRecovery: resting heart rate, HRV (RMSSD), SpO₂. Sleep: respiratory rate, sleep duration and stages. Each finished cycle's average heart rate.
StravaYesYesEach workout with heart rate: its average heart rate. Strava records workouts only.
WithingsYesYes, and on notificationHeart rate and SpO₂ measurements, daily steps, and per night: average heart rate, respiratory rate, HRV (RMSSD), sleep duration and stages.
PolarYes, once the patient accepts Polar's consentsYes, and on notificationPer night: sleep stages, and from nightly recharge average heart rate, HRV (RMSSD) and breathing rate. Daily steps.
UltrahumanYesYesSpO₂, resting heart rate during sleep, daily steps, sleep duration and stages. Partly unconfirmed, see below.
SuuntoYesYes, and on notificationDaily steps only. Partly unconfirmed, see below.
GarminOnly with an approved Garmin appNoSync waits for partner access to Garmin's developer program.
FitbitNoNoNot supported: Fitbit's Web API shuts down on 2026-10-30.

Sync and read the data has the metric-by-metric matrix, with codes and units.

Ultrahuman and Suunto are partly unconfirmed

Ultrahuman's partner API and Suunto's 24/7 data and notification format are documented only to approved partners. Ovok built both against the public material and an open-source reference, without partner access. Expect gaps until Ovok confirms them: an Ultrahuman metric may be missing or shaped differently, and Suunto gives daily steps only. Test with real accounts before you rely on them.

The legacy Withings device integration is separate

Some Ovok projects receive Withings device data through Ovok's older Withings integration, which feeds the IoT ingest. That integration is unrelated to cloud wearables: it uses its own app and its readings are device telemetry. Register a new app at Withings for cloud wearables: saving the legacy integration's client ID answers 422 CLIENT_ID_RESERVED. Withings Sleep Analyzer mats on the legacy integration keep sending their data there; a cloud connection does not change them.

What you need

  1. A project admin to register an app at each provider and save it in Ovok, in the console or through the API. See Set up providers.
  2. PATIENT_APP_URL set on the project. After consent, Ovok sends the patient's browser to <PATIENT_APP_URL>/wearables/<provider>?result=…. Without it, connecting answers 409 APP_URL_NOT_CONFIGURED.
  3. A patient app that signs the patient in and starts the connection. See Connect a patient.

Pages in this section

PageFor
Set up providersAdmins: register the provider app, then save it in the console or through the API. One quickstart per provider.
Connect a patientApp developers: the consent flow with @ovok/core, React hooks or plain HTTP.
Sync and read the dataApp developers: when data arrives, what the Observations look like, and how to query them.
API referenceEvery route, its body, its answer and its errors.

Last updated on

On this page