> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rabts.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Recovery Summary

> 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.



## OpenAPI

````yaml https://api.openwearables.io/openapi.json get /api/v1/users/{user_id}/summaries/recovery
openapi: 3.1.0
info:
  title: Open Wearables API
  version: 0.1.0
servers: []
security: []
paths:
  /api/v1/users/{user_id}/summaries/recovery:
    get:
      tags:
        - 'External: Summaries'
      summary: Get Recovery Summary
      description: >-
        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.
      operationId: get_recovery_summary_api_v1_users__user_id__summaries_recovery_get
      parameters:
        - name: user_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            title: User Id
        - name: start_date
          in: query
          required: true
          schema:
            type: string
            description: >-
              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 normalized to midnight UTC.
            examples:
              - '2023-11-07T05:31:56Z'
              - '2023-11-07'
            format: date-time
            title: Start Date
          description: >-
            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
            normalized to midnight UTC.
        - name: end_date
          in: query
          required: true
          schema:
            type: string
            description: >-
              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 normalized to midnight UTC.
            examples:
              - '2023-11-07T05:31:56Z'
              - '2023-11-07'
            format: date-time
            title: End Date
          description: >-
            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
            normalized to midnight UTC.
        - name: cursor
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Cursor
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 50
            title: Limit
        - name: X-Open-Wearables-API-Key
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: X-Open-Wearables-Api-Key
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedResponse_RecoverySummary_'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
components:
  schemas:
    PaginatedResponse_RecoverySummary_:
      properties:
        data:
          items:
            $ref: '#/components/schemas/RecoverySummary'
          type: array
          title: Data
        pagination:
          $ref: '#/components/schemas/Pagination'
        metadata:
          $ref: '#/components/schemas/TimeseriesMetadata'
      type: object
      required:
        - data
        - pagination
        - metadata
      title: PaginatedResponse[RecoverySummary]
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    RecoverySummary:
      properties:
        date:
          type: string
          format: date
          title: Date
        source:
          $ref: '#/components/schemas/SourceMetadata'
        sleep_duration_seconds:
          anyOf:
            - type: integer
            - type: 'null'
          title: Sleep Duration Seconds
        sleep_efficiency_percent:
          anyOf:
            - type: number
            - type: 'null'
          title: Sleep Efficiency Percent
        resting_heart_rate_bpm:
          anyOf:
            - type: integer
            - type: 'null'
          title: Resting Heart Rate Bpm
        avg_hrv_sdnn_ms:
          anyOf:
            - type: number
            - type: 'null'
          title: Avg Hrv Sdnn Ms
          description: >-
            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:
          anyOf:
            - type: number
            - type: 'null'
          title: Avg Hrv Rmssd Ms
          description: Average HRV (RMSSD)
        avg_spo2_percent:
          anyOf:
            - type: number
            - type: 'null'
          title: Avg Spo2 Percent
        recovery_score:
          anyOf:
            - type: integer
              maximum: 100
              minimum: 0
            - type: 'null'
          title: Recovery Score
          description: >-
            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.
          deprecated: true
      type: object
      required:
        - date
        - source
      title: RecoverySummary
    Pagination:
      properties:
        next_cursor:
          anyOf:
            - type: string
            - type: 'null'
          title: Next Cursor
          description: Cursor to fetch next page, null if no more data
          example: eyJpZCI6IjEyMzQ1Njc4OTAiLCJ0cyI6MTcwNDA2NzIwMH0
        previous_cursor:
          anyOf:
            - type: string
            - type: 'null'
          title: Previous Cursor
          description: Cursor to fetch previous page
        has_more:
          type: boolean
          title: Has More
          description: Whether more data is available
        total_count:
          anyOf:
            - type: integer
            - type: 'null'
          title: Total Count
          description: Total number of records matching the query
          example: 150
      type: object
      required:
        - has_more
      title: Pagination
    TimeseriesMetadata:
      properties:
        resolution:
          anyOf:
            - type: string
              enum:
                - raw
                - 1min
                - 5min
                - 15min
                - 1hour
            - type: 'null'
          title: Resolution
        sample_count:
          anyOf:
            - type: integer
            - type: 'null'
          title: Sample Count
        start_time:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Start Time
        end_time:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: End Time
      type: object
      title: TimeseriesMetadata
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    SourceMetadata:
      properties:
        provider:
          type: string
          title: Provider
          example: apple
        source:
          anyOf:
            - type: string
            - type: 'null'
          title: Source
          example: Connect
        device:
          anyOf:
            - type: string
            - type: 'null'
          title: Device
          example: iPhone15,2
        device_type:
          anyOf:
            - $ref: '#/components/schemas/DeviceType'
            - type: 'null'
          example: phone
        device_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Device Name
          description: >-
            Marketing name for ``device``, derived so it cannot drift from the
            raw model.
          readOnly: true
      type: object
      required:
        - provider
        - device_name
      title: SourceMetadata
    DeviceType:
      type: string
      enum:
        - watch
        - band
        - phone
        - scale
        - ring
        - other
        - unknown
      title: DeviceType
      description: Type of device that collected health data.
  securitySchemes:
    OAuth2PasswordBearer:
      type: oauth2
      flows:
        password:
          scopes: {}
          tokenUrl: /api/v1/auth/login

````