curl 示例前,先选择 Cloud 区域。需要认证的调用必须使用与密钥同一区域的地址。下方示例都使用 MIROBODY_API_BASE:
Mirobody 负责存储源数据、标准化结构化读数,并将二者提供给 AI 使用;数据如何采集、是否预处理,由你自行决定。
user 字段是租户隔离键。 后端把 (你的账户, user) 映射为内部的数据主体(Subject),Subject 之间完全隔离:为每个终端用户传入其稳定 id,任何用户都看不到别人的数据。省略时回落到你账户的默认 Subject。Subject 对 Mirobody 网页应用和其他开发者均不可见。该值在映射前会被归一化(去首尾空白 + 转小写),Alice 与 alice 解析为同一个 Subject。请传入稳定、规范的 id。写入记录
standardized 统计写入途中成功解析到 LOINC 编码的记录数:
每次写入都会做标准化,而不只是存储。 每条记录的值和单位会解析成 UCUM,指标名称会匹配到一个 LOINC 编码,绝不猜码,因此低置信度的匹配只会保留为未编码。见标准化机制。想在不写入的情况下看到结果,请用
POST /v1/standardize 的 store=false。Episode 型(睡眠、运动)
Episode 型记录跨越一个时段而非时间点,起点放time,终点放可选的 end_time:
读取记录
响应为 OpenAI 风格的列表,最新在前。
value 是原样写入的值(如 "97"),单位单独放在 parsed_unit 中,与其它机读字段一同返回:
擦除记录
DELETE /v1/subjects/{user},见合规。
设备与可穿戴数据
结构化记录最主要的形式就是设备与可穿戴数据。当你的厂商接入(Terra、Junction 或你自己 对接的厂商 API)已经把样本送进你的后端之后,写入做法如下。Mirobody 不托管设备 OAuth —— 没有 Terra 那样的连接组件。厂商授权页、token 刷新与
webhook 管道都留在你的产品里,因为每家厂商的流程都不一样,这部分属于你自己的产品体验。
数据到达之后的一切(存储、标准化、留存、删除、AI)才是 Mirobody 的职责。
1
接收
你的厂商接入以 webhook 推送或定时拉取的方式送来样本。
2
聚合到日级(建议)
高频序列在写入前先归并为每天一条。episode 型记录保留它自己的时段。
3
用 POST /v1/data 写入
单次请求最多 500 条,必须带
retention —— 契约见上文。该聚合到什么粒度
POST /v1/data 接受任意粒度,但对多数产品来说,每个有意义的读数一行就够了:写入量更小,
序列也更容易解读。
- 日累计(步数、卡路里、距离):每天一条。
- 连续序列(心率、血氧等每几分钟一个采样):先聚合成日级值,例如静息心率或平均心率; 确实需要时再把最小值/最大值作为各自的指标写入。只在产品真正需要处才做得更细。
- episode 型(睡眠、运动):每段一条,用
time+end_time携带时段。
一次调用写入一天的设备记录
source 标注厂商 —— 读取记录时
它会出现在 comment 字段中。
端上批量样本
有些样本根本不经过厂商 API:由你的 App 从手机自带的健康库读出(Apple HealthKit、 Android Health Connect,或直接与你的 App 配对的蓝牙体脂秤),再由 App 自己上传。 端点还是这一个,客户端需要额外定下两件事:- 在设备本地成批并预聚合。 一个月的 HealthKit 心率样本有数万行,先归并成你真正会 查询的日级值,再按每次请求最多 500 条发送。
- 发送样本自带的时间戳,而不是上传时间:
time是读数被测量的时刻,睡眠与运动的 时段由end_time携带。
source 记下样本的来源("healthkit"、"health_connect"、你的设备型号),
便于事后追溯一条读数的出处。
用完即弃的数据
没有retention: "none":写入存储却要求不存储是自相矛盾的,该值与其它非枚举值一样被拒绝。两种干净的替代模式:
- 零副作用的 dry-run 分析:用
POST /v1/standardize的store=false(默认),获得标准化结果,什么都不写。 - 短生命周期工作数据:以
retention: "1h"写入(一小时后自动过期),或以retention: "session"+ 一个用完即删的session_id写入。