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. 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. 2

    call_answered and call_ended example

    In call_answered, status is "in_progress" and answered_at and answered_on are filled in. The same call's call_ended (account, inbox, conversation, contact and agent are 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. 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. 4

    The call, the channel and the conversation

    • event: call_started, call_answered, call_ended or call_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_cloud meaning WhatsApp Business API, or twilio).
    • conversation: id (the conversation number shown in the dashboard), status.
    • direction: incoming (the customer called) or outgoing (you called).
  5. 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 in call_ended and call_recording_ready of an answered call.
    • duration_known: in call_ended and call_recording_ready of an answered call, true when the length is known and false when it is not. null otherwise.
    • ended_by: who ended the call: agent, contact or system (a network or service failure). null when not known.
    • answered_on: where it was answered: app (the Clomni dashboard or app) or phone (WhatsApp itself, on the phone).
  6. 6

    Contact, agent, recording and summary

    • contact: id, name, phone_number, identifier. A WhatsApp customer who does not share their number can have no phone_number.
    • agent: id, name, email. On an outgoing call, who placed it; on an incoming one, who answered or declined it. null when 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; mixed when 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 example az. The summary is written in the account's language.

Document