The transferPlan.mode field selects which warm transfer behavior to use:
| Mode | Behavior |
|---|
warm-transfer-with-summary | An AI-generated summary of the call is spoken to the recipient before connecting. Requires a summaryPlan.messages array; use {{transcript}} to include the transcript. |
warm-transfer-with-message | A static custom message (set in message) is spoken to the recipient before connecting. {{transcript}} is not available here. |
warm-transfer-wait-for-operator-to-speak-first-and-then-say-message | Waits for the recipient to speak first, then delivers the static message. |
warm-transfer-wait-for-operator-to-speak-first-and-then-say-summary | Waits for the recipient to speak first, then delivers the AI-generated summary. |
warm-transfer-with-twiml | Executes TwiML on the destination leg before connecting. Supports only Play, Say, Gather, and Pause verbs; must be a single-line, valid-XML string under 4096 characters. |
warm-transfer-experimental | Dials the destination, holds the caller, and connects once the recipient answers. Detects voicemail and falls back to a message if the transfer can't complete. |
Example for the experimental mode, which has the most configuration surface:
"transferPlan": {
"mode": "warm-transfer-experimental",
"message": "Transferring a customer to you.",
"holdAudioUrl": "https://assets.example.com/music.mp3",
"voicemailDetectionType": "audio",
"fallbackPlan": {
"message": "Could not transfer your call, goodbye.",
"endCallEnabled": true
},
"summaryPlan": {
"enabled": true,
"messages": [
{ "role": "system", "content": "Please provide a summary of the call." },
{ "role": "user", "content": "Here is the transcript:\n\n{{transcript}}\n\n" }
]
}
}
voicemailDetectionType is either "audio" (default, widest machine-detection coverage including beep detection) or "transcript" (lowest latency). Voicemail detection for transfer plans is only supported when the assistant uses a Google or OpenAI provider, even if the call itself is on a different provider.