> ## Documentation Index
> Fetch the complete documentation index at: https://openwearables.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Wearable API Coverage Matrix

> Data types by provider: Apple, Garmin, Polar, Suunto, Oura, Whoop, Ultrahuman, Strava, Fitbit, and Google Health Connect. OAuth, workouts, sleep, and timeseries support.

This guide gives an overview of data type support across the integrated wearable providers. Use this matrix to understand what data you can expect when integrating with specific devices.

## Quick Overview

| Capability         | Apple | Garmin | Polar | Suunto | Oura | Whoop | Ultrahuman | Strava | Fitbit | Health Connect |
| ------------------ | :---: | :----: | :---: | :----: | :--: | :---: | :--------: | :----: | :----: | :------------: |
| **OAuth**          |   ❌   |    ✅   |   ✅   |    ✅   |   ✅  |   ✅   |      ✅     |    ✅   |    ✅   |        ❌       |
| **Workouts**       |   ✅   |    ✅   |   ✅   |    ✅   |   ✅  |   ✅   |      ❌     |    ✅   |    ✅   |        ✅       |
| **Sleep**          |   ✅   |    ✅   |   ✅   |    ✅   |   ✅  |   ✅   |      ✅     |    ❌   |   🔜   |        ✅       |
| **24/7 Data**      |   ✅   |    ✅   |   ✅   |    ✅   |   ✅  |   ◐   |      ✅     |    ❌   |   🔜   |        ✅       |
| **Timeseries**     |   ✅   |    ✅   |   ✅   |    ✅   |   ✅  |   ❌   |      ✅     |    ◐   |   🔜   |        ✅       |
| **Health Scores**  |   ❌   |    ✅   |   ✅   |    ❌   |   ✅  |   ✅   |      ❌     |    ❌   |    ❌   |        ❌       |
| **Women's Health** |   🔜  |    ✅   |   ❌   |    ❌   |   ❌  |   ❌   |      ❌     |    ❌   |    ❌   |       🔜       |

<Accordion title="Legend">
  * ✅ **Full support** — Fully implemented and collecting data
  * ◐ **Partial** — Limited data or only during certain contexts (e.g., workouts only)
  * 🔜 **Coming soon** — Provider API supports this, processing not yet implemented
  * ❌ **Not available** — Provider doesn't support this or not applicable
</Accordion>

<Note>
  **Timeseries** = Granular, timestamped data points (heart rate samples, step counts, HRV readings) available via the `/timeseries` API endpoint.

  **24/7 Data** = Continuous health monitoring throughout the day (not just during workouts), including resting heart rate, HRV during sleep, SpO2 spot checks, and daily activity samples.
</Note>

***

{/* Auto-generated from ProviderCoverage by scripts/generate_coverage_docs.py — do not edit by hand. */}

## Detailed Coverage Matrix

### Heart & Cardiovascular

| Metric                           | Unit | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| -------------------------------- | ---- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `heart_rate`                     | bpm  |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ✅   |    ✅   |      ✅     |   ❌   |
| `heart_rate_recovery_one_minute` | bpm  |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `heart_rate_variability_rmssd`   | ms   |   ❌   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ❌     |   ✅   |
| `heart_rate_variability_sdnn`    | ms   |   ✅   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ✅     |   ❌   |
| `resting_heart_rate`             | bpm  |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ❌   |    ✅    |    ❌   |    ✅   |      ❌     |   ✅   |
| `walking_heart_rate_average`     | bpm  |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

### Blood & Respiratory

| Metric                            | Unit    | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| --------------------------------- | ------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `blood_alcohol_content`           | mg\_dl  |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `blood_glucose`                   | mg\_dl  |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `blood_pressure_diastolic`        | mmHg    |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `blood_pressure_systolic`         | mmHg    |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `breathing_disturbance_index`     | score   |   ❌   |    ❌   |    ❌   |    ❌   |   ✅  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `forced_expiratory_volume_1`      | liters  |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `forced_vital_capacity`           | liters  |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `oxygen_saturation`               | percent |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ❌     |   ✅   |
| `peak_expiratory_flow_rate`       | L/min   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `peripheral_perfusion_index`      | score   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `respiratory_rate`                | brpm    |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `sleeping_breathing_disturbances` | count   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

