Skip to content
TriedDocs
Webhooks

transfer_started

Sent when the agent begins transferring a phone call, with the destination and transfer type.

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 sends transfer_started followed by call_ended with disconnection_reason call_transfer.

Transfer events are sent for phone calls only. Web calls cannot be transferred.

Which settings enable it#

  • Off by default. Add transfer_started to the agent's webhook_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_ms does 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.