What Talqing POSTs to your webhook URL. Creating a subscription, verifying the signature, delivery rules and testing are on webhooks.

Envelope

Every event has the same outer shape:

Event types

GET /v1/webhooks/event-types returns {"all": [...], "live": [...]}: all is every subscribable type. live currently omits session.queued and session.in_progress, which are nonetheless delivered. For one call, events are dispatched in this order: session.queued (single outbound only), session.started and session.in_progress, recording.ready, session.completed. Each is a separate request, so do not rely on arrival order.

conversation.item.status

One event per move of an outbound channel message’s delivery_status. Receipts arrive out of order and repeat, but a message only ever moves forward, so you get each status at most once.

conversation.attachment.received

One event per file a person sent, as soon as it is stored. A document arrives with status: "pending"; the event is not sent again once the agent reads it. The url lives one hour, because this payload lands in logs. For a fresh one, call GET /v1/attachments/{attachment_id}.

session.queued

session.started

A chat sends it once, when its first message arrives, not on POST /v1/chats. If you subscribe to everything you receive both session.started and session.in_progress for every phone call; count one of them.

session.refused

Sent once for every inbound session refused at the door: the workspace is out of credits, the caller’s number is unreadable, calling is off on the WhatsApp number, the agent is unpublished, the same call arrived twice, or your inbound webhook did not answer. A WhatsApp or Telegram chat is refused only by the inbound webhook; a chat message turned away for credits or an unpublished agent sends no event. Neither session.started nor session.completed follows.

recording.ready

Sent once audio is in storage, before session.completed. Not sent for a call with no stored audio.
url is a credential valid for an hour. Copy the file or strip the field before you log the event. GET /v1/calls/{session_id}/recording mints a fresh link.

session.completed

The end-of-session report and the only event carrying the outcome. It is built from the stored session, so it matches GET /v1/calls/{session_id}.
  • A call sends it once, after finalize, recording, analysis and billing.
  • A chat sends it once, when the chat ends (the agent’s end_call, POST /v1/chats/{chat_id}/end, or replacement by a newer chat). A chat nobody ends never sends it; a chat that ended with no messages sends neither this nor session.started.
  • A session whose worker died before ending sends none. Reconcile from GET /v1/calls with start/end.

transcript rows

cost

How to read it is on costs.

transfer

There is no separate transfer event: a transfer ends the session, so session.completed follows immediately.

recording and screen_recording

Fetch a link with GET /v1/calls/{session_id}/recording; see recordings.