WHOOP Trusted Partner API

The WHOOP Trusted Partner API enables lab and diagnostics partners to manage lab requisitions, service requests, appointments, and diagnostic report results for WHOOP members. It uses an OAuth 2.0 client-credentials flow scoped to `whoop-partner/token`, and exposes endpoints for retrieving and updating service-request status, creating diagnostic-report observations, and generating test data in development environments.

WHOOP Trusted Partner API is one of 2 APIs that WHOOP publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Healthcare, Diagnostics, Labs, Service Requests, and Partner. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, and 1 Naftiko capability spec.

OpenAPI Specification

whoop-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: WHOOP API
  version: 2.0.0
  description: The WHOOP API exposes member fitness, strain, recovery, sleep, workout, and body measurement data captured
    by the WHOOP wrist-worn wearable. OAuth 2.0 protected; v2 endpoints use UUID identifiers and webhook notifications keep
    integrations current.
  contact:
    name: WHOOP Developer Support
    url: https://developer.whoop.com/docs/developing/support
  license:
    name: WHOOP API Terms
    url: https://www.whoop.com/legal/api-terms/
servers:
- url: https://api.prod.whoop.com/developer
tags:
- name: Activity ID Mapping
  description: Utility endpoints for activity ID mapping
- name: Partner
  description: Endpoints for trusted WHOOP partner operations
- name: User
  description: Endpoints for retrieving user profile and measurement data.
