Call webhooks: request fields and examples
Last updated: 9 October 2026 · 6 min read
Every request is a POST with a JSON body. All four events carry the same fields; the values show the call as it stands at that moment. No value is guessed: a field Clomni does not know is null.
Steps
-
1
call_started example
{ "event": "call_started", "delivery_id": "6f1c2b0e-5a7d-5e2b-9c41-8d3f0a6b7e21", "id": 512340, "provider_call_id": "3EB0C2A1F4D8", "account": { "id": 7, "name": "Example LLC" }, "inbox": { "id": 140, "name": "WhatsApp sales", "channel_type": "Channel::Whatsapp", "provider": "whatsapp_qr" }, "conversation": { "id": 2381, "status": "open" }, "message_id": 512340, "direction": "outgoing", "status": "ringing", "contact": { "id": 9921, "name": "Kamran Aliyev", "phone_number": "+994501112233", "identifier": null }, "agent": { "id": 12, "name": "Nigar Hasanova", "email": "[email protected]" }, "started_at": "2026-10-09T10:00:00Z", "answered_at": null, "ended_at": null, "duration_seconds": null, "duration_known": null, "ended_by": null, "answered_on": null, "recording_url": null, "transcript_available": false, "transcript": null, "summary": null, "language": null } -
2
call_answered and call_ended example
In
call_answered,statusis"in_progress"andanswered_atandanswered_onare filled in. The same call'scall_ended(account,inbox,conversation,contactandagentare left out for brevity; every request has them):{ "event": "call_ended", "delivery_id": "0b9e4d27-3c1a-5f60-8e2d-41a7c5b9f310", "id": 512340, "direction": "outgoing", "status": "completed", "started_at": "2026-10-09T10:00:00Z", "answered_at": "2026-10-09T10:00:06Z", "ended_at": "2026-10-09T10:01:41Z", "duration_seconds": 95, "duration_known": true, "ended_by": "agent", "answered_on": "app", "recording_url": null, "transcript_available": false, "transcript": null, "summary": null, "language": null } -
3
call_recording_ready example
{ "event": "call_recording_ready", "delivery_id": "c47a1e95-8b2f-5d03-a6e4-9f1b2c7d8e40", "id": 512340, "duration_seconds": 95, "recording_url": "https://my.clomni.co/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOn.../call-3EB0C2A1F4D8.wav", "transcript_available": true, "transcript": [ { "speaker": "agent", "at": 0.4, "text": "Hello, Clomni store, this is Nigar." }, { "speaker": "contact", "at": 3.1, "text": "Hi. I ordered yesterday, when will it arrive?" } ], "summary": { "title": "Delivery time of an order", "points": ["The customer asked when yesterday's order would arrive.", "They were told it will arrive today by 18:00."], "next_step": "Text the customer when the courier sets off." }, "language": "en" } -
4
The call, the channel and the conversation
event:call_started,call_answered,call_endedorcall_recording_ready.delivery_id: the id of this event of this call. It does not change on a retry.id: the call's id in Clomni, the same in every event of a call. Currently the same as the call bubble's message id (message_id).provider_call_id: the call's id at WhatsApp or Twilio.account:id,name.inbox:id,name,channel_type,provider(whatsapp_qr,whatsapp_cloudmeaning WhatsApp Business API, ortwilio).conversation:id(the conversation number shown in the dashboard),status.direction:incoming(the customer called) oroutgoing(you called).
-
5
Outcome, times and duration
status:ringing,in_progress,completed,missed(an incoming call nobody answered),no_answer(an outgoing call nobody answered),rejected,busy,failed.started_at,answered_at,ended_at: when the call rang, was answered and ended (ISO 8601, UTC).duration_seconds: how long the conversation lasted, in seconds, from the answer. Only incall_endedandcall_recording_readyof an answered call.duration_known: incall_endedandcall_recording_readyof an answered call,truewhen the length is known andfalsewhen it is not.nullotherwise.ended_by: who ended the call:agent,contactorsystem(a network or service failure).nullwhen not known.answered_on: where it was answered:app(the Clomni dashboard or app) orphone(WhatsApp itself, on the phone).
-
6
Contact, agent, recording and summary
contact:id,name,phone_number,identifier. A WhatsApp customer who does not share their number can have nophone_number.agent:id,name,email. On an outgoing call, who placed it; on an incoming one, who answered or declined it.nullwhen not known.recording_url: a link to the recording. It works for as long as the recording is kept and redirects to a file address valid for 5 minutes. To keep the recording, download the file.transcript_available,transcript: what was said, line by line:speaker(agent,contact;mixedwhen both sides are on one recording),at(seconds from the start of the recording),text.summary:title,points(2 to 5 items),next_step. Only for answered calls longer than 10 seconds.language: the transcript's language, for exampleaz. The summary is written in the account's language.