Daily Data & Scores

Read calendar-aligned metrics and Sonar scores in a compact columnar shape.

6 min read Updated Sep 16, 2026

Both endpoints return a dates axis and one equally sized array per requested type. Index i in every series is the value for dates[i].

Daily Metrics

GET /v1/users/{id}/daily

Returns one normalized value per day and metric across the inclusive range.

Query parameterDefaultRules
typesall public daily metricsComma-separated IDs from the Metric Catalog
from_date29 days before to_dateYYYY-MM-DD
to_datecurrent date in the user’s timezoneYYYY-MM-DD

The maximum inclusive range is 366 days. from_date cannot be later than to_date.

Every date is a calendar day in the timezone saved on the user’s profile, not a UTC date. If the profile has no timezone, Sonar uses UTC. See The Health-Data Clock.

http
GET /v1/users/7e4e91a5-1e4f-4fc2-903c-251046d2a4d3/daily?types=steps,distance,resting_heart_rate&from_date=2026-09-01&to_date=2026-09-03
json
{
  "from_date": "2026-09-01",
  "to_date": "2026-09-03",
  "dates": ["2026-09-01", "2026-09-02", "2026-09-03"],
  "series": {
    "steps": [9418, 7310, null],
    "distance": [7.1, 5.4, null],
    "resting_heart_rate": [52, 54.5, null]
  }
}

Missing readings are null; dates are never omitted. Keys in series follow the requested types order. Whitespace around IDs is ignored and duplicate IDs are returned once. An empty or unsupported list returns 422 invalid_types.

Scores

GET /v1/users/{id}/scores

Returns Sonar scores in the daily shape, plus the latest scored day per requested score.

Query parameterDefaultRules
typesall five scoresComma-separated score IDs
from_date29 days before to_dateYYYY-MM-DD
to_datecurrent date in the user’s timezoneYYYY-MM-DD
json
{
  "from_date": "2026-09-01",
  "to_date": "2026-09-03",
  "dates": ["2026-09-01", "2026-09-02", "2026-09-03"],
  "series": {
    "sleep_score": [84, 88, null],
    "recovery_score": [79, 82, null]
  },
  "latest": {
    "sleep_score": { "date": "2026-09-02", "value": 88, "previous_value": 84 },
    "recovery_score": { "date": "2026-09-02", "value": 82, "previous_value": 79 }
  }
}

latest is null when a requested score has no value in the range. previous_value is the prior calendar day’s value, or null when that day is absent or outside the range.

Scores use their own endpoint

Score IDs are rejected by /daily, and daily metric IDs are rejected by /scores. See Health Scores for the five score IDs and their meaning.