What the respiratory rate biomarkers measure
| Biomarker | What it is |
|---|---|
respiratory_rate | The day’s average breaths per minute across all samples |
respiratory_rate_sleep | The average across the hours the user was in bed |
| Field | respiratory_rate, respiratory_rate_sleep |
|---|---|
| Unit | Breaths 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 | Record | Notes |
|---|---|---|
| iOS, HealthKit | respiratoryRate | Apple Watch, during sleep only |
| Android, Health Connect | RespiratoryRateRecord | Fitbit, Garmin Connect, Pixel Watch, Oura and other writers, mostly overnight |
| Direct integrations | Provider-dependent | Garmin and Oura report overnight respiration |
| Phone only | None |
How Sahha calculates respiratory rate
- Pick one source for the day within the oxygen category, which also covers oxygen saturation and VO2 max. One source wins per day; values are never blended.
- Daily is the average of that source’s samples with an end time inside the local day.
- Sleep averages each hour in which the user was in bed for at least 45 minutes, according to sleep records, then averages those hours. Hours before midnight belong to the previous calendar date.
Absence means no samples from the winning source that day.
Interpreting the value
The signal is the change, not the level. Overnight respiratory rate is remarkably stable for an individual. A rise of one to two breaths per minute against the user’s own recent average, sustained over consecutive nights, is a well-documented early marker of respiratory illness, and it tends to precede symptoms [1].
Most users’ two values are the same number. Because consumer devices measure breathing during sleep, the daily and sleep averages usually coincide. The pair only diverges for devices that also sample during the day.
Related scores and insights
Respiratory rate is not a score factor and has no trend or comparison insight.
Use cases
A “breathing rate above your usual” flag. Keep a 14-night rolling average and flag two consecutive nights more than 1.5 breaths per minute above it. Because there is no comparison insight for this field, the baseline is yours to compute from the biomarker history.
GET /api/v1/profile/biomarker/{externalId}?categories=vitals&types=respiratory_rate_sleep&startDateTime=2026-08-19&endDateTime=2026-09-02Pair it with resting heart rate and sleeping heart rate. A rise in all three on the same nights is a stronger signal than any one of them.
Limitations
- Wearable only, and mostly overnight. Daytime respiratory rate is rare on consumer devices.
- A night that spans midnight is split across two dates by the calendar-day window.
- Absence is not zero.
Related guides
- Heart rate for the companion overnight signal
- Oxygen saturation for the other overnight vital from the same sources
- Data dictionary in the developer docs
References
- Miller DJ, Capodilupo JV, Lastella M, et al. Analyzing changes in respiratory rate to predict the risk of COVID-19 infection. PLoS ONE. 2020;15(12):e0243693. https://doi.org/10.1371/journal.pone.0243693