katlovetom
03/23/2026, 11:45 AMAI Evy
03/23/2026, 11:45 AMAI Evy
03/23/2026, 11:46 AMtransfer_started webhook is triggered when a transfer is initiated [(1) ]() . The webhook will POST the payload to your endpoint with a 10-second timeout .
The exact format includes the following structure :
json
{
"event": "transfer_started",
"call": {
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6"
},
"transfer_destination": {
"number": "+12137771235",
"extension": "1234"
},
"transfer_option": {
"type": "warm_transfer",
"showTransfereeAsCaller": true,
"publicHandoffOption": {
"type": "static_message",
"message": "Hi, I am transferring the caller now."
},
"agentDetectionTimeoutMs": 15000,
"onHoldMusic": {
"type": "default"
},
"enableBridgeAudioCue": true
}
}
The payload includes full call data plus transfer_destination and transfer_option (if available) . Fields may vary by transfer type .
To enable this webhook event for your agent, include transfer_started in the webhook_events field when creating or updating an agent [(1) ]() [(2) ]() .AI Evy
03/23/2026, 11:46 AMAI Evy
03/23/2026, 11:46 AMkatlovetom
03/23/2026, 11:47 AMAI Evy
03/23/2026, 11:47 AMAI Evy
03/23/2026, 11:47 AMtransfer_started webhook payload includes "Full call data plus transfer_destination and transfer_option (if available) " [(1) ]() . This means it should include the transcript up to that point.
Looking at the call object structure in the sources, when full call data is included, it contains fields like transcript, transcript_object, and transcript_with_tool_calls [(2) ]() [(3) ]() [(4) ]() . The transcript_with_tool_calls field specifically "precisely captures when (at what utterance, which word) the tool was invoked and what was the result" [(2) ]() .
Additionally, if you're using retell_llm_dynamic_variables to collect information during the call, those would be included in the call object [(2) ]() [(3) ]() [(4) ]() . The call object can also contain collected_dynamic_variables which stores "Dynamic variables collected from the call" .
So yes, the transfer_started webhook should include both the transcript up to that point and any specific details gathered during the call through dynamic variables or metadata [(1) ]() [(2) ]() .AI Evy
03/23/2026, 11:47 AMAI Evy
03/23/2026, 11:47 AMkatlovetom
03/23/2026, 3:32 PMAI Evy
03/23/2026, 3:32 PMAI Evy
03/23/2026, 3:32 PMtranscript_with_tool_calls field captures tool invocations and results from the first agent [(2) ]() , but to make this data available to the second agent, you need to explicitly pass it as dynamic variables [(1) ]() .
One approach mentioned in the community is to store the customer data retrieved from the tool call in a database, then use an inbound webhook to retrieve it when the second agent receives the call . This allows you to inject the data as dynamic_variables for the receiving agent [(1) ]() [(3) ]() .
For inbound webhooks specifically, the response structure should nest dynamic variables under call_inbound [(3) ]() :
json
{
"call_inbound": {
"dynamic_variables": {
"customer_name": "John Doe",
"customer_email": "john@example.com"
}
}
}AI Evy
03/23/2026, 3:32 PMAI Evy
03/23/2026, 3:32 PMAI Evy
03/23/2026, 3:32 PMkatlovetom
03/23/2026, 4:01 PMAI Evy
03/23/2026, 4:01 PMAI Evy
03/23/2026, 4:01 PMjson
{
"caller_name": "John",
"address": "main street"
}
You would configure:
- **Variable Name**: caller_name
- **JSON Path**: caller_name (or $.caller_name depending on the path format)
- **Variable Name**: address
- **JSON Path**: address (or $.address)
## Using the Extracted Variables
Once extracted, these values become dynamic variables that you can reference later in the conversation using double curly braces :
- {{caller_name}}
- {{address}}
The response variables feature allows you to "extract values from the API response and save them as dynamic variables for use later in the conversation" .
For example, you could then use {{caller_name}} in subsequent prompts or pass it to other custom functions .AI Evy
03/23/2026, 4:01 PMAI Evy
03/23/2026, 4:01 PMkatlovetom
03/23/2026, 4:05 PMAI Evy
03/23/2026, 4:05 PMAI Evy
03/23/2026, 4:06 PMjson
{
"call_inbound": {
"dynamic_variables": {
"caller_name": "John",
"address": "main street"
}
}
}AI Evy
03/23/2026, 4:06 PMcall_inbound, not at the top level [(3) ]() .
## Option 2: Extract and Store During the Call
Use the Extract Dynamic Variable feature to capture tool call responses as dynamic variables during the conversation [(4) ]() :
1. After your custom function returns the JSON response, extract the values as response variables
2. These become dynamic variables like {{caller_name}} and {{address}} [(5) ]()
3. However, you'll still need to pass these to the next agent using the inbound webhook approach above
## Important Notes
- The retell_llm_dynamic_variables field is used when creating outbound calls [(5) ]() [(6) ]() , not for agent transfers
- For inbound scenarios (including transfers) , you must use call_inbound.dynamic_variables format [(2) ]() [(3) ]()
- Ensure the receiving agent has these dynamic variables defined in its configuration [(5) ]()
The sources confirm that tool call data doesn't automatically carry over—you must explicitly bridge it between agents using webhooks and dynamic variables [(1) ]() .AI Evy
03/23/2026, 4:06 PMAI Evy
03/23/2026, 4:06 PM