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.