Signals API - Patients

List patients

  • Sandbox: available
  • Staging: available
  • Production: unknown
GET
/v1/signals/api/patient

Scoped to what the caller may see: a MANAGER gets the tenant, a SUBMITTER or SUBSCRIBER only the patients it is attached to. Newest first.

v1's paginate envelope, driven by page and limit (default 10). A page may start at most 10000 rows in; past that, walk with the keyset cursor: pass nextCursor back verbatim, and null means the last page.

Through ovok

  • Who can call it: Manager apps and Submitter apps, and users whose access policy grants the capabilities.
  • Capabilities, all required: signals_patients:read. Project admins have every capability; client applications get no admin bypass.
  • If your access covers only some patients (anyone but project admins, manager or submitter apps, and anyone whose Patient access has no criteria), name them with ids, each one you can read, at most 100. Signals then pages over just those patients, so pages and totals stay true. A patient is named by its Signals id, or by its Medplum Patient id where Signals takes a refId; ovok asks Signals which patient a Signals id is.

Authorization

headerAuthorizationBearer <JWT>

Query Parameters

limit?number

Page size. Defaults to 10, as in v1; at most 1000.

Range1 <= value
ids?array<string>

Only these patients, by Signals id. Repeat the parameter or separate with commas.

sort?string

Accepted for v1 callers and ignored, as v1 ignored it. Newest first, always.

page?number

1-based, as v1 paged. A page may start at most 10000 rows in; walk further with cursor.

Range1 <= value
cursor?string

Opaque keyset cursor: a previous answer's nextCursor, passed back verbatim.

Lengthlength <= 512
tags[key]?string

v1's tag filter: only patients whose tags.key equals one of the comma-separated values, or holds one in an array. Repeat with other keys to require them all. Keys are alphanumeric; tags.key= is accepted too.

Response Body

One page of patients, each with its config.

application/json
  1. response
totalItems*number
limit*number
page*number

1-based.

totalPages*number

At least 1, even for an empty list.

pagingCounter*number

The 1-based position of the first item on this page.

hasPrevPage*boolean
hasNextPage*boolean
prevPage*number
nextPage*number
nextCursor*string

Opaque keyset cursor. Pass it back as cursor for the next page; null means this page was the last. Do not construct or parse it.

items*array<>
Example Request
curl -X GET 'https://api.sandbox.ovok.com/v1/signals/api/patient'
Example Response
{  "totalItems": 0,  "limit": 0,  "page": 0,  "totalPages": 0,  "pagingCounter": 0,  "hasPrevPage": true,  "hasNextPage": true,  "prevPage": 0,  "nextPage": 0,  "nextCursor": "string",  "items": [    {      "id": "string",      "tenantId": "string",      "refId": "string",      "name": "string",      "submitters": [        "string"      ],      "subscribers": [        "string"      ],      "alertIfEmpty": true,      "alertIfNote": true,      "alertInactiveDays": 0,      "alertsPaused": true,      "metadata": {},      "configUpdatedAt": "2019-08-24T14:15:22Z",      "lastSeenAt": "2019-08-24T14:15:22Z",      "createdAt": "2019-08-24T14:15:22Z",      "updatedAt": "2019-08-24T14:15:22Z",      "email": "string",      "bsn": "string",      "umoId": "string",      "dateOfBirth": "string",      "tags": {},      "manager": "string",      "_id": "string",      "tenant": "string",      "config": {        "alertIfEmpty": true,        "alertIfNote": true,        "alertInactiveDays": 0,        "updatedAt": "2019-08-24T14:15:22Z",        "triggers": {          "property1": {            "code": "string",            "system": "string",            "display": "string",            "valueKey": "string",            "constants": {},            "logic": {},            "metadata": {},            "version": 0,            "updatedAt": "2019-08-24T14:15:22Z"          },          "property2": {            "code": "string",            "system": "string",            "display": "string",            "valueKey": "string",            "constants": {},            "logic": {},            "metadata": {},            "version": 0,            "updatedAt": "2019-08-24T14:15:22Z"          }        }      }    }  ]}

Read the config status of many patients POST

Each patient's `configUpdatedAt` and trigger codes, so a caller can confirm a push landed without re-reading every trigger; `triggerFingerprints` adds what each rule says. Exactly one row per requested id, in the order asked. An id that resolves to nothing answers `refId: null` with no codes, as v1 did. A POST because the id list is the request; it writes nothing. ### Through ovok - **Who can call it:** Manager apps, and users whose access policy grants the capabilities. - **Capabilities, all required:** `signals_config:read`. Project admins have every capability; client applications get no admin bypass. - If your access covers only some patients (anyone but project admins, manager or submitter apps, and anyone whose Patient access has no criteria), every patient the body names must be one you can read. A patient is named by its Signals id, or by its Medplum Patient id where Signals takes a `refId`; ovok asks Signals which patient a Signals id is.

Create patients POST

Upserts on `refId`: posting a patient that already exists updates it rather than duplicating it, so a replayed provisioning run is safe. Each entry's `config` — flags and triggers — is applied in the same call, and `metadata` is merged. ### Through ovok - **Who can call it:** Manager apps, and users whose access policy grants the capabilities. - **Capabilities, all required:** `signals_patients:update`. Project admins have every capability; client applications get no admin bypass. - ovok adds your project's submitter to each new patient and stamps `metadata.project` with your project. Sending `config` also needs `signals_config:update` and `signals_silence:update`. New patients count toward your plan's monitored-patient cap. - If your access covers only some patients (anyone but project admins, manager or submitter apps, and anyone whose Patient access has no criteria), every patient the body names must be one you can update. A patient is named by its Signals id, or by its Medplum Patient id where Signals takes a `refId`; ovok asks Signals which patient a Signals id is.