Skip to main content
复制本页的 curl 示例前,先选择 Cloud 区域。需要认证的调用必须使用与密钥同一区域的地址。下方示例都使用 MIROBODY_API_BASE:
SDK 示例中如果写有全球区的完整地址,中国区账户须换成对应的中国区地址。参阅区域。 把结构化记录直接写进 Subject 的存储,并读回。结构化记录最主要的形式就是设备与可穿戴数据(见下文)。每次写入都会经过平台的标准化管线:解析值与单位,为识别出的指标补上 LOINC 编码和规范名称,每条记录都镜像到 FHIR。未解析出编码的行仍可正常读取。agent 通过内置工具读取同一份数据。 健康数据有四种形态,每种形态各有一个写入端点: 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 中,与其它机读字段一同返回:

擦除记录

永久擦除该 Subject 的记录:被遗忘权语义(数据被真正移除,而非仅从读取中隐藏)。三种范围,由窄到宽:
如需一次性擦除某个 Subject 的一切(记录 + 文件 + 对话 + 身份映射),使用 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 携带时段。

一次调用写入一天的设备记录

按 Subject 把一整天(或一个回填窗口)批到一次调用里。用 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 写入。

另见