Overview
Receive a signed POST when something happens in Ovianta.
Event webhooks tell your system what Ovianta agents did, as it happens. When a call ends or an agent leaves a note, Ovianta sends a POST with a JSON body to the URLs the clinic registered.
| Event | Sent when |
|---|---|
call.ended | A conversation with an agent finished, by phone or on the website widget. |
note.created | The agent left a note for the clinic's staff. |
Setting up an endpoint
An admin of the clinic's Ovianta account adds endpoints in Settings › Webhooks:
- Add the endpoint URL and choose its events. The URL must use
httpsand point to a public address. An account can have up to 10 endpoints. - Copy the endpoint's signing secret (it starts with
whsec_). You need it to verify signatures. - Click Send test event. Ovianta sends one
webhook.testevent right away, without retries.
The endpoint page also lists every request sent to it in the last 30 days, with its status and attempts.
The request
Every event is a POST with these headers:
| Header | Value |
|---|---|
content-type | application/json; charset=utf-8 |
user-agent | Ovianta-Webhooks/1.0 |
x-signature | Hex HMAC-SHA256 of the raw body, keyed with the endpoint secret. See Verifying signatures. |
x-ovianta-event | The event type, e.g. call.ended. Same as event in the body. |
x-ovianta-event-id | The event id. Same as eventId in the body. |
x-ovianta-delivery-attempt | Which attempt this is, 1 to 5. |
x-ovianta-test | true on a test event sent from Settings. Absent otherwise. |
and a JSON body with the same envelope for every event:
Prop
Type
{
"event": "note.created",
"eventId": "evt_3f9c2a7d41b8e6c05a1d9e2f",
"version": 1,
"sentAt": "2026-09-01T11:39:31.000+02:00",
"attempt": 1,
"data": { "...": "depends on the event" }
}Answering
Answer with any 2xx within 10 seconds. Ovianta ignores the response body.
Do the work after answering. If processing takes longer than the timeout, store the event, answer 200, and process it in the background.
| Your answer | What Ovianta does |
|---|---|
2xx | Delivered. |
408, 429, 5xx, no answer in time, or no connection | Retries, on the schedule below. |
Any other 4xx, or any 3xx | Rejected. Not retried. Redirects are not followed. |
Retries
An event is attempted up to 5 times:
| Attempt | Sent | Since the first attempt |
|---|---|---|
| 1 | Immediately | 0 min |
| 2 | 1 min after the previous one | 1 min |
| 3 | 5 min after the previous one | 6 min |
| 4 | 15 min after the previous one | 21 min |
| 5 | 40 min after the previous one | 61 min |
A Retry-After header on a retryable answer can make a wait longer, up to 60 min.
After the last attempt the delivery is marked failed. Each attempt rebuilds the body from Ovianta's current data, so a retried event can include changes made since the first attempt.
Duplicates and order
- Deduplicate on
eventId. It is the same on every retry and for every endpoint. You may receive an event more than once. - Do not rely on order. Retries and parallel deliveries mean a later event can arrive first. A
note.createdcan arrive before or after thecall.endedof its call; match them withnote.callId.
Versions
Each event type has a version. Ovianta adds optional fields without changing it, so ignore fields you do not know. A breaking change gets a new version.