Developer API
Webhooks: live call events sent to your server
Get a message on your own server the moment a call starts, is answered, is missed or ends, when a voicemail arrives and when a recording is ready. Every event, its fields and how to check it came from us.
Which plans include it
Included on every plan, including the Free Trial.
What it means
A webhook is an address on your server. When something happens on a call we send it a short JSON message (an HTTP POST), so your CRM or dashboard updates by itself, with no polling.
What it does
- call.started: an incoming call rings in on one of your numbers, or one of your users dials out (from a phone, the app or the API).
- call.answered: the call is picked up. For an outgoing call, the person you rang answered; for an incoming call, one of your users answered.
- call.ended: the call has finished, with its length and how it ended.
- call.missed: an incoming call that nobody picked up (it also gets call.ended).
- voicemail.received: a caller left a voicemail.
- recording.completed: a call recording is ready, with the id to download it by.
- payment.succeeded: your Silux Call bill has been paid.
- payment.failed: a payment did not go through, either your Silux Call bill or a card payment taken over the phone.
- user.created: a user was added to your account.
- user.deactivated: a user was switched off or deleted (reason "switched_off" or "deleted").
Every part of the page
- callId
- The same value on call.started, call.answered, call.ended and call.missed for one call, so you can join them up.
- id (call.ended / call.missed)
- The call's id in GET /api/v1/calls.
- callRecordId (recording.completed)
- The id of the call the recording belongs to, the same as id on call.ended.
- direction
- "inbound" or "outbound".
- from / to
- The calling and called numbers.
- extension
- The extension that made or answered the call, when there is one.
- status (call.ended)
- "answered", "no answer", "busy" or "failed", the same as the call history API.
- audioUrl (recording.completed)
- Download the MP3 from here with your API key (GET /api/v1/recordings/{recordingId}/audio).
- invoiceNumber / amount / currency (payment.succeeded, payment.failed)
- The bill, the amount and the currency. On payment.failed, attempt and nextAttemptAt say which try it was and when the next one is.
- userId / email / reason (user.created, user.deactivated)
- The user who was added, switched off or deleted.
- Headers
- X-Webhook-Event (the event name), X-Webhook-Timestamp and X-Webhook-Signature.
How to use it
Add a webhook
- Open Settings and choose the Webhooks tab.
- Press Add Webhook and paste your address. It must start with https:// and be reachable from the internet.
- Tick the events you want and press Save Webhook.
- Press Send test. "Delivered" means your server answered with a 2xx status.
Change the events later
- On the webhook card, click an event to turn it on (✓) or off (+). It saves straight away.
See what was sent
- On the webhook card press Deliveries. You see each event, whether it was delivered, the status your server returned and the time.
Check a message came from us
- Show the signing secret on the webhook card (eye button) and keep it on your server.
- X-Webhook-Signature is an HMAC-SHA256 (hex) of the raw request body exactly as received, using that secret.
- Work it out on your side from the raw body (before parsing the JSON) and compare the two values in constant time.
- You can also put your own key in the address, for example https://example.co.uk/hook?key=…, and check it on your side.
Examples
call.started (outgoing)
{"event":"call.started","timestamp":"2026-11-05T10:39:57.120Z","tenantId":"…","data":{"callId":"1793820589.25805","direction":"outbound","from":"441632960000","to":"01632960123","extension":"1012","startedAt":"2026-11-05T10:39:57.100Z"}}
call.ended
{"event":"call.ended","data":{"id":"24cb456e-…","callId":"1793820589.25805","direction":"outbound","from":"441632960000","to":"01632960123","status":"answered","durationSeconds":203,"billableSeconds":195,"startedAt":"…","answeredAt":"…","endedAt":"…"}}
recording.completed
{"event":"recording.completed","data":{"recordingId":"9b1f…","callRecordId":"24cb456e-…","from":"441632960000","to":"01632960123","durationSeconds":195,"format":"mp3","audioUrl":"https://www.siluxcall.co.uk/api/v1/recordings/9b1f…/audio"}}
Recommended settings
- ★Reply with a 2xx status straight away and do the work afterwards. We wait up to 10 seconds and try 3 times.
- ★Use callId to join the events for one call. Events can arrive a second or two apart, and call.ended may arrive before recording.completed.
- ★After 10 failed deliveries in a row the webhook is switched off. Fix your server, then switch it back to Active on the card.
- ★Use the call history API to fill any gap, for example after your server was down.
Abbreviations on this page
- Webhook
- An automatic message our system sends to a web address you choose whenever something happens, such as a call ending. Used to connect other software.
- Example: When a call ends, a webhook sends its details to your own system automatically.
- API key
- A secret password that lets one piece of software use another. Treat it like a password.
- Example: Treat an API key like a password: anyone with it can use your account's API.
Questions
Do I need an API key for webhooks?+
No. Webhooks work on their own. You need a key only to download recordings or start calls from your system.
Can I send events to more than one address?+
Yes. Add a webhook for each address.
Why did a call not send call.answered?+
Nobody picked up. Outgoing calls that are not answered send call.started and call.ended; incoming ones also send call.missed.
Related help
Already a customer? Open this page in your dashboard: Settings → Webhooks. New to Silux Call? See the plans or start a free trial.