Health Scores
Sonar's five daily scores, served by their own endpoint with the latest value and its change.
The current public API exposes five scores. Each summarizes a different part of a user’s health data; the meaning of a high value depends on the score.
| Score | What it measures | Main inputs |
|---|---|---|
sleep_score | Sleep quality and consistency | Sleep efficiency, deep and REM sleep, sleep balance, overnight heart rate and HRV, and sleep timing |
recovery_score | Readiness for physical exertion | Sleep quality, overnight heart rate and HRV, physiological deviations, previous-day strain, and heart-rate dip |
strain_score | Cumulative cardiovascular load | Heart rate relative to the user’s resting and maximum heart rate |
nutrition_score | Daily intake relative to the user’s targets | Calories, protein, carbohydrates, fat, and fiber |
stress_score | Physiological stress burden | Heart-rate and HRV changes during waking and sleeping periods, excluding workouts |
Reading the scale
All five scores use a 0–100 scale, but higher does not always mean better. Higher Sleep, Recovery, and Nutrition values indicate a more favorable result. Higher Strain means more accumulated load, and higher Stress means more physiological stress.
How Scores Are Calculated
Scores are calculated from Sonar’s consolidated health data. Required inputs differ by score, and a score is unavailable for a date until those inputs have been processed. Some calculations can use the available optional inputs and adjust their weighting; others require a particular combination of sleep, vitals, or heart-rate data.
Several inputs are evaluated relative to the user’s own rolling history. That makes the result more useful for an individual whose normal heart rate or HRV may differ from population averages. These baseline-dependent signals become more representative as additional history is processed.
Sleep
Sleep combines three aspects of the main sleep session: quality, overnight vitals, and timing consistency. Quality considers sleep efficiency, deep sleep, REM sleep, and sleep balance. Overnight heart rate and HRV are compared with the user’s recent history, while irregular sleep and wake times can reduce the result.
Recovery
Recovery estimates readiness for physical exertion. It gives the greatest influence to overnight heart rate and HRV, then considers sleep quality. Previous-day strain, heart-rate dip, and unusual overnight respiratory rate, temperature, or blood-oxygen readings may also affect the result when those signals are available.
Strain
Strain accumulates cardiovascular effort throughout the day. Sonar evaluates heart rate relative to the user’s resting and maximum heart rate, ignores readings below a low-intensity threshold, and weights harder efforts more heavily. The relationship is nonlinear, so sustained high-intensity activity increases Strain faster than the same duration of easy activity.
Stress
Stress is derived from changes in heart rate and HRV. Sonar evaluates these signals in six-minute intervals, smooths short-lived noise, and interprets sleeping and waking periods separately. Workout periods are excluded so that expected exercise intensity is not counted as physiological stress. The public score is the daily aggregate of the available intervals.
Nutrition
Nutrition compares daily intake with calorie and macronutrient targets derived from the user’s profile and goals. It considers calories, protein, carbohydrates, fat, and fiber; custom targets are used when configured. Values closest to the targets contribute most strongly, while intake above or below them lowers the result.
Request Scores
Request them through GET /v1/users/{id}/scores:
GET /v1/users/{id}/scores?types=sleep_score,recovery_score,strain_score&from_date=2026-09-01&to_date=2026-09-07{
"from_date": "2026-09-01",
"to_date": "2026-09-07",
"dates": ["2026-09-01", "2026-09-02", "2026-09-03", "2026-09-04", "2026-09-05", "2026-09-06", "2026-09-07"],
"series": {
"sleep_score": [84, 88, 79, null, 81, 90, 86],
"recovery_score": [79, 82, 70, null, 77, 85, 80],
"strain_score": [42, 55, 61, null, 38, 47, 50]
},
"latest": {
"sleep_score": { "date": "2026-09-07", "value": 86, "previous_value": 90 },
"recovery_score": { "date": "2026-09-07", "value": 80, "previous_value": 85 },
"strain_score": { "date": "2026-09-07", "value": 50, "previous_value": 47 }
}
}Scores are normalized to the 0–100 range. A score is null when the required inputs have not been processed for that date.
Same shape as daily
dates and series follow the daily contract exactly; latest is the extra a score card needs. Score IDs are rejected by /daily.
When a webhook reports subject.synced, its payload.scores list names the scores that changed for the affected dates, so a consumer re-reads exactly those. Historical scores may arrive across multiple sync events.
Sonar