Skip to main content
Verbeo delivers real-time webhook events to the URL configured in your agent’s 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.
Treat every incoming webhook as idempotent. Network issues or retries can cause the same event to be delivered more than once. Use the combination of call_id and event as your deduplication key.

Configuring your webhook URL

Set the webhookUrl field in your agent’s configuration with Update assistant. Only the webhook changes:
The URL must be publicly reachable. Verbeo refuses webhook URLs that point at a private, local or cloud metadata address — for example 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_started and call_ended are sent immediately.
  • call_analyzed is 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_analyzed waits. 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, so summary or analysis_data can be null.
  • Once Verbeo has recorded a 2xx from your endpoint for call_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.
Retries and the delivery order below can add to these times when your endpoint is failing.

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 any 2xx 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-After is honoured. When a 429 or 503 response includes a Retry-After header (in seconds or as an HTTP date), Verbeo waits that long instead, clamped between 1 minute and 6 hours.
  • Only 307 and 308 redirects are followed, and only once. On a 307 or 308, Verbeo sends the same request, with the same body, to the address in the Location header. Any other 3xx (such as 301 or 302), or a second redirect from that address, is not followed and counts as a failed attempt. Configure your webhook URL as the final address.
After the 12th failed attempt Verbeo stops retrying the event. You can still resend it from the dashboard once your endpoint is fixed. See Monitor and retry deliveries, where every attempt’s full request and response is shown.

Responding to webhook events

Your webhook endpoint must return an HTTP 2xx status code within a reasonable timeout — Verbeo waits 12 seconds (see Retries). No specific response body is required for call lifecycle events.
Schema changes to webhook payloads are additive. New fields may appear in future releases without notice. Fields documented here will not be removed or renamed without a breaking-change notice.