What the HRV biomarkers measure
| Biomarker | Statistic | What it is |
|---|---|---|
heart_rate_variability_sdnn | SDNN | The standard deviation of the intervals between heartbeats over a measurement, in milliseconds |
heart_rate_variability_rmssd | RMSSD | The 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.
| Field | heart_rate_variability_sdnn, heart_rate_variability_rmssd |
|---|---|
| Unit | Milliseconds |
| Reported | Daily average of the day’s measurements |
| Window | Midnight to midnight, profile local time |
| Wearable required | Yes |
| API | GET /api/v1/profile/biomarker/{externalId}?categories=vitals plus one types parameter per field and a date range |
| Webhook | BiomarkerCreatedIntegrationEvent. Entries update in place, upsert on id. |
Data sources
| Platform | SDNN | RMSSD |
|---|---|---|
| iOS, HealthKit | heartRateVariabilitySDNN from Apple Watch, a few spot measurements a day, mostly during sleep and Breathe sessions | Not supplied |
| Android, Health Connect | Not supplied | HeartRateVariabilityRmssdRecord, written by Samsung Health, Fitbit, Garmin Connect, Pixel Watch, Oura and others |
| Direct integrations | Not supplied | WHOOP and Oura report a nightly RMSSD; Garmin reports overnight HRV |
| Phone only | None | None |
The split is total: SDNN is an Apple-only field on this platform, and RMSSD is everyone else.
How Sahha calculates heart rate variability
- 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.
- 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.
Related scores and insights
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-02Pick 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.
Related guides
- Heart rate for the other readiness vital and the same personal-baseline scoring
- Readiness Score explained for how the factors combine
- Data dictionary in the developer docs
References
- 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
- 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