MehXBot
06/12/2026, 6:04 AMAI Evy
06/12/2026, 6:04 AMAI Evy
06/12/2026, 6:05 AMbash
curl --location 'localhost:8080/webhook' \
--header 'Content-Type: application/json' \
--data '{
"event": "call_ended",
"call": {
"call_type": "phone_call",
"from_number": "+12137771234",
"to_number": "+12137771235",
"direction": "inbound",
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6",
"agent_id": "oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD",
"call_status": "registered",
"metadata": {},
"retell_llm_dynamic_variables": {
"customer_name": "John Doe"
},
"start_timestamp": 1714608475945,
"end_timestamp": 1714608491736,
"disconnection_reason": "user_hangup",
"transcript": "...",
"opt_out_sensitive_data_storage": false
}
}'AI Evy
06/12/2026, 6:05 AMcall_status field will show you if calls are working (registered, ongoing, ended, or error) [(3) ]() [(2) ]() .
Webhook Reliability:
Retell's webhooks have a 10-second timeout and will retry up to 3 times if they don't receive a success status (2xx) [(4) ]() . Webhooks are triggered in order but are non-blocking .
For comprehensive monitoring, you could create a test call periodically and check if your webhook receives the expected events (call_started, call_ended, call_analyzed) .AI Evy
06/12/2026, 6:05 AMAI Evy
06/12/2026, 6:05 AMMehXBot
06/12/2026, 6:06 AMAI Evy
06/12/2026, 6:06 AMAI Evy
06/12/2026, 6:06 AMAI Evy
06/12/2026, 6:06 AMAI Evy
06/12/2026, 6:06 AMMehXBot
06/15/2026, 9:01 AMAI Evy
06/15/2026, 9:01 AMAI Evy
06/15/2026, 9:01 AMcall_analysis object in the call response. Specifically, look for the in_voicemail field [(1) ]() .
Here's the structure:
json
"call_analysis": {
"call_summary": "The agent called the user to ask question about his purchase inquiry...",
"in_voicemail": false,
"user_sentiment": "Positive",
"call_successful": true,
"custom_analysis_data": {}
}
The in_voicemail boolean field indicates whether the call reached a voicemail . This field is available in the call analysis data after the call ends .
Additionally, you can check the disconnection_reason field - if it equals "voicemail_reached", that also indicates the call went to voicemail .
The call analysis becomes available after you receive the call_analyzed webhook event .AI Evy
06/15/2026, 9:01 AMAI Evy
06/15/2026, 9:01 AMMehXBot
06/15/2026, 9:02 AMAI Evy
06/15/2026, 9:02 AMAI Evy
06/15/2026, 9:02 AMcall_analysis field exists before using it .
Common reasons you might not receive call analysis:
1. Call didn't connect - If the call has a disconnection reason like dial_failed, dial_no_answer, or dial_busy, the call_started webhook won't be triggered, though call_ended and call_analyzed webhooks will still fire [(2) ]() .
2. No conversation occurred - If there was no actual conversation during the call, the analysis fields won't be populated [(1) ]() .
3. Webhook configuration - Make sure your webhook is configured to receive the call_analyzed event. The default webhook events for voice agents are call_started, call_ended, and call_analyzed [(2) ]() . You can filter which events are delivered using the webhook_events field when creating or updating an agent .
How to access call analysis when available:
You can retrieve analysis results through three methods [(1) ]() :
- Dashboard - View in the history tab under "Conversation Analysis" column
- Webhook - Receive real-time notifications when the call_analyzed event fires [(1) ]() [(2) ]()
- API - Use the Get Call API to retrieve the call_analysis field programmatically [(1) ](AI Evy
06/15/2026, 9:02 AMcall_analysis object contains fields like call_summary, in_voicemail, user_sentiment, call_successful, and custom_analysis_data [(3) ]() .
If you're still not receiving analysis for calls that should have it, verify that your webhook endpoint is correctly configured and returning a success status (2xx) within the 10-second timeout [(2) ]() .AI Evy
06/15/2026, 9:03 AMAI Evy
06/15/2026, 9:03 AMMehXBot
06/15/2026, 9:04 AMAI Evy
06/15/2026, 9:04 AMAI Evy
06/15/2026, 9:04 AMbash
curl --location 'localhost:8080/webhook' \
--header 'Content-Type: application/json' \
--data '{
"event": "call_ended",
"call": {
"call_type": "phone_call",
"from_number": "+12137771234",
"to_number": "+12137771235",
"direction": "inbound",
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6",
"agent_id": "oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD",
"call_status": "registered",
"metadata": {},
"retell_llm_dynamic_variables": {
"customer_name": "John Doe"
},
"start_timestamp": 1714608475945,
"end_timestamp": 1714608491736,
"disconnection_reason": "user_hangup",
"transcript": "...",
"opt_out_sensitive_data_storage": false
}
}'
Test with Postman:
You can also use Postman to send the same JSON payload to your local endpoint .
Make your endpoint online:
Once local testing works, deploy your endpoint using Ngrok to make it accessible online :
1. Install ngrok: brew install ngrok/ngrok/ngrok
2. Start ngrok: `ngrok http
3. Use the generated URL (e.g., ` as your webhook endpoint
Live testing:
After registering your webhook endpoint, start a web call in the dashboard to verify the webhook is triggered correctly .AI Evy
06/15/2026, 9:04 AMAI Evy
06/15/2026, 9:04 AMMehXBot
06/16/2026, 12:31 PMAI Evy
06/16/2026, 12:31 PMAI Evy
06/16/2026, 12:31 PMskip response turned on) before the transfer node .
Key transfer settings to configure:
1. Enable human detection - This ensures the agent checks if a human is present after the transfer target answers [(1) ]() [(2) ]()
2. Auto-greet - If enabled, the agent will immediately say "Hello" when the transfer target picks up, which encourages a response and increases the likelihood of detecting a human
3. Whisper message - A message spoken privately to the transfer target before connecting them to the original callerAI Evy
06/16/2026, 12:31 PMAI Evy
06/16/2026, 12:31 PMAI Evy
06/16/2026, 12:31 PM