Webhook Configuration
To enable post-call webhooks:- Configure your assistant’s webhook URL in the assistant settings
- Enable “Post call webhook” in the assistant configuration
- Define post-call variables that the AI should extract
Request Format
The webhook is sent as a POST request to your configured URL with the following JSON payload:Payload Structure
integer
Unique identifier of the call
string
Channel and direction of the call. One of
inbound, outbound, web (browser widget voice call), whatsapp_inbound, or whatsapp_outboundstring
Unique identifier (UUID) of the assistant that handled the call
string
Name of the assistant that handled the call, as shown in the dashboard
string
Phone number of the customer in E.164 format (e.g., “+1234567890”) or null if not available
string
Phone number used by the assistant in E.164 format or null if not available
integer
Duration of the call in seconds
string
Final status of the call (e.g., “completed”, “busy”, “failed”)
string
Who hung up:
customer (the caller), assistant (hang-up tool or voicemail), or system (max duration, silence, or a provider error). null on older callsobject
Variables extracted by AI based on your post-call schema configuration. String, number, and true/false stay scalars. Tags with multiple values, objects, lists, and JSON arrive as arrays or objects
Extracted Variable Types
Each variable in your assistant’s post-call schema has a type, and the type decides what arrives inextracted_variables.
A variable the assistant could not fill arrives as
null.
Structured variables in extracted_variables
Point your integration at the type rather than at the value. A Tags variable that allows several
values sends an array even when the assistant picks only one.
object
Variables that were passed to the assistant before the call started
array
Full transcript of the call, ordered oldest to newest. Note that this is a different shape from the conversation ended webhook, which uses
role and contentstring
The same conversation as a ready-to-read string, with
AI: and Customer: prefixes and one turn per line. Use this when you just need readable text and do not want to iterate the arraystring
URL to download the call recording (only included if “Include recording in webhook” is enabled in assistant settings)
string
ISO 8601 timestamp when the call was initiated
string
ISO 8601 timestamp when the call was completed (uses updated_at from the call record)
object
Lead information (only included for campaign calls)
array
List of transfer calls made during this call (only included if the call has transfers)
Webhook Settings
You can configure the following options for your post-call webhook:- Send webhook only on completed: Only send the webhook for successfully completed calls
- Include recording in webhook: Include the
recording_urlfield in the payload - Custom variables: Define custom variables that the AI should extract from the conversation
Delivery and retries
The webhook is aPOST with a JSON body. Reply with any 2xx status within 20 seconds; the response body is ignored. Do your processing after you have replied, or hand it to a background task, so a slow handler never turns into a timeout.
If the delivery fails with a temporary error, it is retried automatically with a growing delay:
The last attempt is made about 8.5 minutes after the first one. Retried: any
5xx (for example 502 Bad Gateway or 503 Service Unavailable), 408, 429, connection failures and timeouts (no response within 20 seconds). Any other 4xx (for example 400, 401, 403, 404) is treated as a problem with the endpoint or the payload and is not retried.
After the last failed attempt the delivery is marked as failed. The call page in your dashboard always shows the HTTP status and body of the latest attempt, and the same information is returned as webhook_response by Get call.
Resending webhooks
You can send the webhook of a call again at any time:- From the call page: Re-send webhook in the post-call webhook section sends the call’s data again.
- From the calls list: Resend Webhooks evaluates the selected calls again and re-sends their webhooks, up to 500 calls at a time.
- From the API: Resend call webhooks sends the data of one or more calls again, up to 500 per request.
- From the AI connector: ask your assistant to resend the webhook of a call.
Handle duplicates
The same call can reach your endpoint more than once: a retry can arrive after a slow attempt that your endpoint did process, and a resend can overlap with an automatic retry. Treat the webhook as at-least-once and de-duplicate onid, the unique identifier of the call: process the first payload for an id and ignore, or idempotently update on, later ones.
Important Notes
- The
typefield tells you both the channel and the direction of the call. Text conversations (web widget chat, WhatsApp messages) never arrive here — they use the conversation ended webhook instead. Completed WhatsApp voice calls do arrive here, aswhatsapp_inboundorwhatsapp_outbound - The
assistant_idis the assistant’s UUID, the same identifier used by the other webhooks and by the API — not the numeric id shown in the dashboard URL - The
customer_phoneandassistant_phonefields can benullif the information is not available - The
recording_urlfield is only included if you have enabled “Include recording in webhook” in your assistant settings - The
leadobject is only included for calls that are part of a campaign - The
transfersarray is only included for calls that have transfer calls associated with them - The
extracted_variablesobject will contain the variables you defined in your assistant’s post-call schema configuration. New types (tagswith multiple values,object,list,json) are arrays or objects, not strings - The
ended_byfield iscustomer,assistant, orsystemwhen the engine reported who hung up - Deliveries are retried on temporary errors and can be resent, so the same
idcan arrive more than once. See Delivery and retries

