Patient Vault stores the person. VitalStream stores the signal — every biosensor reading kept as-is at full fidelity, normalized and sensed on read, keyed to the same patient record.
Free to start · BAA-covered in production · Full fidelity, never downsampled on ingest
Open a stream, feed it readings, sense what they mean. Learn three nouns — stream, observation, watch — and you've learned the API.
One call creates a stream against an existing Patient Vault patient and declares its analytes inline — no separate setup call before the first reading flows.
POST /v1/stream
The keystone call. Post a reading in its native unit; the response returns it stored, normalized, scored against the patient's own baseline, and checked against any watches — in one round trip.
POST /v1/stream/{streamId}/observation
Pull a longitudinal trend against the N-of-1 baseline band, or declare a threshold that fires a webhook — and, if you want, a workflow — the moment it's breached.
GET /v1/stream/{streamId}/trend
FHIR has no primitive for a live feed. A FHIR Observation is a discrete clinical event, so systems that treat FHIR as storage face a forced choice: downsample on ingest and lose the signal, or mint one heavyweight Observation per reading and lose queryability. That forced choice is why the industry downsamples — not because the data science wants it.
VitalStream takes the third path: store each reading as a lightweight time-series tuple keyed to the patient, derive everything else on read, and emit FHIR only when you export a window back to the Patient Vault record.
Every reading stored whole, full fidelity. Downsampling on ingest is never on the roadmap — it's the anti-pattern the service exists to avoid.
Normalization and rollups are views over raw, computed at read time and re-derivable. Change a rule, replay history — raw untouched.
Collapse a window into one clinician-legible FHIR Observation in the patient's vault record. Export summarizes; it never dumps the firehose. In design
VitalStream is built on the same canonical model as the rest of the platform, so it reaches for its siblings by default.
Every stream is keyed to a vault patient — VitalStream stores the signal, Patient Vault stores the person.
A breached watch fires a webhook that can open a workflow — a reading out of band becomes a task with an owner.
Every reading and every watch that fires is provenance-tracked — the record that survives a study review.
Target scenarios shaping the design — the high-volume, continuous cases that break a discrete-event data model.
FHIR has no primitive for a continuous feed. Rather than downsample on ingest or mint one heavyweight Observation per reading, VitalStream stores each reading as a lightweight time-series tuple keyed to a Patient Vault patient, and emits FHIR only at the export boundary.
Never on ingest — every reading is stored as-is at full fidelity. Aggregation exists only as a read-side rollup layer computed from raw, and raw is never discarded, so any rule can be changed and replayed against untouched history.
Three nouns: stream, observation, watch. Open a stream with its analytes inline, feed it raw observations, and optionally set a watch that fires a webhook on a threshold. Baselines and trends come back inline, not as separate endpoints.
Free to start. BAA-covered in production.