September 3, 2026 · 5 min read

Heart rate variability

Why iOS and Android supply different statistics, how the daily values are averaged, the personal-baseline readiness factor, and what to build.

What the HRV biomarkers measure

BiomarkerStatisticWhat it is
heart_rate_variability_sdnnSDNNThe standard deviation of the intervals between heartbeats over a measurement, in milliseconds
heart_rate_variability_rmssdRMSSDThe root mean square of successive differences between those intervals, in milliseconds

Both describe how much the gap between heartbeats varies. Higher generally means a more rested, less stressed nervous system. RMSSD tracks short-term, breath-to-breath variation and is the statistic most consumer devices use and the one the monitoring literature recommends for day-to-day tracking [1]. SDNN captures variation over a longer window and is what Apple reports.

Fieldheart_rate_variability_sdnn, heart_rate_variability_rmssd
UnitMilliseconds
ReportedDaily average of the day’s measurements
WindowMidnight to midnight, profile local time
Wearable requiredYes
APIGET /api/v1/profile/biomarker/{externalId}?categories=vitals plus one types parameter per field and a date range
WebhookBiomarkerCreatedIntegrationEvent. Entries update in place, upsert on id.

Data sources

PlatformSDNNRMSSD
iOS, HealthKitheartRateVariabilitySDNN from Apple Watch, a few spot measurements a day, mostly during sleep and Breathe sessionsNot supplied
Android, Health ConnectNot suppliedHeartRateVariabilityRmssdRecord, written by Samsung Health, Fitbit, Garmin Connect, Pixel Watch, Oura and others
Direct integrationsNot suppliedWHOOP and Oura report a nightly RMSSD; Garmin reports overnight HRV
Phone onlyNoneNone

The split is total: SDNN is an Apple-only field on this platform, and RMSSD is everyone else.

How Sahha calculates heart rate variability

  1. Pick one source for the day within the heart category. A source that reports resting heart rate outranks one that reports SDNN, which outranks one that reports RMSSD. One source wins per day; values are never blended across devices.
  2. Average the samples. Each biomarker is the average of that source’s samples of that statistic with an end time inside the local day.

Absence means the winning source supplied no samples of that statistic that day. On Apple Watch, days with no SDNN reading are common, since the Watch takes them opportunistically.

Interpreting the value

Only the user’s own trend means anything. Population HRV spans an order of magnitude and falls steadily with age [2]. Use the heart_rate_variability_sdnn or heart_rate_variability_rmssd comparison insight for context, and the personal-baseline group in particular.

Day-to-day noise is large. A single day 20 percent below the user’s average is unremarkable. Three or more days below it, with resting heart rate above its average, is the pattern that matters.

Apple’s daily value may rest on one reading. With a handful of spot measurements a day, the average can swing on whether a reading happened during sleep or during a stressful afternoon. Ring and band RMSSD values are overnight averages and are steadier.

Score factor. The Readiness Score carries a factor named heart_rate_variability, unit ms, whose value is the day’s RMSSD when the profile reports it and the day’s SDNN otherwise. Its goal is the user’s own 30-day average of that same field, excluding the current day. Credit is 1 when the day’s value is at or slightly above the average and falls as it drops below, scaled by the user’s own 30-day standard deviation, with a floor of 0.2. A profile that moves from one field to the other, for example by adding a ring to an Apple Watch, starts a fresh baseline on the new field and has no factor until enough history exists.

Trend. A heart_rate_variability trend is available on the factor score.

Comparisons. heart_rate_variability_sdnn and heart_rate_variability_rmssd comparisons are both available on the raw values.

Use cases

A recovery readout on the user’s own scale. Show the day’s value against the personal baseline from the comparison insight, as a percentage of the user’s average rather than in milliseconds. Users do not know what 45 ms means; they do know what 15 percent below usual means.

GET /api/v1/profile/biomarker/{externalId}?categories=vitals&types=heart_rate_variability_sdnn&types=heart_rate_variability_rmssd&startDateTime=2026-08-03&endDateTime=2026-09-02

Pick the field per user, not per app. Read both, use whichever the user has, and label which statistic it is. Never plot the two on the same axis.

Limitations

  • SDNN and RMSSD are not comparable, across users or across a device switch.
  • A device change resets the readiness baseline. Moving between an SDNN source and an RMSSD source starts the 30-day history again.
  • Apple values are sparse and context-dependent.
  • Absence is not zero.

References

  1. Plews DJ, Laursen PB, Stanley J, Kilding AE, Buchheit M. Training adaptation and heart rate variability in elite endurance athletes: opening the door to effective monitoring. Sports Medicine. 2013;43(9):773-781. https://doi.org/10.1007/s40279-013-0071-8
  2. Shaffer F, Ginsberg JP. An overview of heart rate variability metrics and norms. Frontiers in Public Health. 2017;5:258. https://doi.org/10.3389/fpubh.2017.00258

Related