List medical notifications
- Sandbox: available
- Staging: available
- Production: unknown
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, orepisode.openedAtfor 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.
episodeis the Signals episode with its aggregates.carehubis the resident context Signals does not hold: resident, room and bed, device, zone.patientNameis 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 arenullwhen that device is not known or is no longer in your project.acknowledgementisnulluntil someone acknowledges the episode. - Use
episode.idwithGET /v1/slim/notifications/medical/{episodeId}to get the full value history. episode.firedBandis 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.minandmaxare each nullable (a band can be one-sided).firedBandisnullwhen the band cannot be established; that never fails the read.- Filters:
status(OPENorCLOSED, both when omitted),since(episodes whose last notification, as in the order above, is at or after this ISO 8601 instant),acknowledged(true,1oryesfor acknowledged only; any other value for unacknowledged only; both when omitted). patientnarrows the feed to one resident, by MedplumPatient.id(thecarehub.patientIda 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.codesnarrows the feed to these LOINC codes, comma separated, at most 32 (for example8867-4,9279-1). Perfusion index isPI. Signals applies the filter. Out-of-bed is never in this feed.- Paging:
limitis 1 to 200 (default 50). Pass the previous page'snextCursorascursor. Page untilnextCursorisnull, 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_unavailablemeans Signals could not be reached; retry afterretryAfterSec.
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'bearerAuthorizationBearer <JWT>status?stringOPEN or CLOSED. Omit for both.
"OPEN""CLOSED"since?stringOnly episodes whose last notification (episode.lastFiringAt, or episode.openedAt when null) is at or after this instant (ISO 8601).
date-timeacknowledged?stringtrue for acknowledged only, false for unacknowledged only.
patient?stringOnly this resident’s episodes. A Medplum Patient id.
length <= 64codes?stringOnly these LOINC codes, comma separated (e.g. 8867-4,9279-1; PI for perfusion index). Omit for every medical code.
^(\d{1,7}-\d|PI)(,(\d{1,7}-\d|PI)){0,31}$limit?string"50"cursor?stringThe previous page’s nextCursor.
length <= 500A page of medical notifications.
application/json- response
A page of the project’s HR/BR notification feed, newest last notification first.
items*array<>nextCursor*stringcurl -X GET 'https://api.sandbox.ovok.com/v1/slim/notifications/medical'{ "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' ```