健康数据上报 API
合作方通过 S2S 接口将健康站、可穿戴、手动录入等渠道的测量数据写入晓葆平台。 支持单条与批量上报,使用 client_request_id 实现幂等。
概述
接口路径前缀:/open/v1/health-data
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /open/v1/health-data/submit | 单条健康数据上报 |
| POST | /open/v1/health-data/submit-batch | 批量上报(最多 50 条/次) |
鉴权说明
继承开放平台 S2S 中间件:AppKey + 签名。完整算法见鉴权说明。
| Header | 类型 | 必填 | 说明 |
|---|---|---|---|
X-App-Id | string | 是 | 控制台「凭证管理」中的 App ID |
X-Timestamp | integer | 是 | Unix 秒级时间戳,有效窗口 ±5 分钟 |
X-Signature | string | 是 | 请求签名,见鉴权说明 |
Authorization | string | 否 | Bearer <JWT>。本路由挂载 jwt.optional: 携带合法 Token 时自动解析用户身份,manual 场景可省略请求体中的xiaobao_user_id |
X-Request-ID | string | 否 | 链路追踪 ID,透传至下游集成日志 |
用户识别规则
按 data_source 分支校验(跨字段规则):
| data_source | 额外必填 / 约束 |
|---|---|
station | 必须提供 device_sn;且至少一种用户识别:xiaobao_user_id / session_id / phone /station_user.user_id(或已登录 JWT) |
third_party | 必须提供 third_user_id;跳过设备 SN 与上述用户标识校验 |
plugin | 必须提供 open_user_id 或 third_user_id |
manual / wearable / home | 至少一种用户识别:xiaobao_user_id / session_id / phone /station_user.user_id(或已登录 JWT) |
单条健康数据上报
支持渠道:manual / wearable / home /station / third_party / plugin。 幂等键为 client_request_id(同应用下重复提交返回 409, 响应携带原 measurement_no)。
POST/open/v1/health-data/submit
请求体(application/json):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
data_source | string | 是 | manual / wearable / home /station / third_party / plugin |
measured_at | string | 是 | 测量时间(可解析的日期时间,建议 ISO 8601) |
original_measured_at | string | 否 | 设备原始测量时间 |
device_sn | string | 否 | 设备序列号,最长 128;station 渠道必填 |
device_model | string | 否 | 设备型号,最长 128 |
points_code | string | 否 | 健康站编码,最长 32 |
push_mode | string | 否 | realtime / batch |
client_request_id | string | 否 | 客户端幂等请求 ID,最长 64 |
third_user_id | string | 否 | 第三方用户 ID,最长 128;third_party 必填 |
open_user_id | integer | 否 | 插件场景 application_users.id,≥1 |
xiaobao_user_id | integer | 否 | 晓葆用户 ID,≥1;有 JWT 时可省略 |
session_id | string | 否 | 健康站会话 ID,最长 32 |
phone | string | 否 | 大陆 11 位手机号 |
user_family_member_id | integer | 否 | 家庭成员 ID,≥1 |
station_user | object | 否 | 健康站用户信息,见下表 |
indicators | array | 否 | 健康指标列表(平铺格式),见下表 |
raw_data | object | 否 | 设备原始数据(透传) |
report | object | 否 | 报告文件信息(透传) |
metadata | string | 否 | 第三方自定义元数据,最长 2048(不参与签名) |
station_user 对象:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
user_id | string | 否 | 健康站侧用户标识(可作为用户识别兜底) |
phone | string | 否 | 手机号 |
name | string | 否 | 姓名,最长 64 |
indicators 单项:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | 是 | 指标代码,最长 64 |
value | any | 是 | 指标值 |
unit | string | 否 | 单位,最长 32 |
请求示例:
POST /open/v1/health-data/submit
X-App-Id: 100023
X-Timestamp: 1743494400
X-Signature: ...
Content-Type: application/json
{
"data_source": "wearable",
"measured_at": "2026-07-20T10:30:00+08:00",
"device_sn": "BP20240001",
"device_model": "HOME_MULTI_BIO_MONITOR",
"xiaobao_user_id": 10086,
"client_request_id": "partner-req-20260720-001",
"indicators": [
{ "code": "systolic_pressure", "value": 128, "unit": "mmHg" },
{ "code": "diastolic_pressure", "value": 82, "unit": "mmHg" }
]
}成功响应(201 Created):
{
"success": true,
"code": 0,
"message": "健康数据上报成功",
"data": {
"measurement_no": "WD-20260720103000-A1B2C3",
"validation_status": "valid",
"claim_status": "claimed"
},
"timestamp": "2026-07-20T10:30:01+08:00"
}data 字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
measurement_no | string | 测量唯一编号 |
validation_status | string | 设备验证状态:valid / invalid_device /invalid_station / points_code_mismatch。third_party 场景不返回此字段 |
claim_status | string | 用户认领状态:claimed / auto_created /pending。third_party 场景不返回此字段 |
manual / wearable / home /third_party / plugin 跳过设备注册校验,validation_status 固定为 valid(third_party 不返回该字段)。 仅 station 渠道做设备与健康站校验。批量健康数据上报
最多 50 条/次。每条独立处理,单条失败不影响其他条目。 条目字段与单条上报相同(嵌套在 measurements[] 内)。
POST/open/v1/health-data/submit-batch
请求体(application/json):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
measurements | array | 是 | 测量条目列表,长度 1–50;单项字段同单条上报请求体 |
请求示例:
POST /open/v1/health-data/submit-batch
X-App-Id: 100023
X-Timestamp: 1743494400
X-Signature: ...
Content-Type: application/json
{
"measurements": [
{
"data_source": "wearable",
"measured_at": "2026-07-20T10:30:00+08:00",
"xiaobao_user_id": 10086,
"client_request_id": "batch-001",
"indicators": [
{ "code": "heart_rate", "value": 72, "unit": "bpm" }
]
},
{
"data_source": "wearable",
"measured_at": "2026-07-20T10:35:00+08:00",
"xiaobao_user_id": 10086,
"client_request_id": "batch-002",
"indicators": [
{ "code": "spo2", "value": 98, "unit": "%" }
]
}
]
}成功响应(201 Created):
{
"success": true,
"code": 0,
"message": "批量上报完成",
"data": {
"total": 2,
"success_count": 2,
"failure_count": 0,
"results": [
{
"index": 0,
"success": true,
"measurement_no": "WD-20260720103000-A1B2C3",
"validation_status": "valid",
"measured_at": "2026-07-20T10:30:00+08:00"
},
{
"index": 1,
"success": true,
"measurement_no": "WD-20260720103500-D4E5F6",
"validation_status": "valid",
"measured_at": "2026-07-20T10:35:00+08:00"
}
]
},
"timestamp": "2026-07-20T10:35:01+08:00"
}results 失败项示例:
{
"index": 1,
"success": false,
"error": "错误描述",
"measured_at": "2026-07-20T10:35:00+08:00"
}错误码
| code | HTTP 状态 | 说明 | 处理建议 |
|---|---|---|---|
DUPLICATE_REQUEST | 409 | 相同 client_request_id 已处理过 | 视为成功,使用响应中的原 measurement_no |
VALIDATION_ERROR | 422 | 字段校验失败(含跨字段规则) | 查看 errors 中的字段与描述 |
HTTP_401 | 401 | 签名校验失败或应用不存在 | 检查签名算法与时间戳 |
HTTP_429 | 429 | 请求频率超限 | 降速并指数退避重试 |