transfer_started tells you the agent is handing a phone call to someone else. It is the first of four transfer events:
| Event | Meaning |
|---|---|
transfer_started |
The agent began the transfer |
transfer_bridged |
The destination answered and is connected to the caller |
transfer_cancelled |
The transfer failed or was cancelled |
transfer_ended |
The bridged legs hung up |
A successful transfer sends transfer_started, transfer_bridged, then later transfer_ended. A failed one sends transfer_started then transfer_cancelled.
When it fires#
- The agent runs a Transfer Call tool (cold, warm or agentic warm transfer). The event fires after the agent finishes speaking and before the destination is dialled. See Transfer call.
- An inbound caller waited in the concurrency queue and the number has a
fallback_number. The call is cold transferred to that number, which sendstransfer_startedfollowed bycall_endedwithdisconnection_reasoncall_transfer.
Transfer events are sent for phone calls only. Web calls cannot be transferred.
Which settings enable it#
- Off by default. Add
transfer_startedto the agent'swebhook_events, or toggle it under Webhook Settings, Events. - URL: the agent's
webhook_url, else the workspace URL.{{variable}}placeholders in the agent URL are not filled for transfer events. - Timeout: the workspace timeout, else 10 s. The agent's
webhook_timeout_msdoes not apply to transfer events.
Payload#
The body has three keys: event, the call object and a transfer object.
{
"event": "transfer_started",
"call": {
"call_id": "call_8c2e5a1f7b3d9e0c4a6f2b18",
"call_type": "phone_call",
"agent_id": "agent_5b0e2c7d9a1f4e3b8c6d2a10",
"agent_version": 2,
"agent_name": "Bondi Dental Front Desk",
"call_status": "ongoing",
"direction": "inbound",
"from_number": "+61412345678",
"to_number": "+61291234567",
"metadata": {},
"retell_llm_dynamic_variables": { "business_name": "Bondi Dental" },
"collected_dynamic_variables": {},
"start_timestamp": 1760675400120,
"end_timestamp": null,
"duration_ms": null,
"transcript": "Agent: Hi, thanks for calling Bondi Dental, this is Ava. How can I help you today?\nUser: I need to talk to the dentist about my bill.\nAgent: Sure, I'll put you through to our practice manager now.",
"transcript_object": [
{ "role": "agent", "content": "Hi, thanks for calling Bondi Dental, this is Ava. How can I help you today?", "words": [] },
{ "role": "user", "content": "I need to talk to the dentist about my bill.", "words": [] },
{ "role": "agent", "content": "Sure, I'll put you through to our practice manager now.", "words": [] }
],
"transcript_with_tool_calls": [
{ "role": "agent", "content": "Hi, thanks for calling Bondi Dental, this is Ava. How can I help you today?", "ts": 1760675400340 },
{ "role": "user", "content": "I need to talk to the dentist about my bill.", "ts": 1760675405910 },
{ "role": "tool_call_invocation", "tool_call_id": "call_tool_01", "name": "transfer_to_manager", "arguments": "{}", "ts": 1760675406650 },
{ "role": "agent", "content": "Sure, I'll put you through to our practice manager now.", "ts": 1760675406700 },
{ "role": "transfer", "event": "transfer_started", "destination": "+61298765432", "ts": 1760675409210 }
],
"recording_url": null,
"recording_multi_channel_url": null,
"public_log_url": "https://api.tried.com.au/public/calls/call_8c2e5a1f7b3d9e0c4a6f2b18/log?exp=1761280209300&sig=1d4a7c0f3b6e9a2d5c8f1b4e7a0d3c6f9b2e5a8d1c4f7b0e3a6d9c2f5b8e1a4d",
"knowledge_base_retrieved_contents_url": "https://api.tried.com.au/public/calls/call_8c2e5a1f7b3d9e0c4a6f2b18/kb-retrievals?exp=1761280209300&sig=4e7a0d3c6f9b2e5a8d1c4f7b0e3a6d9c2f5b8e1a4d7c0f3b6e9a2d5c8f1b4e7a",
"transfer_destination": "+61298765432",
"llm_token_usage": { "values": [1650, 1720], "average": 1685, "num_requests": 2 },
"disconnection_reason": null,
"call_analysis": null,
"latency": {
"e2e": { "p50": 702, "p90": 702, "p95": 702, "p99": 702, "max": 702, "min": 688, "num": 2, "values": [688, 702] }
},
"call_cost": null,
"batch_call_id": null,
"contact_id": "contact_6e2a9c1f4b7d0e3a5c8f1b24"
},
"transfer": {
"destination": "+61298765432",
"transfer_type": "warm_transfer",
"timestamp": 1760675409210
}
}Fields#
The call object is documented on Call object. At this point call_status is ongoing and transfer_destination is set.
| Field | Type | Description |
|---|---|---|
transfer.destination |
string | The number or SIP URI being dialled, after dynamic variables are filled in |
transfer.transfer_type |
string | cold_transfer, warm_transfer or agentic_warm_transfer. Only on transfer_started |
transfer.timestamp |
integer | When the transfer started, Unix ms |
call.transfer_destination |
string | Same as transfer.destination |
call.transcript_with_tool_calls |
array | Ends with a {"role": "transfer", "event": "transfer_started"} entry |
How to respond#
Reply 2xx. The body is ignored and cannot stop the transfer. Delivery runs in the background, so the transfer never waits for your server. Failed attempts are retried up to 3 times (1 s, 2 s, 4 s).
Common uses: screen-pop the caller's record for the person about to answer, or start a timer to measure how long transfers take to connect.