Signals API - Clients

Rotate the webhook signing secret

  • Sandbox: available
  • Staging: available
  • Production: unknown
POST
/v1/signals/api/subscriber/{id}/webhook/rotate-secret

Mints a new Standard Webhooks signing secret (whsec_ and 32 random bytes) and returns it this once. Every delivery carries webhook-id and webhook-timestamp; once the subscriber has a secret it also carries webhook-signature, so a receiver verifies with the Standard Webhooks library. The secret it replaces keeps signing until previousSecretExpiresAt (24 h), so webhook-signature holds both and the receiver switches with no gap. Each rotation keeps only the secret it replaces, so rotate again only once the receiver uses the new one. The first call mints the subscriber's first secret. A MANAGER rotates any subscriber of its tenant; a SUBSCRIBER only its own.

Through ovok

  • Who can call it: Manager apps, and users whose access policy grants the capabilities.
  • Capabilities, all required: signals_webhooks:update. Project admins have every capability; client applications get no admin bypass.
  • It can reach any patient of your project without naming one, so it is for callers that reach every patient: project admins, manager or submitter apps, and anyone whose Patient access has no criteria.

Authorization

headerAuthorizationBearer <JWT>

Path Parameters

id*string

The subscriber's Signals id or its clientId.

Response Body

The new secret; it cannot be read back later.

application/json
  1. response
secret*string

The new Standard Webhooks signing secret, whsec_ and 32 random bytes in base64.

previousSecretExpiresAt*string

When the replaced secret stops signing; null when there was none.

Formatdate-time
Example Request
curl -X POST 'https://api.sandbox.ovok.com/v1/signals/api/subscriber/string/webhook/rotate-secret'
Example Response
{  "secret": "string",  "previousSecretExpiresAt": "2019-08-24T14:15:22Z"}

Send a test event POST

Sends a signed `webhook.test` event (`{ event, subscriber, sentAt }`) now, with every header a real delivery carries, and answers what the receiver did. It is not queued, retried or listed, and it works on a disabled endpoint, so a receiver can be checked before it is enabled. ### Through ovok - **Who can call it:** Manager apps, and users whose access policy grants the capabilities. - **Capabilities, all required:** `signals_webhooks:update`. Project admins have every capability; client applications get no admin bypass. - It can reach any patient of your project without naming one, so it is for callers that reach every patient: project admins, manager or submitter apps, and anyone whose Patient access has no criteria.

List webhook events GET

Every event addressed to the caller, oldest first and keyset paged by `cursor`, each with its delivery status and payload: expired, failed and held ones too. An event is listed once it is two minutes old, so a page never moves past one a slower transaction has yet to commit. Filter by `types`, `status`, `patientId`, or (for a MANAGER) `subscriberId`. ### Through ovok - **Who can call it:** Manager apps, and users whose access policy grants the capabilities. - **Capabilities, all required:** `signals_events: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 `patientId`, 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.