GET
/
day-snapshot
/
{date}
Get day snapshot
curl --request GET \
  --url http://healthkite.local:8080/day-snapshot/{date}
{
  "date": "2026-05-10",
  "timezone": "America/Chicago",
  "sampleEncoding": "columnar-v1",
  "activity": {
    "steps": 9120,
    "distanceMeters": 8221.78,
    "activeEnergyKcal": 874.59,
    "exerciseMinutes": 30,
    "standHours": 3,
    "flightsClimbed": 5
  },
  "heart": {
    "restingBPM": 59,
    "averageBPM": 81.64,
    "hrvSDNN": 92.92,
    "vo2max": 44.14
  },
  "sleep": [
    {
      "startDate": "2026-05-10T04:20:00Z",
      "endDate": "2026-05-10T13:31:30Z",
      "inBedDuration": 33090,
      "asleepDuration": 27660
    }
  ],
  "workouts": [],
  "body": {
    "weightKg": 90.72,
    "bmi": null,
    "bodyFatPercent": null
  },
  "mobility": {
    "walkingSpeedMS": 1.249,
    "stepLengthM": 0.7
  }
}
date is YYYY-MM-DD in the iPhone’s local timezone. The server brackets [startOfDay, nextDayStart) exactly the way the iOS UI does, so the numbers in the response match what’s on screen. This is the highest-leverage endpoint for agents: one call → sleep, workouts, activity totals, heart, body, and mobility for a day.

Field-by-field

sleep (array)

Zero or more sessions whose endDate falls within the local day. Most days have one session (the night ending this morning). Naps + nighttime sleep ending the same day appear as two entries. Same shape as /sleep sessions.

workouts (array)

WorkoutSummary objects whose startDate falls within the local day, sorted by startDate descending. Same shape as /workouts summaries — for full detail, follow up with /workouts/{uuid}.

activity (object or null)

Daily totals computed via HKStatisticsQuery .cumulativeSum. Numbers match the Apple Health app exactly. null if all six fields are nil.
FieldUnit
stepscount
distanceMetersmeters
activeEnergyKcalkcal
exerciseMinutesminutes
standHourshours
flightsClimbedfloors

heart (object or null)

FieldSource
restingBPMLatest RestingHeartRate sample with endDate in the day
averageBPMHKStatisticsQuery .discreteAverage over HeartRate samples in the day
hrvSDNNLatest HeartRateVariabilitySDNN reading within an 18-hour window of the day start
vo2maxLatest VO2Max reading on or before endOfDay
Individual fields are null when no data exists; the whole object is null when all four are nil.

body (object or null)

Latest body measurement on or before endOfDay. mostRecentSampleDate indicates how fresh the data is — values may be days or weeks old depending on logging cadence.

mobility (object or null)

HKStatisticsQuery .discreteAverage over the day’s walking samples.

Future dates

get_day_snapshot({ "date": "2099-01-01" }) returns 200 with sleep: [], workouts: [], and activity/heart/body/mobility: null. No error.

Errors

  • 400 bad_date — date parameter doesn’t parse as YYYY-MM-DD.

MCP tool

get_day_snapshot({ "date": "2026-05-10" })

Path Parameters

date
string<date>
required

YYYY-MM-DD in the iPhone's local timezone.

Response

Day snapshot