> ## Documentation Index
> Fetch the complete documentation index at: https://docs.assistable.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Receive call-start and post-call webhooks

> Connect call events to a receiver and validate its real payload before using it in automations.

Use call webhooks to notify a system you control when a call starts and to receive available results after it ends. Configure each assistant separately.

## Before you start

Prepare an HTTPS receiver that can record test requests and process JSON. Decide which account and contact records it may update. Use a dedicated test contact and phone number for validation.

A call-start notification is asynchronous. Do not depend on its response to delay the call, rewrite the greeting, or supply information the assistant must have before speaking.

## Configure the assistant

1. Open the assistant's **Call Settings**.
2. Under **Webhooks**, enter the call-start destination in **Incoming webhook** if your workflow needs it.
3. Enter the results destination in **Post-call webhook**.
4. Wait for the settings to show **Saved**.
5. Use the test control to check basic reachability, then make a real test call. The test control sends a sample; it is not proof of the real event's contents.
6. Inspect both received requests and associate them with the test call before creating mappings.

## Map the correct event

The current call-start notification uses `event: "call_started"` and includes `call_control_id`, `direction`, `to`, `from`, `contact_id`, and `assistant_id`. Contact identity can be absent.

The assistant's post-call webhook sends the following flat object. Text/identity fields are strings or `null`, numeric duration fields are numbers or `null`, collections default to empty arrays or objects, and `added_to_wallet` is always `true` in this payload. Do not infer a closed list of values for free-text provider/analysis fields.

| Field | Type and meaning |
| - | - |
| `call_id` | String/null; call identifier for correlation and deduplication. |
| `location_id` | String/null; connected location identifier. |
| `assistant_id` | String/null; assistant identifier. |
| `contact_id` | String/null; linked contact identifier. |
| `contact_source` | String/null; source of the contact association when available. |
| `call_type` | String/null; recorded call type. |
| `direction` | String/null; recorded calling direction. |
| `to` | String/null; destination number. |
| `from` | String/null; source number. |
| `disconnection_reason` | String/null; normalized call disposition. See [call dispositions](/v3/guides/call-results/dispositions). |
| `call_completion_reason` | String/null; underlying hangup cause, distinct from a business outcome. |
| `user_sentiment` | String/null; available sentiment analysis. |
| `call_summary` | String/null; available generated summary. |
| `full_transcript` | String/null; transcript text. |
| `call_time_ms` | Number/null; call duration in milliseconds. |
| `call_time_seconds` | Number/null; call duration in seconds. |
| `start_timestamp` | String/null; recorded start timestamp, which can be an epoch value serialized as text. Do not assume an ISO date string. |
| `end_timestamp` | String/null; recorded end timestamp with the same format caveat. |
| `recording_url` | String/null; primary recording URL when available. |
| `transfer_recording_url` | String/null; transfer recording URL when available. |
| `recordings` | Array; available recording references. |
| `transcript_object` | Array; structured transcript entries when available. |
| `extractions` | Object; configured extracted results. |
| `called_tools` | Array; recorded tool calls. |
| `latency_averages` | Object; available latency measurements. |
| `variables` | Object; call variables. |
| `added_to_wallet` | Boolean `true`; compatibility marker. It is not a payment receipt or independent proof of a wallet transaction. |

Use `contact_id` to identify the contact. Capture your own event before wiring a CRM action. The public v3 API response envelope and other webhook types are separate contracts.

## Verify delivery and processing

Complete a call with a recognizable detail. Confirm the receiver captured its payload, wrote to the correct record, and completed any downstream action. Test a missing summary and a repeated event. Use `call_id` to avoid duplicate notes or messages.

Respond promptly: the post-call request times out after 10 seconds; the call-start request uses 5 seconds. Do not rely on guaranteed retries or exactly-once delivery. A receiver should record failures and provide a way to reconcile missing call results.

## Troubleshooting

* **Test button works but no real event arrives:** check the selected assistant and saved URL, then inspect the real call and receiver logs.
* **Request arrived but CRM did not update:** verify identity mapping, authorization, and each downstream action's result.
* **Missing transcript or analysis:** leave the value unknown and handle it explicitly; do not reuse a previous call's value.
* **Duplicate notification:** record processed call IDs before sending.

[Save results to the CRM](/v3/guides/call-results/save-to-crm) · [Send a final summary](/v3/guides/call-results/send-summary) · [Voice settings reference](/v3/voice-settings)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.