mrearthbound
01/30/2026, 5:50 AMAI Evy
01/30/2026, 5:51 AMAI Evy
01/30/2026, 5:51 AMinbound_webhook_url)
This webhook fires before the call connects when an inbound call is received. [(1) ]() [(2) ]()
It allows you to:
- Filter and reject unwanted inbound calls [(1) ]()
- Override agent id or version for that specific call
- Set dynamic variables and metadata for the call
- Add context based on the caller before the conversation begins
The event type is call_inbound and the call object hasn't been created yet at this point.
## Agent Level Webhook
This webhook fires during and after the call for call lifecycle events. [(3) ]()
It sends events for:
- call_started - when the call begins
- call_ended - when the call completes, transfers, or encounters an error
- call_analyzed - when post-call analysis is complete
**In short**: The phone number inbound webhook is for pre-call setup and routing decisions, while the agent level webhook is for tracking call lifecycle events and getting call data after the conversation.AI Evy
01/30/2026, 5:51 AMAI Evy
01/30/2026, 5:51 AMAI Evy
01/30/2026, 6:40 AMmrearthbound
01/30/2026, 6:40 AMAI Evy
01/30/2026, 6:40 AMinbound_webhook_url is correctly set on the phone number. [(1) ]()
## 2. Check Webhook Response Requirements
The webhook has a timeout of 10 seconds. If within 10 seconds no success status (2xx) is received, the webhook will be retried, up to 3 times. [(2) ]()
Your n8n webhook must return a 2xx status code for Retell to consider it successful.
## 3. Confirm You're Testing Inbound Calls
The inbound webhook only fires for inbound calls to your configured number. It does not fire for outbound calls you initiate.
## 4. Return Valid Response Data
A community user experienced a similar issue where returning empty values caused the call to fail with an "inbound webhook error" and the line appeared busy. [(3) ]()
If your webhook returns dynamic variables, ensure you're returning values that Retell can process. One workaround suggested was to return placeholder values like "unknown" instead of empty strings when no data is found.
## 5. Test Your Webhook Endpoint Independently
Try removing the webhook temporarily to confirm calls work without it, then create a simple test webhook that always returns a valid 200 response with minimal data to isolate whether the issue is with your n8n workflow logic or the webhook connection itself.
## Questions to Help Narrow Down
- Are you seeing any error messages in your Retell dashboard?
- Is your n8n webhook endpoint publicly accessible (not localhost) ?
- What does your n8n webhook response look like?AI Evy
01/30/2026, 6:40 AMAI Evy
01/30/2026, 6:40 AMmrearthbound
01/30/2026, 6:41 AMAI Evy
01/30/2026, 6:41 AMAI Evy
01/30/2026, 6:41 AMwebhook_url field on the agent itself. [(1) ]()
Confirm it's set correctly and points to your publicly accessible n8n endpoint.
## 2. Check Webhook Timeout & Response
The webhook has a timeout of 10 seconds. If within 10 seconds no success status (2xx) is received, the webhook will be retried, up to 3 times. [(2) ]()
Make sure your n8n webhook responds with a 2xx status code within that window.
## 3. Confirm Call Actually Connected
If the call did not connect (like dial_failed, dial_no_answer, dial_busy) , the call_started webhook event will not be triggered. It will still trigger call_ended and call_analyzed.
Check your call logs to see if calls are actually connecting.
## 4. Check for 403 or Blocking Issues
A community user reported their agent-level webhook was returning 403 even though it worked locally with ngrok. The issue was likely a configuration problem on their server side blocking the requests. [(3) ]()
Test your n8n webhook URL using a tool like webhook.site to verify Retell is sending the events.
## 5. Possible Intermittent Issues
Another community user reported agent-level webhooks not receiving data during a specific time window, but it resolved itself. [(4) ]()
Check if this is consistent or intermittent.
## Questions to Help Narrow Down
- Is your n8n webhook URL publicly accessible (not localhost) ?
- Are you seeing any calls in your Retell dashboard with completed status?
- Can you test theAI Evy
01/30/2026, 6:41 AMAI Evy
01/30/2026, 6:41 AMAI Evy
01/30/2026, 6:41 AMmrearthbound
01/30/2026, 7:05 AMAI Evy
01/30/2026, 7:05 AMAI Evy
01/30/2026, 7:05 AMcall_analyzed fires, you need to set the post_call_analysis_data field on your agent.
## Configure Post-Call Analysis Data on Your Agent
You define the fields you want extracted using the post_call_analysis_data array when creating or updating your agent. [(1) ]()
Here's an example from the Create Voice Agent API:
javascript
"post_call_analysis_data": [
{
"type": "string",
"name": "customer_name",
"description": "The name of the customer.",
"examples": [
"John Doe",
"Jane Smith"
]
}
]
## Available Analysis Types
You can extract four types of data: [(2) ]()
- Boolean (True/False) – Simple yes/no determinations
- Text (String) – Detailed textual information like summaries or action items
- Number (Numerical value) – Quantitative measurements
- Selector (Enum) – Categorization from a fixed list
## Choose Your Analysis Model
You can also set post_call_analysis_model to specify which model performs the analysis. The default is gpt-4.1-mini. [(1) ]()
javascript
"post_call_analysis_model": "gpt-4.1-mini"
## How It Reaches Your Webhook
Once configured, when a call ends and analysis completes, the call_analyzed webhook event will include your custom analysis results. Make sure your agent-level webhook_url is set to receive this event.AI Evy
01/30/2026, 7:05 AMAI Evy
01/30/2026, 7:05 AMmrearthbound
01/30/2026, 7:07 AMAI Evy
01/30/2026, 7:07 AMAI Evy
01/30/2026, 7:08 AMjavascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
const agentResponse = await client.agent.update('16b980523634a6dc504898cda492e939', {
agent_name: 'Jarvis',
}) ;
console.log(agentResponse.agent_id) ;
## To Add Post-Call Analysis Data
You'd call client.agent.update() with your agent ID and include the post_call_analysis_data array:
javascript
const agentResponse = await client.agent.update('YOUR_AGENT_ID', {
post_call_analysis_data: [
{
type: 'string',
name: 'customer_name',
description: 'The name of the customer.',
examples: ['John Doe', 'Jane Smith']
}
]
}) ;
## API Endpoint Details
- **Method**: PATCH
- **Path**: /update-agent/{agent_id}
- **Authorization**: Bearer token with your API key
You only need to include the fields you want to update—everything else stays the same. The API updates the agent's latest draft version.AI Evy
01/30/2026, 7:08 AMAI Evy
01/30/2026, 7:08 AM