config.settings.webhookUrl. When a call is placed or received using that agent, Verbeo sends HTTP POST requests at key points in the call lifecycle. All requests use Content-Type: application/json.
There are three call lifecycle events. Verbeo delivers them in lifecycle order, holding a later event while an earlier one for the same call is still being retried (see Delivery order). After a long outage on your side they can still arrive out of order — treat each event as self-contained.
Every event payload includes
call_id and agent_id so a single webhook consumer can correlate all three events for the same call.
Configuring your webhook URL
Set thewebhookUrl field in your agent’s configuration with Update assistant. Only the webhook changes:
localhost, 127.0.0.1, 10.x.x.x, 192.168.x.x or 169.254.169.254 — and sends no events to them. To receive events on a server running on your own machine, expose it through a public tunnel. Use the final address as your webhook URL: Verbeo follows a 307 or 308 redirect once, and no other redirects (see Retries).
call_started
Fires once, immediately after the call is answered. Use this event to start any real-time tracking or alerting for active calls.
Payload
Fields
string
required
Always
"call_started".string
required
Verbeo UUID for this call. Use this to correlate with
call_ended and call_analyzed events.string
required
UUID of the agent handling the call.
string
required
ISO 8601 timestamp of when the event was emitted.
string
required
"started".string
required
ISO 8601 timestamp of when the call was answered.
string
required
"inbound", "outbound", or "web".string
Originating phone number in E.164 format.
null for web calls.string
Destination phone number in E.164 format.
null for web calls.object
Key-value pairs passed at call initiation. Empty object
{} if none were provided.call_ended
Fires once, immediately when the call disconnects. The transcript and analysis data are not yet available at this point — those arrive with call_analyzed.
Payload
Fields
string
required
Always
"call_ended".string
required
Final call status, typically
"completed".string
required
ISO 8601 timestamp of when the call was answered.
string
required
ISO 8601 timestamp of when the call disconnected.
number
required
Call duration in seconds.
number
required
Cost in cents, derived from your workspace’s usage rate per minute.
string
required
How the call ended. Common values:
completed, user_hangup, agent_hangup, timeout, error. This is an open set — handle values you don’t recognize gracefully.call_analyzed
Fires once, when transcription, the summary and AI post-call analysis are complete — usually within seconds of the call ending (see Timing). It is sent for every completed call. This event carries the full call record including the conversation transcript, AI summary, structured analysis fields, and recording URL.
Payload
Fields
string
required
Always
"analyzed".object
required
Complete call record.
Delivery
Timing
call_startedandcall_endedare sent immediately.call_analyzedis sent once the transcript, summary and post-call analysis are ready — usually within seconds of the call ending.- If generating them fails (for example, the AI model is unavailable), Verbeo keeps retrying in the background and
call_analyzedwaits. It can take up to 3 hours, and it is still sent only once. In the rare case that they are still missing after 3 hours, it is sent with what is available, sosummaryoranalysis_datacan benull. - Once Verbeo has recorded a
2xxfrom your endpoint forcall_analyzed, it never sends it again on its own. It is sent again only when someone in your workspace clicks Retry on the call’s Webhooks tab in the dashboard (see Retry a delivery), or uses Enhance Transcript on the call, which sends it with the improved transcript.
Delivery order
Verbeo delivers each call’s events in lifecycle order:call_started, then call_ended, then call_analyzed. While an earlier event is still being retried, the later ones wait — but only until 30 minutes after the call ended. After that they are sent anyway, and so are resends from the dashboard, so if your endpoint is down for longer, events can arrive out of order. Each event is self-contained: you never need an earlier event to process a later one.
Retries
A delivery succeeds when your endpoint returns any2xx status within 12 seconds. Any other outcome — a non-2xx status, a timeout, a connection error or a redirect that isn’t followed — is retried:
- Up to 12 automatic attempts per event. A resend from the dashboard starts a fresh series of up to 12.
- Exponential backoff. The wait after each failed attempt doubles — 2, 4, 8, 16, 32, 64, 128 and 256 minutes — and is then capped at 6 hours. The 12th and final attempt happens about 26 hours after the first.
Retry-Afteris honoured. When a429or503response includes aRetry-Afterheader (in seconds or as an HTTP date), Verbeo waits that long instead, clamped between 1 minute and 6 hours.- Only
307and308redirects are followed, and only once. On a307or308, Verbeo sends the same request, with the same body, to the address in theLocationheader. Any other3xx(such as301or302), or a second redirect from that address, is not followed and counts as a failed attempt. Configure your webhook URL as the final address.
Responding to webhook events
Your webhook endpoint must return an HTTP2xx status code within a reasonable timeout — Verbeo waits 12 seconds (see Retries). No specific response body is required for call lifecycle events.