### Body Composition

| Metric                             | Unit    | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ---------------------------------- | ------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `body_fat_mass`                    | kg      |   ❌   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `body_fat_percentage`              | percent |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `body_mass_index`                  | kg\_m2  |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `body_temperature`                 | celsius |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ✅   |    ✅    |    ❌   |    ❌   |      ✅     |   ❌   |
| `height`                           | cm      |   ✅   |    ❌   |    ❌   |    ✅   |   ✅  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ✅   |
| `lean_body_mass`                   | kg      |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `skeletal_muscle_mass`             | kg      |   ❌   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `skin_temperature`                 | celsius |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ✅   |    ❌    |    ❌   |    ❌   |      ❌     |   ✅   |
| `skin_temperature_deviation`       | celsius |   ❌   |    ❌   |    ❌   |    ❌   |   ✅  |   ✅   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `skin_temperature_trend_deviation` | celsius |   ❌   |    ❌   |    ❌   |    ❌   |   ✅  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `waist_circumference`              | cm      |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `weight`                           | kg      |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ✅   |

### Fitness Metrics

| Metric                          | Unit        | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ------------------------------- | ----------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `cardiovascular_age`            | years       |   ❌   |    ❌   |    ❌   |    ❌   |   ✅  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `six_minute_walk_test_distance` | meters      |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `vo2_max`                       | ml\_kg\_min |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ❌   |    ✅    |    ❌   |    ❌   |      ✅     |   ❌   |

### Activity - Basic

| Metric            | Unit    | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ----------------- | ------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `active_time`     | minutes |   ❌   |    ❌   |    ✅   |    ❌   |   ✅  |   ✅   |    ❌    |    ❌   |    ❌   |      ✅     |   ❌   |
| `average_met`     | met     |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `basal_energy`    | kcal    |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `energy`          | kcal    |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ❌     |   ❌   |
| `exercise_time`   | minutes |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `flights_climbed` | count   |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `physical_effort` | score   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `stand_time`      | minutes |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `steps`           | count   |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ✅     |   ❌   |

### Activity - Distance

| Metric                          | Unit   | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ------------------------------- | ------ | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `distance_cycling`              | meters |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `distance_downhill_snow_sports` | meters |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `distance_other`                | meters |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `distance_swimming`             | meters |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `distance_walking_running`      | meters |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |

### Activity - Walking

| Metric                              | Unit      | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ----------------------------------- | --------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `stair_ascent_speed`                | m\_per\_s |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `stair_descent_speed`               | m\_per\_s |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `walking_asymmetry_percentage`      | percent   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `walking_double_support_percentage` | percent   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `walking_speed`                     | m\_per\_s |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `walking_steadiness`                | percent   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `walking_step_length`               | cm        |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

### Activity - Running

| Metric                         | Unit      | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ------------------------------ | --------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `running_ground_contact_time`  | ms        |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `running_power`                | watts     |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `running_speed`                | m\_per\_s |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `running_stride_length`        | cm        |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `running_vertical_oscillation` | cm        |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |

### Activity - Swimming

| Metric                  | Unit  | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ----------------------- | ----- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `swimming_stroke_count` | count |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |

### Activity - Generic

| Metric                           | Unit      | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| -------------------------------- | --------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `cadence`                        | rpm       |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ❌   |      ❌     |   ❌   |
| `estimated_workout_effort_score` | score     |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `power`                          | watts     |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ❌   |      ❌     |   ❌   |
| `speed`                          | m\_per\_s |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ❌   |      ❌     |   ❌   |
| `workout_effort_score`           | score     |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

### Environmental

| Metric                          | Unit    | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ------------------------------- | ------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `air_temperature`               | celsius |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `elevation`                     | meters  |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `environmental_audio_exposure`  | dB      |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `environmental_sound_reduction` | dB      |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `headphone_audio_exposure`      | dB      |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `inhaler_usage`                 | count   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `latitude`                      | degrees |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `longitude`                     | degrees |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `time_in_daylight`              | minutes |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `uv_exposure`                   | count   |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `water_temperature`             | celsius |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `weather_humidity`              | percent |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `weather_temperature`           | celsius |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |

