Write one config to many patients
Write one config to many patients, through Ovok's Signals gateway.
Write one config to many patients
| Method | Path |
|---|---|
POST | /v1/signals/api/patient/config |
- Sandbox: available
- Staging: available
- Production: unknown
Applies the same triggers, flags and metadata to every id named. An id may be the Signals id or the refId.
Unknown ids are reported in misses[] rather than failing the batch. modifiedCount counts patients where a row actually changed; status.triggerWrites gives the row counts behind it. Trigger metadata is MERGED and left untouched when absent.
Send resolvedAt (the instant the configuration was COMPUTED, not sent) to have this push refused rather than applied when the patient already carries a configuration resolved strictly later. Refusal is a silent no-op reported as staleIgnoredCount, never an error. Omitting it applies the push unconditionally.
Through ovok
- Who can call it: Manager apps, and users whose access policy grants the capabilities.
- Capabilities, all required:
signals_config:update,signals_silence:update. Project admins have every capability; client applications get no admin bypass. - A patient stamped with another project is refused.
- 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.
Request
Body
Required. Schema V1ConfigDto.
| Field | Type | Required | Description |
|---|---|---|---|
resolvedAt | string | No | ISO-8601 instant at which this configuration was COMPUTED (not sent). A push carrying one is ignored if the patient already has a configuration resolved strictly later. Optional: a push without it is applied unconditionally, exactly as before. |
triggers | array of object | No | — |
triggers[].code | string | Yes | LOINC code. Unique per patient. |
triggers[].system | string | No | — |
triggers[].display | string | No | — |
triggers[].valueKey | string | No | Key the rule reads the reading under. |
triggers[].constants | object | No | Named values the rule compares against, e.g. { "low": 50, "high": 110 }. |
triggers[].logic | object | No | json-logic. May return a boolean, a string used as the message, or an object {alert, value, message} — the shape the ECH rules use. |
triggers[].delete | boolean | No | Remove this trigger instead of writing it. The patient stops being alerted on the code. |
triggers[].metadata | object | No | Free-form routing labels, MERGED into whatever is already there and left untouched when absent — so a push that omits them cannot un-route a trigger. Signals does not interpret the keys. A caller managing thresholds at two levels records which level owns each trigger here, so a group-wide write matches one label and cannot clobber a per-patient exception. |
ids | array of string | Yes | — |
metadata | object | No | Stamped onto the Patient rows named by ids, merged not replaced. |
alertIfEmpty | boolean | No | — |
alertIfNote | boolean | No | — |
alertInactiveDays | number | No | — |
Responses
| Status | Meaning |
|---|---|
200 | v1's envelope: the ids echoed back and the match and modify counts. |
400 | The query carries a raw #, or more than 200 parameters. |
401 | Your ovok access token, or your client id and secret, are missing or invalid. |
403 | ovok refused the call: you lack a capability this route needs, or your session has no project, or a patient is stamped with another project, or your access covers only some patients and the call names none, or you can read a patient the call names but not update it. From Signals: Authenticated, but the client's role does not permit this, or it is not attached to the patient. |
404 | A patient the call names is not one you can read. |
409 | Your project has no Signals tenant of its own (SIGNALS_TENANT_NOT_OWN), or it is moving to another one. |
415 | The body is not JSON. |
422 | A patient id is not 1 to 64 letters, digits, ., _, ~ or -. More than 100 patients are named. A patient is named by something other than a string. From Signals: The payload failed validation. |
429 | Too many requests. Retry after the seconds in Retry-After. |
500 | ovok hit an unexpected fault, such as your project having no Signals submitter. |
502 | Signals answered with something ovok couldn't use, or refused ovok's own credential. |
503 | Signals is unavailable. Retry after the seconds in Retry-After. |
504 | Signals did not answer in time. |
Example
curl --request POST 'https://api.sandbox.ovok.com/v1/signals/api/patient/config' \
--user "${OVOK_CLIENT_ID}:${OVOK_CLIENT_SECRET}" \
--header 'Content-Type: application/json' \
--data @body.jsonLast updated on