Skip to main content
The Post-Call Webhook is automatically sent to your specified webhook URL after each call is completed. This webhook contains call details, extracted variables, transcript, and optionally the recording URL.

Webhook Configuration

To enable post-call webhooks:
  1. Configure your assistant’s webhook URL in the assistant settings
  2. Enable “Post call webhook” in the assistant configuration
  3. 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:
Using one webhook URL for several assistants? Every payload carries assistant_id (UUID), assistant_name, and type, so you can route each call without configuring a separate endpoint per assistant.

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_outbound
string
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 calls
object
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 in extracted_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 content
string
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 array
string
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_url field in the payload
  • Custom variables: Define custom variables that the AI should extract from the conversation

Delivery and retries

The webhook is a POST 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.
A resend goes to the webhook URL currently configured on the assistant.

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 on id, the unique identifier of the call: process the first payload for an id and ignore, or idempotently update on, later ones.

Important Notes

  • The type field 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, as whatsapp_inbound or whatsapp_outbound
  • The assistant_id is 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_phone and assistant_phone fields can be null if the information is not available
  • The recording_url field is only included if you have enabled “Include recording in webhook” in your assistant settings
  • The lead object is only included for calls that are part of a campaign
  • The transfers array is only included for calls that have transfer calls associated with them
  • The extracted_variables object will contain the variables you defined in your assistant’s post-call schema configuration. New types (tags with multiple values, object, list, json) are arrays or objects, not strings
  • The ended_by field is customer, assistant, or system when the engine reported who hung up
  • Deliveries are retried on temporary errors and can be resent, so the same id can arrive more than once. See Delivery and retries