paths:
  /v1/activity-mapping/{activityV1Id}:
    get:
      tags:
      - Activity ID Mapping
      summary: Get V2 UUID for V1 Activity ID
      description: Lookup the V2 UUID for a given V1 activity ID
      operationId: getActivityMapping
      parameters:
      - name: activityV1Id
        in: path
        description: V1 Activity ID
        required: true
        schema:
          type: integer
          format: int64
        example: 12345678
      responses:
        '200':
          description: Successfully retrieved mapping
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActivityIdMappingResponse'
        '404':
          description: Activity mapping not found
        '500':
          description: Server error
  /v2/cycle/{cycleId}:
    get:
      tags:
      - Cycle
      description: Get the cycle for the specified ID
      operationId: getCycleById
      parameters:
      - name: cycleId
        in: path
        description: ID of the cycle to retrieve
        required: true
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Cycle'
        '400':
          description: Client error constructing the request
        '404':
          description: No resource found
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:cycles
      summary: Get Cycle
  /v2/cycle:
    get:
      tags:
      - Cycle
      description: Get all physiological cycles for a user, paginated. Results are sorted by start time in descending order.
      operationId: getCycleCollection
      parameters:
      - name: limit
        in: query
        description: Limit on the number of cycles returned
        schema:
          maximum: 25
          type: integer
          format: int32
          default: 10
      - name: start
        in: query
        description: Return cycles that occurred after or during (inclusive) this time. If not specified, the response will
          not filter cycles by a minimum time.
        schema:
          type: string
          format: date-time
      - name: end
        in: query
        description: Return cycles that intersect this time or ended before (exclusive) this time. If not specified, `end`
          will be set to `now`.
        schema:
          type: string
          format: date-time
      - name: nextToken
        in: query
        description: Optional next token from the previous response to get the next page. If not provided, the first page
          in the collection is returned
        schema:
          type: string
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCycleResponse'
        '400':
          description: Client error constructing the request
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:cycles
      summary: List Cycle
  /v2/cycle/{cycleId}/sleep:
    get:
      tags:
      - Cycle
      description: Get the sleep for the specified cycle ID
      operationId: getSleepForCycle
      parameters:
      - name: cycleId
        in: path
        description: ID of the cycle to retrieve sleep for
        required: true
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Sleep'
        '400':
          description: Client error constructing the request
        '404':
          description: No resource found
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      summary: List Sleep
  /v2/partner/development/add-test-data:
    post:
      tags:
      - Partner
      summary: Generate Test Data for Partner Development
      description: Generates test user and lab requisition data for partner integration testing. This endpoint is only available
        in non-production environments
      operationId: addTestData
      responses:
        '204':
          description: Test data generated successfully
        '404':
          description: Not available in production environments
        '500':
          description: Failed to generate test data
      security:
      - Trusted Partner: []
  /v2/partner/requisition/{id}:
    get:
      tags:
      - Partner
      summary: Get a Lab Requisition by ID
      description: Retrieves a lab requisition with its associated service requests by its unique identifier. The requesting
        partner must be an owner of the lab requisition.
      operationId: getLabRequisitionById
      parameters:
      - name: id
        in: path
        description: Unique identifier of the lab requisition
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Lab requisition found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LabRequisition'
        '404':
          description: Lab requisition not found or partner is not an owner
      security:
      - Trusted Partner: []
  /v2/partner/service-request/{id}:
    get:
      tags:
      - Partner
      summary: Get a Service Request by ID
      description: Retrieves a service request by its unique identifier. The requesting partner must be an owner of the service
        request.
      operationId: getServiceRequestById
      parameters:
      - name: id
        in: path
        description: Unique identifier of the service request
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Service request found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceRequest'
        '404':
          description: Service request not found or partner is not an owner
      security:
      - Trusted Partner: []
  /v2/partner/token:
    post:
      tags:
      - Partner
      summary: Request a Partner Client Token
      description: Exchanges partner client credentials for an access token.
      operationId: requestToken
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerTokenRequest'
      responses:
        '200':
          description: Token issued successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PartnerTokenResponse'
        '401':
          description: Invalid client credentials
  /v2/partner/requisition/{id}/status:
    patch:
      tags:
      - Partner
      summary: Update Lab Requisition Service Request Statuses
      description: Updates the task business status on all service requests belonging to the requisition. The requesting partner
        must be an owner.
      operationId: updateLabRequisitionStatus
      parameters:
      - name: id
        in: path
        description: Unique identifier of the lab requisition
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ServiceRequestStatusRequest'
      responses:
        '204':
          description: Service request statuses updated successfully
        '404':
          description: Lab requisition not found or partner is not an owner
      security:
      - Trusted Partner: []
  /v2/partner/service-request/{id}/status:
    patch:
      tags:
      - Partner
      summary: Update Service Request Status
      description: Updates the business status of a service request task. The requesting partner must be an owner of the service
        request.
      operationId: updateServiceRequestStatus
      parameters:
      - name: id
        in: path
        description: Unique identifier of the service request
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ServiceRequestStatusRequest'
      responses:
        '200':
          description: Service request status updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceRequest'
        '404':
          description: Service request not found or partner is not an owner
      security:
      - Trusted Partner: []
  /v2/partner/service-request/{id}/results:
    post:
      tags:
      - Partner
      summary: Create Diagnostic Report Results for a Service Request
      description: Creates a diagnostic report with results for a service request. The requesting partner must be an owner
        of the service request.
      operationId: uploadDiagnosticReportResults
      parameters:
      - name: id
        in: path
        description: Unique identifier of the service request
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DiagnosticReportCreateRequest'
      responses:
        '201':
          description: Diagnostic report created successfully
        '404':
          description: Service request not found or partner is not an owner
      security:
      - Trusted Partner: []
  /v2/recovery:
    get:
      tags:
      - Recovery
      description: Get all recoveries for a user, paginated. Results are sorted by start time of the related sleep in descending
        order.
      operationId: getRecoveryCollection
      parameters:
      - name: limit
        in: query
        description: Limit on the number of recoveries returned
        schema:
          maximum: 25
          type: integer
          format: int32
          default: 10
      - name: start
        in: query
        description: Return recoveries that occurred after or during (inclusive) this time. If not specified, the response
          will not filter recoveries by a minimum time.
        schema:
          type: string
          format: date-time
      - name: end
        in: query
        description: Return recoveries that intersect this time or ended before (exclusive) this time. If not specified, `end`
          will be set to `now`.
        schema:
          type: string
          format: date-time
      - name: nextToken
        in: query
        description: Optional next token from the previous response to get the next page. If not provided, the first page
          in the collection is returned
        schema:
          type: string
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecoveryCollection'
        '400':
          description: Client error constructing the request
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:recovery
      summary: List Recovery
  /v2/cycle/{cycleId}/recovery:
    get:
      tags:
      - Recovery
      description: Get the recovery for a cycle
      operationId: getRecoveryForCycle
      parameters:
      - name: cycleId
        in: path
        description: ID of the cycle to retrieve
        required: true
        schema:
          type: integer
          format: int64
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Recovery'
        '400':
          description: Client error constructing the request
        '404':
          description: No resource found
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:recovery
      summary: List Recovery
  /v2/activity/sleep/{sleepId}:
    get:
      tags:
      - Sleep
      description: Get the sleep for the specified ID
      operationId: getSleepById
      parameters:
      - name: sleepId
        in: path
        description: ID of the sleep to retrieve
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Sleep'
        '400':
          description: Client error constructing the request
        '404':
          description: No resource found
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:sleep
      summary: Get Sleep
  /v2/activity/sleep:
    get:
      tags:
      - Sleep
      description: Get all sleeps for a user, paginated. Results are sorted by start time in descending order.
      operationId: getSleepCollection
      parameters:
      - name: limit
        in: query
        description: Limit on the number of sleeps returned
        schema:
          maximum: 25
          type: integer
          format: int32
          default: 10
      - name: start
        in: query
        description: Return sleeps that occurred after or during (inclusive) this time. If not specified, the response will
          not filter sleeps by a minimum time.
        schema:
          type: string
          format: date-time
      - name: end
        in: query
        description: Return sleeps that intersect this time or ended before (exclusive) this time. If not specified, `end`
          will be set to `now`.
        schema:
          type: string
          format: date-time
      - name: nextToken
        in: query
        description: Optional next token from the previous response to get the next page. If not provided, the first page
          in the collection is returned
        schema:
          type: string
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedSleepResponse'
        '400':
          description: Client error constructing the request
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:sleep
      summary: List Sleep
  /v2/user/measurement/body:
    get:
      tags:
      - User
      summary: Get User Body Measurements
      description: Retrieves the body measurements (height, weight, max heart rate) for the authenticated user.
      operationId: getBodyMeasurement
      responses:
        '200':
          description: Successfully retrieved body measurements
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserBodyMeasurement'
        '401':
          description: Invalid authorization
        '404':
          description: Requested resource not found
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:body_measurement
  /v2/user/profile/basic:
    get:
      tags:
      - User
      summary: Get Basic User Profile
      description: Retrieves the basic profile information (name, email) for the authenticated user.
      operationId: getProfileBasic
      responses:
        '200':
          description: Successfully retrieved user profile
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserBasicProfile'
        '401':
          description: Invalid authorization
        '404':
          description: Requested resource not found
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:profile
  /v2/user/access:
    delete:
      tags:
      - User
      description: Revoke the access token granted by the user. If the associated OAuth client is configured to receive webhooks,
        it will no longer receive them for this user.
      operationId: revokeUserOAuthAccess
      responses:
        '204':
          description: Successful request; no response body
        '400':
          description: Client error constructing the request
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth: []
      summary: Delete Access
  /v2/activity/workout/{workoutId}:
    get:
      tags:
      - Workout
      description: Get the workout for the specified ID
      operationId: getWorkoutById
      parameters:
      - name: workoutId
        in: path
        description: ID of the workout to retrieve
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkoutV2'
        '400':
          description: Client error constructing the request
        '404':
          description: No resource found
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:workout
      summary: Get Workout
  /v2/activity/workout:
    get:
      tags:
      - Workout
      description: Get all workouts for a user, paginated. Results are sorted by start time in descending order.
      operationId: getWorkoutCollection
      parameters:
      - name: limit
        in: query
        description: Limit on the number of workouts returned
        schema:
          maximum: 25
          type: integer
          format: int32
          default: 10
      - name: start
        in: query
        description: Return workouts that occurred after or during (inclusive) this time. If not specified, the response will
          not filter workouts by a minimum time.
        schema:
          type: string
          format: date-time
      - name: end
        in: query
        description: Return workouts that intersect this time or ended before (exclusive) this time. If not specified, `end`
          will be set to `now`.
        schema:
          type: string
          format: date-time
      - name: nextToken
        in: query
        description: Optional next token from the previous response to get the next page. If not provided, the first page
          in the collection is returned
        schema:
          type: string
      responses:
        '200':
          description: Successful request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkoutCollection'
        '400':
          description: Client error constructing the request
        '401':
          description: Invalid authorization
        '429':
          description: Request rejected due to rate limiting
        '500':
          description: Server error occurred while making request
      security:
      - OAuth:
        - read:workout
      summary: List Workout
