What the heart rate biomarkers measure
| Biomarker | What it is |
|---|---|
heart_rate_resting | The day’s average of the device’s resting heart rate estimates |
heart_rate_sleep | The average heart rate across the hours the user was in bed |
| Field | heart_rate_resting, heart_rate_sleep |
|---|---|
| Unit | Beats per minute |
| Reported | Daily average |
| 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 | Resting heart rate | Raw heart rate (for sleeping heart rate) |
|---|---|---|
| iOS, HealthKit | restingHeartRate, computed by Apple Watch once a day from quiet periods | heartRate samples from Apple Watch |
| Android, Health Connect | RestingHeartRateRecord, written by Samsung Health, Fitbit, Garmin Connect, Pixel Watch and other apps | HeartRateRecord samples from the same apps |
| Direct integrations | WHOOP and Oura report a nightly resting heart rate; Garmin reports a daily one | Provider-dependent |
| Phone only | None | None |
Each vendor defines resting heart rate differently. Apple samples quiet moments through the day. Oura and WHOOP take the overnight low or average. The values are not interchangeable across devices.
How Sahha calculates heart rate
- Pick one source for the day. Within the heart category, a source that reports resting heart rate outranks one that reports only raw heart rate. One source wins per day; values from different devices are never blended.
- Resting heart rate is the average of that source’s resting heart rate samples with an end time inside the local day. Most devices write one per day, so the average is usually that single value.
- Sleeping heart rate is built from raw heart rate samples. Each hour of the day in which the user was in bed for at least 45 minutes, according to sleep records, is averaged, and those hourly averages are averaged again. Hours before midnight belong to the previous calendar date.
Absence means the winning source supplied no samples of that kind that day.
Interpreting the value
Read it against the user’s own history. Resting heart rate varies far more between people than within one person. For a per-user benchmark use the heart_rate_resting comparison insight, which places the value against global, demographic, and personal-baseline groups and treats lower as better.
Sleeping heart rate is usually lower and steadier than resting. It excludes daytime stress, caffeine, and posture, so it moves less day to day and shows illness, alcohol, and late meals more clearly.
A night that spans midnight is split. The in-bed hour before midnight counts toward the earlier date. Sleeping heart rate for a date mostly reflects the early-morning hours.
Related scores and insights
Score factor. The Readiness Score carries a factor named resting_heart_rate, unit bpm, whose value is the day’s resting heart rate. Its goal is the user’s own 30-day average, excluding the current day. Credit is 1 at the average and falls in proportion to how far the day’s value sits from it, measured in multiples of the user’s own 30-day standard deviation, with a floor of 0.2. A user whose resting heart rate never varies has no standard deviation to scale by, and no factor until it does.
Trend. A resting_heart_rate trend is available on the factor score.
Comparison. A heart_rate_resting comparison is available on the raw value. None for sleeping heart rate.
Use cases
A “higher than your usual” flag. Compare today’s resting heart rate with the user’s own 30-day baseline from the comparison insight. A rise of several beats sustained over two or three days, with no change in training, is the classic early sign of illness or overreaching [1], and the readiness factor already encodes it.
GET /api/v1/profile/biomarker/{externalId}?categories=vitals&types=heart_rate_resting&types=heart_rate_sleep&startDateTime=2026-08-03&endDateTime=2026-09-02A sleeping heart rate history. The seven-night line of sleeping heart rate is the single most legible recovery chart for users, and it needs only raw heart rate plus sleep records.
Limitations
- Values differ by vendor. Do not compare resting heart rate across users on different devices, and expect a step change when a user switches.
- Sleeping heart rate needs both heart rate samples and sleep records. A phone-estimated sleep window can supply the hours, but the heart rate still has to come from a worn device.
- The 45-minute rule drops short in-bed hours. The hour the user went to bed or got up is often excluded.
- Absence is not zero.
Related guides
- Heart rate variability for the other readiness vital
- Sleep duration for the sleep records that define in-bed hours
- Readiness Score explained for how the personal-baseline factors combine
- Data dictionary in the developer docs
References
- Radin JM, Wineinger NE, Topol EJ, Steinhubl SR. Harnessing wearable device data to improve state-level real-time surveillance of influenza-like illness in the USA: a population-based study. The Lancet Digital Health. 2020;2(2):e85-e93. https://doi.org/10.1016/S2589-7500(19)30222-5