{"openapi":"3.1.0","info":{"title":"HealthGather API","description":"HealthGather — 把 Apple 健康 (HealthKit) 数据同步到自有服务器。\n\n所有 `/v1/health/*`、`/v2/health/*` 接口需要 API key (`Authorization: Bearer hg_...`)：\n- 只读 key (scope=read)：可查询/对账/读 V2。\n- 读写 key (scope=read_write)：可上传 + 查询/对账/读（iOS 同步 App 使用）。\nkey 可由服务端 CLI 或登录后的 App 创建，只存哈希；各用户数据按 user_id 隔离。 可读文档: /api-docs 。","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api-docs":{"get":{"summary":"Api Docs","operationId":"api_docs_api_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin":{"get":{"summary":"Admin Console","operationId":"admin_console_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/v2/health/catalog":{"get":{"tags":["health"],"summary":"可用指标目录（覆盖范围与新鲜度）","operationId":"get_catalog_v2_health_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v2/health/capabilities":{"get":{"tags":["health"],"summary":"能力目录：全部已知 metric 与 planned/deferred 能力","description":"能力目录（扩展包设计 §12 / §2.3）。\n\n枚举全部已知 metric_type（quantity registry + typed-content registry），并对\nHealthKit 未直接暴露或本阶段未实现的能力**显式**返回状态——绝不返回 null 让调用方\n误以为「只是暂时没数据」。ECG 首期标记为 `planned`（复杂序列，§9.4 deferred）。","operationId":"get_capabilities_v2_health_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilitiesResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v2/health/records":{"get":{"tags":["health"],"summary":"原始记录游标查询","description":"原始记录游标查询（设计 §8.3 / §14.1）。\n\n`metric_type` 可选：提供时按指标过滤；不提供则返回全部形态。真正未知的\nmetric_type（既不在 quantity registry 也不在 typed-content registry，如 body_mass）\n→ 422；合法非 quantity 指标（sleep_stage / workout）放行。稳定排序 (start_at, id)；\nopaque cursor；默认不返回 tombstone。category/workout 行携带 content_schema + content。\n\n生殖健康 recorded facts 受独立 capability `health.reproductive.read` 控制（reproductive\npack）：请求具体生殖指标或全量查询都需具备该 capability，否则 403（按指标）或在未过滤\n查询中排除生殖记录（数据最小化，不混入普通活动数据）。","operationId":"list_records_v2_health_records_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"metric_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Type"}},{"name":"record_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Type"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":500,"title":"Limit"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/health/summary/hourly":{"get":{"tags":["health"],"summary":"按小时汇总","operationId":"handler_v2_health_summary_hourly_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"metrics","in":"query","required":true,"schema":{"type":"string","title":"Metrics"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"To"}},{"name":"timezone","in":"query","required":false,"schema":{"type":"string","default":"UTC","title":"Timezone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/health/summary/daily":{"get":{"tags":["health"],"summary":"按日汇总","operationId":"handler_v2_health_summary_daily_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"metrics","in":"query","required":true,"schema":{"type":"string","title":"Metrics"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"To"}},{"name":"timezone","in":"query","required":false,"schema":{"type":"string","default":"UTC","title":"Timezone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/register":{"post":{"tags":["account"],"summary":"Register","operationId":"register_v1_account_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/login":{"post":{"tags":["account"],"summary":"Login","operationId":"login_v1_account_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/me":{"get":{"tags":["account"],"summary":"Me","operationId":"me_v1_account_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfile"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["account"],"summary":"Delete Account","description":"Permanently delete the account and all owned data.\n\nHard-deletes health data, derived sleep/workout children, API keys,\nsessions and owned invitation links in a single transaction, scoped strictly\nto the authenticated user. No email or health values are retained: only a\nstructured operational log (user UUID + per-table counts + timestamp) is\nemitted after the commit succeeds.","operationId":"delete_account_v1_account_me_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/account/keys":{"get":{"tags":["account"],"summary":"List Keys","operationId":"list_keys_v1_account_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/KeyRecord"},"type":"array","title":"Response List Keys V1 Account Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["account"],"summary":"Create Read Key","operationId":"create_read_key_v1_account_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedKey"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/account/device-key":{"post":{"tags":["account"],"summary":"Create Device Key","operationId":"create_device_key_v1_account_device_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedKey"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/account/keys/{key_id}":{"delete":{"tags":["account"],"summary":"Revoke Key","operationId":"revoke_key_v1_account_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/logout":{"post":{"tags":["account"],"summary":"Logout","description":"Revoke the presented account session server-side. Idempotent.","operationId":"logout_v1_account_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/users":{"get":{"tags":["admin"],"summary":"Users","operationId":"users_v1_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserList"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"User Detail","operationId":"user_detail_v1_admin_users__user_id__get","security":[{"HTTPBearer":[]}],"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/UserUsageDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/invitations":{"get":{"tags":["admin"],"summary":"Invitations","operationId":"invitations_v1_admin_invitations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/InviteRecord"},"type":"array","title":"Response Invitations V1 Admin Invitations Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["admin"],"summary":"Create Invitation","operationId":"create_invitation_v1_admin_invitations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedInvite"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/invitations/{invitation_id}":{"delete":{"tags":["admin"],"summary":"Revoke Invitation","operationId":"revoke_invitation_v1_admin_invitations__invitation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"tags":["meta"],"summary":"健康检查","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Healthz Healthz Get"}}}}}}},"/v1/health/status":{"get":{"tags":["health"],"summary":"测试连接与 key 权限","operationId":"get_status_v1_health_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/health/events":{"post":{"tags":["health"],"summary":"批量上传血糖记录（幂等）","description":"V1 上传：upsert 进统一表 `health_records`。整批一个事务——任意 DB 异常\n整批回滚并返回非 2xx（500），不返回陈旧计数。V1 路径不做 registry/unit\n校验，保持旧客户端兼容。","operationId":"upload_events_v1_health_events_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["health"],"summary":"查询血糖记录","description":"从统一表读取（含 V2 后台写入），仅返回未删除（非 tombstone）记录。","operationId":"list_events_v1_health_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"metric_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Type"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventOut"},"title":"Response List Events V1 Health Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/health/reconcile":{"get":{"tags":["health"],"summary":"按日对账（记录 ID 清单）","description":"从统一表对账（含 V2 后台写入），按 UTC 日。tombstone 不计入。","operationId":"reconcile_v1_health_reconcile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconcileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/health/changes":{"post":{"tags":["health"],"summary":"批量上传健康变更（幂等 upsert + delete tombstone）","description":"整批一个事务：2xx ⇔ 整批已持久化 ⇔ 可安全重放推进 anchor。\n\n逐行 SELECT 后 INSERT/UPDATE/粘性跳过/tombstone。唯一约束兜底并发同键——\n任何无法安全幂等处理的 DB 异常都整批回滚并返回非 2xx（500），客户端据此\n保留旧 anchor 整批重试（重试时行已存在，幂等）。typed content 校验失败\n→ 422（同样整批回滚）。\n\n写入前校验（设计 §7.1/§8.1）按 record_type 分派：\n  - 通用（所有形态）：end_at >= start_at、字符串/JSON 大小上限；\n  - quantity 专属：metric registry / canonical unit / 有限 value_numeric；\n  - category/workout：由 _apply_upsert 内 validate_typed_content 按 schema 严校验。\nsleep_stage 变更（upsert/delete）在提交前触发受影响时间窗的 dirty 重算（§8），\n派生 session 与原始记录同事务落库。","operationId":"post_changes_v2_health_changes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeBatch"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v2/health/sleep/sessions":{"get":{"tags":["health"],"summary":"睡眠会话","description":"派生睡眠会话（设计 §14.2）。按 start_at 过滤；默认返回 main sleep 和 nap。","operationId":"list_sleep_sessions_v2_health_sleep_sessions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"session_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"main_sleep|nap|alternative","title":"Session Type"},"description":"main_sleep|nap|alternative"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SleepSessionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/health/sleep/summary/daily":{"get":{"tags":["health"],"summary":"睡眠日摘要","description":"睡眠日摘要（设计 §14.3）。timezone 必填（§4.3：睡眠日不是 UTC 日）。","operationId":"sleep_daily_summary_v2_health_sleep_summary_daily_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"timezone","in":"query","required":true,"schema":{"type":"string","description":"统计时区（IANA），用于划分 sleep-day","title":"Timezone"},"description":"统计时区（IANA），用于划分 sleep-day"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SleepDailySummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/health/workouts":{"get":{"tags":["health"],"summary":"运动列表","description":"运动列表（设计 §14.4）。cursor 分页：按 (start_at, id) 升序。tombstone 不可见。","operationId":"list_workouts_v2_health_workouts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"activity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activity Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkoutListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/health/workouts/{record_id}":{"get":{"tags":["health"],"summary":"运动详情","description":"运动详情（设计 §14.5）。按服务端 record ID 取，受 user scope 限制。\ntombstone 不可见。include 默认全部展开。","operationId":"workout_detail_v2_health_workouts__record_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"record_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Record Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"逗号分隔：activities,events,statistics","title":"Include"},"description":"逗号分隔：activities,events,statistics"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkoutDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminUserList":{"properties":{"users":{"items":{"$ref":"#/components/schemas/UserUsage"},"type":"array","title":"Users"},"total_users":{"type":"integer","title":"Total Users"},"total_records":{"type":"integer","title":"Total Records"},"total_estimated_bytes":{"type":"integer","title":"Total Estimated Bytes"},"estimate_kind":{"type":"string","title":"Estimate Kind","default":"logical_payload"},"estimate_note":{"type":"string","title":"Estimate Note","default":"Serialized column-size estimate; excludes database indexes, page overhead, WAL and backups."}},"type":"object","required":["users","total_users","total_records","total_estimated_bytes"],"title":"AdminUserList"},"CapabilitiesResponse":{"properties":{"schema_version":{"type":"integer","title":"Schema Version","default":1},"capabilities":{"items":{"$ref":"#/components/schemas/CapabilityRecord"},"type":"array","title":"Capabilities"}},"type":"object","required":["capabilities"],"title":"CapabilitiesResponse"},"CapabilityRecord":{"properties":{"metric_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Type"},"record_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Type"},"status":{"anyOf":[{"type":"string","enum":["available","planned"]},{"type":"null"}],"title":"Status"},"canonical_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Unit"},"content_schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Schema"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"capability":{"anyOf":[{"type":"string","enum":["exposed","not_exposed_by_healthkit","deferred","not_supported"]},{"type":"null"}],"title":"Capability"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"CapabilityRecord","description":"能力目录单项（扩展包设计 §12）。覆盖所有已知 metric_type，并显式标记\nHealthKit 未直接暴露或本阶段未实现的派生/复杂能力（如 ECG = planned），\n避免返回 null 让调用方误以为「只是暂时没数据」（§2.3）。"},"CatalogMetric":{"properties":{"metric_type":{"type":"string","title":"Metric Type"},"record_type":{"type":"string","title":"Record Type"},"aggregation_style":{"type":"string","title":"Aggregation Style"},"canonical_unit":{"type":"string","title":"Canonical Unit"},"summary_policy":{"type":"string","title":"Summary Policy"},"sync_state":{"type":"string","enum":["never_synced","no_data","available"],"title":"Sync State"},"available_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Available From"},"available_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Available To"},"last_received_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Received At"},"record_count":{"type":"integer","title":"Record Count","default":0}},"type":"object","required":["metric_type","record_type","aggregation_style","canonical_unit","summary_policy","sync_state"],"title":"CatalogMetric"},"CatalogResponse":{"properties":{"schema_version":{"type":"integer","title":"Schema Version","default":1},"metrics":{"items":{"$ref":"#/components/schemas/CatalogMetric"},"type":"array","title":"Metrics"}},"type":"object","required":["metrics"],"title":"CatalogResponse"},"Change":{"properties":{"operation":{"type":"string","enum":["upsert","delete"],"title":"Operation"},"record":{"anyOf":[{"$ref":"#/components/schemas/UpsertRecord"},{"type":"null"}]},"provider_record_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Record Id"},"record_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Type"},"metric_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Type"}},"type":"object","required":["operation"],"title":"Change","description":"单条变更。upsert 必须带 `record`；delete 带扁平的定位字段。\n\ndelete 携带 `record_type`/`metric_type` 是因为 anchored query 按类型发起，\n类型在客户端已知（`HKDeletedObject` 只给 UUID）。"},"ChangeBatch":{"properties":{"source":{"type":"string","title":"Source","default":"apple_health"},"installation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Id"},"sent_at":{"type":"string","format":"date-time","title":"Sent At"},"changes":{"items":{"$ref":"#/components/schemas/Change"},"type":"array","maxItems":5000,"title":"Changes"}},"type":"object","required":["sent_at"],"title":"ChangeBatch"},"ChangeResult":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"upserted":{"type":"integer","title":"Upserted"},"deleted":{"type":"integer","title":"Deleted"},"failed":{"items":{"type":"object"},"type":"array","title":"Failed"}},"type":"object","required":["accepted","upserted","deleted"],"title":"ChangeResult"},"CreatedInvite":{"properties":{"invitation":{"$ref":"#/components/schemas/InviteRecord"},"code":{"type":"string","title":"Code"}},"type":"object","required":["invitation","code"],"title":"CreatedInvite"},"CreatedKey":{"properties":{"key":{"$ref":"#/components/schemas/KeyRecord"},"secret":{"type":"string","title":"Secret"}},"type":"object","required":["key","secret"],"title":"CreatedKey"},"Credentials":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","maxLength":256,"minLength":10,"title":"Password"}},"additionalProperties":false,"type":"object","required":["email","password"],"title":"Credentials"},"DeviceKeyCreateRequest":{"properties":{"label":{"type":"string","maxLength":255,"minLength":1,"title":"Label","default":"HealthGather iOS"}},"additionalProperties":false,"type":"object","title":"DeviceKeyCreateRequest"},"EventIn":{"properties":{"provider_record_id":{"type":"string","title":"Provider Record Id"},"metric_type":{"type":"string","pattern":"^blood_glucose$","title":"Metric Type"},"observed_at":{"type":"string","format":"date-time","title":"Observed At"},"value_raw":{"type":"number","title":"Value Raw"},"unit_raw":{"type":"string","title":"Unit Raw"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","required":["provider_record_id","metric_type","observed_at","value_raw","unit_raw"],"title":"EventIn"},"EventOut":{"properties":{"provider_record_id":{"type":"string","title":"Provider Record Id"},"metric_type":{"type":"string","title":"Metric Type"},"observed_at":{"type":"string","format":"date-time","title":"Observed At"},"value_raw":{"type":"number","title":"Value Raw"},"unit_raw":{"type":"string","title":"Unit Raw"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"received_at":{"type":"string","format":"date-time","title":"Received At"}},"type":"object","required":["provider_record_id","metric_type","observed_at","value_raw","unit_raw","source","received_at"],"title":"EventOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteCreateRequest":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"expires_in_days":{"type":"integer","title":"Expires In Days","default":7}},"type":"object","title":"InviteCreateRequest"},"InviteRecord":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"used_by_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Used By User Id"}},"type":"object","required":["id","label","created_at","expires_at","used_at","revoked_at","used_by_user_id"],"title":"InviteRecord"},"KeyCreateRequest":{"properties":{"label":{"type":"string","maxLength":255,"minLength":1,"title":"Label","default":"Agent read key"}},"additionalProperties":false,"type":"object","title":"KeyCreateRequest"},"KeyRecord":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"scope":{"type":"string","enum":["read","read_write"],"title":"Scope"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","label","scope","capabilities","created_at","revoked_at"],"title":"KeyRecord"},"ReconcileResponse":{"properties":{"date":{"type":"string","title":"Date"},"ids":{"items":{"type":"string"},"type":"array","title":"Ids"}},"type":"object","required":["date","ids"],"title":"ReconcileResponse"},"RecordOut":{"properties":{"id":{"type":"string","title":"Id"},"record_type":{"type":"string","title":"Record Type"},"metric_type":{"type":"string","title":"Metric Type"},"provider_record_id":{"type":"string","title":"Provider Record Id"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"type":"string","format":"date-time","title":"End At"},"value_numeric":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Numeric"},"value_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Text"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"source_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Bundle Id"},"device":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Device"},"metadata":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Metadata"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"content_schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Schema"},"content":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Content"}},"type":"object","required":["id","record_type","metric_type","provider_record_id","start_at","end_at"],"title":"RecordOut","description":"原始记录外壳（quantity/category/workout 通用）。\n\nquantity 行携带 value_*/unit/source/device/metadata；category/workout 行\n额外携带 `content_schema` + `content`（来自 payload）。`id` 为服务端 record ID。"},"RecordsResponse":{"properties":{"metric_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Type"},"records":{"items":{"$ref":"#/components/schemas/RecordOut"},"type":"array","title":"Records"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["records"],"title":"RecordsResponse"},"RegisterRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","maxLength":256,"minLength":10,"title":"Password"},"display_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Display Name"},"invite_code":{"type":"string","maxLength":128,"minLength":8,"title":"Invite Code"}},"additionalProperties":false,"type":"object","required":["email","password","invite_code"],"title":"RegisterRequest"},"SessionResponse":{"properties":{"session_token":{"type":"string","title":"Session Token"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["session_token","expires_at","user_id","email","display_name"],"title":"SessionResponse"},"SleepDailySummary":{"properties":{"sleep_day":{"type":"string","format":"date","title":"Sleep Day"},"main_sleep":{"anyOf":[{"$ref":"#/components/schemas/SleepSessionOut"},{"type":"null"}]},"naps":{"items":{"$ref":"#/components/schemas/SleepSessionOut"},"type":"array","title":"Naps"},"alternatives":{"items":{"$ref":"#/components/schemas/SleepSessionOut"},"type":"array","title":"Alternatives"},"totals":{"$ref":"#/components/schemas/SleepDailyTotals"},"coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"algorithm_version":{"type":"string","title":"Algorithm Version"},"data_freshness":{"type":"string","format":"date-time","title":"Data Freshness"}},"type":"object","required":["sleep_day","totals","algorithm_version","data_freshness"],"title":"SleepDailySummary"},"SleepDailySummaryResponse":{"properties":{"timezone":{"type":"string","title":"Timezone"},"days":{"items":{"$ref":"#/components/schemas/SleepDailySummary"},"type":"array","title":"Days"}},"type":"object","required":["timezone","days"],"title":"SleepDailySummaryResponse"},"SleepDailyTotals":{"properties":{"total_asleep_seconds":{"type":"number","title":"Total Asleep Seconds","default":0.0},"in_bed_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"In Bed Seconds"},"core_seconds":{"type":"number","title":"Core Seconds","default":0.0},"deep_seconds":{"type":"number","title":"Deep Seconds","default":0.0},"rem_seconds":{"type":"number","title":"Rem Seconds","default":0.0},"unspecified_seconds":{"type":"number","title":"Unspecified Seconds","default":0.0}},"type":"object","title":"SleepDailyTotals"},"SleepSessionOut":{"properties":{"session_id":{"type":"string","format":"uuid","title":"Session Id"},"source_set_id":{"type":"string","title":"Source Set Id"},"primary_source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Source Name"},"primary_source_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Source Bundle Id"},"session_type":{"type":"string","title":"Session Type"},"sleep_day":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Sleep Day"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"type":"string","format":"date-time","title":"End At"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"total_asleep_seconds":{"type":"number","title":"Total Asleep Seconds"},"awake_seconds":{"type":"number","title":"Awake Seconds","default":0.0},"core_seconds":{"type":"number","title":"Core Seconds","default":0.0},"deep_seconds":{"type":"number","title":"Deep Seconds","default":0.0},"rem_seconds":{"type":"number","title":"Rem Seconds","default":0.0},"unspecified_seconds":{"type":"number","title":"Unspecified Seconds","default":0.0},"in_bed_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"In Bed Seconds"},"in_bed_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In Bed Source"},"sleep_latency_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sleep Latency Seconds"},"sleep_efficiency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sleep Efficiency"},"awakening_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Awakening Count"},"stage_coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stage Coverage"},"timeline_coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timeline Coverage"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"algorithm_version":{"type":"string","title":"Algorithm Version"},"computed_at":{"type":"string","format":"date-time","title":"Computed At"}},"type":"object","required":["session_id","source_set_id","session_type","start_at","end_at","total_asleep_seconds","algorithm_version","computed_at"],"title":"SleepSessionOut"},"SleepSessionsResponse":{"properties":{"timezone":{"type":"string","title":"Timezone"},"sessions":{"items":{"$ref":"#/components/schemas/SleepSessionOut"},"type":"array","title":"Sessions"}},"type":"object","required":["timezone","sessions"],"title":"SleepSessionsResponse"},"StatusResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"},"user_id":{"type":"string","title":"User Id"},"scope":{"type":"string","title":"Scope"}},"type":"object","required":["ok","user_id","scope"],"title":"StatusResponse"},"SummaryBucket":{"properties":{"bucket_start":{"type":"string","format":"date-time","title":"Bucket Start"},"bucket_end":{"type":"string","format":"date-time","title":"Bucket End"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max"},"avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg"},"median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median"},"latest":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latest"},"sample_count":{"type":"integer","title":"Sample Count","default":0},"coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage"},"estimated":{"type":"boolean","title":"Estimated","default":false},"completeness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completeness"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["bucket_start","bucket_end"],"title":"SummaryBucket"},"SummaryMetricResult":{"properties":{"metric_type":{"type":"string","title":"Metric Type"},"unit":{"type":"string","title":"Unit"},"aggregation_style":{"type":"string","title":"Aggregation Style"},"summary_policy":{"type":"string","title":"Summary Policy"},"algorithm_version":{"type":"string","title":"Algorithm Version"},"source_policy":{"type":"string","title":"Source Policy"},"data_freshness_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Data Freshness Seconds"},"buckets":{"items":{"$ref":"#/components/schemas/SummaryBucket"},"type":"array","title":"Buckets"}},"type":"object","required":["metric_type","unit","aggregation_style","summary_policy","algorithm_version","source_policy","buckets"],"title":"SummaryMetricResult"},"SummaryResponse":{"properties":{"timezone":{"type":"string","title":"Timezone"},"granularity":{"type":"string","title":"Granularity"},"metrics":{"items":{"$ref":"#/components/schemas/SummaryMetricResult"},"type":"array","title":"Metrics"}},"type":"object","required":["timezone","granularity","metrics"],"title":"SummaryResponse"},"UploadBody":{"properties":{"sent_at":{"type":"string","format":"date-time","title":"Sent At"},"events":{"items":{"$ref":"#/components/schemas/EventIn"},"type":"array","maxItems":5000,"title":"Events"}},"type":"object","required":["sent_at"],"title":"UploadBody"},"UploadResult":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"inserted":{"type":"integer","title":"Inserted"},"deduplicated":{"type":"integer","title":"Deduplicated"},"confirmed":{"items":{"type":"string"},"type":"array","title":"Confirmed"}},"type":"object","required":["accepted","inserted","deduplicated","confirmed"],"title":"UploadResult"},"UpsertRecord":{"properties":{"provider_record_id":{"type":"string","title":"Provider Record Id"},"record_type":{"type":"string","title":"Record Type"},"metric_type":{"type":"string","title":"Metric Type"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"type":"string","format":"date-time","title":"End At"},"value_numeric":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Numeric"},"value_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Text"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"source_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Bundle Id"},"device":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Device"},"metadata":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Metadata"},"payload":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Payload"},"content_schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Schema"},"content":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Content"}},"type":"object","required":["provider_record_id","record_type","metric_type","start_at","end_at"],"title":"UpsertRecord","description":"`operation: upsert` 携带的类型化记录外壳。点测令 start_at == end_at。\n\n`content_schema` + `content` 携带判别联合的 typed content（设计 §3.3）：\n已注册 (record_type, metric_type) 组合必须携带受支持版本；未注册组合\n（quantity 等）禁止携带。服务端按 schema 严格校验，不接受无限制任意 JSON。"},"UsageBreakdown":{"properties":{"name":{"type":"string","title":"Name"},"record_count":{"type":"integer","title":"Record Count"},"estimated_bytes":{"type":"integer","title":"Estimated Bytes"}},"type":"object","required":["name","record_count","estimated_bytes"],"title":"UsageBreakdown"},"UserProfile":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["user_id","email","display_name"],"title":"UserProfile"},"UserUsage":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_admin":{"type":"boolean","title":"Is Admin"},"record_count":{"type":"integer","title":"Record Count"},"estimated_bytes":{"type":"integer","title":"Estimated Bytes"},"active_key_count":{"type":"integer","title":"Active Key Count"},"revoked_key_count":{"type":"integer","title":"Revoked Key Count"},"last_data_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Data At"}},"type":"object","required":["user_id","email","display_name","created_at","is_admin","record_count","estimated_bytes","active_key_count","revoked_key_count","last_data_at"],"title":"UserUsage"},"UserUsageDetail":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_admin":{"type":"boolean","title":"Is Admin"},"record_count":{"type":"integer","title":"Record Count"},"estimated_bytes":{"type":"integer","title":"Estimated Bytes"},"active_key_count":{"type":"integer","title":"Active Key Count"},"revoked_key_count":{"type":"integer","title":"Revoked Key Count"},"last_data_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Data At"},"by_metric":{"items":{"$ref":"#/components/schemas/UsageBreakdown"},"type":"array","title":"By Metric"},"by_table":{"items":{"$ref":"#/components/schemas/UsageBreakdown"},"type":"array","title":"By Table"}},"type":"object","required":["user_id","email","display_name","created_at","is_admin","record_count","estimated_bytes","active_key_count","revoked_key_count","last_data_at","by_metric","by_table"],"title":"UserUsageDetail"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkoutActivityOut":{"properties":{"provider_activity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Activity Id"},"activity_type":{"type":"string","title":"Activity Type"},"raw_activity_type":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Raw Activity Type"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"type":"string","format":"date-time","title":"End At"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"sequence":{"type":"integer","title":"Sequence"},"metadata":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Metadata"},"swimming_location_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Swimming Location Type"},"swimming_location_type_raw":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Swimming Location Type Raw"},"lap_length_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lap Length Value"},"lap_length_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lap Length Unit"}},"type":"object","required":["activity_type","start_at","end_at","sequence"],"title":"WorkoutActivityOut"},"WorkoutDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"provider_record_id":{"type":"string","title":"Provider Record Id"},"metric_type":{"type":"string","title":"Metric Type"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"type":"string","format":"date-time","title":"End At"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"source_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Bundle Id"},"activity_type":{"type":"string","title":"Activity Type"},"raw_activity_type":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Raw Activity Type"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"indoor":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Indoor"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"activities":{"items":{"$ref":"#/components/schemas/WorkoutActivityOut"},"type":"array","title":"Activities"},"events":{"items":{"$ref":"#/components/schemas/WorkoutEventOut"},"type":"array","title":"Events"},"statistics":{"items":{"$ref":"#/components/schemas/WorkoutStatisticOut"},"type":"array","title":"Statistics"}},"type":"object","required":["id","provider_record_id","metric_type","start_at","end_at","activity_type"],"title":"WorkoutDetailResponse"},"WorkoutEventOut":{"properties":{"event_type":{"type":"string","title":"Event Type"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End At"},"sequence":{"type":"integer","title":"Sequence"},"metadata":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["event_type","start_at","sequence"],"title":"WorkoutEventOut"},"WorkoutListItem":{"properties":{"id":{"type":"string","title":"Id"},"provider_record_id":{"type":"string","title":"Provider Record Id"},"metric_type":{"type":"string","title":"Metric Type"},"start_at":{"type":"string","format":"date-time","title":"Start At"},"end_at":{"type":"string","format":"date-time","title":"End At"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"source_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Bundle Id"},"activity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activity Type"},"raw_activity_type":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Raw Activity Type"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"indoor":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Indoor"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"}},"type":"object","required":["id","provider_record_id","metric_type","start_at","end_at"],"title":"WorkoutListItem","description":"列表只返回主摘要，不默认展开 events/statistics（设计 §14.4）。"},"WorkoutListResponse":{"properties":{"workouts":{"items":{"$ref":"#/components/schemas/WorkoutListItem"},"type":"array","title":"Workouts"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["workouts"],"title":"WorkoutListResponse"},"WorkoutStatisticOut":{"properties":{"activity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activity Id"},"metric_type":{"type":"string","title":"Metric Type"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"sum_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sum Value"},"average_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Value"},"minimum_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimum Value"},"maximum_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Maximum Value"},"most_recent_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Most Recent Value"},"most_recent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Most Recent At"},"source":{"type":"string","title":"Source"}},"type":"object","required":["metric_type","source"],"title":"WorkoutStatisticOut"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"health","description":"健康数据的查询、上传、按日对账与 V2 同步/读 API"},{"name":"meta","description":"健康检查与文档"}]}