### Provider-Specific

| Metric                | Unit    | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| --------------------- | ------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `garmin_body_battery` | percent |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `garmin_fitness_age`  | years   |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `garmin_stress_level` | score   |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

### Other

| Metric                          | Unit  | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ------------------------------- | ----- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `atrial_fibrillation_burden`    | count |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `electrodermal_activity`        | count |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `hydration`                     | mL    |   ❌   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `insulin_delivery`              | count |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `number_of_alcoholic_beverages` | count |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `number_of_times_fallen`        | count |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `push_count`                    | count |   ✅   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

***

## Workout Data Coverage

| Field                  | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ---------------------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `average_cadence`      |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ❌   |      ❌     |   ❌   |
| `average_speed`        |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ✅   |      ❌     |   ❌   |
| `average_watts`        |   ❌   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ✅   |    ✅   |      ❌     |   ❌   |
| `distance`             |   ✅   |    ✅   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ✅   |    ✅   |      ❌     |   ✅   |
| `elev_high`            |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ✅   |      ❌     |   ❌   |
| `elev_low`             |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ✅   |      ❌     |   ❌   |
| `energy_burned`        |   ✅   |    ✅   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ✅   |    ✅   |      ❌     |   ✅   |
| `heart_rate_avg`       |   ✅   |    ✅   |    ✅   |    ✅   |   ❌  |   ✅   |    ✅    |    ✅   |    ✅   |      ❌     |   ✅   |
| `heart_rate_max`       |   ✅   |    ✅   |    ✅   |    ✅   |   ❌  |   ✅   |    ✅    |    ✅   |    ✅   |      ❌     |   ✅   |
| `heart_rate_min`       |   ✅   |    ✅   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ✅   |      ❌     |   ❌   |
| `max_speed`            |   ✅   |    ❌   |    ❌   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ✅   |      ❌     |   ❌   |
| `max_watts`            |   ❌   |    ❌   |    ❌   |    ❌   |   ❌  |   ❌   |    ❌    |    ✅   |    ✅   |      ❌     |   ❌   |
| `moving_time_seconds`  |   ✅   |    ❌   |    ❌   |    ✅   |   ✅  |   ❌   |    ✅    |    ✅   |    ✅   |      ❌     |   ✅   |
| `steps_count`          |   ✅   |    ✅   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ❌   |    ✅   |      ❌     |   ❌   |
| `total_elevation_gain` |   ✅   |    ❌   |    ✅   |    ✅   |   ❌  |   ❌   |    ✅    |    ✅   |    ✅   |      ❌     |   ✅   |

***

## Sleep Data Coverage

| Field                          | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ------------------------------ | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `is_nap`                       |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ❌   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |
| `sleep_awake_minutes`          |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |
| `sleep_deep_minutes`           |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |
| `sleep_efficiency_score`       |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ❌   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |
| `sleep_light_minutes`          |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |
| `sleep_rem_minutes`            |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |
| `sleep_stages`                 |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ❌   |      ✅     |   ❌   |
| `sleep_time_in_bed_minutes`    |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |
| `sleep_total_duration_minutes` |   ✅   |    ❌   |    ✅   |    ✅   |   ✅  |   ✅   |    ✅    |    ❌   |    ✅   |      ✅     |   ✅   |

***

## Women's Health Coverage

| Field                         | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| ----------------------------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `current_phase`               |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `current_phase_type`          |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `cycle_length`                |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `day_in_cycle`                |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `days_until_next_phase`       |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `fertile_window_start`        |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `has_specified_cycle_length`  |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `has_specified_period_length` |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `is_predicted_cycle`          |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `last_updated_at`             |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `length_of_current_phase`     |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `length_of_fertile_window`    |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `period_length`               |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `predicted_cycle_length`      |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `pregnancy_snapshot`          |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

***

## Health Scores Coverage

