End users (userRef)
Attribute measurements to your own user identifiers and read per-user history and a personal baseline over the API.
Tag every measurement with userRef — an opaque identifier of your end
user — and the API turns from a stream of anonymous measurements into a
per-user health record you can build product features on.
The ref
- Format:
^[A-Za-z0-9._:@-]{1,64}$— safe to use in a URL path segment. - It is your identifier, opaque to us. Do not send PII (no e-mails, no names): send a hash or your internal user id.
- Everything is scoped to the API key that signs the request. Another key — even in the same organization — sees an empty history for the same ref.
Writing it
Pass userRef (optional everywhere) when you:
- submit a measurement:
POST /sdk/v1/measurements; - mint a cloud session:
POST /sdk/v1/cloud/sessions— the measurement the inference node stores inherits the ref, and a fallback batch job keeps it; - queue a batch job:
POST /sdk/v1/cloud/jobs.
A malformed ref is a 400 validation_error. When the ref was set, measurement
and job payloads additively carry userRef back.
Reading
All three endpoints are HMAC-signed GETs (authentication).
GET /sdk/v1/users
Distinct refs of your key with aggregates, ordered by last activity:
{
"items": [
{
"userRef": "u_42",
"measurements": 7,
"firstSeenAt": 1756000000000,
"lastSeenAt": 1756400000000,
"avgQuality": 0.84
}
],
"total": 3
}page / perPage (1..100, default 20) paginate.
GET /sdk/v1/users/{ref}/measurements
The user's history, newest first, in the standard
measurement shape. Supports page, perPage,
from / to (millisecond timestamps) and include=assessment.
GET /sdk/v1/users/{ref}/baseline
A personal baseline: per-metric median ± 2·MAD over the user's usable
measurements (complete, quality good/fair) from the last 30 days, capped at
the 200 most recent. Metrics: heartRateBpm, rmssdMs, sdnnMs,
breathingRate, stressIndex, systolicMmHg, diastolicMmHg, spo2Pct.
{
"userRef": "u_42",
"status": "ok",
"windowDays": 30,
"minSamples": 5,
"sampleCount": 12,
"metrics": {
"heartRateBpm": { "median": 68, "mad": 3, "low": 62, "high": 74, "unit": "bpm", "samples": 12 }
},
"disclaimers": ["Estimate for wellness use only. Not a medical device."]
}Honesty rules:
- fewer than 5 values for every metric →
status: "insufficient_data"and an emptymetrics(still HTTP 200); low/highis an informational corridor, not a medical norm; a constant series hasmad: 0and a degenerate corridor.
CSV export in the console gains a trailing userRef column, and the
integration measurements table can filter by ref.