Ultrahuman Metrics API

Ring and CGM daily metrics for consented users.

OpenAPI Specification

ultrahuman-metrics-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Ultrahuman Partner (UltraSignal) Metrics API
  description: 'The Ultrahuman Partner API gives approved partners read access to user-consented health metrics from the Ultrahuman Ring AIR / Ring Pro and, for users with an active M1 patch, the Ultrahuman CGM. Access is secured with OAuth 2.0 (Authorization Code Grant plus Refresh Token flow) across three scopes: profile, ring_data, and cgm_data. Access is not self-serve - partners apply to the developer program and are issued a Client ID, Client Secret, and a registered redirect URI during onboarding; end users authorize data sharing from the Ultrahuman app (Profile -> Settings -> Partner ID). Access tokens expire in ~1 day (86400 seconds); refresh tokens rotate on each exchange.

    IMPORTANT: This document is MODELED by API Evangelist from Ultrahuman''s public partner developer documentation. Endpoint paths, scopes, OAuth flows, query parameters, and the documented metric families are drawn from the docs; exact request/response schemas are approximations and should be verified against the live developer portal. Ultrahuman also documents a personal-token variant at GET /api/v1/partner/daily_metrics for a developer''s own ring data.'
  version: '1.0'
  contact:
    name: Ultrahuman Partnerships
    url: https://partnerships.ultrahuman.com/
  x-endpointsModeled: true
servers:
- url: https://partner.ultrahuman.com
  description: Ultrahuman Partner API
tags:
- name: Metrics
  description: Ring and CGM daily metrics for consented users.
paths:
  /api/partners/v1/user_data/metrics:
    get:
      operationId: getUserMetrics
      tags:
      - Metrics
      summary: Get a user's daily health metrics
      description: Returns consented daily metrics for the authorized user. Ring metrics require the ring_data scope; glucose/CGM metrics require the cgm_data scope and an active M1 patch. Query by a single date (YYYY-MM-DD) or by a start_epoch/end_epoch window (max range 7 days). date and the epoch pair are mutually exclusive.
      security:
      - bearerAuth: []
      parameters:
      - name: date
        in: query
        required: false
        description: Target day in YYYY-MM-DD. Mutually exclusive with the epoch pair.
        schema:
          type: string
          format: date
      - name: start_epoch
        in: query
        required: false
        description: Window start, epoch seconds. Use with end_epoch (max 7-day range).
        schema:
          type: integer
          format: int64
      - name: end_epoch
        in: query
        required: false
        description: Window end, epoch seconds.
        schema:
          type: integer
          format: int64
      - name: email
        in: query
        required: false
        description: Optional target user's email for authorized multi-user access.
        schema:
          type: string
          format: email
      responses:
        '200':
          description: The user's metrics for the requested period.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MetricsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  responses:
    BadRequest:
      description: Invalid parameters, or the epoch window exceeded the 7-day limit.
    Unauthorized:
      description: Missing, invalid, or expired access token.
    NotFound:
      description: User not found, or the partner lacks permission for the requested data.
  schemas:
    MetricsResponse:
      type: object
      description: Modeled envelope of daily metrics. The docs describe roughly 40+ metric fields spanning cardiovascular, sleep, glucose, activity/recovery, and temperature families; representative fields are shown here.
      properties:
        date:
          type: string
          format: date
        cardiovascular:
          type: object
          properties:
            heart_rate:
              type: number
            hrv_rmssd:
              type: number
            night_resting_heart_rate:
              type: number
            sleep_hrv:
              type: number
            spo2:
              type: number
        sleep:
          type: object
          properties:
            total_duration_minutes:
              type: number
            efficiency:
              type: number
            rem_minutes:
              type: number
            deep_minutes:
              type: number
            light_minutes:
              type: number
            sleep_score:
              type: number
            temperature_deviation:
              type: number
        activity_recovery:
          type: object
          properties:
            steps:
              type: integer
            active_minutes:
              type: number
            movement_index:
              type: number
            recovery_index:
              type: number
            recovery_score:
              type: number
            metabolic_score:
              type: number
            vo2_max:
              type: number
        temperature:
          type: object
          properties:
            skin_temperature_celsius:
              type: number
            avg_body_temperature_sleep:
              type: number
        glucose:
          type: object
          description: Present only with the cgm_data scope and an active M1 patch.
          properties:
            readings:
              type: array
              items:
                type: object
                properties:
                  epoch:
                    type: integer
                    format: int64
                  value_mgdl:
                    type: number
            average_mgdl:
              type: number
            variability:
              type: number
            estimated_hba1c:
              type: number
            time_in_target_percent:
              type: number
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: OAuth 2.0 access token in the Authorization header.