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 | 🔜 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 🔜 |
Legend
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
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.Detailed Coverage Matrix
Heart & Cardiovascular
| Metric | Unit | Apple | Fitbit | Garmin | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | Oura | Polar | Samsung | Strava | Suunto | Ultrahuman | Whoop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
swimming_stroke_count | count | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
Activity - Generic
| Metric | Unit | Apple | Fitbit | Garmin | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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:Apple Health
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
Garmin
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
mctwebhook type
Polar
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)
Suunto
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
Oura
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_ratesample and average breathing rate persisted asrespiratory_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_healthOAuth 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_deviationandtemperature_trend_deviationreflect skin temperature relative to baseline (not absolute body temperature)- Backfill defaults to 30 days when no date range is specified
Whoop
Whoop
Integration Method: OAuth 2.0 (pull + webhook)
- Data synced via periodic polling (default: every hour) and real-time webhook notifications for
workout,sleep, andrecoveryevents - 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
Ultrahuman
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
Strava
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
/timeseriesdata wheningest_workout_samplesis 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
Fitbit
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”
Google Health Connect
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_energyseries - All Health Connect distance is stored as
distance_walking_runningregardless of activity type - No health scores; GPS routes and in-workout sample streams are accepted by the SDK payload but not yet processed
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 |

