{"openapi":"3.1.0","info":{"title":"Open Wearables API","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Root  Get"}}}}}}},"/api/v1/meta/coverage":{"get":{"tags":["External: Meta","External: Meta"],"summary":"Provider data coverage matrix","operationId":"get_coverage_api_v1_meta_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageResponse"}}}}}}},"/api/v1/users":{"get":{"tags":["External: Users"],"summary":"List Users","description":"List users with pagination, sorting, and search.","operationId":"list_users_api_v1_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-based)","default":1,"title":"Page"},"description":"Page number (1-based)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of results per page","default":20,"title":"Limit"},"description":"Number of results per page"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"enum":["created_at","email","first_name","last_name","last_synced_at"],"type":"string"},{"type":"null"}],"description":"Field to sort by","default":"created_at","title":"Sort By"},"description":"Field to sort by"},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order","default":"desc","title":"Sort Order"},"description":"Sort order"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search across first_name, last_name, and email (partial match)","title":"Search"},"description":"Search across first_name, last_name, and email (partial match)"},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"description":"Filter by exact email","title":"Email"},"description":"Filter by exact email"},{"name":"external_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by external user ID. Deprecated: no data-fetching endpoint (timeseries, workouts, sleep, summaries, health-scores, etc.) accepts external_user_id - they all require the Open Wearables UUID. This field was added early in the project but never wired into those endpoints, so it only works as a filter on GET /users. Store the UUID returned by POST /users in your own system instead.","deprecated":true,"title":"External User Id"},"description":"Filter by external user ID. Deprecated: no data-fetching endpoint (timeseries, workouts, sleep, summaries, health-scores, etc.) accepts external_user_id - they all require the Open Wearables UUID. This field was added early in the project but never wired into those endpoints, so it only works as a filter on GET /users. Store the UUID returned by POST /users in your own system instead.","deprecated":true},{"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/OldPaginatedResponse_UserRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["External: Users"],"summary":"Create User","operationId":"create_user_api_v1_users_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}":{"get":{"tags":["External: Users"],"summary":"Get User","operationId":"get_user_api_v1_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"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/UserRead"}}}},"401":{"description":"Authentication required","content":{"application/json":{"example":{"detail":"Authentication required: provide JWT token or API key"}}}},"404":{"description":"User not found","content":{"application/json":{"example":{"detail":"User with ID: 123e4567-e89b-12d3-a456-426614174000 not found."}}}},"400":{"description":"Validation error","content":{"application/json":{"example":{"detail":"Input should be a valid UUID"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["External: Users"],"summary":"Delete User","operationId":"delete_user_api_v1_users__user_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["External: Users"],"summary":"Update User","operationId":"update_user_api_v1_users__user_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/connections":{"get":{"tags":["External: Connections"],"summary":"Get Connections Endpoint","description":"Get all connections for a user, enriched with provider capability metadata.","operationId":"get_connections_endpoint_api_v1_users__user_id__connections_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"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":{"type":"array","items":{"$ref":"#/components/schemas/UserConnectionWithCapabilities"},"title":"Response Get Connections Endpoint Api V1 Users  User Id  Connections Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/connections/{provider}":{"delete":{"tags":["External: Connections"],"summary":"Disconnect Provider Endpoint","description":"Disconnect a user from a provider, revoking the connection and clearing tokens.","operationId":"disconnect_provider_endpoint_api_v1_users__user_id__connections__provider__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/connections/{provider}/data":{"delete":{"tags":["External: Connections"],"summary":"Delete Provider Data Endpoint","description":"Delete all of a user's data for a provider and revoke the connection.","operationId":"delete_provider_data_endpoint_api_v1_users__user_id__connections__provider__data_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/summaries/activity":{"get":{"tags":["External: Summaries"],"summary":"Get Activity Summary","description":"Returns daily aggregated activity metrics.\n\nAggregates time-series data (steps, energy, heart rate, etc.) by day.","operationId":"get_activity_summary_api_v1_users__user_id__summaries_activity_get","security":[{"OAuth2PasswordBearer":[]}],"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":400,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"asc","title":"Sort Order"}},{"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_ActivitySummary_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/summaries/sleep":{"get":{"tags":["External: Summaries"],"summary":"Get Sleep Summary","description":"Returns daily sleep metrics.","operationId":"get_sleep_summary_api_v1_users__user_id__summaries_sleep_get","security":[{"OAuth2PasswordBearer":[]}],"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_SleepSummary_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/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).","operationId":"get_recovery_summary_api_v1_users__user_id__summaries_recovery_get","security":[{"OAuth2PasswordBearer":[]}],"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"}}}}}}},"/api/v1/users/{user_id}/summaries/body":{"get":{"tags":["External: Summaries"],"summary":"Get Body Summary","description":"Returns comprehensive body metrics with semantic grouping.\n\nResponse is organized into three categories:\n- **static**: Slow-changing values (weight, height, body fat, muscle mass, BMI, age)\n  Returns the most recent recorded value for each field.\n- **averaged**: Vitals averaged over a period (resting HR, HRV)\n  Period is configurable via `average_period` parameter (1-7 days).\n- **latest**: Point-in-time readings (body temperature, blood pressure)\n  Only returned if measured within `latest_window_hours` (default 4 hours).\n\nReturns null if no body data exists for the user.","operationId":"get_body_summary_api_v1_users__user_id__summaries_body_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"average_period","in":"query","required":false,"schema":{"type":"integer","maximum":7,"minimum":1,"description":"Days to average vitals (1-7)","default":7,"title":"Average Period"},"description":"Days to average vitals (1-7)"},{"name":"latest_window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"description":"Hours for latest readings to be considered valid (1-24)","default":4,"title":"Latest Window Hours"},"description":"Hours for latest readings to be considered valid (1-24)"},{"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":{"anyOf":[{"$ref":"#/components/schemas/BodySummary"},{"type":"null"}],"title":"Response Get Body Summary Api V1 Users  User Id  Summaries Body Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/summaries/data":{"get":{"tags":["External: Summaries"],"summary":"Get Data Summary","description":"Returns per-user data counts grouped by series type, event type, and provider.\n\nOptionally scope the counts to a date window via `start_date` / `end_date` (data points are\nfiltered by `recorded_at`, events by their start time). Omitting both returns all-time counts.","operationId":"get_data_summary_api_v1_users__user_id__summaries_data_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"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"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"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"},{"type":"null"}],"title":"End Date"}},{"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/UserDataSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/timeseries":{"get":{"tags":["External: Timeseries"],"summary":"Get Timeseries","description":"Returns granular time series data (biometrics or activity).","operationId":"get_timeseries_api_v1_users__user_id__timeseries_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"start_time","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 Time"},"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_time","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 Time"},"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":"types","in":"query","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/SeriesType"},"default":[],"title":"Types"}},{"name":"resolution","in":"query","required":false,"schema":{"enum":["raw","1min","5min","15min","1hour"],"type":"string","default":"raw","title":"Resolution"}},{"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_TimeSeriesSample_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/events/workouts":{"get":{"tags":["External: Events"],"summary":"List Workouts","description":"Returns workout sessions.","operationId":"list_workouts_api_v1_users__user_id__events_workouts_get","security":[{"OAuth2PasswordBearer":[]}],"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":"record_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Type"}},{"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_Workout_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/events/sleep":{"get":{"tags":["External: Events"],"summary":"List Sleep Sessions","description":"Returns sleep sessions (including naps).","operationId":"list_sleep_sessions_api_v1_users__user_id__events_sleep_get","security":[{"OAuth2PasswordBearer":[]}],"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":"filter_by_priority","in":"query","required":false,"schema":{"type":"boolean","description":"When true, keep only the highest-priority source's sessions per sleep date (provider/device priority, same ranking as summaries). Defaults to false for backwards compatibility.","default":false,"title":"Filter By Priority"},"description":"When true, keep only the highest-priority source's sessions per sleep date (provider/device priority, same ranking as summaries). Defaults to false for backwards compatibility."},{"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_SleepSession_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/events/menstrual-cycles":{"get":{"tags":["External: Events"],"summary":"List Menstrual Cycles","description":"Returns menstrual cycle records.","operationId":"list_menstrual_cycles_api_v1_users__user_id__events_menstrual_cycles_get","security":[{"OAuth2PasswordBearer":[]}],"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_MenstrualCycleRecord_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/events/workouts/{workout_id}":{"delete":{"tags":["External: Events"],"summary":"Delete Workout","description":"Delete a workout session.","operationId":"delete_workout_api_v1_users__user_id__events_workouts__workout_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"workout_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workout Id"}},{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/events/sleep/{sleep_id}":{"delete":{"tags":["External: Events"],"summary":"Delete Sleep Session","description":"Delete a sleep session.","operationId":"delete_sleep_session_api_v1_users__user_id__events_sleep__sleep_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sleep_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sleep Id"}},{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/events/menstrual-cycles/{cycle_id}":{"delete":{"tags":["External: Events"],"summary":"Delete Menstrual Cycle","description":"Delete a menstrual cycle record.","operationId":"delete_menstrual_cycle_api_v1_users__user_id__events_menstrual_cycles__cycle_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"cycle_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cycle Id"}},{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/health-scores":{"get":{"tags":["External: Health Scores"],"summary":"List Health Scores","description":"Returns health scores (sleep, recovery, readiness, etc.) for a user.","operationId":"list_health_scores_api_v1_users__user_id__health_scores_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"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"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"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"},{"type":"null"}],"title":"End Date"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/HealthScoreCategory"},{"type":"null"}],"title":"Category"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ProviderName"},{"type":"null"}],"title":"Provider"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"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_HealthScoreResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oauth/{provider}/authorize":{"get":{"tags":["External: Providers"],"summary":"Get Provider Authorization URL","description":"Initiate OAuth flow for a provider.\n\nReturns authorization URL where user should be redirected to log in.","operationId":"authorize_provider_api_v1_oauth__provider__authorize_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName"}},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"User ID to connect","title":"User Id"},"description":"User ID to connect"},{"name":"redirect_uri","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional redirect URI after authorization","title":"Redirect Uri"},"description":"Optional redirect URI after authorization"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizationURLResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oauth/{provider}/callback":{"get":{"tags":["System: OAuth"],"summary":"Oauth Callback","description":"OAuth callback endpoint.\n\nProvider redirects here after user authorizes. Exchanges code for tokens.","operationId":"oauth_callback_api_v1_oauth__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Authorization code from provider","title":"Code"},"description":"Authorization code from provider"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"State parameter for CSRF protection","title":"State"},"description":"State parameter for CSRF protection"},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oauth/success":{"get":{"tags":["System: OAuth"],"summary":"Oauth Success","description":"Simple success page after OAuth completion.","operationId":"oauth_success_api_v1_oauth_success_get","parameters":[{"name":"provider","in":"query","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Success Api V1 Oauth Success Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oauth/error":{"get":{"tags":["System: OAuth"],"summary":"Oauth Error","description":"OAuth error page.","operationId":"oauth_error_api_v1_oauth_error_get","parameters":[{"name":"message","in":"query","required":false,"schema":{"type":"string","default":"OAuth authentication failed","title":"Message"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Error Api V1 Oauth Error Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oauth/providers":{"get":{"tags":["External: Providers"],"summary":"Get Providers","description":"Get providers with their configuration and metadata.\n\nQuery params:\n- enabled_only: Filter to only enabled providers (default: False, returns all)\n- cloud_only: Filter to only providers with cloud OAuth API (default: False)\n\nReturns full provider details including name, icon_url, has_cloud_api, is_enabled.","operationId":"get_providers_api_v1_oauth_providers_get","parameters":[{"name":"enabled_only","in":"query","required":false,"schema":{"type":"boolean","description":"Return only enabled providers","default":false,"title":"Enabled Only"},"description":"Return only enabled providers"},{"name":"cloud_only","in":"query","required":false,"schema":{"type":"boolean","description":"Return only cloud (OAuth) providers","default":false,"title":"Cloud Only"},"description":"Return only cloud (OAuth) providers"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderSettingRead"},"title":"Response Get Providers Api V1 Oauth Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Internal: Providers"],"summary":"Bulk Update Providers","description":"Bulk update provider settings.\n\nAccepts a map of provider_id -> is_enabled and updates all providers at once.\nThis is the primary endpoint for the admin UI to save checkbox states.","operationId":"bulk_update_providers_api_v1_oauth_providers_put","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkProviderSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProviderSettingRead"},"title":"Response Bulk Update Providers Api V1 Oauth Providers Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oauth/providers/{provider}":{"put":{"tags":["Internal: Providers"],"summary":"Update Provider Setting","description":"Update is_enabled and/or live_sync_mode for a single provider.","operationId":"update_provider_setting_api_v1_oauth_providers__provider__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderSettingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderSettingRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/users/{user_id}/sync":{"post":{"tags":["External: Data Sync"],"summary":"Sync User Data","description":"Synchronize data from fitness provider API for a specific user.\n\n**Data Types:**\n- `workouts`: Workouts/exercises/activities\n- `247`: 24/7 data including sleep, recovery, and activity samples\n- `all`: All available data types\n\n**Provider-specific:**\n- **Suunto**: Supports workouts and 247 data with pagination\n- **Polar**: Supports workouts (exercises) only\n- **Garmin**: Data arrives via webhooks (backfill for 30-day history)\n- **Whoop**: Supports workouts and 247 data (sleep/recovery)\n\n**Execution Mode:**\n- `async=true` (default): Dispatches sync to background Celery worker. Returns immediately with task ID.\n- `async=false`: Executes synchronously (may timeout for large data sets).\n\nRequires valid API key and active connection for the user.","operationId":"sync_user_data_api_v1_providers__provider__users__user_id__sync_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName","description":"Data provider"},"description":"Data provider"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"data_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SyncDataType","description":"Type of data to sync: workouts, 247 (sleep/recovery/activity), or all","default":"all"},"description":"Type of data to sync: workouts, 247 (sleep/recovery/activity), or all"},{"name":"since","in":"query","required":false,"schema":{"type":"integer","description":"Unix timestamp to synchronize data since (0 = all, Suunto only)","default":0,"title":"Since"},"description":"Unix timestamp to synchronize data since (0 = all, Suunto only)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"description":"Maximum number of items (Suunto: max 100)","default":50,"title":"Limit"},"description":"Maximum number of items (Suunto: max 100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"Offset for pagination (Suunto only)","default":0,"title":"Offset"},"description":"Offset for pagination (Suunto only)"},{"name":"filter_by_modification_time","in":"query","required":false,"schema":{"type":"boolean","description":"Filter by modification time instead of creation time (Suunto only)","default":true,"title":"Filter By Modification Time"},"description":"Filter by modification time instead of creation time (Suunto only)"},{"name":"samples","in":"query","required":false,"schema":{"type":"boolean","description":"Synchronize sample data (Polar only)","default":false,"title":"Samples"},"description":"Synchronize sample data (Polar only)"},{"name":"zones","in":"query","required":false,"schema":{"type":"boolean","description":"Synchronize zones data (Polar only)","default":false,"title":"Zones"},"description":"Synchronize zones data (Polar only)"},{"name":"route","in":"query","required":false,"schema":{"type":"boolean","description":"Synchronize route data (Polar only)","default":false,"title":"Route"},"description":"Synchronize route data (Polar only)"},{"name":"summary_start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Activity start time as Unix timestamp or ISO 8601 date (Garmin only)","title":"Summary Start Time"},"description":"Activity start time as Unix timestamp or ISO 8601 date (Garmin only)"},{"name":"summary_end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Activity end time as Unix timestamp or ISO 8601 date (Garmin only)","title":"Summary End Time"},"description":"Activity end time as Unix timestamp or ISO 8601 date (Garmin only)"},{"name":"async","in":"query","required":false,"schema":{"type":"boolean","description":"Run sync asynchronously via Celery (default: true). Set false for sync.","default":true,"title":"Async"},"description":"Run sync asynchronously via Celery (default: true). Set false for sync."},{"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":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"object","additionalProperties":true},{"type":"string"}]},"title":"Response Sync User Data Api V1 Providers  Provider  Users  User Id  Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/garmin/users/{user_id}/backfill/status":{"get":{"tags":["External: Data Sync"],"summary":"Get Garmin Backfill Status Endpoint","description":"Get Garmin backfill status for backfill data types.\n\nThe backfill is webhook-based and auto-triggered after OAuth connection.\nReturns status for each data type independently. Max 30 days of history.\n\n**Response Fields:**\n- `overall_status`: pending | in_progress | complete | cancelled | retry_in_progress | permanently_failed\n- `current_window`: Current window index (0-based)\n- `total_windows`: Total number of 30-day windows (12)\n- `windows`: Per-window-per-type matrix with done/pending/timed_out/failed states\n- `summary`: Per-type aggregated counts (done, timed_out, failed)\n- `in_progress`: Whether backfill is currently running (true for in_progress or retry_in_progress)\n- `retry_phase`: Whether the retry phase is currently active\n- `retry_type`: Data type currently being retried (null if not retrying)\n- `retry_window`: Window index being retried (null if not retrying)\n- `attempt_count`: Number of GC-and-retry cycles completed\n- `max_attempts`: Maximum GC-and-retry cycles before permanently failed (3)\n- `permanently_failed`: Whether backfill has exhausted all retry attempts\n\n**Window Cell States:**\n- `done`: Data received via webhook or Garmin API error (treated as done)\n- `pending`: Not yet processed\n- `timed_out`: No webhook received within timeout (warning)\n- `failed`: Permanently failed after retry attempt (error)","operationId":"get_garmin_backfill_status_endpoint_api_v1_providers_garmin_users__user_id__backfill_status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"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":{"type":"object","additionalProperties":true,"title":"Response Get Garmin Backfill Status Endpoint Api V1 Providers Garmin Users  User Id  Backfill Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/garmin/users/{user_id}/backfill/cancel":{"post":{"tags":["External: Data Sync"],"summary":"Cancel Garmin Backfill","description":"Cancel an in-progress Garmin backfill for a user.\n\nSets a cancellation flag in Redis. The backfill will stop after the\ncurrent data type completes processing.\n\nReturns 409 if no backfill is currently in progress.","operationId":"cancel_garmin_backfill_api_v1_providers_garmin_users__user_id__backfill_cancel_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"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":{"type":"object","additionalProperties":true,"title":"Response Cancel Garmin Backfill Api V1 Providers Garmin Users  User Id  Backfill Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/garmin/users/{user_id}/backfill/{type_name}/retry":{"post":{"tags":["External: Data Sync"],"summary":"Retry Garmin Backfill Type","description":"Retry backfill for a specific data type in the current window.\n\nResets the type status to pending and triggers a new backfill attempt\nfor the current window context. Use when a type has timed out or\nneeds re-processing.\n\n**Valid Type Names:**\nsleeps, dailies, activities, activityDetails, hrv\n\nReturns:\n    Dict with retry status","operationId":"retry_garmin_backfill_type_api_v1_providers_garmin_users__user_id__backfill__type_name__retry_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"type_name","in":"path","required":true,"schema":{"type":"string","title":"Type Name"}},{"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":{"type":"object","additionalProperties":true,"title":"Response Retry Garmin Backfill Type Api V1 Providers Garmin Users  User Id  Backfill  Type Name  Retry Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/users/{user_id}/sync/historical":{"post":{"tags":["External: Data Sync"],"summary":"Sync Historical Data","description":"Trigger a historical sync of the user's data from a connected provider.\n\nEach provider strategy decides how to dispatch the sync (REST polling,\nwebhook backfill, etc.). The ``days`` parameter may be ignored by\nproviders that enforce their own limits.\n\n**Automatic historical sync on connect (grace period)**\n\nv0.4.2 introduced this endpoint as the canonical, opt-in way to\nbackfill historical data - the long-term goal is that connecting a\nprovider only sets up live sync, and history is pulled on demand.\n\nTo make migration painless, the pre-0.4.2 behaviour is kept for now\nbehind a grace-period flag (``HISTORICAL_SYNC_ON_CONNECT``, default:\n``true``): a historical sync is auto-dispatched after a successful\nOAuth callback (up to 90 days for pull-based providers; up to 30\ndays for Garmin, whose webhook-based backfill is capped at 30 days\nfrom the user's consent date).\n\nOnce your integration calls this endpoint explicitly, set\n``HISTORICAL_SYNC_ON_CONNECT=false``. The flag will default to\n``false`` in a future release and is planned for removal afterwards.","operationId":"sync_historical_data_api_v1_providers__provider__users__user_id__sync_historical_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName","description":"Data provider"},"description":"Data provider"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Days of historical data to fetch (default: 90, max: 365). Ignored for providers with their own limits (e.g. Garmin: 30 days).","default":90,"title":"Days"},"description":"Days of historical data to fetch (default: 90, max: 365). Ignored for providers with their own limits (e.g. Garmin: 30 days)."},{"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":{"type":"object","additionalProperties":true,"title":"Response Sync Historical Data Api V1 Providers  Provider  Users  User Id  Sync Historical Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/sync/stream":{"get":{"tags":["External: Sync Status"],"summary":"Stream User Sync Status","description":"Open a Server-Sent Events stream of sync status for a user.\n\nThe stream emits ``event: sync.status`` messages whose ``data``\npayload is a JSON-encoded ``SyncStatusEvent``. Heartbeats are sent\nevery ~15 s as SSE comments (lines starting with ``:``) to keep the\nconnection alive across proxies.\n\nCovers events from:\n\n- REST pull syncs (e.g. Whoop, Oura, Polar, Suunto)\n- Garmin webhook live + 30-day backfill\n- Mobile SDK uploads (Apple HealthKit, Samsung Health, Google)\n- Apple Health XML imports\n\nThe stream remains open until the client disconnects. ``EventSource``\nin browsers reconnects automatically.","operationId":"stream_user_sync_status_api_v1_users__user_id__sync_stream_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"replay","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Replay last N events on connect.","default":20,"title":"Replay"},"description":"Replay last N events on connect."},{"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":"Server-Sent Events stream of sync status updates.","content":{"text/event-stream":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/sync/recent":{"get":{"tags":["External: Sync Status"],"summary":"List Recent Sync Events","description":"Return the most recent stored sync events (newest first).\n\nEvents are kept in Redis for 24 h. Use this to seed the UI before\nopening the SSE stream, or to inspect history without subscribing.","operationId":"list_recent_sync_events_api_v1_users__user_id__sync_recent_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"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":{"type":"array","items":{"$ref":"#/components/schemas/SyncStatusEvent"},"title":"Response List Recent Sync Events Api V1 Users  User Id  Sync Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/sync/runs":{"get":{"tags":["External: Sync Status"],"summary":"List Sync Run Summaries","description":"Return aggregated per-run summaries for recent sync activity.","operationId":"list_sync_run_summaries_api_v1_users__user_id__sync_runs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"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":{"type":"array","items":{"$ref":"#/components/schemas/SyncRunSummary"},"title":"Response List Sync Run Summaries Api V1 Users  User Id  Sync Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/runs":{"get":{"tags":["External: Sync Status"],"summary":"List All Sync Run Summaries","description":"Return aggregated per-run summaries across all users (admin view).\n\nSupports optional filtering by user_id, provider, status, and source.","operationId":"list_all_sync_run_summaries_api_v1_sync_runs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":50,"title":"Limit"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by user ID.","title":"User Id"},"description":"Filter by user ID."},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by provider name.","title":"Provider"},"description":"Filter by provider name."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status.","title":"Status"},"description":"Filter by status."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by source.","title":"Source"},"description":"Filter by source."},{"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":{"type":"array","items":{"$ref":"#/components/schemas/SyncRunSummary"},"title":"Response List All Sync Run Summaries Api V1 Sync Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/users/{user_id}/workouts":{"get":{"tags":["System: Vendor Workouts"],"summary":"Get User Workouts","description":"Get workouts/exercises/activities from fitness provider API for a specific user.\n\n- **Suunto**: Returns workouts with pagination support\n- **Polar**: Returns exercises (Polar's term for workouts)\n- **Garmin**: Returns activities from Health API\n\nRequires valid API key and active connection for the user.","operationId":"get_user_workouts_api_v1_providers__provider__users__user_id__workouts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName","description":"Workout data provider"},"description":"Workout data provider"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","description":"Unix timestamp to get workouts since (0 = all, Suunto only)","default":0,"title":"Since"},"description":"Unix timestamp to get workouts since (0 = all, Suunto only)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"description":"Maximum number of workouts (Suunto: max 100)","default":50,"title":"Limit"},"description":"Maximum number of workouts (Suunto: max 100)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"Offset for pagination (Suunto only)","default":0,"title":"Offset"},"description":"Offset for pagination (Suunto only)"},{"name":"filter_by_modification_time","in":"query","required":false,"schema":{"type":"boolean","description":"Filter by modification time instead of creation time (Suunto only)","default":true,"title":"Filter By Modification Time"},"description":"Filter by modification time instead of creation time (Suunto only)"},{"name":"samples","in":"query","required":false,"schema":{"type":"boolean","description":"Return sample data (Polar only)","default":false,"title":"Samples"},"description":"Return sample data (Polar only)"},{"name":"zones","in":"query","required":false,"schema":{"type":"boolean","description":"Return zones data (Polar only)","default":false,"title":"Zones"},"description":"Return zones data (Polar only)"},{"name":"route","in":"query","required":false,"schema":{"type":"boolean","description":"Return route data (Polar only)","default":false,"title":"Route"},"description":"Return route data (Polar only)"},{"name":"summary_start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Activity start time as Unix timestamp or ISO 8601 date (Garmin only)","title":"Summary Start Time"},"description":"Activity start time as Unix timestamp or ISO 8601 date (Garmin only)"},{"name":"summary_end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Activity end time as Unix timestamp or ISO 8601 date (Garmin only)","title":"Summary End Time"},"description":"Activity end time as Unix timestamp or ISO 8601 date (Garmin only)"},{"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":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"array","items":{"type":"object","additionalProperties":true}}],"title":"Response Get User Workouts Api V1 Providers  Provider  Users  User Id  Workouts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/users/{user_id}/workouts/{workout_id}":{"get":{"tags":["System: Vendor Workouts"],"summary":"Get User Workout Detail","description":"Get detailed workout/exercise/activity data from fitness provider API.\n\n- **Suunto**: Returns detailed workout data\n- **Polar**: Returns detailed exercise data\n- **Garmin**: Returns detailed activity data\n\nRequires valid API key and active connection for the user.","operationId":"get_user_workout_detail_api_v1_providers__provider__users__user_id__workouts__workout_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName","description":"Workout data provider"},"description":"Workout data provider"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"workout_id","in":"path","required":true,"schema":{"type":"string","title":"Workout Id"}},{"name":"samples","in":"query","required":false,"schema":{"type":"boolean","description":"Return sample data (Polar only)","default":false,"title":"Samples"},"description":"Return sample data (Polar only)"},{"name":"zones","in":"query","required":false,"schema":{"type":"boolean","description":"Return zones data (Polar only)","default":false,"title":"Zones"},"description":"Return zones data (Polar only)"},{"name":"route","in":"query","required":false,"schema":{"type":"boolean","description":"Return route data (Polar only)","default":false,"title":"Route"},"description":"Return route data (Polar only)"},{"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":{"type":"object","additionalProperties":true,"title":"Response Get User Workout Detail Api V1 Providers  Provider  Users  User Id  Workouts  Workout Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/import/apple/xml/s3":{"post":{"tags":["External: Apple Health Import"],"summary":"Import Xml Presigned Url","description":"Generate presigned URL for XML file upload and trigger processing task.","operationId":"import_xml_presigned_url_api_v1_users__user_id__import_apple_xml_s3_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignedURLRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignedURLResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/import/apple/xml/direct":{"post":{"tags":["External: Apple Health Import"],"summary":"Import Xml File","description":"Import XML file into the database.","operationId":"import_xml_file_api_v1_users__user_id__import_apple_xml_direct_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_xml_file_api_v1_users__user_id__import_apple_xml_direct_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Import Xml File Api V1 Users  User Id  Import Apple Xml Direct Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sns/notification":{"post":{"tags":["External: Apple Health Import"],"summary":"Receive Sns Notification","description":"Handle all SNS messages (subscription confirmation + S3 upload notifications).","operationId":"receive_sns_notification_api_v1_sns_notification_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadDataResponse"}}}}}}},"/api/v1/sdk/users/{user_id}/logs":{"post":{"tags":["External: Mobile SDK"],"summary":"Submit Sdk Logs","description":"Accept SDK diagnostic log events and store to raw S3 storage.\n\nUsed for observability into mobile SDK sync behavior (background task\nlifecycle, device state, sync success/failure).","operationId":"submit_sdk_logs_api_v1_sdk_users__user_id__logs_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SDKLogRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sdk/users/{user_id}/sync":{"post":{"tags":["External: Mobile SDK"],"summary":"Sync Sdk Data","description":"Import health data from SDK provider asynchronously via Celery.\n\nSupports Apple HealthKit and Samsung Health SDK formats (identical payloads):\n```json\n{\n    \"provider\": \"apple\",\n    \"sdkVersion\": \"1.0.0\",\n    \"syncTimestamp\": \"2021-01-01T00:00:00Z\",\n    \"data\": {\n        \"records\": [...],\n        \"sleep\": [...],\n        \"workouts\": [...]\n    }\n}\n```\n\nArgs:\n    user_id: SDK user identifier\n    body: Health data payload\n    auth: SDK authentication (Bearer token or API key)\n\nReturns:\n    UploadDataResponse with 202 status and task queued message\n\nRaises:\n    HTTPException: 403 if token doesn't match user_id, 400 if provider unsupported.\n    Payload validation runs async in the worker, not here.","operationId":"sync_sdk_data_api_v1_sdk_users__user_id__sync_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Open-Wearables-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Open-Wearables-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"SyncRequest","description":"Schema for Apple HealthKit data import via SDK.\n\nThis schema represents the structure of health data exported from Apple HealthKit\nand sent to the SDK sync endpoint. The data is processed asynchronously via Celery.\n\nStructure:\n- `data.records`: Time-series measurements (heart rate, steps, distance, etc.)\n- `data.sleep`: Sleep phase records (in bed, awake, light, deep, REM)\n- `data.workouts`: Exercise/workout sessions with statistics\n\nAll fields within `data` are optional - you can send any combination of records, sleep, and workouts.","example":{"data":{"records":[{"endDate":"2026-02-24T08:30:00Z","id":"abc-xyz-123-sys","parentId":"abc-xyz-123","source":{"appId":"com.sec.android.app.shealth","deviceId":"R9ZW30ABC12","deviceManufacturer":"Samsung","deviceModel":"SM-R960","deviceName":"Galaxy Watch7","deviceType":"watch"},"startDate":"2026-02-24T08:30:00Z","type":"BLOOD_PRESSURE_SYSTOLIC","unit":"mmHg","value":122.0,"zoneOffset":"+01:00"}],"sleep":[{"endDate":"2026-02-24T00:00:00Z","id":"slp-001-s0-0","parentId":"slp-001","source":{"appId":"com.sec.android.app.shealth","deviceId":"R9ZW30ABC12","deviceManufacturer":"Samsung","deviceModel":"SM-R960","deviceName":"Galaxy Watch7","deviceType":"watch"},"stage":"light","startDate":"2026-02-23T23:10:00Z","values":[{"type":"sleepScore","unit":"score","value":82}],"zoneOffset":"+01:00"}],"workouts":[{"endDate":"2026-02-24T06:45:00Z","id":"wrk-001-s0","notes":"Morning run in the park","parentId":"wrk-001","route":[{"altitudeM":142.0,"horizontalAccuracyM":3.5,"latitude":52.229676,"longitude":21.012229,"timestamp":"2026-02-24T06:01:00Z"}],"samples":[{"timestamp":"2026-02-24T06:01:00Z","type":"heartRate","unit":"bpm","value":110.0},{"timestamp":"2026-02-24T06:01:00Z","type":"cadence","unit":"spm","value":155.0},{"timestamp":"2026-02-24T06:01:00Z","type":"speed","unit":"m/s","value":1.8}],"source":{"appId":"com.sec.android.app.shealth","deviceId":"R9ZW30ABC12","deviceManufacturer":"Samsung","deviceModel":"SM-R960","deviceName":"Galaxy Watch7","deviceType":"watch"},"startDate":"2026-02-24T06:00:00Z","type":"RUNNING","values":[{"type":"duration","unit":"ms","value":2700000},{"type":"calories","unit":"kcal","value":345.5},{"type":"distance","unit":"m","value":5234.0},{"type":"meanHeartRate","unit":"bpm","value":142.3},{"type":"maxHeartRate","unit":"bpm","value":178.0},{"type":"minHeartRate","unit":"bpm","value":95.0},{"type":"meanSpeed","unit":"m/s","value":1.5},{"type":"maxSpeed","unit":"m/s","value":3.2},{"type":"meanCadence","unit":"spm","value":165.0},{"type":"maxCadence","unit":"spm","value":182.0},{"type":"altitudeGain","unit":"m","value":45.0},{"type":"altitudeLoss","unit":"m","value":42.0},{"type":"maxAltitude","unit":"m","value":185.0},{"type":"minAltitude","unit":"m","value":140.0},{"type":"vo2Max","unit":"mL/kg/min","value":42.5}],"zoneOffset":"+01:00"}]},"provider":"samsung","sdkVersion":"0.1.0","syncTimestamp":"2026-02-24T10:00:00Z"},"properties":{"provider":{"title":"Provider","type":"string"},"sdkVersion":{"title":"Sdkversion","type":"string"},"syncTimestamp":{"format":"date-time","title":"Synctimestamp","type":"string"},"data":{"description":"Container for health data arrays (records, sleep, workouts)","properties":{"records":{"description":"Time-series health measurements (heart rate, steps, distance, etc.)","items":{"description":"Health metric record from HealthKit (heart rate, steps, distance, etc.).","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parentid"},"type":{"anyOf":[{"description":"Metric type identifiers for Apple HealthKit and Samsung/Health Connect SDK.\n\nApple types use HKQuantityTypeIdentifier... strings.\nSamsung/HC types use uppercase SCREAMING_SNAKE_CASE strings (e.g. \"HEART_RATE\").","enum":["HKQuantityTypeIdentifierHeartRate","HEART_RATE","HKQuantityTypeIdentifierRestingHeartRate","RESTING_HEART_RATE","HKQuantityTypeIdentifierHeartRateVariabilitySDNN","HEART_RATE_VARIABILITY","HKQuantityTypeIdentifierHeartRateRecoveryOneMinute","HKQuantityTypeIdentifierWalkingHeartRateAverage","HKQuantityTypeIdentifierOxygenSaturation","OXYGEN_SATURATION","HKQuantityTypeIdentifierBloodGlucose","BLOOD_GLUCOSE","HKQuantityTypeIdentifierBloodPressureSystolic","BLOOD_PRESSURE_SYSTOLIC","HKQuantityTypeIdentifierBloodPressureDiastolic","BLOOD_PRESSURE_DIASTOLIC","HKQuantityTypeIdentifierRespiratoryRate","RESPIRATORY_RATE","HKQuantityTypeIdentifierHeight","HEIGHT","WEIGHT","HKQuantityTypeIdentifierBodyMass","LEAN_BODY_MASS","SKELETAL_MUSCLE_MASS","BODY_FAT_MASS","HKQuantityTypeIdentifierBodyFatPercentage","BODY_FAT","HKQuantityTypeIdentifierBodyMassIndex","BMI","HKQuantityTypeIdentifierLeanBodyMass","HKQuantityTypeIdentifierBodyTemperature","BODY_TEMPERATURE","HKQuantityTypeIdentifierVO2Max","VO2_MAX","HKQuantityTypeIdentifierSixMinuteWalkTestDistance","HKQuantityTypeIdentifierStepCount","STEP_COUNT","HKQuantityTypeIdentifierActiveEnergyBurned","HKQuantityTypeIdentifierBasalEnergyBurned","ACTIVE_CALORIES_BURNED","BASAL_METABOLIC_RATE","HKQuantityTypeIdentifierAppleStandTime","HKQuantityTypeIdentifierAppleExerciseTime","HKQuantityTypeIdentifierFlightsClimbed","FLOORS_CLIMBED","DISTANCE","HKQuantityTypeIdentifierDistanceWalkingRunning","HKQuantityTypeIdentifierDistanceCycling","HKQuantityTypeIdentifierDistanceSwimming","HKQuantityTypeIdentifierDistanceDownhillSnowSports","HKQuantityTypeIdentifierDistancePaddleSports","HKQuantityTypeIdentifierDistanceRowing","HKQuantityTypeIdentifierDistanceSkatingSports","HKQuantityTypeIdentifierDistanceWheelchair","HKQuantityTypeIdentifierDistanceCrossCountrySkiing","HKQuantityTypeIdentifierWalkingStepLength","HKQuantityTypeIdentifierWalkingSpeed","HKQuantityTypeIdentifierWalkingDoubleSupportPercentage","HKQuantityTypeIdentifierWalkingAsymmetryPercentage","HKQuantityTypeIdentifierAppleWalkingSteadiness","HKQuantityTypeIdentifierStairDescentSpeed","HKQuantityTypeIdentifierStairAscentSpeed","HKQuantityTypeIdentifierRunningPower","HKQuantityTypeIdentifierRunningSpeed","HKQuantityTypeIdentifierRunningVerticalOscillation","HKQuantityTypeIdentifierRunningGroundContactTime","HKQuantityTypeIdentifierRunningStrideLength","HKQuantityTypeIdentifierSwimmingStrokeCount","HKQuantityTypeIdentifierEnvironmentalAudioExposure","HKQuantityTypeIdentifierHeadphoneAudioExposure","HKQuantityTypeIdentifierEnvironmentalSoundReduction","HKQuantityTypeIdentifierTimeInDaylight","HKQuantityTypeIdentifierPhysicalEffort","HKQuantityTypeIdentifierWorkoutEffortScore","HKQuantityTypeIdentifierEstimatedWorkoutEffortScore","HKQuantityTypeIdentifierAppleMoveTime","HKQuantityTypeIdentifierAppleSleepingWristTemperature","HKQuantityTypeIdentifierBloodAlcoholContent","HKQuantityTypeIdentifierPeripheralPerfusionIndex","HKQuantityTypeIdentifierForcedVitalCapacity","HKQuantityTypeIdentifierForcedExpiratoryVolume1","HKQuantityTypeIdentifierPeakExpiratoryFlowRate","HKQuantityTypeIdentifierBasalBodyTemperature","HKQuantityTypeIdentifierAppleSleepingBreathingDisturbances","HKQuantityTypeIdentifierWaistCircumference","HKQuantityTypeIdentifierInsulinDelivery","HKQuantityTypeIdentifierNumberOfTimesFallen","HKQuantityTypeIdentifierInhalerUsage","HKQuantityTypeIdentifierNumberOfAlcoholicBeverages","HYDRATION","HKQuantityTypeIdentifierElectrodermalActivity","HKQuantityTypeIdentifierUVExposure","HKQuantityTypeIdentifierPushCount","HKQuantityTypeIdentifierAtrialFibrillationBurden","HKQuantityTypeIdentifierUnderwaterDepth","HKQuantityTypeIdentifierWaterTemperature","HKQuantityTypeIdentifierCyclingCadence","HKQuantityTypeIdentifierCyclingFunctionalThresholdPower","HKQuantityTypeIdentifierCyclingPower","HKQuantityTypeIdentifierCyclingSpeed","POWER","SPEED","CYCLING_PEDALING_CADENCE","TOTAL_CALORIES_BURNED","HKQuantityTypeIdentifierCrossCountrySkiingSpeed","HKQuantityTypeIdentifierPaddleSportsSpeed","HKQuantityTypeIdentifierRowingSpeed","HKQuantityTypeIdentifierNikeFuel"],"title":"SDKMetricType","type":"string"},{"type":"string"},{"type":"null"}],"title":"Type"},"startDate":{"format":"date-time","title":"Startdate","type":"string"},"endDate":{"format":"date-time","title":"Enddate","type":"string"},"zoneOffset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zoneoffset"},"source":{"anyOf":[{"description":"Source/device information for HealthKit records.","properties":{"appId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"bundleIdentifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bundleidentifier"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"productType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producttype"},"operatingSystemVersion":{"anyOf":[{"description":"Operating system version info from HealthKit source.","properties":{"majorVersion":{"title":"Majorversion","type":"integer"},"minorVersion":{"title":"Minorversion","type":"integer"},"patchVersion":{"title":"Patchversion","type":"integer"}},"required":["majorVersion","minorVersion","patchVersion"],"title":"OSVersion","type":"object"},{"type":"null"}]},"deviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deviceid"},"deviceName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicename"},"deviceManufacturer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicemanufacturer"},"deviceType":{"anyOf":[{"description":"Device type for HealthKit records.","enum":["phone","watch","scale","ring","fitness_band","chest_strap","head_mounted","smart_display","unknown"],"title":"DeviceType","type":"string"},{"type":"string"},{"type":"null"}],"title":"Devicetype"},"deviceModel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicemodel"},"deviceHardwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicehardwareversion"},"deviceSoftwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicesoftwareversion"},"recordingMethod":{"anyOf":[{"description":"Recording method for HealthKit records.","enum":["active","automatic","manual","unknown"],"title":"RecordingMethod","type":"string"},{"type":"string"},{"type":"null"}],"title":"Recordingmethod"}},"title":"SourceInfo","type":"object"},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","type":"string"}],"title":"Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"metadata":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"required":["startDate","endDate","value","unit"],"title":"MetricRecord","type":"object"},"title":"Records","type":"array"},"sleep":{"description":"Sleep phase records (in bed, awake, light, deep, REM).","items":{"description":"Sleep analysis record from HealthKit.","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parentid"},"stage":{"anyOf":[{"enum":["in_bed","sleeping","awake","light","deep","rem","unknown"],"title":"SleepPhase","type":"string"},{"type":"string"}],"title":"Stage"},"startDate":{"format":"date-time","title":"Startdate","type":"string"},"endDate":{"format":"date-time","title":"Enddate","type":"string"},"zoneOffset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zoneoffset"},"source":{"anyOf":[{"description":"Source/device information for HealthKit records.","properties":{"appId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"bundleIdentifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bundleidentifier"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"productType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producttype"},"operatingSystemVersion":{"anyOf":[{"description":"Operating system version info from HealthKit source.","properties":{"majorVersion":{"title":"Majorversion","type":"integer"},"minorVersion":{"title":"Minorversion","type":"integer"},"patchVersion":{"title":"Patchversion","type":"integer"}},"required":["majorVersion","minorVersion","patchVersion"],"title":"OSVersion","type":"object"},{"type":"null"}]},"deviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deviceid"},"deviceName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicename"},"deviceManufacturer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicemanufacturer"},"deviceType":{"anyOf":[{"description":"Device type for HealthKit records.","enum":["phone","watch","scale","ring","fitness_band","chest_strap","head_mounted","smart_display","unknown"],"title":"DeviceType","type":"string"},{"type":"string"},{"type":"null"}],"title":"Devicetype"},"deviceModel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicemodel"},"deviceHardwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicehardwareversion"},"deviceSoftwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicesoftwareversion"},"recordingMethod":{"anyOf":[{"description":"Recording method for HealthKit records.","enum":["active","automatic","manual","unknown"],"title":"RecordingMethod","type":"string"},{"type":"string"},{"type":"null"}],"title":"Recordingmethod"}},"title":"SourceInfo","type":"object"},{"type":"null"}]},"values":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Values"},"metadata":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"required":["stage","startDate","endDate"],"title":"SleepRecord","type":"object"},"title":"Sleep","type":"array"},"workouts":{"description":"Exercise/workout sessions with optional statistics (distance, heart rate, calories, etc.)","items":{"description":"Schema for workout/exercise session from HealthKit.","properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parentid"},"type":{"anyOf":[{"description":"Apple HealthKit SDK workout activity types.\n\nThese are the workout types sent from the iOS SDK in snake_case format.","enum":["walking","running","cycling","wheelchair_walk","wheelchair_run","hand_cycling","elliptical","stair_climbing","stairs","jump_rope","core_training","functional_strength_training","strength_training","cross_training","mixed_cardio","hiit","step_training","fitness_gaming","preparation_and_recovery","flexibility","cooldown","barre","cardio_dance","social_dance","yoga","mind_and_body","pilates","american_football","australian_football","baseball","basketball","cricket","disc_sports","handball","hockey","lacrosse","rugby","soccer","softball","volleyball","badminton","pickleball","racquetball","squash","table_tennis","tennis","climbing","equestrian","fishing","golf","hiking","hunting","play","cross_country_skiing","curling","downhill_skiing","snow_sports","snowboarding","skating","paddle_sports","rowing","sailing","surfing","swimming","underwater_diving","water_fitness","water_polo","water_sports","boxing","kickboxing","martial_arts","tai_chi","wrestling","archery","bowling","fencing","gymnastics","track_and_field","swim_bike_run","transition","dance","dance_inspired_training","mixed_metabolic_cardio_training","cycling_stationary","boot_camp","calisthenics","dancing","exercise_class","football_american","football_australian","frisbee_disc","guided_breathing","ice_hockey","ice_skating","paddling","paragliding","rock_climbing","roller_hockey","rowing_machine","running_treadmill","scuba_diving","skiing","snowshoeing","stair_climbing_machine","stretching","swimming_open_water","swimming_pool","weightlifting","wheelchair","other"],"title":"SDKWorkoutType","type":"string"},{"type":"string"},{"type":"null"}],"title":"Type"},"startDate":{"format":"date-time","title":"Startdate","type":"string"},"endDate":{"format":"date-time","title":"Enddate","type":"string"},"zoneOffset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zoneoffset"},"source":{"anyOf":[{"description":"Source/device information for HealthKit records.","properties":{"appId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"bundleIdentifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bundleidentifier"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"productType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producttype"},"operatingSystemVersion":{"anyOf":[{"description":"Operating system version info from HealthKit source.","properties":{"majorVersion":{"title":"Majorversion","type":"integer"},"minorVersion":{"title":"Minorversion","type":"integer"},"patchVersion":{"title":"Patchversion","type":"integer"}},"required":["majorVersion","minorVersion","patchVersion"],"title":"OSVersion","type":"object"},{"type":"null"}]},"deviceId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deviceid"},"deviceName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicename"},"deviceManufacturer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicemanufacturer"},"deviceType":{"anyOf":[{"description":"Device type for HealthKit records.","enum":["phone","watch","scale","ring","fitness_band","chest_strap","head_mounted","smart_display","unknown"],"title":"DeviceType","type":"string"},{"type":"string"},{"type":"null"}],"title":"Devicetype"},"deviceModel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicemodel"},"deviceHardwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicehardwareversion"},"deviceSoftwareVersion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Devicesoftwareversion"},"recordingMethod":{"anyOf":[{"description":"Recording method for HealthKit records.","enum":["active","automatic","manual","unknown"],"title":"RecordingMethod","type":"string"},{"type":"string"},{"type":"null"}],"title":"Recordingmethod"}},"title":"SourceInfo","type":"object"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"values":{"anyOf":[{"items":{"description":"Schema for workout statistic (distance, heart rate, calories, etc.).","properties":{"type":{"anyOf":[{"description":"Apple HealthKit workout statistic types.\n\nThese represent the different metrics that can be recorded during a workout session.","enum":["duration","totalDuration","activeEnergyBurned","basalEnergyBurned","calories","totalCalories","distance","stepCount","swimmingStrokeCount","minHeartRate","averageHeartRate","maxHeartRate","meanHeartRate","meanSpeed","meanCadence","maxCadence","averageRunningPower","averageRunningSpeed","averageRunningStrideLength","averageVerticalOscillation","averageGroundContactTime","vo2Max","elevationAscended","elevationDescended","altitudeGain","altitudeLoss","maxAltitude","minAltitude","averageSpeed","maxSpeed","averageMETs","lapLength","swimmingLocationType","indoorWorkout","weatherTemperature","weatherHumidity"],"title":"WorkoutStatisticType","type":"string"},{"type":"string"}],"title":"Type"},"unit":{"title":"Unit","type":"string"},"value":{"anyOf":[{"type":"number"},{"type":"integer"}],"title":"Value"}},"required":["type","unit","value"],"title":"WorkoutStatistic","type":"object"},"type":"array"},{"type":"null"}],"title":"Values"},"segments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Segments"},"laps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Laps"},"route":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Route"},"samples":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Samples"},"metadata":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"required":["startDate","endDate"],"title":"Workout","type":"object"},"title":"Workouts","type":"array"}},"title":"SyncRequestData","type":"object"}},"required":["provider","sdkVersion","syncTimestamp"]}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/token":{"post":{"tags":["External: Mobile SDK"],"summary":"Create User Token","description":"Exchange app credentials or admin auth for user-scoped access token.\n\nSupports two authentication methods:\n1. App credentials: Provide app_id and app_secret in the request body\n2. Admin authentication: Authenticate as a developer/admin via Bearer token\n   (app_id and app_secret can be omitted)\n\nBoth methods return access_token with refresh_token.\n\nReturns a JWT token scoped to SDK endpoints only.\nTokens expire after configured time (default: 60 minutes).\n\nArgs:\n    user_id: OpenWearables User ID (UUID)\n    payload: Optional application credentials (app_id, app_secret)\n    db: Database session\n    developer: Optional authenticated developer (from Bearer token)\n\nReturns:\n    TokenResponse containing access_token, token_type, and refresh_token\n\nRaises:\n    401: If app credentials are invalid or admin auth is missing\n    400: If neither app credentials nor admin auth is provided","operationId":"create_user_token_api_v1_users__user_id__token_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SDKTokenRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/invitation-code":{"post":{"tags":["External: Mobile SDK"],"summary":"Generate Invitation Code","description":"Generate a single-use invitation code for SDK user onboarding.\n\nThe code can be shared with a mobile app user who enters it to receive\nSDK access and refresh tokens without manually entering user_id and tokens.\n\nPreviously generated codes for this user are marked as expired.\n\nRequires developer authentication.","operationId":"generate_invitation_code_api_v1_users__user_id__invitation_code_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInvitationCodeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invitation-code/redeem":{"post":{"tags":["External: Mobile SDK"],"summary":"Redeem Invitation Code","description":"Redeem an invitation code for SDK tokens.\n\nPublic endpoint (no authentication required). Exchanges a valid,\nnon-expired, single-use invitation code for access_token, refresh_token,\nand user_id.","operationId":"redeem_invitation_code_api_v1_invitation_code_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInvitationCodeRedeem"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCodeRedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/token/refresh":{"post":{"tags":["External: Token"],"summary":"Refresh Token","description":"Exchange refresh token for new access token.\n\nThis endpoint accepts both SDK and Developer refresh tokens and returns\na new access token of the same type. Implements refresh token rotation:\nthe old refresh token is revoked and a new one is issued.\n\nArgs:\n    payload: Request containing the refresh token\n    db: Database session\n\nReturns:\n    TokenResponse with new access token and new refresh token\n\nRaises:\n    401: If the refresh token is invalid or revoked","operationId":"refresh_token_api_v1_token_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/token/revoke":{"post":{"tags":["External: Token"],"summary":"Revoke Refresh Token","description":"Revoke a refresh token.\n\nUse this endpoint to invalidate a refresh token, for example when\nlogging out or when a token is compromised. This follows the OAuth 2.0\nToken Revocation specification (RFC 7009) which uses POST.\n\nArgs:\n    payload: Request containing the refresh token to revoke\n    db: Database session\n\nRaises:\n    404: If the refresh token is not found","operationId":"revoke_refresh_token_api_v1_token_revoke_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/data-sources":{"get":{"tags":["External: Data Sources"],"summary":"Get user data sources","operationId":"get_user_data_sources_api_v1_users__user_id__data_sources_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"User ID","title":"User Id"},"description":"User ID"},{"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/DataSourceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/endpoints":{"get":{"tags":["External: Webhooks"],"summary":"List Endpoints","operationId":"list_endpoints_api_v1_webhooks_endpoints_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EndpointResponse"},"type":"array","title":"Response List Endpoints Api V1 Webhooks Endpoints Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["External: Webhooks"],"summary":"Create Endpoint","operationId":"create_endpoint_api_v1_webhooks_endpoints_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/webhooks/endpoints/{endpoint_id}":{"get":{"tags":["External: Webhooks"],"summary":"Get Endpoint","operationId":"get_endpoint_api_v1_webhooks_endpoints__endpoint_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["External: Webhooks"],"summary":"Update Endpoint","operationId":"update_endpoint_api_v1_webhooks_endpoints__endpoint_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["External: Webhooks"],"summary":"Delete Endpoint","operationId":"delete_endpoint_api_v1_webhooks_endpoints__endpoint_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/endpoints/{endpoint_id}/secret":{"get":{"tags":["External: Webhooks"],"summary":"Get Endpoint Secret","operationId":"get_endpoint_secret_api_v1_webhooks_endpoints__endpoint_id__secret_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/event-types":{"get":{"tags":["External: Webhooks"],"summary":"List Event Types","operationId":"list_event_types_api_v1_webhooks_event_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EventTypeResponse"},"type":"array","title":"Response List Event Types Api V1 Webhooks Event Types Get"}}}}}}},"/api/v1/webhooks/messages":{"get":{"tags":["External: Webhooks"],"summary":"List Messages","operationId":"list_messages_api_v1_webhooks_messages_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Items per page.","default":50,"title":"Limit"},"description":"Items per page."},{"name":"iterator","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor from the previous page's `iterator` field.","title":"Iterator"},"description":"Cursor from the previous page's `iterator` field."},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only messages created before this timestamp.","title":"Before"},"description":"Only messages created before this timestamp."},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only messages created after this timestamp.","title":"After"},"description":"Only messages created after this timestamp."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WebhookMessageResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/endpoints/{endpoint_id}/attempts":{"get":{"tags":["External: Webhooks"],"summary":"List Endpoint Attempts","operationId":"list_endpoint_attempts_api_v1_webhooks_endpoints__endpoint_id__attempts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Items per page.","default":50,"title":"Limit"},"description":"Items per page."},{"name":"iterator","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor from the previous page's `iterator` field.","title":"Iterator"},"description":"Cursor from the previous page's `iterator` field."},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only attempts created before this timestamp.","title":"Before"},"description":"Only attempts created before this timestamp."},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only attempts created after this timestamp.","title":"After"},"description":"Only attempts created after this timestamp."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by status: 0=success, 1=pending, 2=failed, 3=sending.","title":"Status"},"description":"Filter by status: 0=success, 1=pending, 2=failed, 3=sending."},{"name":"event_types","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by event type(s).","title":"Event Types"},"description":"Filter by event type(s)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_WebhookMessageAttemptResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/endpoints/{endpoint_id}/test":{"post":{"tags":["External: Webhooks"],"summary":"Send Test Event","operationId":"send_test_event_api_v1_webhooks_endpoints__endpoint_id__test_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","title":"Endpoint Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TestEventRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Send Test Event Api V1 Webhooks Endpoints  Endpoint Id  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Internal: Auth"],"summary":"Login","description":"Authenticate developer and return access token with refresh token.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_api_v1_auth_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["Internal: Auth"],"summary":"Logout","description":"Logout developer (token invalidation should be handled client-side).","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/change-password":{"post":{"tags":["Internal: Auth"],"summary":"Change Password","description":"Change password for the current authenticated developer.","operationId":"change_password_api_v1_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChange"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/me":{"get":{"tags":["Internal: Auth"],"summary":"Get Current Developer Info","description":"Get current authenticated developer.","operationId":"get_current_developer_info_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperRead"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"patch":{"tags":["Internal: Auth"],"summary":"Update Current Developer","description":"Update current authenticated developer.","operationId":"update_current_developer_api_v1_auth_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/developers":{"get":{"tags":["Internal: Developers"],"summary":"List Developers","description":"List all developers (team members).","operationId":"list_developers_api_v1_developers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DeveloperRead"},"type":"array","title":"Response List Developers Api V1 Developers Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/developers/{developer_id}":{"get":{"tags":["Internal: Developers"],"summary":"Get Developer","description":"Get developer by ID.","operationId":"get_developer_api_v1_developers__developer_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"developer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Developer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Internal: Developers"],"summary":"Update Developer","description":"Update developer by ID.","operationId":"update_developer_api_v1_developers__developer_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"developer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Developer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Internal: Developers"],"summary":"Delete Developer","description":"Delete developer by ID.","operationId":"delete_developer_api_v1_developers__developer_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"developer_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Developer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invitations":{"get":{"tags":["Internal: Invitations"],"summary":"List Invitations","description":"List all pending invitations.","operationId":"list_invitations_api_v1_invitations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/InvitationRead"},"type":"array","title":"Response List Invitations Api V1 Invitations Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Internal: Invitations"],"summary":"Create Invitation","description":"Create and send a new invitation.","operationId":"create_invitation_api_v1_invitations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/invitations/{invitation_id}":{"delete":{"tags":["Internal: Invitations"],"summary":"Revoke Invitation","description":"Revoke a pending invitation.","operationId":"revoke_invitation_api_v1_invitations__invitation_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invitations/{invitation_id}/resend":{"post":{"tags":["Internal: Invitations"],"summary":"Resend Invitation","description":"Resend an invitation email.","operationId":"resend_invitation_api_v1_invitations__invitation_id__resend_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invitations/accept":{"post":{"tags":["Internal: Invitations"],"summary":"Accept Invitation","description":"Accept an invitation and create a developer account (public endpoint).","operationId":"accept_invitation_api_v1_invitations_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAccept"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeveloperRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/developer/api-keys":{"get":{"tags":["Internal: API Keys"],"summary":"List Api Keys","description":"List all API keys.","operationId":"list_api_keys_api_v1_developer_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyRead"},"type":"array","title":"Response List Api Keys Api V1 Developer Api Keys Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Internal: API Keys"],"summary":"Create Api Key","description":"Generate new API key.","operationId":"create_api_key_api_v1_developer_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_api_key_api_v1_developer_api_keys_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/developer/api-keys/{key_id}":{"delete":{"tags":["Internal: API Keys"],"summary":"Delete Api Key","description":"Delete API key by key value.","operationId":"delete_api_key_api_v1_developer_api_keys__key_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Internal: API Keys"],"summary":"Update Api Key","description":"Update API key (future: name, scopes).","operationId":"update_api_key_api_v1_developer_api_keys__key_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/developer/api-keys/{key_id}/rotate":{"post":{"tags":["Internal: API Keys"],"summary":"Rotate Api Key","description":"Rotate API key - delete old and generate new.","operationId":"rotate_api_key_api_v1_developer_api_keys__key_id__rotate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications":{"get":{"tags":["Internal: Applications"],"summary":"List Applications","description":"List all applications for current developer.","operationId":"list_applications_api_v1_applications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApplicationRead"},"type":"array","title":"Response List Applications Api V1 Applications Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Internal: Applications"],"summary":"Create Application","description":"Create new application.\n\nReturns app_secret only once - store it securely as it cannot be retrieved again.","operationId":"create_application_api_v1_applications_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadWithSecret"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/applications/{app_id}":{"delete":{"tags":["Internal: Applications"],"summary":"Delete Application","description":"Delete application.","operationId":"delete_application_api_v1_applications__app_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications/{app_id}/rotate-secret":{"post":{"tags":["Internal: Applications"],"summary":"Rotate Application Secret","description":"Rotate application secret.\n\nReturns new secret only once - store it securely as it cannot be retrieved again.\nThe old secret will no longer work after rotation.","operationId":"rotate_application_secret_api_v1_applications__app_id__rotate_secret_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadWithSecret"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/stats":{"get":{"tags":["Internal: Dashboard","dashboard"],"summary":"Get Stats","description":"Get system dashboard statistics.","operationId":"get_stats_api_v1_dashboard_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemInfoResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/config":{"get":{"tags":["Internal: Config"],"summary":"Get Config","operationId":"get_config_api_v1_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/archival":{"get":{"tags":["Internal: Data Lifecycle"],"summary":"Get data lifecycle settings","description":"Returns current archival/retention configuration and storage size estimates.","operationId":"get_archival_settings_api_v1_settings_archival_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchivalSettingWithEstimate"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Internal: Data Lifecycle"],"summary":"Update data lifecycle settings","description":"Configure archive_after_days (when live data is aggregated) and delete_after_days (when old data is permanently removed). Set to null to disable.","operationId":"update_archival_settings_api_v1_settings_archival_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchivalSettingUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchivalSettingWithEstimate"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/archival/run":{"post":{"tags":["Internal: Data Lifecycle"],"summary":"Trigger archival job manually","description":"Dispatches the daily archival + retention job via Celery. Returns immediately with the task ID.","operationId":"trigger_archival_api_v1_settings_archival_run_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Trigger Archival Api V1 Settings Archival Run Post"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/seed":{"post":{"tags":["Internal: Seed Data"],"summary":"Generate synthetic seed data","description":"Dispatches a Celery task to generate synthetic users with configurable health data profiles.","operationId":"dispatch_seed_generation_api_v1_settings_seed_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDataRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/seed/presets":{"get":{"tags":["Internal: Seed Data"],"summary":"List available seed data presets","description":"Returns the list of pre-configured profiles for seed data generation.","operationId":"list_presets_api_v1_settings_seed_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SeedPresetInfo"},"type":"array","title":"Response List Presets Api V1 Settings Seed Presets Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/settings/seed/sleep-profiles":{"get":{"tags":["Internal: Seed Data"],"summary":"List available sleep stage profiles","operationId":"list_sleep_stage_profiles_api_v1_settings_seed_sleep_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Sleep Stage Profiles Api V1 Settings Seed Sleep Profiles Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/priorities/providers":{"get":{"tags":["Internal: Priorities"],"summary":"Get global provider priorities","operationId":"get_provider_priorities_api_v1_priorities_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPriorityListResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Internal: Priorities"],"summary":"Bulk update provider priorities","operationId":"bulk_update_provider_priorities_api_v1_priorities_providers_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPriorityBulkUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPriorityListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/priorities/providers/{provider}":{"put":{"tags":["Internal: Priorities"],"summary":"Update provider priority","operationId":"update_provider_priority_api_v1_priorities_providers__provider__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ProviderName","description":"Provider name enum"},"description":"Provider name enum"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPriorityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPriorityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/priorities/device-types":{"get":{"tags":["Internal: Priorities"],"summary":"Get device type priorities","operationId":"get_device_type_priorities_api_v1_priorities_device_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTypePriorityListResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Internal: Priorities"],"summary":"Bulk update device type priorities","operationId":"bulk_update_device_type_priorities_api_v1_priorities_device_types_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTypePriorityBulkUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTypePriorityListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/priorities/device-types/{device_type}":{"put":{"tags":["Internal: Priorities"],"summary":"Update device type priority","operationId":"update_device_type_priority_api_v1_priorities_device_types__device_type__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"device_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/DeviceType","description":"Device type enum"},"description":"Device type enum"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTypePriorityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTypePriorityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oura/webhooks":{"get":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Oura Webhook Verification","description":"Handle Oura webhook verification challenge.\n\nDelegates to OuraWebhookHandler.handle_challenge().","operationId":"oura_webhook_verification_api_v1_oura_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oura Webhook Verification Api V1 Oura Webhooks Get"}}}}},"deprecated":true},"post":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Oura Webhook Notification","description":"Receive Oura webhook notifications.\n\nDelegates to OuraWebhookHandler (signature verification, payload parsing,\nCelery task dispatch).","operationId":"oura_webhook_notification_api_v1_oura_webhooks_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oura Webhook Notification Api V1 Oura Webhooks Post"}}}}},"deprecated":true}},"/api/v1/oura/webhooks/health":{"get":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Oura Webhook Health","description":"Health check endpoint for Oura webhook configuration.","operationId":"oura_webhook_health_api_v1_oura_webhooks_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oura Webhook Health Api V1 Oura Webhooks Health Get"}}}}},"deprecated":true}},"/api/v1/oura/webhooks/subscriptions":{"post":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Create Webhook Subscriptions","description":"Register Oura webhook subscriptions for all data types.\n\nRequires Oura client_id and client_secret to be configured.\nSubscriptions are app-level (cover all authorized users).","operationId":"create_webhook_subscriptions_api_v1_oura_webhooks_subscriptions_post","deprecated":true,"security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"callback_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Webhook Subscriptions Api V1 Oura Webhooks Subscriptions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"List Webhook Subscriptions","description":"List active Oura webhook subscriptions.","operationId":"list_webhook_subscriptions_api_v1_oura_webhooks_subscriptions_get","deprecated":true,"security":[{"OAuth2PasswordBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionsResponse"}}}}}}},"/api/v1/oura/webhooks/subscriptions/renew":{"post":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Renew Webhook Subscriptions","description":"Renew all active Oura webhook subscriptions.","operationId":"renew_webhook_subscriptions_api_v1_oura_webhooks_subscriptions_renew_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Renew Webhook Subscriptions Api V1 Oura Webhooks Subscriptions Renew Post"}}}}},"deprecated":true,"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/strava/webhooks":{"get":{"tags":["System: Strava Webhooks"],"summary":"Strava Webhook Verification","description":"Strava webhook subscription verification (GET).\n\nDelegates to StravaWebhookHandler.handle_challenge().","operationId":"strava_webhook_verification_api_v1_strava_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Strava Webhook Verification Api V1 Strava Webhooks Get"}}}}}},"post":{"tags":["System: Strava Webhooks"],"summary":"Strava Webhook Event","description":"Strava webhook event handler (POST).\n\nDelegates to StravaWebhookHandler (signature verification, parsing,\nCelery task dispatch).","operationId":"strava_webhook_event_api_v1_strava_webhooks_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Strava Webhook Event Api V1 Strava Webhooks Post"}}}}}}},"/api/v1/strava/webhooks/health":{"get":{"tags":["System: Strava Webhooks"],"summary":"Strava Webhook Health","description":"Health check endpoint for Strava webhook configuration.","operationId":"strava_webhook_health_api_v1_strava_webhooks_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Strava Webhook Health Api V1 Strava Webhooks Health Get"}}}}}}},"/api/v1/providers/{provider}/webhooks":{"post":{"tags":["System: Provider Webhooks"],"summary":"Handle Provider Webhook","description":"Receive an incoming webhook event from a provider.\n\nBody bytes are pre-read by the async ``_read_body`` dependency so that\nsignature verification has access to the exact bytes signed by the provider.\nThe route itself is a plain ``def`` so FastAPI runs it in a threadpool,\nkeeping synchronous DB work off the event loop.\n\nReturns whatever dict the provider's ``dispatch()`` method returns.","operationId":"handle_provider_webhook_api_v1_providers__provider__webhooks_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Handle Provider Webhook Api V1 Providers  Provider  Webhooks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["System: Provider Webhooks"],"summary":"Verify Provider Webhook","description":"Handle GET-based subscription verification challenges.\n\nSome providers (Strava ``hub.challenge``, Oura ``verification_token``)\nverify webhook subscriptions by sending a GET request that must be\nechoed back.  This endpoint delegates to the provider's\n``handle_challenge()`` method.\n\nProviders that do not support GET challenges will receive a ``501``\nresponse from the default ``BaseWebhookHandler.handle_challenge()``\nimplementation.","operationId":"verify_provider_webhook_api_v1_providers__provider__webhooks_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Verify Provider Webhook Api V1 Providers  Provider  Webhooks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/webhooks/subscriptions":{"get":{"tags":["System: Provider Webhooks"],"summary":"List Webhook Subscriptions","description":"List active webhook subscriptions for a provider.","operationId":"list_webhook_subscriptions_api_v1_providers__provider__webhooks_subscriptions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["System: Provider Webhooks"],"summary":"Register Webhook Subscriptions","description":"Register or update webhook subscriptions for a provider.","operationId":"register_webhook_subscriptions_api_v1_providers__provider__webhooks_subscriptions_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"callback_url","in":"query","required":true,"schema":{"type":"string","title":"Callback Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Register Webhook Subscriptions Api V1 Providers  Provider  Webhooks Subscriptions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/webhooks/subscriptions/renew":{"post":{"tags":["System: Provider Webhooks"],"summary":"Renew Webhook Subscriptions","description":"Renew all active webhook subscriptions for a provider.","operationId":"renew_webhook_subscriptions_api_v1_providers__provider__webhooks_subscriptions_renew_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Renew Webhook Subscriptions Api V1 Providers  Provider  Webhooks Subscriptions Renew Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/webhooks/subscriptions/{subscription_id}":{"get":{"tags":["System: Provider Webhooks"],"summary":"Get Webhook Subscription","description":"Get a single webhook subscription by ID.","operationId":"get_webhook_subscription_api_v1_providers__provider__webhooks_subscriptions__subscription_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["System: Provider Webhooks"],"summary":"Delete Webhook Subscription","description":"Delete a webhook subscription by ID.","operationId":"delete_webhook_subscription_api_v1_providers__provider__webhooks_subscriptions__subscription_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeletedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["System: Provider Webhooks"],"summary":"Update Webhook Subscription","description":"Update the callback URL of a webhook subscription.","operationId":"update_webhook_subscription_api_v1_providers__provider__webhooks_subscriptions__subscription_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"callback_url","in":"query","required":true,"schema":{"type":"string","title":"Callback Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/garmin/webhooks/ping":{"post":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Garmin Webhook Ping Compat","description":"Deprecated: POST /api/v1/garmin/webhooks/ping.\n\nUse POST /api/v1/providers/garmin/webhooks instead.","operationId":"garmin_webhook_ping_compat_api_v1_garmin_webhooks_ping_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Garmin Webhook Ping Compat Api V1 Garmin Webhooks Ping Post"}}}}},"deprecated":true}},"/api/v1/garmin/webhooks/push":{"post":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Garmin Webhook Push Compat","description":"Deprecated: POST /api/v1/garmin/webhooks/push.\n\nUse POST /api/v1/providers/garmin/webhooks instead.","operationId":"garmin_webhook_push_compat_api_v1_garmin_webhooks_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Garmin Webhook Push Compat Api V1 Garmin Webhooks Push Post"}}}}},"deprecated":true}},"/api/v1/strava/webhook":{"get":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Strava Webhook Verification","description":"Strava webhook subscription verification (GET).\n\nDelegates to StravaWebhookHandler.handle_challenge().","operationId":"strava_webhook_verification_api_v1_strava_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Strava Webhook Verification Api V1 Strava Webhook Get"}}}}},"deprecated":true},"post":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Strava Webhook Event","description":"Strava webhook event handler (POST).\n\nDelegates to StravaWebhookHandler (signature verification, parsing,\nCelery task dispatch).","operationId":"strava_webhook_event_api_v1_strava_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Strava Webhook Event Api V1 Strava Webhook Post"}}}}},"deprecated":true}},"/api/v1/strava/webhook/health":{"get":{"tags":["System: Provider Webhooks (Deprecated)"],"summary":"Strava Webhook Health","description":"Health check endpoint for Strava webhook configuration.","operationId":"strava_webhook_health_api_v1_strava_webhook_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Strava Webhook Health Api V1 Strava Webhook Health Get"}}}}},"deprecated":true}}},"components":{"schemas":{"ActivitySummary":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"source":{"$ref":"#/components/schemas/SourceMetadata"},"steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps","description":"Total step count","example":8432},"distance_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Meters","example":6240.5},"floors_climbed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Floors Climbed","description":"Calculated from elevation (1 floor ≈ 3m)","example":12},"elevation_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation Meters","description":"Raw total elevation gain","example":36.0},"active_calories_kcal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Active Calories Kcal","description":"Active energy burned","example":342.5},"total_calories_kcal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Calories Kcal","description":"Active + basal energy","example":2150.0},"active_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Minutes","description":"Minutes with activity above threshold","example":60},"sedentary_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sedentary Minutes","description":"Minutes with minimal activity","example":480},"intensity_minutes":{"anyOf":[{"$ref":"#/components/schemas/IntensityMinutes"},{"type":"null"}]},"heart_rate":{"anyOf":[{"$ref":"#/components/schemas/HeartRateStats"},{"type":"null"}]}},"type":"object","required":["date","source"],"title":"ActivitySummary"},"ApiKeyRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","created_by","created_at"],"title":"ApiKeyRead"},"ApiKeyUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"ApiKeyUpdate"},"ApplicationCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"}},"type":"object","required":["name"],"title":"ApplicationCreate","description":"Schema for creating a new Application (external input)."},"ApplicationRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"app_id":{"type":"string","title":"App Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","app_id","name","created_at"],"title":"ApplicationRead","description":"Schema for reading Application (without secret)."},"ApplicationReadWithSecret":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"app_id":{"type":"string","title":"App Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"app_secret":{"type":"string","title":"App Secret"}},"type":"object","required":["id","app_id","name","created_at","app_secret"],"title":"ApplicationReadWithSecret","description":"Schema returned only on creation - contains plain app_secret."},"ArchivalSettingRead":{"properties":{"archive_after_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Archive After Days","description":"Days before live samples are aggregated into daily archive. NULL = archival disabled."},"delete_after_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delete After Days","description":"Days before archived data is permanently removed. NULL = kept indefinitely."}},"type":"object","title":"ArchivalSettingRead","description":"Response schema for archival settings."},"ArchivalSettingUpdate":{"properties":{"archive_after_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Archive After Days","description":"Days before live data is archived. NULL to disable archival."},"delete_after_days":{"anyOf":[{"type":"integer","maximum":7300.0,"minimum":1.0},{"type":"null"}],"title":"Delete After Days","description":"Days before data is permanently deleted. NULL to keep indefinitely."}},"type":"object","title":"ArchivalSettingUpdate","description":"Request schema for updating archival settings."},"ArchivalSettingWithEstimate":{"properties":{"settings":{"$ref":"#/components/schemas/ArchivalSettingRead"},"storage":{"$ref":"#/components/schemas/StorageEstimate"}},"type":"object","required":["settings","storage"],"title":"ArchivalSettingWithEstimate","description":"Combined archival settings + storage estimates response."},"AuthorizationURLResponse":{"properties":{"authorization_url":{"type":"string","title":"Authorization Url"},"state":{"type":"string","title":"State"}},"type":"object","required":["authorization_url","state"],"title":"AuthorizationURLResponse","description":"Response containing authorization URL for user redirect."},"BloodPressure":{"properties":{"avg_systolic_mmhg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Systolic Mmhg","description":"Average systolic pressure","example":120},"avg_diastolic_mmhg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Diastolic Mmhg","description":"Average diastolic pressure","example":80},"max_systolic_mmhg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Systolic Mmhg","description":"Maximum systolic pressure","example":135},"max_diastolic_mmhg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Diastolic Mmhg","description":"Maximum diastolic pressure","example":90},"min_systolic_mmhg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Systolic Mmhg","description":"Minimum systolic pressure","example":110},"min_diastolic_mmhg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Diastolic Mmhg","description":"Minimum diastolic pressure","example":72},"reading_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reading Count","description":"Number of readings in period","example":5}},"type":"object","title":"BloodPressure","description":"Blood pressure statistics aggregated over a period.\n\nValues are aggregated from multiple readings to provide a more representative measure."},"BodyAveraged":{"properties":{"period_days":{"type":"integer","title":"Period Days","description":"Number of days averaged (1 or 7)","example":7},"resting_heart_rate_bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resting Heart Rate Bpm","description":"Average resting heart rate","example":62},"avg_hrv_sdnn_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Hrv Sdnn Ms","description":"Average HRV (SDNN)","example":45.2},"avg_hrv_rmssd_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Hrv Rmssd Ms","description":"Average HRV (RMSSD)","example":42.0},"period_start":{"type":"string","format":"date-time","title":"Period Start","description":"Start of averaging period"},"period_end":{"type":"string","format":"date-time","title":"Period End","description":"End of averaging period"}},"type":"object","required":["period_days","period_start","period_end"],"title":"BodyAveraged","description":"Vitals averaged over a configurable time period.\n\nThese metrics fluctuate daily and are more meaningful as averages.\nPeriod can be 1 day (current state) or 7 days (baseline trend)."},"BodyLatest":{"properties":{"body_temperature_celsius":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Body Temperature Celsius","description":"Body temperature if measured within time window","example":36.6},"body_temperature_measured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Body Temperature Measured At","description":"When body temperature was measured (null if no recent reading)"},"skin_temperature_celsius":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Skin Temperature Celsius","description":"Skin temperature if measured within time window","example":36.6},"skin_temperature_measured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Skin Temperature Measured At","description":"When skin temperature was measured (null if no recent reading)"},"blood_pressure":{"anyOf":[{"$ref":"#/components/schemas/BloodPressure"},{"type":"null"}],"description":"Blood pressure if measured within time window"},"blood_pressure_measured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Blood Pressure Measured At","description":"When blood pressure was measured (null if no recent reading)"}},"type":"object","title":"BodyLatest","description":"Point-in-time metrics that are only relevant when recent.\n\nThese metrics are only returned if measured within a configurable time window.\nStale readings return null to avoid displaying outdated data."},"BodySlowChanging":{"properties":{"weight_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight Kg","description":"Most recent weight measurement","example":72.5},"height_cm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Height Cm","description":"Most recent height measurement","example":175.5},"body_fat_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Body Fat Percent","description":"Most recent body fat percentage","example":18.5},"muscle_mass_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Muscle Mass Kg","description":"Most recent muscle/lean body mass","example":58.2},"bmi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bmi","description":"Calculated from latest weight and height","example":23.5},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age","description":"Age in years calculated from birth date","example":32}},"type":"object","title":"BodySlowChanging","description":"Slow-changing body composition metrics.\n\nThese are metrics that change infrequently (days/weeks between measurements).\nReturns the most recent recorded value for each field."},"BodySummary":{"properties":{"source":{"$ref":"#/components/schemas/SourceMetadata"},"slow_changing":{"$ref":"#/components/schemas/BodySlowChanging"},"averaged":{"$ref":"#/components/schemas/BodyAveraged"},"latest":{"$ref":"#/components/schemas/BodyLatest"}},"type":"object","required":["source","slow_changing","averaged","latest"],"title":"BodySummary","description":"Comprehensive body metrics with semantic grouping.\n\nMetrics are grouped by their temporal characteristics:\n- slow_changing: Slow-changing values (latest measurement)\n- averaged: Vitals averaged over a period (1 or 7 days)\n- latest: Point-in-time readings (only if recent)"},"Body_create_api_key_api_v1_developer_api_keys_post":{"properties":{"name":{"type":"string","title":"Name","description":"Name for the API key","default":"Default"}},"type":"object","title":"Body_create_api_key_api_v1_developer_api_keys_post"},"Body_import_xml_file_api_v1_users__user_id__import_apple_xml_direct_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_xml_file_api_v1_users__user_id__import_apple_xml_direct_post"},"Body_login_api_v1_auth_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_v1_auth_login_post"},"BulkProviderSettingsUpdate":{"properties":{"providers":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Providers","description":"Map of provider_id -> is_enabled","examples":[{"apple":true,"garmin":true,"polar":false,"suunto":true}]}},"type":"object","required":["providers"],"title":"BulkProviderSettingsUpdate","description":"Schema for bulk updating provider enabled/disabled state."},"ConfigResponse":{"properties":{"outgoing_webhooks_enabled":{"type":"boolean","title":"Outgoing Webhooks Enabled"}},"type":"object","required":["outgoing_webhooks_enabled"],"title":"ConfigResponse","description":"Instance feature flags for the admin panel. Additive-only: append new flags,\nnever remove or repurpose, so the frontend stays backward compatible."},"ConnectionStatus":{"type":"string","enum":["active","revoked","expired"],"title":"ConnectionStatus","description":"Status of a user connection to a provider."},"ConnectionsCoverage":{"properties":{"users_with_active":{"type":"integer","title":"Users With Active"},"users_with_multi_active":{"type":"integer","title":"Users With Multi Active"},"top_providers":{"items":{"$ref":"#/components/schemas/ProviderConnectionCount"},"type":"array","title":"Top Providers"}},"type":"object","required":["users_with_active","users_with_multi_active","top_providers"],"title":"ConnectionsCoverage"},"CoverageResponse":{"properties":{"providers":{"items":{"type":"string"},"type":"array","title":"Providers"},"timeseries":{"items":{"$ref":"#/components/schemas/TimeseriesCategory"},"type":"array","title":"Timeseries"},"workout_fields":{"items":{"$ref":"#/components/schemas/WorkoutField"},"type":"array","title":"Workout Fields"},"sleep_fields":{"items":{"$ref":"#/components/schemas/SleepField"},"type":"array","title":"Sleep Fields"},"menstrual_cycle_fields":{"items":{"$ref":"#/components/schemas/MenstrualCycleField"},"type":"array","title":"Menstrual Cycle Fields"},"health_scores":{"items":{"$ref":"#/components/schemas/HealthScore"},"type":"array","title":"Health Scores"}},"type":"object","required":["providers","timeseries","workout_fields","sleep_fields","menstrual_cycle_fields","health_scores"],"title":"CoverageResponse"},"DataGranularity":{"type":"string","enum":["daily","hourly","raw"],"title":"DataGranularity","description":"How finely a provider's 24/7 data is stored.\n\nDAILY  — one aggregated value per day (server-side rollup).\nHOURLY — one aggregated value per hour (server-side rollup).\nRAW    — every individual reading (no aggregation), where the provider supports it."},"DataPointsInfo":{"properties":{"count":{"type":"integer","title":"Count"},"archived":{"type":"integer","title":"Archived"}},"type":"object","required":["count","archived"],"title":"DataPointsInfo","description":"Data points information.\n\n``count`` is the live (hot) ``data_point_series`` table; ``archived`` is the separate archive\ntable. Both are approximate on a cold cache / from planner statistics."},"DataSourceListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DataSourceResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"DataSourceListResponse"},"DataSourceResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"provider":{"$ref":"#/components/schemas/ProviderName"},"user_connection_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Connection Id"},"device_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Model"},"software_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Software Version"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"device_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Type"},"original_source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Source Name"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["id","user_id","provider"],"title":"DataSourceResponse"},"DataTypeCount":{"properties":{"type":{"type":"string","title":"Type"},"count":{"type":"integer","minimum":0.0,"title":"Count"}},"type":"object","required":["type","count"],"title":"DataTypeCount","description":"Count of records for a specific data type."},"DeveloperRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","email","created_at","updated_at"],"title":"DeveloperRead"},"DeveloperUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"password":{"anyOf":[{"type":"string","minLength":8},{"type":"null"}],"title":"Password"}},"type":"object","title":"DeveloperUpdate"},"DeviceStateEvent":{"properties":{"eventType":{"type":"string","const":"device_state","title":"Eventtype"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"batteryLevel":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Batterylevel"},"batteryState":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Batterystate"},"isLowPowerMode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Islowpowermode"},"thermalState":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thermalstate"},"taskType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tasktype"},"availableRamBytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Availablerambytes"},"totalRamBytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Totalrambytes"}},"type":"object","required":["eventType","timestamp"],"title":"DeviceStateEvent"},"DeviceType":{"type":"string","enum":["watch","band","phone","scale","ring","other","unknown"],"title":"DeviceType","description":"Type of device that collected health data."},"DeviceTypePriorityBase":{"properties":{"device_type":{"$ref":"#/components/schemas/DeviceType"},"priority":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Priority"}},"type":"object","required":["device_type","priority"],"title":"DeviceTypePriorityBase"},"DeviceTypePriorityBulkUpdate":{"properties":{"priorities":{"items":{"$ref":"#/components/schemas/DeviceTypePriorityBase"},"type":"array","title":"Priorities"}},"type":"object","required":["priorities"],"title":"DeviceTypePriorityBulkUpdate"},"DeviceTypePriorityListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DeviceTypePriorityResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"DeviceTypePriorityListResponse"},"DeviceTypePriorityResponse":{"properties":{"device_type":{"$ref":"#/components/schemas/DeviceType"},"priority":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Priority"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["device_type","priority","id","created_at","updated_at"],"title":"DeviceTypePriorityResponse"},"DeviceTypePriorityUpdate":{"properties":{"priority":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Priority"}},"type":"object","required":["priority"],"title":"DeviceTypePriorityUpdate"},"EndpointCreateRequest":{"properties":{"url":{"type":"string","title":"Url","description":"HTTPS URL where webhook payloads will be sent."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Human-readable label for this endpoint."},"filter_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Filter Types","description":"Only deliver events of these types. Empty / None = all types."},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id","description":"Subscribe only to events for this user. Empty / None = all users."}},"type":"object","required":["url"],"title":"EndpointCreateRequest"},"EndpointResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"filter_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Filter Types"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["id","url"],"title":"EndpointResponse"},"EndpointSecretResponse":{"properties":{"key":{"type":"string","title":"Key"}},"type":"object","required":["key"],"title":"EndpointSecretResponse"},"EndpointUpdateRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"filter_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Filter Types"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id","description":"Subscribe only to events for this user. Pass null to remove the filter."}},"type":"object","title":"EndpointUpdateRequest"},"EventRecordsInfo":{"properties":{"count":{"type":"integer","title":"Count"},"workouts":{"type":"integer","title":"Workouts"},"sleep":{"type":"integer","title":"Sleep"},"menstrual_cycles":{"type":"integer","title":"Menstrual Cycles"}},"type":"object","required":["count","workouts","sleep","menstrual_cycles"],"title":"EventRecordsInfo","description":"Event record counts with a breakdown by category."},"EventTypeResponse":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"child_events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Child Events"}},"type":"object","required":["name","description"],"title":"EventTypeResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthScore":{"properties":{"code":{"type":"string","title":"Code"},"providers":{"items":{"type":"string"},"type":"array","title":"Providers"}},"type":"object","required":["code","providers"],"title":"HealthScore"},"HealthScoreCategory":{"type":"string","enum":["sleep","recovery","readiness","activity","stress","resilience","body_battery","strain"],"title":"HealthScoreCategory"},"HealthScoreResponse":{"properties":{"category":{"$ref":"#/components/schemas/HealthScoreCategory"},"value":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"null"}],"title":"Value","description":"Overall numeric score. Range varies by provider and category — see HEALTH_SCORE_RANGES for scale."},"qualifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qualifier","description":"Textual rating from the provider, e.g. GOOD or EXCELLENT"},"recorded_at":{"type":"string","format":"date-time","title":"Recorded At"},"zone_offset":{"anyOf":[{"type":"string","maxLength":10,"pattern":"^[+-]\\d{2}:\\d{2}$"},{"type":"null"}],"title":"Zone Offset","description":"Timezone offset in the format '+01:00' or '-05:30'","examples":["+01:00","-05:30"]},"components":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ScoreComponent"},"type":"object"},{"type":"null"}],"title":"Components"},"id":{"type":"string","format":"uuid","title":"Id"},"data_source_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Data Source Id"},"provider":{"anyOf":[{"$ref":"#/components/schemas/ProviderName"},{"type":"null"}]}},"type":"object","required":["category","recorded_at","id","data_source_id","provider"],"title":"HealthScoreResponse"},"HeartRateStats":{"properties":{"avg_bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Bpm"},"max_bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bpm"},"min_bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Bpm"}},"type":"object","title":"HeartRateStats","description":"Heart rate statistics for a period."},"HistoricalDataSyncStartEvent":{"properties":{"eventType":{"type":"string","const":"historical_data_sync_start","title":"Eventtype"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"dataTypeCounts":{"items":{"$ref":"#/components/schemas/DataTypeCount"},"type":"array","title":"Datatypecounts"},"timeRange":{"anyOf":[{"$ref":"#/components/schemas/TimeRange"},{"type":"null"}]}},"type":"object","required":["eventType","timestamp"],"title":"HistoricalDataSyncStartEvent"},"HistoricalDataTypeSyncEndEvent":{"properties":{"eventType":{"type":"string","const":"historical_data_type_sync_end","title":"Eventtype"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"dataType":{"type":"string","title":"Datatype"},"success":{"type":"boolean","title":"Success"},"recordCount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recordcount"},"durationMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Durationms"}},"type":"object","required":["eventType","timestamp","dataType","success"],"title":"HistoricalDataTypeSyncEndEvent"},"IntensityMinutes":{"properties":{"light":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Light"},"moderate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Moderate"},"vigorous":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vigorous"}},"type":"object","title":"IntensityMinutes"},"InvitationAccept":{"properties":{"token":{"type":"string","title":"Token"},"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name","strip_whitespace":true},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name","strip_whitespace":true},"password":{"type":"string","minLength":8,"title":"Password"}},"type":"object","required":["token","first_name","last_name","password"],"title":"InvitationAccept","description":"Schema for accepting an invitation."},"InvitationCodeRedeemResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In"},"user_id":{"type":"string","format":"uuid","title":"User Id"}},"type":"object","required":["access_token","user_id"],"title":"InvitationCodeRedeemResponse","description":"Redeem response with user_id included."},"InvitationCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"InvitationCreate","description":"Schema for creating a new invitation (API input)."},"InvitationRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"token":{"type":"string","title":"Token"},"status":{"$ref":"#/components/schemas/InvitationStatus"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"invited_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Invited By Id"}},"type":"object","required":["id","email","token","status","expires_at","created_at"],"title":"InvitationRead","description":"Schema for reading invitation data."},"InvitationStatus":{"type":"string","enum":["pending","sent","failed","accepted","expired","revoked"],"title":"InvitationStatus"},"LiveSyncMode":{"type":"string","enum":["pull","webhook"],"title":"LiveSyncMode"},"MenstrualCycleField":{"properties":{"code":{"type":"string","title":"Code"},"providers":{"items":{"type":"string"},"type":"array","title":"Providers"}},"type":"object","required":["code","providers"],"title":"MenstrualCycleField"},"MenstrualCycleRecord":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"zone_offset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Offset"},"source":{"$ref":"#/components/schemas/SourceMetadata"},"current_phase":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Phase"},"current_phase_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Phase Type"},"day_in_cycle":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day In Cycle"},"cycle_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cycle Length"},"predicted_cycle_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Predicted Cycle Length"},"is_predicted_cycle":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Predicted Cycle"},"period_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Period Length"},"length_of_current_phase":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Length Of Current Phase"},"days_until_next_phase":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Until Next Phase"},"fertile_window_start":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fertile Window Start"},"length_of_fertile_window":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Length Of Fertile Window"},"last_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated At"},"has_specified_cycle_length":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Specified Cycle Length"},"has_specified_period_length":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Specified Period Length"},"pregnancy_snapshot":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Pregnancy Snapshot"}},"type":"object","required":["id","start_time","end_time","source"],"title":"MenstrualCycleRecord"},"MetricCount":{"properties":{"count":{"type":"integer","title":"Count"}},"type":"object","required":["count"],"title":"MetricCount","description":"A single count metric."},"OldPaginatedResponse_UserRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UserRead"},"type":"array","title":"Items"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Total number of items matching the query"},"page":{"type":"integer","minimum":1.0,"title":"Page","description":"Current page number (1-based)"},"limit":{"type":"integer","exclusiveMinimum":0.0,"title":"Limit","description":"Number of items per page"},"pages":{"type":"integer","title":"Pages","description":"Total number of pages.","readOnly":true},"has_next":{"type":"boolean","title":"Has Next","description":"Whether there is a next page.","readOnly":true},"has_prev":{"type":"boolean","title":"Has Prev","description":"Whether there is a previous page.","readOnly":true}},"type":"object","required":["items","total","page","limit","pages","has_next","has_prev"],"title":"OldPaginatedResponse[UserRead]"},"PaginatedResponse_ActivitySummary_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ActivitySummary"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"metadata":{"$ref":"#/components/schemas/TimeseriesMetadata"}},"type":"object","required":["data","pagination","metadata"],"title":"PaginatedResponse[ActivitySummary]"},"PaginatedResponse_HealthScoreResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/HealthScoreResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"metadata":{"$ref":"#/components/schemas/TimeseriesMetadata"}},"type":"object","required":["data","pagination","metadata"],"title":"PaginatedResponse[HealthScoreResponse]"},"PaginatedResponse_MenstrualCycleRecord_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MenstrualCycleRecord"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"metadata":{"$ref":"#/components/schemas/TimeseriesMetadata"}},"type":"object","required":["data","pagination","metadata"],"title":"PaginatedResponse[MenstrualCycleRecord]"},"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]"},"PaginatedResponse_SleepSession_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SleepSession"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"metadata":{"$ref":"#/components/schemas/TimeseriesMetadata"}},"type":"object","required":["data","pagination","metadata"],"title":"PaginatedResponse[SleepSession]"},"PaginatedResponse_SleepSummary_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SleepSummary"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"metadata":{"$ref":"#/components/schemas/TimeseriesMetadata"}},"type":"object","required":["data","pagination","metadata"],"title":"PaginatedResponse[SleepSummary]"},"PaginatedResponse_TimeSeriesSample_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TimeSeriesSample"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"metadata":{"$ref":"#/components/schemas/TimeseriesMetadata"}},"type":"object","required":["data","pagination","metadata"],"title":"PaginatedResponse[TimeSeriesSample]"},"PaginatedResponse_WebhookMessageAttemptResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookMessageAttemptResponse"},"type":"array","title":"Data"},"done":{"type":"boolean","title":"Done","description":"True when this is the last page."},"iterator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iterator","description":"Pass as `iterator` in the next request to fetch the following page."},"prevIterator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previterator"}},"type":"object","required":["data","done"],"title":"PaginatedResponse[WebhookMessageAttemptResponse]"},"PaginatedResponse_WebhookMessageResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookMessageResponse"},"type":"array","title":"Data"},"done":{"type":"boolean","title":"Done","description":"True when this is the last page."},"iterator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iterator","description":"Pass as `iterator` in the next request to fetch the following page."},"prevIterator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previterator"}},"type":"object","required":["data","done"],"title":"PaginatedResponse[WebhookMessageResponse]"},"PaginatedResponse_Workout_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Workout"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"metadata":{"$ref":"#/components/schemas/TimeseriesMetadata"}},"type":"object","required":["data","pagination","metadata"],"title":"PaginatedResponse[Workout]"},"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"},"PasswordChange":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","minLength":8,"title":"New Password"},"confirm_password":{"type":"string","minLength":8,"title":"Confirm Password"}},"type":"object","required":["current_password","new_password","confirm_password"],"title":"PasswordChange"},"PresignedURLRequest":{"properties":{"filename":{"type":"string","maxLength":200,"title":"Filename","description":"Custom filename","default":""},"expiration_seconds":{"type":"integer","maximum":3600.0,"minimum":60.0,"title":"Expiration Seconds","description":"URL expiration time in seconds (1 min - 1 hour)","default":300},"max_file_size":{"type":"integer","maximum":1073741824.0,"minimum":1024.0,"title":"Max File Size","description":"Maximum file size in bytes (1KB - 500MB)","default":52428800}},"type":"object","title":"PresignedURLRequest"},"PresignedURLResponse":{"properties":{"upload_url":{"type":"string","title":"Upload Url"},"form_fields":{"additionalProperties":{"type":"string"},"type":"object","title":"Form Fields"},"file_key":{"type":"string","title":"File Key"},"expires_in":{"type":"integer","title":"Expires In"},"max_file_size":{"type":"integer","title":"Max File Size"},"bucket":{"type":"string","title":"Bucket"}},"type":"object","required":["upload_url","form_fields","file_key","expires_in","max_file_size","bucket"],"title":"PresignedURLResponse"},"ProviderConnectionCount":{"properties":{"provider":{"type":"string","title":"Provider"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["provider","count"],"title":"ProviderConnectionCount"},"ProviderDataCount":{"properties":{"provider":{"type":"string","title":"Provider"},"data_points":{"type":"integer","title":"Data Points"},"series_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Series Counts"},"workout_count":{"type":"integer","title":"Workout Count"},"sleep_count":{"type":"integer","title":"Sleep Count"}},"type":"object","required":["provider","data_points","series_counts","workout_count","sleep_count"],"title":"ProviderDataCount","description":"Data counts for a single provider."},"ProviderName":{"type":"string","enum":["apple","samsung","garmin","google","polar","suunto","whoop","strava","oura","fitbit","ultrahuman","sensorbio","unknown","internal"],"title":"ProviderName","description":"Supported data providers."},"ProviderPriorityBase":{"properties":{"provider":{"$ref":"#/components/schemas/ProviderName"},"priority":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Priority"}},"type":"object","required":["provider","priority"],"title":"ProviderPriorityBase"},"ProviderPriorityBulkUpdate":{"properties":{"priorities":{"items":{"$ref":"#/components/schemas/ProviderPriorityBase"},"type":"array","title":"Priorities"}},"type":"object","required":["priorities"],"title":"ProviderPriorityBulkUpdate"},"ProviderPriorityListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProviderPriorityResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ProviderPriorityListResponse"},"ProviderPriorityResponse":{"properties":{"provider":{"$ref":"#/components/schemas/ProviderName"},"priority":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Priority"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["provider","priority","id","created_at","updated_at"],"title":"ProviderPriorityResponse"},"ProviderPriorityUpdate":{"properties":{"priority":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Priority"}},"type":"object","required":["priority"],"title":"ProviderPriorityUpdate"},"ProviderSettingRead":{"properties":{"provider":{"type":"string","title":"Provider","description":"Provider identifier (e.g., 'apple', 'garmin')"},"name":{"type":"string","title":"Name","description":"Display name (e.g., 'Apple Health', 'Garmin')"},"has_cloud_api":{"type":"boolean","title":"Has Cloud Api","description":"Whether provider uses cloud OAuth API"},"is_enabled":{"type":"boolean","title":"Is Enabled","description":"Whether provider is enabled by admin"},"icon_url":{"type":"string","title":"Icon Url","description":"Relative URL to provider icon (e.g., '/static/provider-icons/garmin.svg'). Resolve against the API base URL."},"live_sync_mode":{"anyOf":[{"$ref":"#/components/schemas/LiveSyncMode"},{"type":"null"}],"description":"Current live sync mode ('pull' or 'webhook'). Null for SDK-only providers."},"live_sync_configurable":{"type":"boolean","title":"Live Sync Configurable","description":"Whether the admin can switch live_sync_mode for this provider.","default":false},"data_granularity":{"anyOf":[{"$ref":"#/components/schemas/DataGranularity"},{"type":"null"}],"description":"How finely 24/7 data is stored ('daily', 'hourly', 'raw'). Null = provider default."}},"type":"object","required":["provider","name","has_cloud_api","is_enabled","icon_url"],"title":"ProviderSettingRead","description":"Provider setting with metadata."},"ProviderSettingUpdate":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"live_sync_mode":{"anyOf":[{"$ref":"#/components/schemas/LiveSyncMode"},{"type":"null"}]},"data_granularity":{"anyOf":[{"$ref":"#/components/schemas/DataGranularity"},{"type":"null"}]}},"type":"object","title":"ProviderSettingUpdate","description":"Schema for updating a single provider setting."},"ProviderWebhookSubscription":{"properties":{},"type":"object","title":"ProviderWebhookSubscription","description":"Base class for all provider webhook subscription responses."},"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)"},"avg_spo2_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Spo2 Percent"},"recovery_score":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Recovery Score","description":"0-100 score"}},"type":"object","required":["date","source"],"title":"RecoverySummary"},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest","description":"Request to exchange refresh token for new access token."},"SDKLogRequest":{"properties":{"sdkVersion":{"type":"string","title":"Sdkversion"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"events":{"items":{"oneOf":[{"$ref":"#/components/schemas/HistoricalDataSyncStartEvent"},{"$ref":"#/components/schemas/HistoricalDataTypeSyncEndEvent"},{"$ref":"#/components/schemas/DeviceStateEvent"}],"discriminator":{"propertyName":"eventType","mapping":{"device_state":"#/components/schemas/DeviceStateEvent","historical_data_sync_start":"#/components/schemas/HistoricalDataSyncStartEvent","historical_data_type_sync_end":"#/components/schemas/HistoricalDataTypeSyncEndEvent"}}},"type":"array","maxItems":100,"minItems":1,"title":"Events"}},"type":"object","required":["sdkVersion","events"],"title":"SDKLogRequest","description":"Top-level request for SDK log events endpoint."},"SDKTokenRequest":{"properties":{"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"app_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Secret"}},"type":"object","title":"SDKTokenRequest","description":"Request schema for exchanging app credentials for user token.\n\nBoth fields are optional - if not provided, admin authentication is required."},"ScoreComponent":{"properties":{"value":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"null"}],"title":"Value","description":"Numeric score value. Range varies by provider and category — see HEALTH_SCORE_RANGES for scale."},"qualifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qualifier","description":"Textual rating from the provider, e.g. GOOD or EXCELLENT"}},"type":"object","title":"ScoreComponent","description":"A single constituent of a health score (e.g. deep sleep percentage)."},"SeedDataRequest":{"properties":{"num_users":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Num Users","default":1},"profile":{"$ref":"#/components/schemas/SeedProfileConfig","default":{"generate_workouts":true,"generate_sleep":true,"generate_time_series":true,"num_connections":2,"workout_config":{"count":80,"date_range_months":6,"duration_max_minutes":180,"duration_min_minutes":15,"hr_max_range":[140,180],"hr_min_range":[90,120],"steps_range":[500,20000]},"sleep_config":{"count":20,"date_range_months":6,"duration_max_minutes":600,"duration_min_minutes":300,"nap_chance_pct":10,"stage_distribution":{"awake_pct_range":[2,8],"deep_pct_range":[15,25],"rem_pct_range":[20,25]},"weekend_catchup":false},"time_series_config":{"date_range_months":6,"enabled_types":[],"include_blood_pressure":false}}},"random_seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Random Seed","description":"Seed for reproducible generation. None = random."}},"type":"object","title":"SeedDataRequest","description":"API request to generate seed data."},"SeedDataResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","title":"Status"},"seed_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed Used"}},"type":"object","required":["task_id","status"],"title":"SeedDataResponse","description":"API response after dispatching seed task."},"SeedPresetInfo":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"profile":{"$ref":"#/components/schemas/SeedProfileConfig"}},"type":"object","required":["id","label","description","profile"],"title":"SeedPresetInfo","description":"Preset metadata returned by the presets endpoint."},"SeedProfileConfig":{"properties":{"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"generate_workouts":{"type":"boolean","title":"Generate Workouts","default":true},"generate_sleep":{"type":"boolean","title":"Generate Sleep","default":true},"generate_time_series":{"type":"boolean","title":"Generate Time Series","default":true},"providers":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProviderName"},"type":"array"},{"type":"null"}],"title":"Providers","description":"Specific providers. None = random selection."},"num_connections":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Num Connections","default":2},"workout_config":{"$ref":"#/components/schemas/WorkoutConfig","default":{"count":80,"duration_min_minutes":15,"duration_max_minutes":180,"hr_min_range":[90,120],"hr_max_range":[140,180],"steps_range":[500,20000],"date_range_months":6}},"sleep_config":{"$ref":"#/components/schemas/SleepConfig","default":{"count":20,"duration_min_minutes":300,"duration_max_minutes":600,"nap_chance_pct":10,"weekend_catchup":false,"date_range_months":6,"stage_distribution":{"awake_pct_range":[2,8],"deep_pct_range":[15,25],"rem_pct_range":[20,25]}}},"time_series_config":{"$ref":"#/components/schemas/TimeSeriesConfig","default":{"enabled_types":[],"include_blood_pressure":false,"date_range_months":6}}},"type":"object","title":"SeedProfileConfig","description":"Complete seed data generation configuration."},"SeriesType":{"type":"string","enum":["heart_rate","resting_heart_rate","heart_rate_variability_sdnn","heart_rate_recovery_one_minute","walking_heart_rate_average","heart_rate_variability_rmssd","oxygen_saturation","blood_glucose","blood_pressure_systolic","blood_pressure_diastolic","respiratory_rate","sleeping_breathing_disturbances","breathing_disturbance_index","blood_alcohol_content","peripheral_perfusion_index","forced_vital_capacity","forced_expiratory_volume_1","peak_expiratory_flow_rate","height","weight","body_fat_percentage","body_mass_index","lean_body_mass","body_temperature","skin_temperature","skin_temperature_deviation","skin_temperature_trend_deviation","waist_circumference","body_fat_mass","skeletal_muscle_mass","vo2_max","six_minute_walk_test_distance","cardiovascular_age","steps","energy","basal_energy","stand_time","exercise_time","physical_effort","flights_climbed","average_met","active_time","distance_walking_running","distance_cycling","distance_swimming","distance_downhill_snow_sports","distance_other","walking_step_length","walking_speed","walking_double_support_percentage","walking_asymmetry_percentage","walking_steadiness","stair_descent_speed","stair_ascent_speed","running_power","running_speed","running_vertical_oscillation","running_ground_contact_time","running_stride_length","running_vertical_ratio","running_stance_time_balance","swimming_stroke_count","underwater_depth","cadence","power","speed","workout_effort_score","estimated_workout_effort_score","environmental_audio_exposure","headphone_audio_exposure","environmental_sound_reduction","time_in_daylight","water_temperature","uv_exposure","inhaler_usage","weather_temperature","weather_humidity","elevation","latitude","longitude","air_temperature","garmin_stress_level","garmin_skin_temperature","garmin_fitness_age","garmin_body_battery","electrodermal_activity","push_count","atrial_fibrillation_burden","insulin_delivery","number_of_times_fallen","number_of_alcoholic_beverages","nike_fuel","hydration"],"title":"SeriesType","description":"All supported time-series metric types."},"SleepConfig":{"properties":{"count":{"type":"integer","maximum":365.0,"minimum":0.0,"title":"Count","default":20},"duration_min_minutes":{"type":"integer","maximum":720.0,"minimum":60.0,"title":"Duration Min Minutes","default":300},"duration_max_minutes":{"type":"integer","maximum":720.0,"minimum":60.0,"title":"Duration Max Minutes","default":600},"nap_chance_pct":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Nap Chance Pct","default":10},"weekend_catchup":{"type":"boolean","title":"Weekend Catchup","description":"If True, weekday sleep is shorter and weekend sleep is longer.","default":false},"date_range_months":{"type":"integer","maximum":24.0,"minimum":1.0,"title":"Date Range Months","default":6},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From","description":"Explicit start date. Overrides date_range_months."},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To","description":"Explicit end date. Overrides date_range_months."},"stage_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage Profile","description":"Named sleep stage profile. None = use stage_distribution."},"stage_distribution":{"$ref":"#/components/schemas/SleepStageDistribution","default":{"deep_pct_range":[15,25],"rem_pct_range":[20,25],"awake_pct_range":[2,8]}}},"type":"object","title":"SleepConfig","description":"Parameters controlling sleep generation."},"SleepField":{"properties":{"code":{"type":"string","title":"Code"},"providers":{"items":{"type":"string"},"type":"array","title":"Providers"}},"type":"object","required":["code","providers"],"title":"SleepField"},"SleepSession":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"zone_offset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Offset"},"source":{"$ref":"#/components/schemas/SourceMetadata"},"duration_seconds":{"type":"integer","title":"Duration Seconds"},"sleep_duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sleep Duration Seconds"},"efficiency_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Efficiency Percent"},"stages":{"anyOf":[{"$ref":"#/components/schemas/SleepStagesSummary"},{"type":"null"}]},"sleep_stage_intervals":{"anyOf":[{"items":{"$ref":"#/components/schemas/SleepStage"},"type":"array"},{"type":"null"}],"title":"Sleep Stage Intervals"},"is_nap":{"type":"boolean","title":"Is Nap","default":false}},"type":"object","required":["id","start_time","end_time","source","duration_seconds"],"title":"SleepSession"},"SleepSessionSummary":{"properties":{"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"zone_offset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Offset","description":"UTC offset of the session, e.g. '+02:00'"},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes","description":"Session duration","example":420},"is_nap":{"type":"boolean","title":"Is Nap","description":"True if this session is a nap rather than main sleep","default":false}},"type":"object","required":["start_time","end_time"],"title":"SleepSessionSummary","description":"Lightweight per-session breakdown of a single sleep or nap within a day.\n\nFor full per-session detail (stages, intervals, source) use the sleep-sessions endpoint."},"SleepStage":{"properties":{"stage":{"$ref":"#/components/schemas/SleepStageType"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"}},"type":"object","required":["stage","start_time","end_time"],"title":"SleepStage","description":"A single continuous sleep stage interval stored inside the JSONB column."},"SleepStageDistribution":{"properties":{"deep_pct_range":{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2,"title":"Deep Pct Range","default":[15,25]},"rem_pct_range":{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2,"title":"Rem Pct Range","default":[20,25]},"awake_pct_range":{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2,"title":"Awake Pct Range","default":[2,8]}},"type":"object","title":"SleepStageDistribution","description":"Percentage ranges for each sleep stage. Light = remainder (100% - others)."},"SleepStageType":{"type":"string","enum":["in_bed","awake","sleeping","light","deep","rem","unknown"],"title":"SleepStageType"},"SleepStagesSummary":{"properties":{"awake_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Awake Minutes"},"light_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Light Minutes"},"deep_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deep Minutes"},"rem_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rem Minutes"}},"type":"object","title":"SleepStagesSummary"},"SleepSummary":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"source":{"$ref":"#/components/schemas/SourceMetadata"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start of the longest main-sleep session"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End of the longest main-sleep session"},"zone_offset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Offset","description":"UTC offset of the longest main-sleep session, e.g. '+02:00'"},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes","description":"Total sleep duration excluding naps","example":450},"total_duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Duration Minutes","description":"Total of all sleep + nap durations for the day","example":480},"time_in_bed_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time In Bed Minutes","description":"Total time in bed excluding naps","example":480},"efficiency_percent":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Efficiency Percent","example":89.5},"stages":{"anyOf":[{"$ref":"#/components/schemas/SleepStagesSummary"},{"type":"null"}]},"interruptions_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interruptions Count"},"nap_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nap Count","description":"Number of naps taken","example":1},"nap_duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nap Duration Minutes","description":"Total nap duration","example":30},"sessions":{"anyOf":[{"items":{"$ref":"#/components/schemas/SleepSessionSummary"},"type":"array"},{"type":"null"}],"title":"Sessions","description":"Per-session breakdown of all sleep and nap sessions for the day"},"avg_heart_rate_bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Heart Rate Bpm"},"avg_hrv_sdnn_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Hrv Sdnn Ms","description":"Average HRV (SDNN) during sleep"},"avg_hrv_rmssd_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Hrv Rmssd Ms","description":"Average HRV (RMSSD) during sleep"},"avg_respiratory_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Respiratory Rate"},"avg_spo2_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Spo2 Percent"}},"type":"object","required":["date","source"],"title":"SleepSummary"},"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"},"StorageEstimate":{"properties":{"live_data_bytes":{"type":"integer","title":"Live Data Bytes","description":"Data size of data_point_series table (bytes)"},"live_index_bytes":{"type":"integer","title":"Live Index Bytes","description":"Index size of data_point_series table (bytes)"},"archive_data_bytes":{"type":"integer","title":"Archive Data Bytes","description":"Data size of archive table (bytes)"},"archive_index_bytes":{"type":"integer","title":"Archive Index Bytes","description":"Index size of archive table (bytes)"},"other_tables_bytes":{"type":"integer","title":"Other Tables Bytes","description":"Total size of all other tables (bytes)"},"total_bytes":{"type":"integer","title":"Total Bytes","description":"Total storage across ALL tables"},"live_row_count":{"type":"integer","title":"Live Row Count","description":"Number of rows in live table"},"archive_row_count":{"type":"integer","title":"Archive Row Count","description":"Number of rows in archive table"},"avg_bytes_per_live_row":{"type":"number","title":"Avg Bytes Per Live Row","description":"Average bytes per live row (data+index)"},"avg_bytes_per_archive_row":{"type":"number","title":"Avg Bytes Per Archive Row","description":"Average bytes per archive row (data+index)"},"live_data_span_days":{"type":"integer","title":"Live Data Span Days","description":"Actual span of live data in days (MAX - MIN recorded_at)"},"live_total_pretty":{"type":"string","title":"Live Total Pretty","description":"Human-readable live total size (data+indexes)"},"live_data_pretty":{"type":"string","title":"Live Data Pretty","description":"Human-readable live data size"},"live_index_pretty":{"type":"string","title":"Live Index Pretty","description":"Human-readable live index size"},"archive_total_pretty":{"type":"string","title":"Archive Total Pretty","description":"Human-readable archive total size (data+indexes)"},"archive_data_pretty":{"type":"string","title":"Archive Data Pretty","description":"Human-readable archive data size"},"archive_index_pretty":{"type":"string","title":"Archive Index Pretty","description":"Human-readable archive index size"},"other_tables_pretty":{"type":"string","title":"Other Tables Pretty","description":"Human-readable other tables size"},"total_pretty":{"type":"string","title":"Total Pretty","description":"Human-readable total DB size"},"growth_class":{"type":"string","title":"Growth Class","description":"Growth complexity class: 'bounded' | 'linear_efficient' | 'linear'"}},"type":"object","required":["live_data_bytes","live_index_bytes","archive_data_bytes","archive_index_bytes","other_tables_bytes","total_bytes","live_row_count","archive_row_count","avg_bytes_per_live_row","avg_bytes_per_archive_row","live_data_span_days","live_total_pretty","live_data_pretty","live_index_pretty","archive_total_pretty","archive_data_pretty","archive_index_pretty","other_tables_pretty","total_pretty","growth_class"],"title":"StorageEstimate","description":"Storage sizes across all database tables."},"SyncDataType":{"type":"string","enum":["workouts","247","all"],"title":"SyncDataType","description":"Types of data to sync from provider."},"SyncRunSummary":{"properties":{"run_id":{"type":"string","title":"Run Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"provider":{"type":"string","title":"Provider"},"source":{"type":"string","title":"Source"},"stage":{"type":"string","title":"Stage"},"status":{"type":"string","title":"Status"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"items_processed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Items Processed"},"items_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Items Total"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"primary_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary User Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"last_update":{"type":"string","format":"date-time","title":"Last Update"}},"type":"object","required":["run_id","user_id","provider","source","stage","status","last_update"],"title":"SyncRunSummary","description":"Latest known status for a sync run, derived from the event stream."},"SyncSource":{"type":"string","enum":["pull","webhook","sdk","backfill","xml_import","linked_account"],"title":"SyncSource","description":"How the sync was initiated / what transport delivers data."},"SyncStage":{"type":"string","enum":["queued","started","fetching","processing","saving","completed","failed","cancelled"],"title":"SyncStage","description":"Coarse-grained stage label for a sync run."},"SyncStatus":{"type":"string","enum":["in_progress","success","partial","failed","cancelled","skipped"],"title":"SyncStatus","description":"Overall outcome state for the run."},"SyncStatusEvent":{"properties":{"event_id":{"type":"string","format":"uuid","title":"Event Id","description":"Unique ID for this event."},"run_id":{"type":"string","title":"Run Id","description":"Identifier shared by all events of the same sync run."},"user_id":{"type":"string","format":"uuid","title":"User Id"},"provider":{"type":"string","title":"Provider","description":"Provider slug (e.g. 'garmin', 'apple', 'whoop')."},"source":{"$ref":"#/components/schemas/SyncSource"},"stage":{"$ref":"#/components/schemas/SyncStage"},"status":{"$ref":"#/components/schemas/SyncStatus"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"progress":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Progress","description":"Optional 0..1 progress."},"items_processed":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Items Processed"},"items_total":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Items Total"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"primary_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary User Id","description":"For LINKED_ACCOUNT events: the OW user whose sync run produced this data."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["run_id","user_id","provider","source","stage","status"],"title":"SyncStatusEvent","description":"A single status update for a sync run."},"SystemInfoResponse":{"properties":{"total_users":{"$ref":"#/components/schemas/MetricCount"},"active_conn":{"$ref":"#/components/schemas/MetricCount"},"data_points":{"$ref":"#/components/schemas/DataPointsInfo"},"event_records":{"$ref":"#/components/schemas/EventRecordsInfo"},"connections_coverage":{"$ref":"#/components/schemas/ConnectionsCoverage"}},"type":"object","required":["total_users","active_conn","data_points","event_records","connections_coverage"],"title":"SystemInfoResponse","description":"Dashboard system information response."},"TestEventRequest":{"properties":{"event_type":{"type":"string","title":"Event Type","description":"Event type to include in the test payload.","default":"workout.created"}},"type":"object","title":"TestEventRequest"},"TimeRange":{"properties":{"startDate":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Startdate"},"endDate":{"type":"string","format":"date-time","title":"Enddate"}},"type":"object","required":["endDate"],"title":"TimeRange"},"TimeSeriesConfig":{"properties":{"enabled_types":{"items":{"$ref":"#/components/schemas/SeriesType"},"type":"array","title":"Enabled Types","description":"Specific series types to emit. Empty list = no continuous series emitted. Workout-bound types are never affected by this list - they follow the workout generator."},"include_blood_pressure":{"type":"boolean","title":"Include Blood Pressure","description":"Emit paired blood_pressure_systolic + blood_pressure_diastolic.","default":false},"date_range_months":{"type":"integer","maximum":24.0,"minimum":1.0,"title":"Date Range Months","default":6},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From","description":"Explicit start date. Overrides date_range_months."},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To","description":"Explicit end date. Overrides date_range_months."}},"type":"object","title":"TimeSeriesConfig","description":"Parameters controlling continuous time-series generation.\n\nContinuous time-series are emitted across the full date range independently\nfrom workouts (e.g. heart rate every 5 min, weight weekly). Workout-bound\nseries (running_power, cadence, ...) are still emitted inside workout\nwindows and are not controlled by this config."},"TimeSeriesSample":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"zone_offset":{"anyOf":[{"type":"string","maxLength":10,"pattern":"^[+-]\\d{2}:\\d{2}$"},{"type":"null"}],"title":"Zone Offset","description":"Timezone offset in the format '+01:00' or '-05:30'","examples":["+01:00","-05:30"]},"type":{"$ref":"#/components/schemas/SeriesType"},"value":{"anyOf":[{"type":"number"},{"type":"integer"}],"title":"Value"},"unit":{"type":"string","title":"Unit"},"source":{"anyOf":[{"$ref":"#/components/schemas/SourceMetadata"},{"type":"null"}]},"is_daily_total":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Daily Total"}},"type":"object","required":["timestamp","type","value","unit"],"title":"TimeSeriesSample"},"TimeseriesCategory":{"properties":{"name":{"type":"string","title":"Name"},"metrics":{"items":{"$ref":"#/components/schemas/TimeseriesMetric"},"type":"array","title":"Metrics"}},"type":"object","required":["name","metrics"],"title":"TimeseriesCategory"},"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"},"TimeseriesMetric":{"properties":{"code":{"type":"string","title":"Code"},"unit":{"type":"string","title":"Unit"},"providers":{"items":{"type":"string"},"type":"array","title":"Providers"}},"type":"object","required":["code","unit","providers"],"title":"TimeseriesMetric"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In"}},"type":"object","required":["access_token"],"title":"TokenResponse","description":"Token response with optional refresh token."},"UploadDataResponse":{"properties":{"status_code":{"type":"integer","title":"Status Code","description":"HTTP status code (typically 202 for async operations)"},"response":{"type":"string","title":"Response","description":"Human-readable response message"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"User ID associated with the import operation"},"dropped_count":{"type":"integer","title":"Dropped Count","description":"Number of individual records dropped by per-record validation","default":0},"records_saved":{"type":"integer","title":"Records Saved","description":"Time-series samples saved","default":0},"workouts_saved":{"type":"integer","title":"Workouts Saved","description":"Workouts saved","default":0},"sleep_saved":{"type":"integer","title":"Sleep Saved","description":"Sleep records saved","default":0}},"type":"object","required":["status_code","response"],"title":"UploadDataResponse","description":"Response schema for data upload/sync operations.\n\nReturned when health data is queued for asynchronous processing via Celery.\nThe actual import happens in the background - this response indicates the task was queued successfully."},"UserConnectionWithCapabilities":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"provider":{"type":"string","title":"Provider"},"provider_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider User Id"},"provider_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Username"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"id":{"type":"string","format":"uuid","title":"Id"},"status":{"$ref":"#/components/schemas/ConnectionStatus"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url","description":"Relative URL to provider icon (e.g., '/static/provider-icons/garmin.svg'). Resolve against the API base URL."},"max_historical_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Historical Days"},"rest_pull":{"type":"boolean","title":"Rest Pull","default":false},"webhook_stream":{"type":"boolean","title":"Webhook Stream","default":false},"webhook_ping":{"type":"boolean","title":"Webhook Ping","default":false},"webhook_callback":{"type":"boolean","title":"Webhook Callback","default":false},"live_sync_mode":{"anyOf":[{"$ref":"#/components/schemas/LiveSyncMode"},{"type":"null"}]},"linked_user_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Linked User Ids"}},"type":"object","required":["user_id","provider","id","status","last_synced_at","created_at","updated_at"],"title":"UserConnectionWithCapabilities","description":"UserConnectionRead enriched with provider capability metadata.\n\nExtra fields are populated by the endpoint, not from the ORM model."},"UserCreate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"external_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External User Id","description":"Deprecated: no data-fetching endpoint (timeseries, workouts, sleep, summaries, health-scores, etc.) accepts external_user_id - they all require the Open Wearables UUID. This field was added early in the project but never wired into those endpoints, so it only works as a filter on GET /users. Store the UUID returned by POST /users in your own system instead.","deprecated":true}},"type":"object","title":"UserCreate"},"UserDataSummaryResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"total_data_points":{"type":"integer","title":"Total Data Points"},"total_workouts":{"type":"integer","title":"Total Workouts"},"total_sleep_events":{"type":"integer","title":"Total Sleep Events"},"series_type_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Series Type Counts"},"workout_type_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Workout Type Counts"},"by_provider":{"items":{"$ref":"#/components/schemas/ProviderDataCount"},"type":"array","title":"By Provider"},"has_womens_health_data":{"type":"boolean","title":"Has Womens Health Data","default":false}},"type":"object","required":["user_id","total_data_points","total_workouts","total_sleep_events","series_type_counts","workout_type_counts","by_provider"],"title":"UserDataSummaryResponse","description":"Per-user data summary with counts by type and provider."},"UserInvitationCodeRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","code","user_id","expires_at","created_at"],"title":"UserInvitationCodeRead","description":"Response schema after generating an invitation code."},"UserInvitationCodeRedeem":{"properties":{"code":{"type":"string","maxLength":8,"minLength":8,"pattern":"^[A-Z2-9]{8}$","title":"Code"}},"type":"object","required":["code"],"title":"UserInvitationCodeRedeem","description":"API input for redeeming an invitation code."},"UserRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"external_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External User Id","description":"Deprecated: no data-fetching endpoint (timeseries, workouts, sleep, summaries, health-scores, etc.) accepts external_user_id - they all require the Open Wearables UUID. This field was added early in the project but never wired into those endpoints, so it only works as a filter on GET /users. Store the UUID returned by POST /users in your own system instead.","deprecated":true},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"last_synced_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Synced Provider"},"has_active_connection":{"type":"boolean","title":"Has Active Connection","default":false}},"type":"object","required":["id","created_at"],"title":"UserRead"},"UserUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"external_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External User Id","description":"Deprecated: no data-fetching endpoint (timeseries, workouts, sleep, summaries, health-scores, etc.) accepts external_user_id - they all require the Open Wearables UUID. This field was added early in the project but never wired into those endpoints, so it only works as a filter on GET /users. Store the UUID returned by POST /users in your own system instead.","deprecated":true}},"type":"object","title":"UserUpdate"},"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"},"WebhookDeletedResponse":{"properties":{"deleted":{"$ref":"#/components/schemas/WebhookOperationResult"}},"type":"object","required":["deleted"],"title":"WebhookDeletedResponse","description":"Response wrapper for a delete operation result."},"WebhookMessageAttemptResponse":{"properties":{"id":{"type":"string","title":"Id"},"endpointId":{"type":"string","title":"Endpointid"},"msgId":{"type":"string","title":"Msgid"},"url":{"type":"string","title":"Url"},"response":{"type":"string","title":"Response"},"responseStatusCode":{"type":"integer","title":"Responsestatuscode"},"responseDurationMs":{"type":"integer","title":"Responsedurationms"},"status":{"type":"integer","title":"Status"},"statusText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statustext"},"triggerType":{"type":"integer","title":"Triggertype"},"timestamp":{"type":"string","title":"Timestamp"},"msg":{"anyOf":[{"$ref":"#/components/schemas/WebhookMessageResponse"},{"type":"null"}]}},"type":"object","required":["id","endpointId","msgId","url","response","responseStatusCode","responseDurationMs","status","triggerType","timestamp"],"title":"WebhookMessageAttemptResponse","description":"A single delivery attempt for a webhook message to one endpoint."},"WebhookMessageResponse":{"properties":{"id":{"type":"string","title":"Id"},"eventType":{"type":"string","title":"Eventtype"},"eventId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eventid"},"timestamp":{"type":"string","title":"Timestamp"},"channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channels"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}},"type":"object","required":["id","eventType","timestamp"],"title":"WebhookMessageResponse","description":"A single webhook message (outgoing event emitted to all subscribed endpoints)."},"WebhookOperationResult":{"additionalProperties":true,"type":"object"},"WebhookSubscriptionResponse":{"properties":{"subscription":{"anyOf":[{"$ref":"#/components/schemas/ProviderWebhookSubscription"},{"type":"null"}]}},"type":"object","title":"WebhookSubscriptionResponse","description":"Response wrapper for fetching a single webhook subscription."},"WebhookSubscriptionStatus":{"type":"string","enum":["created","updated","patched","deleted","skipped","error"],"title":"WebhookSubscriptionStatus"},"WebhookSubscriptionsResponse":{"properties":{"subscriptions":{"items":{"$ref":"#/components/schemas/ProviderWebhookSubscription"},"type":"array","title":"Subscriptions"}},"type":"object","required":["subscriptions"],"title":"WebhookSubscriptionsResponse","description":"Response wrapper for listing webhook subscriptions (any provider)."},"WebhookUpdatedResponse":{"properties":{"updated":{"$ref":"#/components/schemas/WebhookOperationResult"}},"type":"object","required":["updated"],"title":"WebhookUpdatedResponse","description":"Response wrapper for an update operation result."},"Workout":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","title":"Type"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","example":"Morning Run"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"zone_offset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Offset"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"source":{"$ref":"#/components/schemas/SourceMetadata"},"calories_kcal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calories Kcal"},"distance_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Meters"},"avg_heart_rate_bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Heart Rate Bpm"},"max_heart_rate_bpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Heart Rate Bpm"},"avg_pace_sec_per_km":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Avg Pace Sec Per Km"},"elevation_gain_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation Gain Meters"}},"type":"object","required":["id","type","start_time","end_time","source"],"title":"Workout"},"WorkoutConfig":{"properties":{"count":{"type":"integer","maximum":500.0,"minimum":0.0,"title":"Count","default":80},"workout_types":{"anyOf":[{"items":{"$ref":"#/components/schemas/WorkoutType"},"type":"array"},{"type":"null"}],"title":"Workout Types","description":"Specific workout types to generate. None = random from all."},"duration_min_minutes":{"type":"integer","maximum":600.0,"minimum":5.0,"title":"Duration Min Minutes","default":15},"duration_max_minutes":{"type":"integer","maximum":600.0,"minimum":5.0,"title":"Duration Max Minutes","default":180},"hr_min_range":{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2,"title":"Hr Min Range","default":[90,120]},"hr_max_range":{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2,"title":"Hr Max Range","default":[140,180]},"steps_range":{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2,"title":"Steps Range","default":[500,20000]},"date_range_months":{"type":"integer","maximum":24.0,"minimum":1.0,"title":"Date Range Months","default":6},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From","description":"Explicit start date. Overrides date_range_months."},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To","description":"Explicit end date. Overrides date_range_months."}},"type":"object","title":"WorkoutConfig","description":"Parameters controlling workout generation."},"WorkoutField":{"properties":{"code":{"type":"string","title":"Code"},"providers":{"items":{"type":"string"},"type":"array","title":"Providers"}},"type":"object","required":["code","providers"],"title":"WorkoutField"},"WorkoutType":{"type":"string","enum":["running","trail_running","treadmill","walking","hiking","mountaineering","cycling","mountain_biking","indoor_cycling","cyclocross","swimming","pool_swimming","open_water_swimming","strength_training","cardio_training","fitness_equipment","elliptical","rowing_machine","stair_climbing","yoga","pilates","stretching","meditation","cross_country_skiing","alpine_skiing","backcountry_skiing","downhill_skiing","snowboarding","snowshoeing","ice_skating","snowmobiling","winter_sports","snow_sports","rowing","kayaking","canoeing","paddling","stand_up_paddleboarding","surfing","kitesurfing","windsurfing","sailing","water_polo","wakeboarding","water_skiing","boating","water_sports","soccer","basketball","football","american_football","baseball","tennis","badminton","volleyball","handball","rugby","hockey","floorball","lacrosse","cricket","squash","table_tennis","padel","pickleball","racquetball","racket_sports","boxing","martial_arts","wrestling","fencing","rock_climbing","indoor_climbing","bouldering","trail_hiking","orienteering","archery","fishing","hunting","paragliding","parkour","golf","skating","inline_skating","skateboarding","horseback_riding","gymnastics","bowling","curling","disc_sports","triathlon","multisport","motorcycling","motor_sports","dance","aerobics","group_exercise","e_biking","virtual_activity","diving","snorkeling","walking_fitness","casual_walking","transition","team_sports","para_sports","play","wheelchair","recovery","gaming","chores","lifestyle","work","operations","generic","other","sport"],"title":"WorkoutType","description":"Unified workout/activity types for Polar, Suunto, and Garmin.\n\nBased on FIT SDK sport types and common activities across platforms.\nExcludes branded/niche activities (e.g., LES MILLS classes, specific dance types)."}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/login"}}}}}}