openapi: 3.0.3
info:
title: BodyTrace RPM Data API
description: >-
HTTP API for BodyTrace cellular-connected remote patient monitoring (RPM)
devices - blood pressure monitors, body-weight scales, and pulse oximeters.
Devices transmit measurements directly over the cellular network to the
BodyTrace platform; healthcare organizations then read those readings over
this API. Authentication is HTTP Basic using credentials issued by BodyTrace.
Scope and honesty note: BodyTrace does not publish an open, self-serve
developer portal - device provisioning and API credentials are arranged
through BodyTrace sales, and the reference docs live behind partner
onboarding (BodyTrace's own docs plus integrator guides such as Validic).
The one endpoint publicly and repeatedly documented in the wild is the data
values pull, `GET /1/device/{imei}/datavalues`, and the device push message
payload. Those are marked CONFIRMED below. The remaining operations (raw data
messages, device listing/status, alerts, and provisioning) are HONESTLY
MODELED from BodyTrace's documented IMEI-centric data model and RPM feature
set; their exact paths and parameters should be verified against the partner
documentation you receive with credentials. Modeled operations carry
`x-endpoint-status: modeled`; confirmed ones carry
`x-endpoint-status: confirmed`.
Delivery model: readings can be pulled from the data values endpoint on a
polling loop, or pushed by BodyTrace to a customer-hosted HTTP endpoint
(a webhook you host and secure). There is no documented public WebSocket
surface.
version: '1.0'
contact:
name: BodyTrace
url: https://www.bodytrace.com
license:
name: Proprietary
url: https://www.bodytrace.com
servers:
- url: https://us.data.bodytrace.com/1
description: BodyTrace US data region
- url: https://eu.data.bodytrace.com/1
description: BodyTrace EU data region (region assigned by BodyTrace)
security:
- basicAuth: []
tags:
- name: Observations
description: Confirmed pull surface for device readings (data values).
- name: Data Messages
description: Modeled surface for raw per-transmission device messages.
- name: Devices
description: Modeled device listing and status keyed by IMEI.
- name: Alerts
description: Modeled threshold and connectivity alerts.
- name: Provisioning
description: Modeled device enrollment and delivery configuration.
paths:
/device/{imei}/datavalues:
parameters:
- $ref: '#/components/parameters/Imei'
get:
operationId: getDeviceDataValues
tags:
- Observations
summary: Get device data values (readings)
description: >-
Retrieve the latest and historical readings for a device by IMEI. Use the
`names` query parameter to select which values to return - for example
`values/weight`, `values/systolic`, `values/diastolic`, `values/pulse`,
`batteryVoltage`, and `signalStrength` - and optionally bound the results
with a time range. This is the confirmed, publicly documented BodyTrace
pull endpoint.
x-endpoint-status: confirmed
parameters:
- name: names
in: query
required: false
description: >-
Comma-separated list of value names to return, e.g.
`batteryVoltage,signalStrength,values/weight,values/unit`. For blood
pressure use `values/systolic,values/diastolic,values/pulse`.
schema:
type: string
example: batteryVoltage,signalStrength,values/weight,values/unit
- name: from
in: query
required: false
description: Start of the time window, epoch milliseconds (UTC).
schema:
type: integer
format: int64
- name: to
in: query
required: false
description: End of the time window, epoch milliseconds (UTC).
schema:
type: integer
format: int64
- name: limit
in: query
required: false
description: Maximum number of readings to return.
schema:
type: integer
responses:
'200':
description: The requested device readings.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/DataValue'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/device/{imei}/datamessages:
parameters:
- $ref: '#/components/parameters/Imei'
get:
operationId: getDeviceDataMessages
tags:
- Data Messages
summary: Get raw device data messages
description: >-
Retrieve the raw, per-transmission messages a device has sent over the
cellular network for a given IMEI and time range. Each message mirrors the
payload BodyTrace devices emit (deviceId, ts, batteryVoltage, rssi, and a
values object). MODELED - the message payload shape is confirmed from
BodyTrace's documented device messages, but this read/query surface is
gated behind partner credentials; verify path and parameters against your
onboarding docs.
x-endpoint-status: modeled
parameters:
- name: from
in: query
required: false
description: Start of the time window, epoch milliseconds (UTC).
schema:
type: integer
format: int64
- name: to
in: query
required: false
description: End of the time window, epoch milliseconds (UTC).
schema:
type: integer
format: int64
- name: limit
in: query
required: false
description: Maximum number of messages to return.
schema:
type: integer
responses:
'200':
description: A list of raw device messages.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/DeviceMessage'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/devices:
get:
operationId: listDevices
tags:
- Devices
summary: List devices
description: >-
List the cellular devices provisioned in your account, keyed by IMEI.
MODELED - BodyTrace's model is device/IMEI centric, but an account-scoped
listing endpoint is gated behind partner credentials; verify against your
onboarding docs.
x-endpoint-status: modeled
responses:
'200':
description: A list of devices.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Device'
'401':
$ref: '#/components/responses/Unauthorized'
/device/{imei}/status:
parameters:
- $ref: '#/components/parameters/Imei'
get:
operationId: getDeviceStatus
tags:
- Devices
summary: Get device status
description: >-
Read a single device's status by IMEI - last seen timestamp, battery
voltage, signal strength, and provisioning state. MODELED from BodyTrace's
device data model; verify against your onboarding docs.
x-endpoint-status: modeled
responses:
'200':
description: The device status.
content:
application/json:
schema:
$ref: '#/components/schemas/Device'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/device/{imei}/alerts:
parameters:
- $ref: '#/components/parameters/Imei'
get:
operationId: listDeviceAlerts
tags:
- Alerts
summary: List device alerts
description: >-
List threshold and connectivity alerts raised for a device - for example a
blood-pressure reading outside a configured range, or a low-battery /
offline condition. MODELED RPM capability; alert configuration is arranged
with BodyTrace and gated behind credentials.
x-endpoint-status: modeled
responses:
'200':
description: A list of alerts.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Alert'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/device/{imei}/provision:
parameters:
- $ref: '#/components/parameters/Imei'
post:
operationId: provisionDevice
tags:
- Provisioning
summary: Provision a device
description: >-
Associate a device (by IMEI) with an account, patient, or program and
configure where its measurements are delivered - including an optional
pushed HTTP endpoint (webhook) that BodyTrace should POST readings to.
MODELED from BodyTrace's documented onboarding flow; provisioning is
completed with BodyTrace and gated behind credentials.
x-endpoint-status: modeled
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProvisionInput'
responses:
'200':
description: The provisioned device.
content:
application/json:
schema:
$ref: '#/components/schemas/Device'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
components:
securitySchemes:
basicAuth:
type: http
scheme: basic
description: >-
HTTP Basic authentication using the username and password issued by
BodyTrace for your account. The same credential model secures the
customer-hosted push endpoint (you define the username/password BodyTrace
uses when POSTing measurements to you).
parameters:
Imei:
name: imei
in: path
required: true
description: >-
The device IMEI (serial). BodyTrace documents this as the IMEI without
leading zeros and without the final check digit.
schema:
type: string
example: '357872040012345'
responses:
Unauthorized:
description: Missing or invalid HTTP Basic credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: The device or resource was not found / not registered.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
ValidationError:
description: The request payload failed validation.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
Values:
type: object
description: >-
Measurement payload. The populated fields depend on the device type. A
scale reports weight/tare; a blood pressure monitor reports
systolic/diastolic/pulse; a pulse oximeter reports spo2/pulse. An empty
values object indicates a heartbeat / connectivity message.
properties:
unit:
type: integer
description: Unit setting for the measurement (device-defined).
weight:
type: integer
description: Body weight in grams (scale).
tare:
type: integer
description: Tare / calibration offset in grams (scale).
systolic:
type: integer
description: Systolic blood pressure in mmHg (BP monitor).
diastolic:
type: integer
description: Diastolic blood pressure in mmHg (BP monitor).
pulse:
type: integer
description: Pulse in beats per minute (BP monitor / pulse oximeter).
spo2:
type: integer
description: Blood oxygen saturation as a percentage (pulse oximeter).
additionalProperties: true
DataValue:
type: object
description: A single reading returned by the data values endpoint.
properties:
ts:
type: integer
format: int64
description: Measurement timestamp, epoch milliseconds (UTC).
batteryVoltage:
type: integer
description: Battery voltage in millivolts.
signalStrength:
type: integer
description: Cellular signal strength.
rssi:
type: integer
description: Signal strength in negative dBm (raw radio metric).
values:
$ref: '#/components/schemas/Values'
DeviceMessage:
type: object
description: >-
A raw per-transmission device message, matching the JSON BodyTrace
devices emit over cellular.
properties:
deviceId:
type: string
description: The device IMEI (without leading zeros and final digit).
ts:
type: integer
format: int64
description: Timestamp, epoch milliseconds (UTC).
batteryVoltage:
type: integer
description: Battery voltage in millivolts (functional range ~4700-6000).
rssi:
type: integer
description: Signal strength in negative dBm.
values:
$ref: '#/components/schemas/Values'
Device:
type: object
description: A provisioned cellular device.
properties:
imei:
type: string
deviceType:
type: string
description: Device family, e.g. scale, bloodPressure, pulseOximeter.
enum:
- scale
- bloodPressure
- pulseOximeter
lastSeen:
type: integer
format: int64
description: Last transmission timestamp, epoch milliseconds (UTC).
batteryVoltage:
type: integer
signalStrength:
type: integer
provisioned:
type: boolean
Alert:
type: object
description: A threshold or connectivity alert raised for a device.
properties:
id:
type: string
imei:
type: string
type:
type: string
description: Alert type, e.g. threshold, lowBattery, offline.
enum:
- threshold
- lowBattery
- offline
metric:
type: string
description: The measurement that triggered a threshold alert, e.g. systolic.
value:
type: number
ts:
type: integer
format: int64
message:
type: string
ProvisionInput:
type: object
required:
- imei
properties:
imei:
type: string
description: The device IMEI to provision.
deviceType:
type: string
enum:
- scale
- bloodPressure
- pulseOximeter
externalId:
type: string
description: Your patient/program identifier to associate with the device.
pushUrl:
type: string
format: uri
description: >-
Optional customer-hosted HTTPS endpoint BodyTrace should POST each
measurement to (secured with HTTP Basic credentials you provide).