Daily health metrics
get_metricRead daily health metric series like steps, resting heart rate, HRV, or weight; filter by date window, aggregate, or group by day/week/month.
Instructions
Read any one-number-per-day health series: steps, resting HR, HRV, weight, …
series takes ONE name, a LIST of names, or nothing (= every series).
Names come from list_metric_series, which also says how much data backs
each — call it first rather than guessing. Activity is five series
(steps, active_energy, exercise_minutes, stand_minutes, distance_meters);
pass them as a list to get the whole day in one call.
days = the newest N days THAT HAVE DATA, per series (not N calendar days).
For a CALENDAR window — "last month", "this semester", "July" — pass
since / until ("YYYY-MM-DD", either or both) instead; days is then
ignored and the reply names the range it used.
aggregation is computed here, not by you: avg / sum / min / max /
latest over the window, or none (default) for the per-day points only.
sum is refused on state measurements (resting HR, weight, VO2max) — it
has no meaning there. granularity = day (default), week (ISO weeks)
or month; week/month return buckets aggregated with aggregation
(avg when none), each with days_with_data beside days_in_period.
period_in_progress: true marks the current, unfinished week/month and
clipped_by_window: true the oldest one your days cut through — never
compare either against a full period as if it were one.
granularity = weekday groups the window by day of the week (Mon..Sun)
— the direct answer to "weekends vs weekdays" and to social jet lag. Read
its weekday_note: sleep is dated by the morning it ends, so Sat is the
Friday-night sleep.
Honesty the reply already does for you, so do not undo it:
· On cumulative series (steps, energy, water) today is still accruing —
it is marked partial: true and excluded from every aggregate.
· excluded_days names days dropped because their data was short (basal
energy with the Watch off the wrist, TDEE without basal), with reasons.
· Missing days are absent, never zero.
Each series' points (or buckets) is a table: columns names the
fields once and every entry of rows is one day (or period) in that
order — e.g. columns: ["date", "value", "partial"]. The flags above are
columns; a day without one has null there.
Each series carries its own coverage block: quote coverage.days_covered
and coverage.span_days beside any number. 🔴 Before saying how far back
someone's data goes, read coverage.more_available: true means older days
exist that your days left behind — ask for more, or quote
coverage.oldest_available. Never report a window as the extent of their data.
Reads YOUR data by default.
Pass partner=true for your partner's — of these series only sleep, water
and weight (with body composition) can be shared, so every other series
comes back empty for a partner by design.
Sleep is here too — duration, timing (bedtime_minutes, wake_minutes,
sleep_midpoint_minutes), stages, awakenings, heart/breathing rate while
asleep; the nights behind those numbers are get_sleep_nights. Richer
kinds have their own tools: workouts, strength, food, notes, symptoms, cycle,
and the sex / age / height profile (get_user_profile).
Samples within a day (HRV spikes) → get_intraday. Trend / period
comparison / correlation → get_metric_trend, compare_metric_periods,
correlate_metric_series.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| fresh | No | ||
| since | No | ||
| until | No | ||
| series | No | ||
| partner | No | ||
| aggregation | No | none | |
| granularity | No | day |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||