components:
  schemas:
    ActivityIdMappingResponse:
      required:
      - v2_activity_id
      type: object
      properties:
        v2_activity_id:
          type: string
          description: V2 Unique identifier for the activity
          format: uuid
          example: ecfc6a15-4661-442f-a9a4-f160dd7afae8
    Cycle:
      required:
      - created_at
      - id
      - score_state
      - start
      - timezone_offset
      - updated_at
      - user_id
      type: object
      properties:
        id:
          type: integer
          description: Unique identifier for the physiological cycle
          format: int64
          example: 93845
        user_id:
          type: integer
          description: The WHOOP User for the physiological cycle
          format: int64
          example: 10129
        created_at:
          type: string
          description: The time the cycle was recorded in WHOOP
          format: date-time
          example: '2022-04-24T11:25:44.774Z'
        updated_at:
          type: string
          description: The time the cycle was last updated in WHOOP
          format: date-time
          example: '2022-04-24T14:25:44.774Z'
        start:
          type: string
          description: Start time bound of the cycle
          format: date-time
          example: '2022-04-24T02:25:44.774Z'
        end:
          type: string
          description: End time bound of the cycle. If not present, the user is currently in this cycle
          format: date-time
          example: '2022-04-24T10:25:44.774Z'
        timezone_offset:
          type: string
          description: The user's timezone offset at the time the cycle was recorded. Follows format for Time Zone Designator
            (TZD) - '+hh:mm', '-hh:mm', or 'Z'.
          example: -05:00
          externalDocs:
            description: Learn more about the Time Zone Designator from the W3C Standard
            url: https://www.w3.org/TR/NOTE-datetime
        score_state:
          type: string
          description: '`SCORED` means the cycle was scored and the measurement values will be present. `PENDING_SCORE` means
            WHOOP is currently evaluating the cycle. `UNSCORABLE` means this activity could not be scored for some reason
            - commonly because there is not enough user metric data for the time range.'
          example: SCORED
          enum:
          - SCORED
          - PENDING_SCORE
          - UNSCORABLE
        score:
          $ref: '#/components/schemas/CycleScore'
      description: The collection of records in this page.
    CycleScore:
      required:
      - average_heart_rate
      - kilojoule
      - max_heart_rate
      - strain
      type: object
      properties:
        strain:
          type: number
          description: WHOOP metric of the cardiovascular load - the level of strain  on the user's cardiovascular system
            based on the user's heart rate during the cycle. Strain is scored on a scale from 0 to 21.
          format: float
          example: 5.2951527
          externalDocs:
            description: WHOOP Strain
            url: https://api.prod.whoop.com/url-mapping-service/v1/STRAIN
        kilojoule:
          type: number
          description: Kilojoules the user expended during the cycle.
          format: float
          example: 8288.297
        average_heart_rate:
          type: integer
          description: The user's average heart rate during the cycle.
          format: int32
          example: 68
        max_heart_rate:
          type: integer
          description: The user's max heart rate during the cycle.
          format: int32
          example: 141
      description: WHOOP's measurements and evaluation of the cycle. Only present if the score state is `SCORED`
    PaginatedCycleResponse:
      type: object
      properties:
        records:
          type: array
          description: The collection of records in this page.
          items:
            $ref: '#/components/schemas/Cycle'
        next_token:
          type: string
          description: A token that can be used on the next request to access the next page of records. If the token is not
            present, there are no more records in the collection.
          example: MTIzOjEyMzEyMw
    Sleep:
      required:
      - created_at
      - cycle_id
      - end
      - id
      - nap
      - score_state
      - start
      - timezone_offset
      - updated_at
      - user_id
      type: object
      properties:
        id:
          type: string
          description: Unique identifier for the sleep activity
          format: uuid
          example: ecfc6a15-4661-442f-a9a4-f160dd7afae8
        cycle_id:
          type: integer
          description: Unique identifier for the cycle this sleep belongs to
          format: int64
          example: 93845
        v1_id:
          type: integer
          description: Previous generation identifier for the activity. Will not exist past 09/01/2025
          format: int64
          example: 93845
        user_id:
          type: integer
          description: The WHOOP User who performed the sleep activity
          format: int64
          example: 10129
        created_at:
          type: string
          description: The time the sleep activity was recorded in WHOOP
          format: date-time
          example: '2022-04-24T11:25:44.774Z'
        updated_at:
          type: string
          description: The time the sleep activity was last updated in WHOOP
          format: date-time
          example: '2022-04-24T14:25:44.774Z'
        start:
          type: string
          description: Start time bound of the sleep
          format: date-time
          example: '2022-04-24T02:25:44.774Z'
        end:
          type: string
          description: End time bound of the sleep
          format: date-time
          example: '2022-04-24T10:25:44.774Z'
        timezone_offset:
          type: string
          description: The user's timezone offset at the time the sleep was recorded. Follows format for Time Zone Designator
            (TZD) - '+hh:mm', '-hh:mm', or 'Z'.
          example: -05:00
          externalDocs:
            description: Learn more about the Time Zone Designator from the W3C Standard
            url: https://www.w3.org/TR/NOTE-datetime
        nap:
          type: boolean
          description: If true, this sleep activity was a nap for the user
          example: false
        score_state:
          type: string
          description: '`SCORED` means the sleep activity was scored and the measurement values will be present. `PENDING_SCORE`
            means WHOOP is currently evaluating the sleep activity. `UNSCORABLE` means this activity could not be scored for
            some reason - commonly because there is not enough user metric data for the time range.'
          example: SCORED
          enum:
          - SCORED
          - PENDING_SCORE
          - UNSCORABLE
        score:
          $ref: '#/components/schemas/SleepScore'
      description: The collection of records in this page.
    SleepNeeded:
      required:
      - baseline_milli
      - need_from_recent_nap_milli
      - need_from_recent_strain_milli
      - need_from_sleep_debt_milli
      type: object
      properties:
        baseline_milli:
          type: integer
          description: The amount of sleep a user needed based on historical trends
          format: int64
          example: 27395716
        need_from_sleep_debt_milli:
          type: integer
          description: The difference between the amount of sleep the user's body required and the amount the user actually
            got
          format: int64
          example: 352230
          externalDocs:
            description: WHOOP Locker - What is Sleep Debt & How Do You Catch Up on Sleep?
            url: https://www.whoop.com/thelocker/what-is-sleep-debt-catch-up/
        need_from_recent_strain_milli:
          type: integer
          description: Additional sleep need accrued based on the user's strain
          format: int64
          example: 208595
        need_from_recent_nap_milli:
          type: integer
          description: Reduction in sleep need accrued based on the user's recent nap activity (negative value or zero)
          format: int64
          example: -12312
      description: Breakdown of the amount of sleep a user needed before the sleep activity. Summing all individual components
        results in the amount of sleep the user needed prior to this sleep activity
    SleepScore:
      required:
      - sleep_needed
      - stage_summary
      type: object
      properties:
        stage_summary:
          $ref: '#/components/schemas/SleepStageSummary'
        sleep_needed:
          $ref: '#/components/schemas/SleepNeeded'
        respiratory_rate:
          type: number
          description: The user's respiratory rate during the sleep.
          format: float
          example: 16.11328125
        sleep_performance_percentage:
          type: number
          description: A percentage (0-100%) of the time a user is asleep over the amount of sleep the user needed. May not
            be reported if WHOOP does not have enough data about a user yet to calculate Sleep Need.
          format: float
          example: 98.0
        sleep_consistency_percentage:
          type: number
          description: Percentage (0-100%) of how similar this sleep and wake times compared to the previous day. May not
            be reported if WHOOP does not have enough sleep data about a user yet to understand consistency.
          format: float
          example: 90.0
          externalDocs:
            description: WHOOP Locker - What is Sleep Consistency?
            url: https://www.whoop.com/thelocker/new-feature-sleep-consistency-why-we-track-it/
        sleep_efficiency_percentage:
          type: number
          description: A percentage (0-100%) of the time you spend in bed that you are actually asleep.
          format: float
          example: 91.69533848
          externalDocs:
            description: 'WHOOP Locker - Sleep Efficiency: What is It, How Do You Stack Up & How Can You Improve?'
            url: https://www.whoop.com/thelocker/app-feature-improve-sleep-efficiency/
      description: WHOOP's measurements and evaluation of the sleep activity. Only present if the Sleep State is `SCORED`
    SleepStageSummary:
      required:
      - disturbance_count
      - sleep_cycle_count
      - total_awake_time_milli
      - total_in_bed_time_milli
      - total_light_sleep_time_milli
      - total_no_data_time_milli
      - total_rem_sleep_time_milli
      - total_slow_wave_sleep_time_milli
      type: object
      properties:
        total_in_bed_time_milli:
       

# --- truncated at 32 KB (55 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/whoop-co/refs/heads/main/openapi/whoop-api-openapi.yml