| Score          | Apple | Fitbit | Garmin | Google | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop |
| -------------- | :---: | :----: | :----: | :----: | :--: | :---: | :-----: | :----: | :----: | :--------: | :---: |
| `activity`     |   ❌   |    ❌   |    ❌   |    ❌   |   ✅  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `body_battery` |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `readiness`    |   ❌   |    ❌   |    ❌   |    ❌   |   ✅  |   ✅   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |
| `recovery`     |   ❌   |    ❌   |    ❌   |    ❌   |   ❌  |   ✅   |    ❌    |    ❌   |    ✅   |      ❌     |   ✅   |
| `sleep`        |   ❌   |    ❌   |    ✅   |    ❌   |   ✅  |   ✅   |    ❌    |    ❌   |    ❌   |      ❌     |   ✅   |
| `strain`       |   ❌   |    ❌   |    ❌   |    ❌   |   ❌  |   ✅   |    ❌    |    ❌   |    ❌   |      ❌     |   ✅   |
| `stress`       |   ❌   |    ❌   |    ✅   |    ❌   |   ❌  |   ❌   |    ❌    |    ❌   |    ❌   |      ❌     |   ❌   |

***

## Provider Quirks

Key differences and limitations to be aware of when working with each provider:

<Accordion title="Apple Health">
  **Integration Method:** Push-based via SDK (no OAuth)

  * Data arrives via client SDK push, not server-to-server sync
  * Workouts (most metrics), sleep (stages, duration), and 100+ health record types via HealthKit SDK
  * Most comprehensive data coverage (100+ metric types)
  * Full sleep processing with stages (deep, light, REM, awake), duration, and time in bed
  * Sleep biometrics (HR, HRV, SpO2 during sleep) not yet extracted as part of sleep records
  * Some walking metrics require iPhone in pocket during activity
  * HRV is measured as SDNN, typically during sleep or rest periods
</Accordion>

<Accordion title="Garmin">
  **Integration Method:** OAuth 2.0 + Webhooks

  * Webhooks push data for 16 data types: activities, sleep, dailies, epochs, body composition, HRV, stress, respiration, pulse ox, blood pressure, user metrics, skin temperature, health snapshots, activity details, Move IQ, and menstrual cycle tracking
  * Full sleep processing with stages (deep, light, REM, awake), duration, efficiency score, and heart rate biometrics
  * Continuous 24/7 timeseries data: heart rate, steps, energy, HRV (RMSSD, overnight sleep window), stress levels, body battery, respiratory rate, SpO2, and more
  * Body composition from Garmin Index scale: weight, body fat %, BMI
  * Garmin-specific metrics: stress level, body battery, fitness age, skin temperature
  * 135+ workout type mappings to unified taxonomy
  * Workout details include distance, calories, avg/max heart rate, elevation gain, and average speed
  * Backfill orchestration for historical data retrieval (up to 5 years)
  * Menstrual cycle tracking (MCT): cycle phase, day in cycle, cycle/period length, fertile window, and pregnancy snapshot via the `mct` webhook type
</Accordion>

<Accordion title="Polar">
  **Integration Method:** OAuth 2.0 (pull + webhook)

  * Data synced via periodic polling; real-time webhook notifications for exercise, sleep, activity, nightly recharge, and Sleepwise events
  * Webhooks are notify-only: Polar sends a lightweight event payload, Open Wearables acknowledges immediately and enqueues a targeted sync for the affected data type
  * Full sleep processing with stages (deep, light, REM, awake), duration, time in bed, and stage timestamps from hypnogram; sleep efficiency not available in the API
  * Sleep HR timeseries saved from per-night heart rate samples (not summarised avg/min on the sleep record)
  * Continuous 24/7 heart rate sampled at \~5-min intervals via range endpoint (90-day lookback)
  * Daily activity: steps, active calories, and walking/running distance from `/v3/users/activities`
  * Health scores: sleep score, Nightly Recharge (recovery), Cardio Load (strain)
  * Sleepwise Alertness and Circadian Bedtime scores require an active **Polar Sleepwise** subscription
  * Body temperature, sleep skin temperature, SpO2, and wrist ECG (HRV RMSSD) require a **Polar Elixir** device
  * HRV RMSSD available from Elixir SpO2 spot tests and wrist ECG measurements; not available from standard devices; SDNN not provided
  * 75+ workout type mappings to unified taxonomy
  * Exercises fetched from `/v3/exercises` (all exercises in Polar Flow for the connected user; no date filter)
