Calling webhooks
Set up Slovio calling webhooks to receive call.started, call.answered, call.ended, call.missed and call.failed events, with payloads, signatures and retries.
4 min readUpdated
Calling webhooks send AI Calling events to your server as they happen: a call started, was answered, ended, was missed or failed. Set them up in Calling → Webhooks → Add endpoint. They are separate from messaging webhooks, and each account can have up to 10 calling endpoints.
Add an endpoint
- Open Calling → Webhooks.
- Select Add endpoint.
- Enter a Name, for example
CRM sync. - Enter the Endpoint URL. It must be HTTPS.
- Tick the Events you want.
- Leave Enabled on.
- Select Add endpoint.
- Copy the signing secret that appears. It is shown only once. Select Done.
- Select Send test event to check your endpoint receives it.
Only the account owner can manage calling webhooks.
Events
| Event | Label on screen | When |
|---|---|---|
call.started |
Call started | A call begins. |
call.answered |
Call answered | The call is answered. |
call.ended |
Call ended | The call ends, with duration, outcome and cost. |
call.missed |
Call missed | An inbound call was not answered. |
call.failed |
Call failed | The call could not connect. |
Payload
Every delivery is a POST with a JSON body:
{
"id": "evt_4b1f0c9e2d7a6b5c8e3f1a0d9c8b7a6e",
"type": "call.ended",
"apiVersion": "2026-09-29",
"createdAt": "2026-10-03T05:31:40.000Z",
"test": false,
"data": {
"callId": "api-3f9c0b1e7d2a4c58b6e1f0a9d8c7b6a5e4d3c2b1",
"direction": "outbound",
"from": "+911414567890",
"to": "+919876543210",
"agentId": "66f2a9c4e1b7d30012ab45cd",
"endedAt": "2026-10-03T05:31:40.000Z",
"durationSeconds": 74,
"status": "completed",
"outcome": "completed",
"cost": { "amount": 4.2, "currency": "INR", "settled": true },
"recordingAvailable": true,
"extractedVariables": { "confirmed": "yes" }
}
}data always has callId, and whichever of direction, from, to, agentId, campaignId and contactId apply. The rest depends on the event:
| Event | Extra fields in data |
|---|---|
call.started |
startedAt |
call.answered |
answeredAt |
call.ended |
endedAt, durationSeconds, status, outcome, cost, recordingAvailable, transcriptAvailable, extractedVariables |
call.failed |
failedAt, failureReason |
call.missed |
missedAt, missReason |
About call.ended:
- Slovio waits up to 3 minutes for the call's cost to settle. If it is not settled by then, the event is sent with
"settled": falseand"amount": null. extractedVariablesholds what the agent captured. If it is larger than 32 KB, it is left out and"extractedVariablesOmitted": trueis sent instead.
A test event is a realistic call.ended with "test": true.
Headers
| Header | Value |
|---|---|
X-Slovio-Event |
The event type, for example call.ended. |
X-Slovio-Event-Id |
The event id. The same on every retry. |
X-Slovio-Delivery-Attempt |
1 for the first try, 2 for the first retry, and so on. |
X-Slovio-Timestamp |
Unix seconds. |
X-Slovio-Signature |
t=<unix seconds>,v1=<hex> |
v1 is the HMAC-SHA256 of <t>.<raw body>, keyed with your signing secret. Reject a timestamp more than 5 minutes old. See Verify webhook signatures for code.
Responding and retries
- Answer with any 2xx within 10 seconds.
- Timeouts, network errors, 408, 425, 429 and 5xx are retried. The wait starts at 30 seconds and doubles each time, up to 1 hour, for 10 attempts in total (about 3 hours).
- Any other 4xx fails at once and is not retried. Redirects are not followed.
- While an endpoint is switched off, its events are held, not dropped. Switch it back on within 24 hours and they are delivered.
- Deliveries opens the Delivery log for an endpoint, with each attempt and its status: Delivered, Retrying or Failed. Use Retry now to send a delivery that has not been delivered yet. Test events can't be retried.
Rotate the signing secret
Select Rotate secret on the endpoint. The old secret stops working at once, and every delivery after that, including queued retries, is signed with the new one. Update your server straight away.
Common questions
How is this different from the webhooks under Developer?
Messaging webhooks (More → Developer → APIs → Webhooks) carry message, contact and chatbot events. Calling webhooks carry call events only and are set up under Calling → Webhooks. See Webhooks.
Why does call.ended show settled false?
The cost was not final within 3 minutes of the call ending. Read the final cost with the Calls API, or check Call Logs.
Can I get the recording in the webhook?
No. recordingAvailable tells you a recording exists. Play or download it in Calling → Call Logs.
What happens if my server is down for an hour?
Slovio keeps retrying for about 3 hours, so the events arrive once your server is back. After 10 failed attempts the delivery is marked Failed. You can send it again with Retry now.
How many endpoints can I add?
Up to 10 calling webhook endpoints per account.
Stuck, or is something here out of date? Tell the team — we reply within a working day.