---
title: "Get Body Summary"
method: GET
path: "/api/v1/users/{user_id}/summaries/body"
tags: ["External: Summaries"]
---

# Get Body Summary

`GET /api/v1/users/{user_id}/summaries/body`

## Request

- Base URL: `https://api.openwearables.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.openwearables.io/api/v1/users/{user_id}/summaries/body`
- Auth: OAuth 2 (password, token URL `/api/v1/auth/login`)

Returns comprehensive body metrics with semantic grouping.

Response is organized into three categories:
- **static**: Slow-changing values (weight, height, body fat, muscle mass, BMI, age)
  Returns the most recent recorded value for each field.
- **averaged**: Vitals averaged over a period (resting HR, HRV)
  Period is configurable via `average_period` parameter (1-7 days).
- **latest**: Point-in-time readings (body temperature, blood pressure)
  Only returned if measured within `latest_window_hours` (default 4 hours).

Returns null if no body data exists for the user.

## Path parameters

- `user_id` string, uuid, required

## Query parameters

- `average_period` integer: Days to average vitals (1-7)
- `latest_window_hours` integer: Hours for latest readings to be considered valid (1-24)

## Headers

- `X-Open-Wearables-API-Key` string, nullable

## Response `200`

Successful Response

- BodySummary: Comprehensive body metrics with semantic grouping. Metrics are grouped by their temporal characteristics: - slow_changing: Slow-changing values (latest measurement) - averaged: Vitals averaged over a period (1 or 7 days) - latest: Point-in-time readings (only if recent)
  - `source` SourceMetadata, required
    - `provider` string, required
    - `source` string, nullable
    - `device` string, nullable
    - `device_type` 'watch' | 'band' | 'phone' | 'scale' | 'ring' | 'tablet' | 'chest_strap' | 'hr_sensor' | 'headphones' | 'head_mounted' | 'glasses' | 'smart_display' | 'bp_monitor' | 'glucose_meter' | 'thermometer' | 'sleep_monitor' | 'bike_computer' | 'fitness_machine' | 'other' | 'unknown': Type of device that collected health data.
    - `device_id` string, nullable
    - `device_name` string, nullable, required: Marketing name for ``device``, derived so it cannot drift from the raw model.
  - `slow_changing` BodySlowChanging, required: Slow-changing body composition metrics. These are metrics that change infrequently (days/weeks between measurements). Returns the most recent recorded value for each field.
    - `weight_kg` number, nullable: Most recent weight measurement
    - `height_cm` number, nullable: Most recent height measurement
    - `body_fat_percent` number, nullable: Most recent body fat percentage
    - `muscle_mass_kg` number, nullable: Most recent muscle/lean body mass
    - `bmi` number, nullable: Calculated from latest weight and height
    - `age` integer, nullable: Age in years calculated from birth date
  - `averaged` BodyAveraged, required: Vitals averaged over a configurable time period. These metrics fluctuate daily and are more meaningful as averages. Period can be 1 day (current state) or 7 days (baseline trend).
    - `period_days` integer, required: Number of days averaged (1 or 7)
    - `resting_heart_rate_bpm` integer, nullable: Average resting heart rate
    - `avg_hrv_sdnn_ms` number, nullable: Average HRV (SDNN)
    - `avg_hrv_rmssd_ms` number, nullable: Average HRV (RMSSD)
    - `period_start` string, date-time, required: Start of averaging period
    - `period_end` string, date-time, required: End of averaging period
  - `latest` BodyLatest, required: Point-in-time metrics that are only relevant when recent. These metrics are only returned if measured within a configurable time window. Stale readings return null to avoid displaying outdated data.
    - `body_temperature_celsius` number, nullable: Body temperature if measured within time window
    - `body_temperature_measured_at` string, date-time, nullable: When body temperature was measured (null if no recent reading)
    - `skin_temperature_celsius` number, nullable: Skin temperature if measured within time window
    - `skin_temperature_measured_at` string, date-time, nullable: When skin temperature was measured (null if no recent reading)
    - `blood_pressure` BloodPressure: Blood pressure statistics aggregated over a period. Values are aggregated from multiple readings to provide a more representative measure.
      - `avg_systolic_mmhg` integer, nullable: Average systolic pressure
      - `avg_diastolic_mmhg` integer, nullable: Average diastolic pressure
      - `max_systolic_mmhg` integer, nullable: Maximum systolic pressure
      - `max_diastolic_mmhg` integer, nullable: Maximum diastolic pressure
      - `min_systolic_mmhg` integer, nullable: Minimum systolic pressure
      - `min_diastolic_mmhg` integer, nullable: Minimum diastolic pressure
      - `reading_count` integer, nullable: Number of readings in period
    - `blood_pressure_measured_at` string, date-time, nullable: When blood pressure was measured (null if no recent reading)

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-14** `bc25a1359b11`: 1 info
  - added the optional property `anyOf[subschema #1: BodySummary]/source/device_id` to the response with the `200` status
- **2026-10-02** `4eaceca2333d`: 13 warning
  - added the new `bike_computer` enum value to the `anyOf[subschema #1: BodySummary]/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - added the new `bp_monitor` enum value to the `anyOf[subschema #1: BodySummary]/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - added the new `chest_strap` enum value to the `anyOf[subschema #1: BodySummary]/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - added the new `fitness_machine` enum value to the `anyOf[subschema #1: BodySummary]/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - …9 more
- **2026-08-08** `37c1c527cd8f`: 3 info
  - added the optional property `anyOf[subschema #1: BodySummary]/source/device_type` to the response with the `200` status
  - added the optional property `anyOf[subschema #1: BodySummary]/source/source` to the response with the `200` status
  - added the required property `anyOf[subschema #1: BodySummary]/source/device_name` to the response with the `200` status

[Operation history](https://skmtc.dev/openwearables/apis/open-wearables-api/changes/api/v1/users/:user_id/summaries/body/get.md)

---

[API](https://skmtc.dev/openwearables/apis/open-wearables-api.md) · [All operations](https://skmtc.dev/openwearables/apis/open-wearables-api/llms.txt) · [OpenAPI document](https://skmtc.dev/openwearables/apis/open-wearables-api/revisions/c9016a165d04?raw)