</Accordion>

<Accordion title="Suunto">
  **Integration Method:** OAuth 2.0 + 24/7 Data API

  * Most complete cloud-based provider (workouts + sleep + continuous data)
  * Full sleep analysis with stages and biometrics (HR, HRV, SpO2)
  * Activity samples include heart rate, steps, SpO2, energy, and HRV
  * HRV measured as RMSSD, available during activity and sleep
  * Daily activity statistics for aggregated steps and energy
  * 121+ workout type mappings to unified taxonomy
  * Recovery data: Balance score (0-100) mapped to recovery\_score
</Accordion>

<Accordion title="Oura">
  **Integration Method:** OAuth 2.0 + Webhooks

  * Webhooks push real-time notifications for: daily activity, daily readiness, daily sleep, daily SpO2, and workouts
  * Full sleep processing with stages (deep, light, REM, awake), duration, time in bed, efficiency score, stage timestamps, and nap detection
  * Sleep biometrics: lowest heart rate persisted as a daily `resting_heart_rate` sample and average breathing rate persisted as `respiratory_rate`; average HR and average HRV are available from the API but not yet persisted per sleep record
  * Continuous 24/7 timeseries: heart rate (5-min intervals), HRV (RMSSD, 5-min intervals), daily SpO2, steps, active calories, walking distance
  * Recovery data from daily readiness: recovery score, skin temperature deviation, and skin temperature trend deviation
  * Fitness metrics: VO2 max (daily estimate) and cardiovascular age — both require the `heart_health` OAuth scope
  * Personal info sync: height and weight from user profile
  * Oura does **not** expose heart rate data during workouts via API; workout records include only duration, type, calories, and distance
  * `temperature_deviation` and `temperature_trend_deviation` reflect skin temperature relative to baseline (not absolute body temperature)
  * Backfill defaults to 30 days when no date range is specified
</Accordion>

<Accordion title="Whoop">
  **Integration Method:** OAuth 2.0 (pull + webhook)

  * Data synced via periodic polling (default: every hour) and real-time webhook notifications for `workout`, `sleep`, and `recovery` events
  * Full workout support with 145+ workout type mappings to unified taxonomy
  * Workout metrics include: avg/max heart rate, calories, distance, elevation gain, moving time
  * Continuous heart rate data is **not available** via API (only during workouts)
  * Does not track steps (device limitation)
  * Sleep data fully implemented with all stages and efficiency
  * Recovery data fully implemented: recovery score, resting heart rate, HRV (RMSSD), SpO2, skin temperature
  * Body measurements (height, weight) synced from user profile
  * Strain scores available but not yet implemented
</Accordion>

<Accordion title="Ultrahuman">
  **Integration Method:** OAuth 2.0 (pull-based polling)

  * Data synced via periodic polling (default: every hour); Ultrahuman does not support webhooks
  * Daily metrics endpoint returns all data types for a single day: sleep, HR, HRV, skin temperature, steps, VO2 max, recovery indices
  * Full sleep processing with stages (deep, light, REM, awake), duration, time in bed, and efficiency score
  * Continuous 24/7 timeseries: heart rate, HRV (SDNN), skin temperature, steps
  * VO2 max as a daily aggregate value
  * Recovery metrics (recovery index, movement index, metabolic score) are normalized but not yet persisted
  * No workout/activity data available via the Partnership API
  * Skin temperature values are typically lower than core body temperature (\~29-37°C)
  * Backfill defaults to 30 days when no date range is specified
</Accordion>

<Accordion title="Strava">
  **Integration Method:** OAuth 2.0 + Webhooks

  * Activity/workout platform only — no sleep, HRV, or continuous health data
  * Real-time webhook notifications for new and updated activities
  * 50+ sport type mappings to unified taxonomy (SportType) plus legacy ActivityType support
  * Workout metrics include: avg/max heart rate, distance, avg/max speed, avg/max watts, elevation (gain/high/low), calories, moving time, device name
  * Per-sample workout streams (heart rate, speed, cadence, power) ingested as `/timeseries` data when `ingest_workout_samples` is enabled — scoped to workouts only, not continuous 24/7
  * Calories fall back to kilojoules when calorie data is not available from the API
  * Only one webhook subscription allowed per application
  * Webhook must respond with HTTP 200 within 2 seconds; retries up to 3 times on failure
