SlimSlim/Notifications

List medical notifications

  • Sandbox: available
  • Staging: available
  • Production: unknown
GET
/v1/slim/notifications/medical

Lists your project's medical notifications (heart rate, respiratory rate and other vital-sign alerts), newest last notification first, one page at a time. Medical episodes are decided by Signals; Ovok reads them from Signals, adds the resident context, and never re-derives a clinical value.

Auth: Bearer token. The caller must be a practitioner, an admin, a super admin, or hold the "System Owner" access policy. The access policy must grant Patient:read, Device:read and Location:read (an admin or super admin who holds no access policy skips this check). Scope: The caller's project (from the token), applied on both sides: Signals filters on the resident's project stamp, and Ovok checks each resolved resident against your project.

Behaviour

  • Order: newest last notification first. That is episode.lastFiringAt, the newest reading outside the band, or episode.openedAt for an episode stored without one (before 2026-09-28). An open episode that fires again moves up, so while you read page 2 it can move to page 1. It is never listed twice, and the next read of page 1 shows it.
  • One row per episode, not per reading: a run of readings outside the band is one episode, which closes on recovery or acknowledgement.
  • Each row has three blocks. episode is the Signals episode with its aggregates. carehub is the resident context Signals does not hold: resident, room and bed, device, zone. patientName is the resident's Resident ID, also after a discharge, an unassign or a device move. The room, bed, device and zone are those of the device the episode was raised on, also after the resident moved to another device or was unassigned. They are null when that device is not known or is no longer in your project. acknowledgement is null until someone acknowledges the episode.
  • Use episode.id with GET /v1/slim/notifications/medical/{episodeId} to get the full value history.
  • episode.firedBand is the band the episode was judged under: the band Signals recorded when it fired, or else the band rebuilt from Signals' configuration history at the episode's trigger version. It is not the resident's current band, so editing a threshold does not change past rows. min and max are each nullable (a band can be one-sided). firedBand is null when the band cannot be established; that never fails the read.
  • Filters: status (OPEN or CLOSED, both when omitted), since (episodes whose last notification, as in the order above, is at or after this ISO 8601 instant), acknowledged (true, 1 or yes for acknowledged only; any other value for unacknowledged only; both when omitted).
  • patient narrows the feed to one resident, by Medplum Patient.id (the carehub.patientId a row returns). It does not change the project scope. A resident who cannot be resolved, or who is in another project, answers 404 rather than an unfiltered page.
  • codes narrows the feed to these LOINC codes, comma separated, at most 32 (for example 8867-4,9279-1). Perfusion index is PI. Signals applies the filter. Out-of-bed is never in this feed.
  • Paging: limit is 1 to 200 (default 50). Pass the previous page's nextCursor as cursor. Page until nextCursor is null, not until a short page arrives: rows whose resident cannot be resolved into your project are dropped after Signals counted them.
  • A resident with no Signals project stamp matches no project and does not appear.
  • When the project's Signals tenant has episodic alerts switched off, the page is empty.
  • Out-of-bed is served by GET /v1/slim/notifications/oob.
  • A 503 with signals_unavailable means Signals could not be reached; retry after retryAfterSec.

Example

curl -X GET 'https://api.sandbox.ovok.com/v1/slim/notifications/medical?status=OPEN&codes=8867-4,9279-1&limit=50' \  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk'

Authorization

bearer
headerAuthorizationBearer <JWT>

Query Parameters

status?string

OPEN or CLOSED. Omit for both.

Value in"OPEN""CLOSED"
since?string

Only episodes whose last notification (episode.lastFiringAt, or episode.openedAt when null) is at or after this instant (ISO 8601).

Formatdate-time
acknowledged?string

true for acknowledged only, false for unacknowledged only.

patient?string

Only this resident’s episodes. A Medplum Patient id.

Lengthlength <= 64
codes?string

Only these LOINC codes, comma separated (e.g. 8867-4,9279-1; PI for perfusion index). Omit for every medical code.

Match^(\d{1,7}-\d|PI)(,(\d{1,7}-\d|PI)){0,31}$
limit?string
Default"50"
cursor?string

The previous page’s nextCursor.

Lengthlength <= 500

Response Body

A page of medical notifications.

application/json
  1. response

A page of the project’s HR/BR notification feed, newest last notification first.

