Ciaran
06/11/2026, 3:53 PMAI Evy
06/11/2026, 3:53 PMAI Evy
06/11/2026, 3:54 PMAI Evy
06/11/2026, 3:54 PMAI Evy
06/11/2026, 3:54 PMCiaran
06/11/2026, 3:56 PMAI Evy
06/11/2026, 3:56 PMAI Evy
06/11/2026, 3:56 PMoverride_dynamic_variables field .
The API accepts a PATCH request to /v2/update-live-call/{call_id} with a body structure like :
json
{
"fields_to_override": {
"override_dynamic_variables": {
"additional_discount": "15%"
}
}
}
This override takes effect immediately on the live call . You only need to set the delta where you want to override—no need to set the entire dynamic variables object .
For calls that have ended, you can use the Update Call API at /v2/update-call/{call_id}, which also supports the override_dynamic_variables field [(2) ]() . Setting this to null will remove any existing override .
However, I don't have specific documentation about webhook events triggered specifically for "transfer has been successful" or how dynamic variables are handled in that webhook payload. The sources show webhook events like call_started, call_ended, and call_analyzed [(3) ]() , where dynamic variables appear in the call_analyzed event .
Check out these potentially useful sources: [Update Live Call]() , [Update Call]()
Would you like me to try to provide a general approach based on my knowledge?AI Evy
06/11/2026, 3:56 PMAI Evy
06/11/2026, 3:56 PMCiaran
06/11/2026, 3:57 PMAI Evy
06/11/2026, 3:57 PMAI Evy
06/11/2026, 3:58 PMtransfer_started - Triggered when a transfer is initiated
- transfer_bridged - Triggered when a transfer successfully bridges
- transfer_cancelled - Triggered when a transfer is cancelled or fails to connect
- transfer_ended - Triggered when the transfer leg ends
The transfer_bridged event is specifically what you're looking for to confirm a successful transfer . Each of these webhook events includes full call data plus transfer_destination and transfer_option (if available) .
You can configure which events are delivered per agent using the webhook_events field when creating or updating an agent . By default, voice agents receive call_started, call_ended, and call_analyzed events, so you'll need to explicitly add the transfer events if you want to receive them .AI Evy
06/11/2026, 3:58 PMAI Evy
06/11/2026, 3:58 PMCiaran
06/11/2026, 4:07 PMAI Evy
06/11/2026, 4:07 PMAI Evy
06/11/2026, 4:07 PMcall_started but not transfer_bridged, the issue is likely that you haven't explicitly configured your agent to send transfer-related webhook events [(1) ]() [(2) ]() .
By default, voice agents only receive call_started, call_ended, and call_analyzed webhook events [(2) ]() . To receive transfer events like transfer_bridged, you must explicitly add them to the webhook_events field when creating or updating your agent [(1) ]() [(2) ]() .
When creating an agent, include the transfer events in your configuration [(1) ]() :
json
{
"webhook_url": "<https://your-computer-url%22,>
"webhook_events": [
"call_started",
"call_ended",
"call_analyzed",
"transfer_started",
"transfer_bridged",
"transfer_cancelled",
"transfer_ended"
]
}AI Evy
06/11/2026, 4:07 PMwebhook_events field accepts these transfer-related options [(2) ]() :
- transfer_started
- transfer_bridged
- transfer_cancelled
- transfer_ended
Update your agent configuration to include transfer_bridged in the webhook_events array, and you should start receiving those webhook notifications when transfers successfully bridge [(1) ]() [(2) ]() .
Additionally, be aware that after an agent transfer, the webhook from the original agent continues to fire—the second agent's webhook doesn't automatically activate post-transfer [(3) ]() . If you need webhooks from both agents during a transfer scenario, consider using a shared webhook URL at the account level or from Agent 1 to capture all events .AI Evy
06/11/2026, 4:07 PMAI Evy
06/11/2026, 4:07 PMCiaran
06/11/2026, 4:08 PMAI Evy
06/11/2026, 4:08 PMAI Evy
06/11/2026, 4:08 PMwebhook_events field on the original agent (the one initiating the transfer) [(1) ]() [(2) ]() .
After an agent transfer, the webhook from the original agent continues to fire—the second agent's webhook doesn't automatically activate post-transfer [(3) ]() . This means transfer events like transfer_bridged will be sent to the webhook URL configured on the first agent .
To receive transfer events, update your original agent with the webhook_events configuration [(1) ]() [(2) ]() :
json
{
"webhook_url": "<https://your-computer-url%22,>
"webhook_events": [
"call_started",
"call_ended",
"call_analyzed",
"transfer_started",
"transfer_bridged",
"transfer_cancelled",
"transfer_ended"
]
}
[(1) ]() , [(2) ]()
If you need webhooks from both agents during a transfer scenario, consider using a shared webhook URL at the account level to capture events from all agents [(3) ]() .AI Evy
06/11/2026, 4:08 PMAI Evy
06/11/2026, 4:08 PMCiaran
06/11/2026, 4:11 PMAI Evy
06/11/2026, 4:11 PMAI Evy
06/11/2026, 4:11 PMwebhook_events field determines which events are delivered to the webhook_url you've set on the agent [(1) ]() [(3) ]() .
For inbound calls, the webhook configuration comes from the agent associated with that phone number or call [(1) ]() [(2) ]() . If you've set agent-level webhooks using the webhook_url field, those will be used instead of account-level webhooks [(1) ]() [(3) ]() [(2) ]() .
However, there's an important behavior to note: after an agent transfer, the webhook from the original agent continues to fire—the second agent's webhook doesn't automatically activate post-transfer [(4) ]() . This means all transfer events (transfer_started, transfer_bridged, transfer_cancelled, transfer_ended) should be sent to the original agent's webhook URL .
To troubleshoot why you're not receiving transfer webhooks:
1. Verify the webhook URL is correct on your original/first agent (the one handling the inbound call initially) [(1) ]() [(2) ]()
2. Confirm webhook_events includes the transfer events on that same agent [(1) ]() [AI Evy
06/11/2026, 4:11 PMAI Evy
06/11/2026, 4:11 PMAI Evy
06/11/2026, 4:11 PMCiaran
06/11/2026, 4:15 PMAI Evy
06/11/2026, 4:15 PMAI Evy
06/11/2026, 4:15 PMtransfer_bridged event should trigger when a transfer successfully bridges [(1) ]() . According to the documentation, transfer_bridged is "Triggered when a transfer successfully bridges" .
For the webhook to fire correctly, you need to ensure:
1. The webhook_events array includes transfer_bridged on the original agent (the one initiating the transfer) [(1) ]() [(2) ]() [(3) ]() . The default events are only call_started, call_ended, and call_analyzed, so transfer events must be explicitly added [(1) ]() .
2. Your webhook endpoint must respond with a 2xx status code . Retell expects a successful status code with no body required .
3. The webhook timeout is set appropriately - the default is 10,000ms (10 seconds) [(1) ]() [(2) ]() [(3) ]() . If your endpoint doesn't respond within this timeframe, the webhook may fail.
4. The transfer must actually complete the bridge. If the transfer is cancelled or fails to connect before bridging, you'll receive transfer_cancelled instead of transfer_bridged [(1) ]() .
The transfer_bridged event payload includes full call data plus transfer_destination and transfer_option (if available) .
If you've confirmed all these settings are correct and still aren't receiving the webhook, double-check that:
- Your webhook URL is accessible from Retell's servers
- The transfer is completing successfully (not being cancAI Evy
06/11/2026, 4:15 PMAI Evy
06/11/2026, 4:15 PMCiaran
06/11/2026, 4:17 PMAI Evy
06/11/2026, 4:17 PMAI Evy
06/11/2026, 4:18 PMcall_started (not call_inbound)
- call_ended
- call_analyzed
- transcript_updated
- transfer_started
- transfer_bridged
- transfer_cancelled
- transfer_ended
You mentioned checking call_inbound, but the correct event name is call_started . If you've configured call_inbound in your webhook_events array, that could be why you're not receiving the expected webhooks.
Second, verify your agent configuration. Check your agent's webhook_events field to ensure it includes the transfer events [(2) ]() [(3) ]() :
json
{
"webhook_events": [
"call_started",
"call_ended",
"call_analyzed",
"transfer_started",
"transfer_bridged",
"transfer_cancelled",
"transfer_ended"
]
}AI Evy
06/11/2026, 4:18 PMtransfer_bridged event is triggered when a transfer successfully bridges [(1) ]() . If you're doing an agent-to-agent transfer (agent swap) rather than a phone number transfer, the behavior may differ. After an agent transfer, the webhook from the original agent continues to fire—the second agent's webhook doesn't automatically activate post-transfer [(4) ]() .
Fourth, check webhook ordering. Webhooks are triggered in order but are not blocking [(1) ]() . When a call did not connect (like calls with dial_failed, dial_no_answer, dial_busy disconnection reason) , it will not have its call_started webhook triggered, but will still have its call_ended and call_analyzed webhooks triggered .
Update your agent configuration with the correct event names and verify that your webhook endpoint is responding with a 2xx status code within the timeout period (default 10,000ms) [(1) ]() [(2) ]() [(3) ]() .AI Evy
06/11/2026, 4:18 PMAI Evy
06/11/2026, 4:18 PMCiaran
06/11/2026, 4:20 PMAI Evy
06/11/2026, 4:20 PMAI Evy
06/11/2026, 4:20 PMwebhook_events array [(1) ]() :
json
{
"webhook_events": [
"call_started",
"call_ended",
"call_analyzed",
"transfer_started",
"transfer_bridged",
"transfer_cancelled",
"transfer_ended"
]
}
The transfer events (transfer_started, transfer_bridged, transfer_cancelled, transfer_ended) need to be sent to a webhook endpoint that's actively listening, and by selecting "Only transferred agent," you're routing those events away from your configured endpoint.
Try switching the Webhook Setting in your Agent Swap Node to use the original agent's webhook, and you should start receiving the transfer event webhooks.AI Evy
06/11/2026, 4:20 PMAI Evy
06/11/2026, 4:20 PMCiaran
06/11/2026, 4:22 PMAI Evy
06/11/2026, 4:22 PMAI Evy
06/11/2026, 4:22 PMtransfer_started, transfer_bridged, transfer_cancelled, transfer_ended) [(1) ]() .
The key behavior to understand is that after an agent transfer, the webhook from the original agent continues to fire—the second agent's webhook doesn't automatically activate post-transfer . This means transfer events will be sent to whichever agent's webhook you configure in the Agent Swap Node.
Since you have all the transfer events configured in your original agent's webhook_events array [(2) ]() [(3) ]() [(4) ]() :
- call_started
- call_ended
- call_analyzed
- transfer_started
- transfer_bridged
- transfer_cancelled
- transfer_ended
Setting the Agent Swap Node to "Only this agent" will ensure those transfer webhooks are sent to your original agent's webhook endpoint, which is the one you've been monitoring.AI Evy
06/11/2026, 4:22 PMAI Evy
06/11/2026, 4:22 PMCiaran
06/11/2026, 4:26 PMAI Evy
06/11/2026, 4:26 PMAI Evy
06/11/2026, 4:26 PMcall_started, not call_inbound [(1) ]() [(2) ]() [(3) ]() [(4) ]() .
The valid webhook events for voice agents are [(1) ]() [(3) ]() [(4) ]() :
- call_started
- call_ended
- call_analyzed
- transcript_updated
- transfer_started
- transfer_bridged
- transfer_cancelled
- transfer_ended
If you've somehow configured call_inbound in your webhook events, that's not a recognized event type and could indicate a configuration issue.
To troubleshoot:
1. Use the Get Voice Agent API to verify your exact webhook_events configuration [(4) ]()
2. Confirm your webhook_url is correctly set and accessible [(1) ]() [(4) ]()
3. Ensure your webhook endpoint responds with a 2xx status code within the timeout period (default 10,000ms) [(1) ]() [(3) ]() [(4) ]()
4. Verify the transfer is actually completing - if it fails before bridging, you'll get transfer_cancelled instead of transfer_bridged
The Agent Transfer Node documentation mentions that transfer settings behavior means certain settings from the first agent persAI Evy
06/11/2026, 4:27 PMAI Evy
06/11/2026, 4:27 PMCiaran
06/11/2026, 4:29 PMAI Evy
06/11/2026, 4:29 PMAI Evy
06/11/2026, 4:29 PMcall_inbound, call_started, and call_analyzed webhooks, but no transfer events. Based on your webhook logs, you're getting the expected basic call events, which confirms your webhook endpoint is working correctly.
**The key issue**: You're using an Agent Transfer (agent swap) , not a traditional phone transfer [(1) ]() . Agent Transfer has different webhook behavior than phone-based transfers.
According to the documentation, the valid webhook events for voice agents are [(2) ]() [(3) ]() [(4) ]() [(5) ]() :
- call_started
- call_ended
- call_analyzed
- transcript_updated
- transfer_started
- transfer_bridged
- transfer_cancelled
- transfer_ended
However, these transfer webhook events (transfer_started, transfer_bridged, etc.) are documented in the context of phone-based call transfers, not Agent Transfer (agent swap) [(2) ]() .
The Agent Transfer Node documentation states that when you use agent swap, "the following settings of the first agent will be used throughout the call: optInSignedUrl, optOutSensitiveDataStorage, webHookUrl" [(1) ]() . This means your original agent's webhook continues to be used.
**The critical distinction**: The transfer_bridged event is "Triggered when a transfer successfully bridges" [(2) ]() , which refers to bridging a phone call to another phone number or extension. When you perform an Agent Transfer (swappinAI Evy
06/11/2026, 4:29 PMtransfer_bridged or other transfer webhooks—those events are designed for phone-based transfers, not agent-to-agent swaps [(2) ]() [(1) ]() .
To track agent swaps, you'll need to use alternative approaches since the transfer webhooks don't apply to Agent Transfer nodes [(1) ]() [(6) ]() .AI Evy
06/11/2026, 4:30 PMAI Evy
06/11/2026, 4:30 PMCiaran
06/11/2026, 4:33 PMAI Evy
06/11/2026, 4:33 PMAI Evy
06/11/2026, 4:33 PMcall_started and call_analyzed webhooks [(2) ]() , you could:
1. Capture the dynamic variables in the call_started or custom webhook events [(2) ]() [(3) ]()
2. Store them in your system
3. Re-inject them if needed using the conversation context
The key limitation is that Agent Transfer is designed to maintain conversation continuity [(1) ]() , sAI Evy
06/11/2026, 4:33 PM{{variable_name}} syntax
- You're using the Agent Transfer Node (not Call Transfer Node) to maintain the same call session [(1) ]()AI Evy
06/11/2026, 4:34 PMAI Evy
06/11/2026, 4:34 PMCiaran
06/11/2026, 4:36 PMAI Evy
06/11/2026, 4:36 PMAI Evy
06/11/2026, 4:37 PMtransfer_bridged events—those are only for phone-based transfers) [(1) ]() [(2) ]()
2. Variables aren't persisting to Agent 2
**Why This Happens**:
Agent Transfer maintains the same call session and the destination agent has access to the full conversation history [(2) ]() . However, when you transfer immediately before any conversation occurs, there's no conversation context yet to pass along.
**Your Options**:
Option A: Set Variables Before Transfer
If Agent 1 needs to pass information to Agent 2, have Agent 1 set dynamic variables explicitly before the transfer occurs. The transferred agent should have access to these through the conversation context since "the destination agent has access to the full conversation history" .
Option B: Use Account-Level Webhooks
Set up an account-level webhook through the dashboard's webhooks tab [(1) ]() . This ensures webhook events fire regardless of which agent is handling the call [(3) ]() . This won't solve the variable persistence issue directly, but gives you visibility into all call events.
Option C: Use Custom Function to Pass Data
Add a custom function node in Agent 1 that explicitly captures and stores the variables you need before the transfer . This function can trigger your webhook directly with the data you need to perAI Evy
06/11/2026, 4:37 PMwebHookUrl setting from the first agent persists throughout the call [(2) ]() , but Agent Transfer webhooks (transfer_started, transfer_bridged, etc.) are designed for phone-based call transfers, not agent-to-agent swaps [(1) ]() [(2) ]() . This is why you're not seeing transfer webhooks when using Agent Transfer nodes.AI Evy
06/11/2026, 4:37 PMAI Evy
06/11/2026, 4:37 PMCiaran
06/11/2026, 4:40 PMAI Evy
06/11/2026, 4:40 PMAI Evy
06/11/2026, 4:40 PM{{variable_name}} syntax and can be injected into prompts, begin messages, and tool configurations . When you set dynamic variables at the agent level, they serve as defaults and are used when specific variables aren't included in the call request .
Key Limitation:
According to the Agent Transfer documentation, when transferring between agents, "the following settings of the first agent will be used throughout the call: optInSignedUrl, optOutSensitiveDataStorage, webHookUrl" [(3) ]() . However, dynamic variables should be accessible to the transferred agent through the conversation context since "the destination agent has access to the full conversation history" .
Workaround for Immediate Transfers:
Since you're transferring immediately before conversation starts, consider using a Custom Function to explicitly set and store variabAI Evy
06/11/2026, 4:40 PMAI Evy
06/11/2026, 4:40 PMAI Evy
06/11/2026, 4:40 PMCiaran
06/11/2026, 4:44 PMAI Evy
06/11/2026, 4:44 PMAI Evy
06/11/2026, 4:45 PMtransfer_bridged webhooks will NOT fire for Agent Transfer (agent swap) . This is the core misunderstanding. Agent Transfer vs Call Transfer - Critical Difference: - Agent Transfer (agent swap) : Switches between AI agents within the same call session [(1) ]() [(2) ]() - Call Transfer (phone-based) : Transfers the call to another phone number or SIP URI [(3) ]() The transfer_bridged, transfer_started, transfer_cancelled, and transfer_ended webhook events are only for phone-based Call Transfers , not Agent Transfers [(1) ]() [(2) ]() . Why No Transfer Webhooks for Agent Transfer: When you use an Agent Transfer node, you're not creating a phone bridge—you're switching the conversation handler within the same call session . The call continues with the same call_id, and the destination agent has access to the full conversation history . What Webhooks You WILL Receive: - call_started (when the original call begins) - call_ended (when the entire call ends) - call_analyzed (after the call completes) This matches exactly what you're seeing in your logs. For Dynamic Variables During Agent Transfer: The documentation states that "the destination agent has access to the full conversation history" . However, since you're transferring immediately before conversation starts, there's no conversation context yet. Your Options: 1. Set dynamic variables in Agent 1 before the transfer occurs using Extract Dynamic Variable tools [(4) ]()AI Evy
06/11/2026, 4:45 PMAI Evy
06/11/2026, 4:45 PMAI Evy
06/11/2026, 4:45 PMCiaran
06/11/2026, 4:45 PMAI Evy
06/11/2026, 4:45 PMAI Evy
06/11/2026, 4:46 PMtransfer_started
- transfer_bridged
- transfer_cancelled
- transfer_ended
However, this comes with significant trade-offs compared to Agent Transfer:
Disadvantages of Call Transfer vs Agent Transfer:
- **Higher Latency**: The transition is much slower than agent swap [(2) ]() [(3) ]()
- **Lower Reliability**: Creates a new phone call, which can fail
- **Requires Handoff Messages**: The destination doesn't automatically get conversation history
- **Requires Separate Phone Numbers**: Each agent receiving transfers needs its own phone number
But you'll lose the key benefits of Agent Transfer:
- Near-instant transition
- Full conversation history access for the destination agent
- No separate phone numbers needed
For your variable persistence issue, Call Transfer won't solve it—you'd need to explicitly pass data through handoff messages or webhooks. The real solution is to set dynamic variables in Agent 1 before the transfer occurs, so they're available in the conversation context when Agent 2 takes over .AI Evy
06/11/2026, 4:46 PMAI Evy
06/11/2026, 4:46 PMCiaran
06/11/2026, 4:49 PMAI Evy
06/11/2026, 4:49 PMAI Evy
06/11/2026, 4:49 PMAI Evy
06/11/2026, 4:49 PMAI Evy
06/11/2026, 4:49 PMCiaran
06/11/2026, 4:58 PMAI Evy
06/11/2026, 4:58 PMAI Evy
06/11/2026, 4:58 PM{{variable_name}} syntax in prompts, begin messages, and tool configurations
2. Use Dynamic Variables in Your Prompts
Dynamic variables work in :
- Prompts (agent instructions and personality)
- Begin message (opening greeting)
- Tool configurations (custom function URLs, tool descriptions, property descriptions)
- Call handling (voicemail prompts, transfer call phone numbers, warm transfer instructions)
- Webhook URLs
3. Variable Persistence During Agent Transfer
When using Agent Transfer, "the following settings of the first agent will be used throughout the call: optInSignedUrl, optOutSensitiveDataStorage, webHookUrl" [(2) ]() . The destination agent has access to the full conversation history .
Key Limitation for Your Scenario:
Since you're transferring immediately before conversation starts, there's minimal conversation context. The solution is to set variables at the agent level as defaults on both agents, ensuring they're available throughout the call session [(1) ]() .
**Why Agent Transfer Over CallAI Evy
06/11/2026, 4:58 PMAI Evy
06/11/2026, 4:58 PMAI Evy
06/11/2026, 4:58 PMCiaran
06/11/2026, 4:59 PMAI Evy
06/11/2026, 4:59 PMAI Evy
06/11/2026, 4:59 PM{{variable_name}} syntax and can be accessed in various contexts including prompts, tool configurations, and call handling .
Setting Dynamic Variables:
You can configure agent-level default dynamic variables which serve as fallback values when specific variables aren't included in the call request . The documentation explains that "Default variables serve as a fallback and will only be used when specific variables aren't included in the call request" .
Nested Variables Support:
Retell supports nested variables using syntax like {{current_time_{{my_timezone}}}} .
For the specific Code Node implementation details and how to programmatically access all dynamic variables within a code block, I recommend reviewing the Node Overview documentation [(1) ]() which covers the Code Node as part of the conversation flow system.AI Evy
06/11/2026, 4:59 PMAI Evy
06/11/2026, 4:59 PM