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

# Get Recovery Summary

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

## 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/recovery`
- Auth: OAuth 2 (password, token URL `/api/v1/auth/login`)

Returns daily recovery metrics (recovery score, HRV, resting HR, SpO2).

**Warning - known limitation:** this endpoint currently returns data **only for WHOOP**.
Metrics are read from stored recovery-score records, which today are produced solely by
WHOOP, so users connected only to other providers (e.g. Apple Health) receive an empty
result even when the underlying resting HR, HRV and SpO2 are available. This is a bug.

These values will soon be computed from the timeseries we already store in the database
rather than from what a single provider reports, at which point recovery metrics will be
returned for all providers that supply the underlying data.

## Path parameters

- `user_id` string, uuid, required

## Query parameters

- `start_date` string, date-time, required: ISO 8601 datetime (e.g. `2023-11-07T05:31:56Z`) or Unix timestamp in seconds. Date-only strings (e.g. `2023-11-07`) are also accepted and cover the whole day, so a date-only range includes both boundary days.
- `end_date` string, date-time, required: ISO 8601 datetime (e.g. `2023-11-07T05:31:56Z`) or Unix timestamp in seconds. Date-only strings (e.g. `2023-11-07`) are also accepted and cover the whole day, so a date-only range includes both boundary days.
- `cursor` string, nullable
- `limit` integer

## Headers

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

## Response `200`

Successful Response

- PaginatedResponseRecoverySummary
  - `data` RecoverySummary[], required
    - `date` string, date, required
    - `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.
    - `sleep_duration_seconds` integer, nullable
    - `sleep_efficiency_percent` number, nullable
    - `resting_heart_rate_bpm` integer, nullable
    - `avg_hrv_sdnn_ms` number, nullable: Average HRV (SDNN). Currently always null: every record this endpoint returns today comes from WHOOP - a recovery-score record is required for a row to be returned, and only WHOOP produces one - and WHOOP reports HRV as RMSSD, which is exposed in avg_hrv_rmssd_ms. Once recovery metrics are computed from stored timeseries (and returned for all providers, not just WHOOP), this will carry SDNN for providers that report it (e.g. Apple Health).
    - `avg_hrv_rmssd_ms` number, nullable: Average HRV (RMSSD)
    - `avg_spo2_percent` number, nullable
    - `recovery_score` integer, nullable: Deprecated and scheduled for removal in an upcoming release: 0-100 recovery score. Among the supported providers only WHOOP reports a recovery score, and Open Wearables does not compute its own, so this is null for every other provider. Migrate to the health scores endpoint (GET /api/v1/users/{user_id}/health-scores), whose `components` array exposes the underlying metrics the score is derived from.
  - `pagination` Pagination, required
    - `next_cursor` string, nullable: Cursor to fetch next page, null if no more data
    - `previous_cursor` string, nullable: Cursor to fetch previous page
    - `has_more` boolean, required: Whether more data is available
    - `total_count` integer, nullable: Total number of records matching the query
  - `metadata` TimeseriesMetadata, required
    - `resolution` 'raw' | '1min' | '5min' | '15min' | '1hour': Bucket width requested when reading time series. RAW returns stored samples untouched.
    - `sample_count` integer, nullable
    - `start_time` string, date-time, nullable
    - `end_time` string, date-time, nullable

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-14** `bc25a1359b11`: 1 info
  - added the optional property `data/items/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 `data/items/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - added the new `bp_monitor` enum value to the `data/items/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - added the new `chest_strap` enum value to the `data/items/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - added the new `fitness_machine` enum value to the `data/items/source/device_type/anyOf[subschema #1: DeviceType]/` response property for the response status `200`
  - …9 more
- **2026-09-16** `b628830d5f47`: 1 info
  - for the `query` request parameter `limit`, the max was increased from `100.00` to `1000.00`
- **2026-08-23** `d52fb9b4319d`: 2 info
  - added the optional property `data/items/avg_hrv_rmssd_ms` to the response with the `200` status
  - response property `data/items/recovery_score` deprecated
- …earlier changes not shown

[Operation history](https://skmtc.dev/openwearables/apis/open-wearables-api/changes/api/v1/users/:user_id/summaries/recovery/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)