</Accordion>

<Accordion title="Fitbit">
  **Integration Method:** OAuth 2.0 with PKCE (pull-based polling)

  * Data synced via periodic polling only; the Fitbit Subscriptions API (webhooks) is not yet implemented
  * Workout/activity data only today, fetched from the Activities List API with pagination; backfill defaults to 30 days
  * Workout metrics populated: avg heart rate, calories, distance, steps, and device name; min/max heart rate, speed, and elevation are offered by the API but not yet processed; power is not available
  * Workout distance is currently stored as the raw kilometer value from the API; conversion to the platform meter unit is pending
  * Sleep, intraday heart rate, HRV, SpO2, breathing rate, skin temperature, and body measurements are available in the Fitbit Web API but processing is not yet implemented
  * Intraday timeseries requires a Fitbit "Personal" app type or Fitbit approval for server applications
  * 14 activity type ID mappings plus 25 name-based fallbacks to the unified taxonomy; unrecognized activities map to "other"
</Accordion>

<Accordion title="Google Health Connect">
  **Integration Method:** Push-based via Android SDK (no OAuth)

  * 25+ Health Connect record types mapped to unified series: heart rate, resting HR, HRV, SpO2, blood pressure, respiratory rate, body measurements, steps, calories, and distance
  * Full sleep processing with stages (deep, light, REM, awake), duration, time in bed, efficiency score, and stage timestamps
  * Workout sessions currently carry duration, type, and start/end times only; heart rate, speed, calorie, and elevation gain aggregates are planned
  * HRV is measured as RMSSD; SDNN is not available
  * Body fat percentage arrives already in percent
  * Blood glucose arrives in mmol/L; values are stored as received until unit conversion ships
  * Health Connect basal metabolic rate is a kcal/day rate stored into the kcal `basal_energy` series
  * All Health Connect distance is stored as `distance_walking_running` regardless of activity type
  * No health scores; GPS routes and in-workout sample streams are accepted by the SDK payload but not yet processed
</Accordion>

***

## Data Normalization

Open Wearables normalizes all incoming data to consistent units and formats:

### Unit Standardization

All data is normalized to these canonical units:

| Metric        | Unit      |
| ------------- | --------- |
| Heart rate    | `bpm`     |
| HRV           | `ms`      |
| Distance      | `meters`  |
| Weight        | `kg`      |
| Height        | `cm`      |
| Temperature   | `°C`      |
| Energy        | `kcal`    |
| Duration      | `seconds` |
| Speed         | `m/s`     |
| Blood glucose | `mg/dL`   |

### Timestamp Handling

All timestamps are normalized to **UTC** with timezone information preserved when available:

```json theme={null}
{
  "timestamp": "2025-01-07T14:30:00Z",
  "type": "heart_rate",
  "value": 72,
  "unit": "bpm"
}
```

***

## Checking User Data Availability

To see what data is available for a specific user, query the connections endpoint:

```bash theme={null}
curl -X GET "https://api.openwearables.com/api/v1/users/{user_id}/connections" \
  -H "X-Open-Wearables-API-Key: YOUR_API_KEY"
```

Response shows which providers are connected:

```json theme={null}
[
  {
    "provider": "suunto",
    "status": "active",
    "last_synced_at": "2025-01-07T10:30:00Z"
  },
  {
    "provider": "apple",
    "status": "active",
    "last_synced_at": "2025-01-07T14:22:00Z"
  }
]
```

Then query the timeseries endpoint to see available data:

```bash theme={null}
curl -X GET "https://api.openwearables.com/api/v1/users/{user_id}/timeseries\
?start_time=2025-01-01T00:00:00Z\
&end_time=2025-01-07T23:59:59Z" \
  -H "X-Open-Wearables-API-Key: YOUR_API_KEY"
```
