# Cloud wearables

Canonical page: https://docs.ovok.com/wearables

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.

```mermaid
flowchart LR
  setup[Admin saves the<br/>provider app] --> connect[Patient connects<br/>their account]
  connect --> sync[Ovok syncs daily<br/>or on demand]
  sync --> obs[Observations in<br/>the patient's project]
  obs --> read[Your app reads<br/>them with FHIR]
```

## Read this first [#read-this-first]

<Callout type="warn" title="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](/wearables/sync-and-read-data#keep-wearable-and-device-readings-apart) 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.

</Callout>

## What each provider gives you today [#what-each-provider-gives-you-today]

| Provider | Patients can connect | Synced into FHIR | What is synced |
| --- | --- | --- | --- |
| Oura | Yes | Yes | Sleep: average and lowest heart rate, HRV (RMSSD), respiratory rate, sleep duration and stages. Daily SpO₂ and steps. |
| WHOOP | Yes | Yes | Recovery: resting heart rate, HRV (RMSSD), SpO₂. Sleep: respiratory rate, sleep duration and stages. Each finished cycle's average heart rate. |
| Strava | Yes | Yes | Each workout with heart rate: its average heart rate. Strava records workouts only. |
| Withings | Yes | Yes, and on notification | Heart rate and SpO₂ measurements, daily steps, and per night: average heart rate, respiratory rate, HRV (RMSSD), sleep duration and stages. |
| Polar | Yes, once the patient accepts Polar's consents | Yes, and on notification | Per night: sleep stages, and from nightly recharge average heart rate, HRV (RMSSD) and breathing rate. Daily steps. |
| Ultrahuman | Yes | Yes | SpO₂, resting heart rate during sleep, daily steps, sleep duration and stages. Partly unconfirmed, see below. |
| Suunto | Yes | Yes, and on notification | Daily steps only. Partly unconfirmed, see below. |
| Garmin | Only with an approved Garmin app | No | Sync waits for partner access to Garmin's developer program. |
| Fitbit | No | No | Not supported: Fitbit's Web API shuts down on 2026-10-30. |

[Sync and read the data](/wearables/sync-and-read-data#what-each-provider-syncs) has the metric-by-metric matrix, with codes and units.

<Callout type="warn" title="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.

</Callout>

<Callout type="info" title="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](/data-ingestion). 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`](/errors/client-id-reserved). Withings Sleep Analyzer mats on the legacy integration keep sending their data there; a cloud connection does not change them.

</Callout>

## What you need [#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](/wearables/set-up-providers).
2. **[`PATIENT_APP_URL`](/settings-and-features/settings/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`](/errors/app-url-not-configured).
3. **A patient app** that signs the patient in and starts the connection. See [Connect a patient](/wearables/connect-a-patient).

## Pages in this section [#pages-in-this-section]

| Page | For |
| --- | --- |
| [Set up providers](/wearables/set-up-providers) | Admins: register the provider app, then save it in the console or through the API. One quickstart per provider. |
| [Connect a patient](/wearables/connect-a-patient) | App developers: the consent flow with `@ovok/core`, React hooks or plain HTTP. |
| [Sync and read the data](/wearables/sync-and-read-data) | App developers: when data arrives, what the Observations look like, and how to query them. |
| [API reference](/wearables/api-reference) | Every route, its body, its answer and its errors. |
