Alchemist
06/30/2026, 10:20 PMAI Evy
06/30/2026, 10:20 PMAI Evy
06/30/2026, 10:21 PMjavascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: process.env['RETELL_API_KEY'],
}) ;
const chatResponse = await client.chat.createSMSChat({
from_number: '+12137771234',
to_number: '+14155551234',
}) ;
The from_number must be a number purchased from Retell or imported to Retell with SMS capability, and the to_number is the recipient's number in E.164 format .
For detailed business registration requirements for outbound calling and any additional SMS registration processes beyond what's shown in the API, I recommend checking the full documentation at [Documentation]() or reaching out through [Hire certified Retell partner]() .AI Evy
06/30/2026, 10:21 PMAI Evy
06/30/2026, 10:21 PMAlchemist
06/30/2026, 10:26 PMAI Evy
06/30/2026, 10:26 PMAI Evy
06/30/2026, 10:26 PM/create-phone-call [(1) ]() . Here's how to make an outbound call :
javascript
const registerCallResponse = await retell.call.createPhoneCall({
from_number: '+14157774444', // replace with the number you purchased
to_number: '+12137774445', // replace with the number you want to call
// Optional: per-call agent selection and overrides
override_agent_id: 'agent_abc123',
override_agent_version: 0, // or omit to use latest
agent_override: {
agent: {
voice_speed: 1.1,
enable_backchannel: true,
},
// retell_llm or conversation_flow overrides are also supported
},
retell_llm_dynamic_variables: { // dynamic variables (optional, string values only)
name: 'John Doe',
blood_group: 'B+'
},
custom_sip_headers: { // replace with custom sip headers you want to send (optional)
X-Custom-Header: 'Custom Value'
}
}) ;
Key parameters :
- `from_number`: Your Retell-managed or imported number (E.164 format)
- `to_number`: Destination number (E.164 format)
- `override_agent_id`: Override the agent used for this call (optional)
- `metadata`: Free-form metadata stored with the call (optional)
- `retell_llm_dynamic_variables`: Key-value strings injected into prompts/tools (optional)
For batch outbound calls, you can use the /create-batch-call endpoint [(2) ]() .AI Evy
06/30/2026, 10:26 PMAI Evy
06/30/2026, 10:26 PMAlchemist
07/02/2026, 4:11 PMAI Evy
07/02/2026, 4:11 PMAI Evy
07/02/2026, 4:11 PMbash
POST <https://api.retellai.com/v2/create-phone-call>
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
With a JSON body like:
json
{
"from_number": "+14157774444",
"to_number": "+12137774445",
"override_agent_id": "agent_abc123",
"retell_llm_dynamic_variables": {
"name": "John Doe",
"blood_group": "B+"
},
"metadata": {
"custom_field": "value"
}
}
For outbound SMS, use POST to `
json
{
"from_number": "+12137771234",
"to_number": "+14155551234"
}
The response will be a JSON object containing the call or chat ID and other details.
For detailed API specifications and all available parameters, visit [Documentation]() .AI Evy
07/02/2026, 4:11 PMAI Evy
07/02/2026, 4:11 PMAlchemist
07/10/2026, 6:15 PMAI Evy
07/10/2026, 6:15 PMAI Evy
07/10/2026, 6:15 PM{{direction}} dynamic variable [(1) ]() . This system variable automatically contains either inbound or outbound depending on the call direction .
Determining Call Direction:
You can reference {{direction}} in your agent's prompt or use it in function calls . For example, in your prompt you could include:
You are handling a {{direction}} call. {{#if direction == "inbound"}}Ask the caller how you can help them today.{{else}}Introduce yourself and explain the purpose of your call.{{/if}}
The {{direction}} variable is one of several phone call-specific system variables available, along with {{user_number}} (the caller's phone number) and {{agent_number}} .
Fetching CRM Data for Inbound Calls:
For inbound calls, you can fetch CRM data using the Inbound Call Webhook [(2) ]() . When an inbound call arrives, Retell can send a webhook to your server, allowing you to:
1. Look up the caller in your CRM using from_number
2. Return dynamic variables with customer data
3. Optionally override which agent handles the call
You can also use Code Tool to fetch data during the call [(3) ]() . Code Tool runs JavaScript directly in Retell's sandbox and has access to the fetch function for HTTP requests . You can call external APIs to retrieve CRM data in real-time:AI Evy
07/10/2026, 6:15 PMjavascript
const phoneNumber = dv.user_number;
const response = await fetch(`<https://your-crm.com/api/customer?phone=$%7BphoneNumber%7D%60,> {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}) ;
const customerData = await response.json() ;
return {
customer_name: customerData.name,
account_status: customerData.status
};
Additionally, if you have CRM integrations configured, Retell can automatically sync contact data and map CRM fields to Retell contact fields [(4) ]() .
[(3) ]() , [(1) ]() , [(4) ]() , [(2) ]()AI Evy
07/10/2026, 6:15 PMAI Evy
07/10/2026, 6:15 PMAlchemist
07/10/2026, 6:20 PMAI Evy
07/10/2026, 6:20 PMAI Evy
07/10/2026, 6:20 PMinbound_webhook_url parameter when importing or updating your phone number
2. Your webhook endpoint will receive a POST request when an inbound call arrives [(1) ]()
Webhook Request Payload Structure:
When an inbound call is received, Retell sends a POST request with this structure :
json
{
"event": "call_inbound",
"event_timestamp": 1780012672105,
"call_inbound": {
"agent_id": "agent_12345",
"agent_version": 1,
"from_number": "+12137771234",
"to_number": "+12137771235",
"custom_sip_headers": {
"x-my-header": "my-value",
"user-to-user": "616263;encoding=hex"
}
}
}
Webhook Response Structure:
Your endpoint should return a JSON response with a 2xx status code . You can override agent settings, set dynamic variables, and add metadata :AI Evy
07/10/2026, 6:20 PMjson
{
"call_inbound": {
"override_agent_id": "agent_12345",
"override_agent_version": 1,
"agent_override": {
"agent": {
"voice_id": "11labs-Adrian",
"voice_temperature": 0.6,
"interruption_sensitivity": 0.8,
"max_call_duration_ms": 1800000
},
"retell_llm": {
"model": "gpt-4o-mini",
"model_temperature": 0.2,
"knowledge_base_ids": ["kb_abc123"],
"start_speaker": "agent",
"begin_message": "Hi {{customer_name}}, thanks for calling."
}
},
"dynamic_variables": {
"customer_name": "John Doe"
},
"metadata": {
"random_id": "12345"
}
}
}
CRM API Response Structure:
For CRM integration, the response structure depends entirely on your CRM system [(4) ]() . Retell AI doesn't dictate a specific CRM response format - it works with any HTTP API regardless of the programming language or response structure .
You'll need to design your webhook to:
1. Receive the inbound call payload from Retell [(1) ]()
2. Query your CRM using from_number to look up the caller
3. Extract relevant customer data from your CRM's response
4. Return dynamic variables in the format shown above
The webhook has a 10-second timeout and will retry up to 3 times if unsuccessful .AI Evy
07/10/2026, 6:21 PMAI Evy
07/10/2026, 6:21 PMAlchemist
07/13/2026, 5:05 PMAI Evy
07/13/2026, 5:05 PMAI Evy
07/13/2026, 5:05 PMAI Evy
07/13/2026, 5:05 PMAI Evy
07/13/2026, 5:05 PMAlchemist
07/13/2026, 5:09 PMAI Evy
07/13/2026, 5:09 PMAI Evy
07/13/2026, 5:09 PMAI Evy
07/13/2026, 5:09 PMAI Evy
07/13/2026, 5:09 PMAlchemist
07/13/2026, 5:14 PMAI Evy
07/13/2026, 5:14 PMAI Evy
07/13/2026, 5:14 PMAI Evy
07/13/2026, 5:15 PMAI Evy
07/13/2026, 5:15 PMAlchemist
07/13/2026, 6:32 PMAI Evy
07/13/2026, 6:32 PMAI Evy
07/13/2026, 6:32 PMjson
{
"url": "<https://your-crm.com/api/update-status%22,>
"method": "POST",
"headers": {
"Authorization": "Bearer YOUR_CRM_API_KEY",
"Content-Type": "application/json"
},
"body": {
"call_id": "{{call_id}}",
"phone_number": "{{user_number}}",
"status": "qualified",
"tag": "interested",
"timestamp": "{{current_time}}"
}
}
Key Points:
- You can use dynamic variables like {{call_id}} , {{user_number}} , and {{current_time}} to inject call-specific data
- The static values (like "status": "qualified") remain constant for every call
- Custom functions support GET, POST, PUT, PATCH, and DELETE requests [(2) ]()
- You can add custom headers and query parameters
Alternative: Using retell_llm_dynamic_variables
If you want to pass static data when initiating the call, include it in retell_llm_dynamic_variables [(3) ]() :
json
{
"from_number": "+14157774444",
"to_number": "+12137774445",
"retell_llm_dynamic_variables": {
"campaign_id": "summer_2024",
"lead_source": "website",
"priority": "high"
}
}
These variables can then be referenced in your custom function as {{campaign_id}}, {{lead_source}}, etc. [(1) ]()AI Evy
07/13/2026, 6:32 PMAI Evy
07/13/2026, 6:32 PMAlchemist
07/13/2026, 7:38 PMAI Evy
07/13/2026, 7:38 PMAI Evy
07/13/2026, 7:38 PMjson
{
"type": "object",
"properties": {
"status": {
"type": "string",
"const": "qualified"
},
"tag": {
"type": "string",
"const": "interested"
},
"call_id": {
"type": "string",
"const": "{{call_id}}"
},
"phone_number": {
"type": "string",
"const": "{{user_number}}"
}
}
}
Key Points:
- Use "const" for static values that never change
- Use "const": "{{variable_name}}" for dynamic variables
- The "type": "object" at the top level is required
When Payload: args only is enabled, the request body will be only the arguments (flat JSON) , not wrapped in name, call, and args . Turn this on if your CRM endpoint expects a flat JSON body .
Common Mistake:
Not adding "type": "object" at the top level of the JSON schema is a frequent error that prevents saving the custom function .AI Evy
07/13/2026, 7:38 PMAI Evy
07/13/2026, 7:38 PMAlchemist
07/13/2026, 8:35 PMAI Evy
07/13/2026, 8:35 PMAI Evy
07/13/2026, 8:35 PMAI Evy
07/13/2026, 8:35 PMvoicemail_reached [(2) ]()
4. Consider using warm transfer or agentic warm transfer modes, which allow the AI agent to detect if the other side is human before completing the transfer [(3) ]()AI Evy
07/13/2026, 8:35 PMAI Evy
07/13/2026, 8:35 PMAlchemist
07/13/2026, 10:20 PMAI Evy
07/13/2026, 10:20 PMAI Evy
07/13/2026, 10:20 PMcall_analysis
- **`call_analyzed`**: Triggered when call analysis is complete, containing full call data including the call_analysis object
- **`transcript_updated`**: Triggered on turn-taking transcript updates, plus a final update when the call ends, containing full call data plus transcript_with_tool_calls
- **`transfer_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
Important Note: If the call did not connect (like dial failed) , the call_started webhook event will not be triggered .
Exact Payload Structure:
The webhook will POST a JSON payload to your endpoint . Here's the exact structure:AI Evy
07/13/2026, 10:20 PMjson
{
"event": "call_ended",
"call": {
"call_type": "phone_call",
"from_number": "+12137771234",
"to_number": "+12137771235",
"direction": "inbound",
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6",
"agent_id": "oBeDLoLOeuAbiuaMFXRtDOLriTJ5tSxD",
"call_status": "registered",
"metadata": {},
"retell_llm_dynamic_variables": {
"customer_name": "John Doe"
},
"start_timestamp": 1714608475945,
"end_timestamp": 1714608491736,
"disconnection_reason": "user_hangup",
"transcript": "...",
"transcript_object": [ [Object], [Object], [Object], [Object] ],
"transcript_with_tool_calls": [ [Object], [Object], [Object], [Object] ],
"opt_out_sensitive_data_storage": false
}
}
Transfer Event Payload:
For transfer events, the payload includes additional fields :
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
}
}AI Evy
07/13/2026, 10:20 PMcall_started won't trigger, but call_ended and call_analyzed will still be sent
- If metadata and retell_llm_dynamic_variables are not provided, they will be omitted from the webhook event payloadAI Evy
07/13/2026, 10:20 PMAI Evy
07/13/2026, 10:20 PMAlchemist
07/13/2026, 10:23 PMAlchemist
07/13/2026, 10:23 PMAI Evy
07/13/2026, 10:23 PMAI Evy
07/13/2026, 10:23 PMcall_started will NOT be triggered - this event only fires when the call actually connects
- call_ended WILL be triggered [(1) ]() [(2) ]() - even for unanswered calls
- call_analyzed WILL be triggered - you'll still get post-call analysis
Checking if the call was answered:
In the call_ended webhook payload, check the disconnection_reason field [(1) ]() . For unanswered calls, you'll see values like:
- dial_no_answer - the phone rang but wasn't picked up
- dial_busy - the line was busy
- dial_failed - the call failed to connect
- voicemail_reached - voicemail was detected
Example webhook payload for unanswered call:
json
{
"event": "call_ended",
"call": {
"call_id": "Jabr9TXYYJHfvl6Syypi88rdAHYHmcq6",
"disconnection_reason": "dial_no_answer",
"start_timestamp": 1714608475945,
"end_timestamp": 1714608491736
}
}
To determine if a call was answered, check if disconnection_reason is agent_hangup, user_hangup, or call_transfer - these indicate the call was actually connected [(2) ]() [(3) ]() .AI Evy
07/13/2026, 10:23 PMAI Evy
07/13/2026, 10:23 PMAlchemist
07/13/2026, 10:24 PMAI Evy
07/13/2026, 10:24 PMAI Evy
07/13/2026, 10:24 PMuser_hangup - User ended the call
- user_declined - User declined the call
Agent-Initiated:
- agent_hangup - Agent ended the call
Call Routing:
- call_transfer - Call was transferred
Detection-Based:
- voicemail_reached - Voicemail was detected
- ivr_reached - IVR system was detected
Timeout/Duration:
- inactivity - Call ended due to inactivity
- max_duration_reached - Maximum call duration was reached
Capacity/Billing:
- concurrency_limit_reached - Concurrency limit was hit
- no_concurrency_fallback - No fallback available when limit reached
- no_valid_payment - No valid payment method
Security:
- scam_detected - Potential scam was detected
Dial Failures:
- dial_busy - Line was busy
- dial_failed - Dial attempt failed
- dial_no_answer - No answer received
- invalid_destination - Invalid phone number or destination
Telephony Provider Issues:
- telephony_provider_permission_denied - Provider permission denied
- telephony_provider_unavailable - Provider unavailable
- sip_routing_error - SIP routing error
Spam/Blocking:
- marked_as_spam - Call was marked as spam
Technical Errors:
- error_llm_websocket_open - LLM websocket failed to open
- error_llm_websocket_lost_connection - LLM websocket lost connection
- error_llm_websocket_runtime - LLM websocket runtime error
- error_llm_websocket_corrupt_payload - LLM websocket corrupt payload
- `errAI Evy
07/13/2026, 10:24 PMerror_asr - ASR (speech recognition) error
- error_retell - Retell system error
- error_unknown - Unknown error
- error_user_not_joined - User didn't join the call
Transfer-Related:
- transfer_bridged - Transfer was successfully bridged
- transfer_cancelled - Transfer was cancelled
Other:
- registered_call_timeout - Registered call timed out
- manual_stopped - Call was manually stopped
- call_take_over - Call was taken over
You can check the disconnection_reason field in the call_ended webhook event or when fetching call details via the Get Call API [(6) ]() [(7) ]() .AI Evy
07/13/2026, 10:24 PMAI Evy
07/13/2026, 10:24 PMAlchemist
07/14/2026, 10:47 PMAI Evy
07/14/2026, 10:47 PMAI Evy
07/14/2026, 10:47 PMagent_override object [(1) ]() .
In your webhook response, include the agent_override.agent.voice_speed field to control the voice speed for that specific inbound call :
json
{
"call_inbound": {
"agent_override": {
"agent": {
"voice_speed": 1.1
}
}
}
}
Key points:
- The agent_override object allows you to override agent settings per-call without modifying the saved agent
- voice_speed is one of the supported fields in the agent group of agent_override
- This override applies only to this specific inbound call session
- If you also provide override_agent_id or override_agent_version, Retell first resolves the target agent, then applies agent_override on top
Complete example with multiple voice settings:
json
{
"call_inbound": {
"override_agent_id": "agent_12345",
"agent_override": {
"agent": {
"voice_id": "11labs-Adrian",
"voice_speed": 1.2,
"voice_temperature": 0.6,
"interruption_sensitivity": 0.8
}
},
"dynamic_variables": {
"customer_name": "John Doe"
}
}
}
The webhook must be configured at the phone number level using the inbound_webhook_url field [(1) ]() [(2) ]() [(3) ]() .AI Evy
07/14/2026, 10:47 PMAI Evy
07/14/2026, 10:47 PMAlchemist
07/14/2026, 10:55 PMAI Evy
07/14/2026, 10:55 PMAI Evy
07/14/2026, 10:55 PMjson
{
"on_hold_music": {
"type": "default"
}
}AI Evy
07/14/2026, 10:55 PMinbound_webhook_url) is used to override agent settings, set dynamic variables, or reject calls when they first arrive [(2) ]() . It cannot control transfer behavior directly. Transfer settings must be configured either:
1. In the call transfer node within your conversation flow [(1) ]()
2. Via agent_override in the inbound webhook response to modify the agent's transfer node settings [(2) ]()
If you want to dynamically control transfer ring audio per inbound call, you would need to use agent_override in your inbound webhook response to modify the agent's call transfer node configuration .AI Evy
07/14/2026, 10:55 PMAI Evy
07/14/2026, 10:55 PMAlchemist
07/14/2026, 10:57 PMAI Evy
07/14/2026, 10:57 PMAI Evy
07/14/2026, 10:57 PMagent_override in your inbound webhook response if you want to dynamically change the warm transfer configuration per inbound call .
Example inbound webhook response (if you need dynamic overrides) :
json
{
"call_inbound": {
"override_agent_id": "agent_12345",
"dynamic_variables": {
"customer_name": "John Doe"
}
}
}AI Evy
07/14/2026, 10:57 PMAI Evy
07/14/2026, 10:57 PMAlchemist
07/14/2026, 11:26 PMAI Evy
07/14/2026, 11:26 PMAI Evy
07/14/2026, 11:26 PMskip response turned on) before the call transfer node .
Why this happens:
The call transfer node is designed for the transfer action only—the agent remains silent in this node . To deliver a handoff message, your conversation flow should look like this:
1. Conversation Node → Agent says your handoff script with skip response enabled
2. Call Transfer Node → Transfer executes silently
Warm transfer specific messages:
For warm transfer, you can configure these messages in the call transfer node settings :
- **Whisper message (optional) **: Spoken privately to the transfer target before connecting the caller
- **Three-way message (optional) **: Spoken to both parties once the connection is established
These messages are not the pre-transfer handoff to the caller. They occur during or after the transfer connection.
Known issue:
There's a documented case where conversation flow agents can stay silent after function nodes [(2) ]() , and similar behavior could affect nodes before transfers. Ensure your conversation node before the transfer has proper configuration.
Configuration check:
Verify your flow structure includes a conversation node before the transfer node, with the handoff script configured in that conversation node's prompt or static sentence, not in the transfer node itself [(1) ]() [(3) ](AI Evy
07/14/2026, 11:26 PMAI Evy
07/14/2026, 11:26 PMAI Evy
07/14/2026, 11:27 PMAlchemist
07/14/2026, 11:28 PMAI Evy
07/14/2026, 11:28 PMAI Evy
07/14/2026, 11:28 PMfrom and P-Asserted-Identity headers [(2) ]()
4. **SIP trunk configuration**: If you're using custom telephony (like Twilio SIPAI Evy
07/14/2026, 11:28 PMAI Evy
07/14/2026, 11:28 PMAI Evy
07/14/2026, 11:28 PMAlchemist
07/14/2026, 11:29 PMAI Evy
07/14/2026, 11:29 PMAI Evy
07/14/2026, 11:30 PMfrom and P-Asserted-Identity headers [(2) ]() . The telephony provider must support caller ID override for this feature to work properly [(1) ]() [(2) ]() .
Telephony provider requirements:
- Retell Twilio numbers support showing user's number on both warm and cold transfer [(2) ]()
- Retell Telnyx numbers only support this when using SIP REFER via cold transfer
- If caller ID override is not supported, the transfer would fail [(1) ]() [(2) ]()
Troubleshooting steps:
1. Verify your caller ID configuration in the call transfer node—ensure you've selected the appropriate caller ID setting (Retell Agent's number vs User's Number)
2. **Check telephony provider permissions**—warm transfer requires additional permissions compared to cold transfer [(3) ]() . Contact your telephony provider to verify that warm transfer is enabled for both inbound and outbound scenarios
3. Review your SIP trunk settingsAI Evy
07/14/2026, 11:30 PMAI Evy
07/14/2026, 11:30 PMAI Evy
07/14/2026, 11:30 PMAlchemist
07/14/2026, 11:31 PMAI Evy
07/14/2026, 11:31 PMAI Evy
07/14/2026, 11:31 PMinbound_webhook_url) , ensure it's not accidentally overriding your warm transfer configuration through agent_override
2. Confirm caller ID settings for inbound scenarios - In your call transfer node, check the Caller ID configuration. For inbound calls, the behavior differs:
- If set to "User's Number", the transfer destination sees the original caller's number
- For warm transfer with whisper messages, this uses SIP DIAL and sets from and P-Asserted-Identity headers [(2) ]()
- Your telephony provider must support caller ID override for this to work [(1) ]() [(2) ]()
3. Verify your phone number type [(2) ]() - Retell Twilio numbers support warm transfer with whisper messages for both inbound and outbound . If you're using custom telephony or imported numbers, check with your provider about inbound warm transfer permissions [(3) ]()
4. Test with a different inbound number - Try using a Retell-purchased Twilio number for inbound calls to rule out telephony provider restrictions
The whisper message configuration itself is cAI Evy
07/14/2026, 11:31 PMAI Evy
07/14/2026, 11:31 PMAlchemist
07/14/2026, 11:33 PMAI Evy
07/14/2026, 11:33 PMAI Evy
07/14/2026, 11:33 PMfrom and P-Asserted-Identity headers [(2) ]() . Retell Twilio numbers support showing user's number on both warm and cold transfer
Check for inbound-specific overrides:
If you have an inbound_webhook_url configured on your phone number, verify that your webhook response is not accidentally overriding the warm transfer settings through agent_override [(AI Evy
07/14/2026, 11:33 PMAI Evy
07/14/2026, 11:33 PMAI Evy
07/14/2026, 11:33 PMAlchemist
07/14/2026, 11:36 PMAI Evy
07/14/2026, 11:36 PMAI Evy
07/14/2026, 11:37 PMagent_override you're using in your inbound webhook is only overriding basic voice settings, but it's not overriding your call transfer node configuration, which is where the whisper message settings live [(1) ]() [(2) ]() .
The issue: When you use agent_override.agent in your inbound webhook response, you can override fields like voice_id, voice_speed, voice_temperature, interruption_sensitivity, and max_call_duration_ms , but this doesn't affect the warm transfer whisper message behavior configured in your conversation flow's call transfer node.
What's happening:
- Your outbound calls use the agent's default configuration (including the call transfer node with whisper message)
- Your inbound calls apply the agent_override, which may be causing the agent to behave differently during the transfer sequence
To fix this for inbound calls:
1. Remove the agent_override temporarily and test if the whisper message works for inbound calls without any overrides
2. If you need the voice overrides, ensure your call transfer node settings are properly configured in the base agent that handles inbound calls
3. Verify the agent being used - If you're specifying override_agent_id in your inbound webhook response, make sure that agent has the warm transfer whisper message properly configured
The agent_override.agent object can include settings like voice_id, voice_speed, voice_temperature, interruption_sensitivity, volume, voice_emotion, responsiveness, enable_backchannel, language, webhook_url, boosted_keywords, end_call_after_silence_ms, and max_call_duration_ms , but it doesn't directly override conversation flow node configurations like whisper messages in call transfer nodesAI Evy
07/14/2026, 11:37 PMAI Evy
07/14/2026, 11:37 PMAI Evy
07/14/2026, 11:37 PMAlchemist
07/14/2026, 11:54 PMAI Evy
07/14/2026, 11:54 PMAI Evy
07/14/2026, 11:54 PMagent_override, you're already using voice_temperature: 0.6, which can help with naturalness
- **Pause before speaking**: For the beginning of the call, if the agent speaks first, it will wait for the configured duration before speaking
Since you're already using agent_override in your inbound webhook with voice_speed: 0.96, you might want to lower this value further (e.g., 0.85-0.9) specifically for the greeting to make it less rushed.AI Evy
07/14/2026, 11:54 PMAI Evy
07/14/2026, 11:54 PMAlchemist
07/14/2026, 11:55 PMAI Evy
07/14/2026, 11:55 PMAI Evy
07/14/2026, 11:56 PMjson
"agent_override": {
"agent": {
"voice_id": "11labs-Cimo",
"voice_speed": 0.96,
"voice_temperature": 0.6,
"interruption_sensitivity": 0.8,
"max_call_duration_ms": 600000,
"begin_message_delay_ms": 1000
}
}
[(1) ]() [(2) ]()
This gives a 1-second delay before the first message, which can help reduce the robotic feel [(1) ]() [(2) ]() [(3) ]() .
Additional considerations:
Since you mentioned the first message sounds different from the rest of the conversation, you might also want to check if you're using a fixed welcome message versus letting the agent generate it dynamically [(4) ]() . Fixed messages can sometimes sound more robotic compared to LLM-generated responses .AI Evy
07/14/2026, 11:56 PMAI Evy
07/14/2026, 11:56 PM