Skip to main content

Signals route policies

Ovok protects its Signals API with custom AccessPolicy rows. These rows are not FHIR resource types. They express what a caller may do through Ovok's Signals routes, and they are checked in addition to the caller's access to the affected Patient.

Custom capability rows​

Add the exact resource type and interaction shown below to the AccessPolicy. A catch-all FHIR rule does not grant these capabilities.

AccessPolicy resourceTypeInteractionGrants
signals_alertsreadRead alert episodes, raw alerts, and their notes.
signals_alertsupdateAcknowledge alerts and create, edit, or delete alert notes, subject to the note's author and route checks.
signals_configreadRead project Signals settings and a patient's thresholds.
signals_configupdateEnable Signals for a patient, change patient thresholds, or request project Signals settings changes, subject to additional checks.
signals_silenceupdatePerform changes that reduce the likelihood of an alert, including deleting or loosening a threshold or disarming alert behavior.

In policy data these are resource[] rules: resourceType is signals_alerts, signals_config, or signals_silence, and interaction contains read or update. The route guard checks the exact custom row. An AccessPolicy row for * does not grant a Signals capability.

Patient access still applies​

For a route tied to a patient, the caller also needs the matching Patient interaction in the same policy:

  • Reading a patient's thresholds requires Patient read access.
  • Updating or deleting a patient's threshold, or enabling Signals for the patient, requires Patient update access.
  • The patient must belong to the current project. Signals routes do not allow a project admin or integration to cross that project boundary.

The alerts and raw-alerts collection endpoints only return results for patients the caller can read. For individual alert and note operations, Ovok checks the relevant patient and applies the route's capability requirement.

Route reference​

All paths below use the /v1/signals prefix.

OperationMethod and pathCustom capabilityAdditional authorization
List patient thresholdsGET /patients/:patientId/thresholdssignals_config:readPatient read
Set a patient thresholdPUT /patients/:patientId/thresholds/:codesignals_config:updatePatient update; loosening a threshold also requires signals_silence:update and a reason
Delete a patient thresholdDELETE /patients/:patientId/thresholds/:codesignals_silence:updatePatient update and a reason
List alert episodesGET /alertssignals_alerts:readResults are limited to readable patients
Read an alert episodeGET /alerts/:episodeIdsignals_alerts:readAccess to the episode's patient
Acknowledge an alert episodePOST /alerts/:episodeId/acksignals_alerts:updateAccess to the episode's patient
List raw alertsGET /raw-alertssignals_alerts:readResults are limited to readable patients
Read a raw alertGET /raw-alerts/:alertIdsignals_alerts:readAccess to the alert's patient
Acknowledge a raw alertPOST /raw-alerts/:alertId/acksignals_alerts:updateAccess to the alert's patient
Read alert notesGET /alerts/:episodeId/notes, GET /raw-alerts/:alertId/notessignals_alerts:readAccess to the related alert
Add an alert notePOST /alerts/:episodeId/notes, POST /raw-alerts/:alertId/notessignals_alerts:updateAccess to the related alert
Edit or delete a notePUT, PATCH, or DELETE /notes/:noteIdsignals_alerts:updateNote ownership and project checks also apply
Read project Signals settingsGET /settingssignals_config:readProject scope
Change project Signals settingsPATCH /settingssignals_config:updateProject admin; some settings require Super Admin. Disarming additionally requires signals_silence:update and a reason.

FHIR threshold endpoints also use the custom policy checks:

OperationMethod and pathRequired custom capabilitiesPatient interaction
Update a patient thresholdPUT /fhir/R4/Patient/:id/threshold (also the unversioned and R5 aliases)signals_config:update and signals_silence:updatePatient update
Enable Signals for a patientPOST /fhir/R4/Patient/:id/$enable-signals (also the unversioned and R5 aliases)signals_config:updatePatient update

Example policy​

This example gives a ward team read access to its patients, update access where monitoring workflows require it, and the Signals capabilities used by those workflows. Replace the organization reference and interactions with the scope your application needs.

{
"resourceType": "AccessPolicy",
"name": "Ward Signals team",
"resource": [
{
"resourceType": "Patient",
"criteria": "Patient?organization=Organization/ward-a",
"interaction": ["read", "search"]
},
{
"resourceType": "Patient",
"criteria": "Patient?organization=Organization/ward-a",
"interaction": ["update"]
},
{
"resourceType": "signals_alerts",
"interaction": ["read", "update"]
},
{
"resourceType": "signals_config",
"interaction": ["read", "update"]
},
{
"resourceType": "signals_silence",
"interaction": ["update"]
}
]
}

The example is illustrative: confirm that the criteria matches your Patient data and that every interaction is needed. A Signals capability does not widen the Patient scope. Conversely, Patient access alone does not grant the matching Signals operation.

Grant signals_silence:update only to roles that are allowed to weaken or remove a threshold or disarm alert behavior. It is intentionally separate from ordinary threshold configuration.

Admin and integration behavior​

Super Admins and project admins pass the custom capability check for project users. Project scope and Patient project membership checks still apply. ClientApplication callers do not receive the admin bypass, even if marked as an admin; grant an integration the exact capability rows it needs.

Signals settings have stricter route-specific checks beyond the AccessPolicy: changing project settings requires a project admin, and changing selected high-impact fields requires Super Admin. See the Signals overview for its role in the Ovok architecture and regulatory context.