items*array<>
nextCursor*string
Example Request
curl -X GET 'https://api.sandbox.ovok.com/v1/slim/notifications/medical'
Example Response
{  "items": [    {      "episode": {        "id": "string",        "patientId": "string",        "code": "string",        "system": "string",        "display": "string",        "status": "string",        "openedAt": "string",        "closedAt": "string",        "closeReason": "string",        "lastSampleAt": "string",        "durationMs": 0,        "observationCount": 0,        "firingCount": 0,        "minValue": 0,        "maxValue": 0,        "avgValue": 0,        "lastValue": 0,        "peakValue": 0,        "peakAt": "string",        "lastFiringValue": 0,        "lastFiringAt": "string",        "lastObservationId": "string",        "firedBand": {          "min": 0,          "max": 0,          "triggerVersion": 0        }      },      "carehub": {        "patientId": "string",        "patientName": "string",        "locationId": "string",        "locationName": "string",        "room": "string",        "bed": "string",        "floor": "string",        "deviceId": "string",        "deviceMedplumId": "string",        "deviceName": "string",        "organizationId": "string",        "organizationName": "string"      },      "acknowledgement": {        "acknowledgedAt": "string",        "acknowledgedBy": "string",        "acknowledgedActor": {          "reference": "string",          "display": "string"        }      },      "noteCount": 0    }  ],  "nextCursor": "string"}

List alarm notifications GET

Lists your project's device alarms and attention presses, filtered and paged. These are decided by the sending system; Ovok stores them as CommunicationRequests and forwards them. **Auth:** Bearer token. The caller must be a practitioner, an admin, a super admin, or hold the "System Owner" access policy. The access policy must grant `CommunicationRequest:read`, `CommunicationRequest:search` and `Observation:read` (an admin or super admin who holds no access policy skips this check). **Scope:** The caller's project (from the token). The `project` query parameter is accepted but ignored. ## Behaviour - One row per alarm episode. Each row's `alarm` carries the sender's own alarm id (`episodeId`), its severity, type and text, so the sender can match an acknowledgement to its own record. - `type`: `deviceAlarm`, `attention`, or both comma separated. Both when omitted. - `severity`: `RED`, `YELLOW`, `ATTENTION`, comma separated, as the sender coded the alarm. Every severity when omitted. - `status` defaults to `active`; an acknowledged alarm is `completed`. - `sort`: `newest` (default) or `oldest`, by event time (`occurrenceDateTime`, then `authoredOn`, then id). - `patient`, `device`, `startDate`, `endDate`, `page`, `count`, `total` and `truncated` work as on `GET /v1/slim/notifications/oob`: `count` is 1 to 100 (default 25), dates are inclusive UTC instants, and the list pages through at most the first 1,000 results (server-configurable). - Acknowledge a row with `PATCH /v1/slim/notifications/{id}/ack`. - Out-of-bed is on `GET /v1/slim/notifications/oob`; vital-sign alerts, decided by Signals, are on `GET /v1/slim/notifications/medical`. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/slim/notifications/alarms?type=deviceAlarm&severity=RED&sort=newest' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```

Get medical notification GET

Returns one medical notification with its full value history, addressed by the `episode.id` a feed row carries. The episode is read from Signals, which decides medical alerts. **Auth:** Bearer token. The caller must be a practitioner, an admin, a super admin, or hold the "System Owner" access policy. The access policy must grant `Patient:read`, `Device:read` and `Location:read` (an admin or super admin who holds no access policy skips this check). **Scope:** The caller's project (from the token), applied on both sides: Signals matches it against the resident's project stamp, and Ovok checks the resolved resident against your project. ## Behaviour - `episode` is the Signals episode as Signals returned it: status, open and close times, close reason, aggregates, and every reading recorded while it ran (`values`). Check `episode.truncated`: a very long episode returns a capped series and says so. - `carehub` adds the resident context: resident, room and bed, device and zone. `patientName` is the resident's Resident ID, also after a discharge, an unassign or a device move. The room, bed, device and zone are those of the device the episode was raised on, also after the resident moved to another device or was unassigned. They are `null` when that device is not known or is no longer in your project. - `acknowledgement` is `null` until someone acknowledges the episode. - `episode.firedBand` is the band the episode was judged under, as described on `GET /v1/slim/notifications/medical`. It is `null` when it cannot be established. - An episode in another project, or an out-of-bed episode (code `103214-3`), answers 404, the same as one that does not exist. A 404 is never caused by Signals being down. - A 503 with `signals_unavailable` means Signals could not be reached; retry after `retryAfterSec`. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/slim/notifications/medical/c3499c27-2973-0a7f-807e-fb8676a92dcb' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```