https://retellai.com/?utm_source=discord&utm_medium=seo logo
do we need a business registration for oubound cal...
# ❓・ai-evy-support
a
@AI Evy do we need a business registration for oubound calling and what are the exact requirements? Also, can we send an outbound SMS directly from Retell number? If yes, what is the registration process
a
Thanks for tagging me @Alchemist. I'll look through relevant sources and get back to you shortly.
### Answer Based on the available sources, I don't have specific documentation about business registration requirements for outbound calling with Retell AI. However, I can provide information about outbound SMS. Outbound SMS from Retell Numbers: Yes, you can send outbound SMS directly from Retell numbers [(1) ]() . The API endpoint for creating outbound SMS is available [(2) ]() . To send an outbound SMS, you need [(1) ]() : 1. A phone number purchased from Retell or imported to Retell with SMS capability 2. The phone number must be in E.164 format Here's how to create an outbound SMS :
Copy code
javascript
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]() .
​ To learn more, see the sources I considered: [[1] Create Outbound SMS](https://docs.retellai.com/api-references/create-sms-chat) [[2] Node KB, Role-Based Access, Outbound SMS API & More](https://www.retellai.com/changelog/node-kb-role-based-access-outbound-sms-api-more) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy provide me outbound call api endpoint as well
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer The outbound call API endpoint is
/create-phone-call
[(1) ]() . Here's how to make an outbound call :
Copy code
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) ]() .
​ To learn more, see the sources I considered: [[1] Outbound Calls (Make Calls)](https://docs.retellai.com/deploy/outbound-call) [[2] Create Batch Call](https://docs.retellai.com/api-references/create-batch-call) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy, I need http with json
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer For HTTP requests with JSON to create an outbound call, use a POST request to ` with your API key in the Authorization header and a JSON body. The request format is:
Copy code
bash
POST <https://api.retellai.com/v2/create-phone-call>
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
With a JSON body like:
Copy code
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 `
Copy code
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]() .
message has been deleted
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy how can AI voice agent determine if a call is inbound or outbound? Also, how can I have the Ai fetch data from CRM for inbound calls?
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer --- Your AI voice agent can determine if a call is inbound or outbound using the
{{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:
Copy code
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:
Copy code
javascript
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) ]()
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Receive calls](https://docs.retellai.com/deploy/inbound-call) [[3] Code tool for single and multi-prompt agents](https://docs.retellai.com/build/single-multi-prompt/code-tool) [[4] Map CRM fields to Retell contacts and call data](https://docs.retellai.com/integrations/crm-mappings) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy how to setup inbound call webhook? also, tell me structruture of how CRM API response in Json
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer Setting Up Inbound Call Webhook: To set up an inbound call webhook, you need to configure it in your phone number settings [(1) ]() [(2) ]() [(3) ]() . The webhook URL can be set when importing a phone number or updating an existing one [(2) ]() [(3) ]() . Configuration Steps: 1. Set the
inbound_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 :
Copy code
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 :
Copy code
json
{
  "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 .
​ To learn more, see the sources I considered: [[1] Inbound call & SMS webhook](https://docs.retellai.com/features/inbound-call-webhook) [[2] Import Phone Number](https://docs.retellai.com/api-references/import-phone-number) [[3] Get Phone Number](https://docs.retellai.com/api-references/get-phone-number) [[4] INTEGRATION CRM WITH API](https://discord.com/channels/1186424376300679209/1430967137765425373) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy, is it possible for the flow to divide branches on the basis of whether the transfer was successful
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer Yes, in conversation flow you can branch based on whether a transfer was successful [(1) ]() . Transfer Failure Handling: The call transfer node automatically handles transfer failures . When you add a call transfer node, there's a pre-populated edge specifically for transfer failures . You can connect this edge to another node to handle the failure scenario . How It Works: Transition happens when the transfer fails . You can connect the transfer failure edge to any node you want - for example, a conversation node that apologizes and offers alternative options, or another transfer node that tries a different number . This allows your conversation flow to have two distinct branches: - **Success path**: Continue with the normal flow after transfer - **Failure path**: Handle the situation when transfer fails (e.g., no answer, busy signal, voicemail detection failure) The system automatically determines which branch to take based on the transfer outcome .
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy there is only one path to connect after transfer node and it's for Failure, no path for successful transfer
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer You're correct about the call transfer node behavior. According to the documentation, transition happens when transfer fails [(1) ]() . There is a pre-populated edge specifically for transfer failure that you can connect to handle that scenario . For successful transfers, there is no transition path because the call itself is transferred to the destination number . Once the transfer succeeds, the original Retell agent's conversation flow ends - the call is now being handled by whoever answered at the transfer destination . If you need branching logic after a successful transfer, consider using an Agent Transfer Node instead [(2) ]() . Agent transfer hands the conversation to a different Retell agent mid-call, and since both agents are within the Retell system, you maintain control over the flow . The destination agent inherits the full conversation history, and you can continue building your conversation flow logic . Key differences : - **Call Transfer Node**: Transfers to an external phone number or SIP URI - once successful, you lose control of the flow [(1) ]() - **Agent Transfer Node**: Transfers to another Retell agent - you maintain control and can continue the conversation flow [(2) ]() If you're trying to route between AI agents or need post-transfer logic, agent transfer is preferred over call transfer .
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Agent Transfer Node](https://docs.retellai.com/build/conversation-flow/transfer-agent-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy can we check from webhook if the call was answered or not?
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer Yes, you can check if a call was answered through webhooks and the Get Call API [(1) ]() . Webhook Events for Call Status: Retell sends webhooks at different lifecycle events : - **call_started**: When the call connects - **call_ended**: Final status and duration - **call_analyzed**: Transcript and analysis ready - **call_failed**: Error details and reasons Checking Call Outcome: To determine if a call was answered or not, you should examine the webhook payload or use the Get Call API [(2) ]() . The available fields show the status of your call . For outbound calls specifically, you can track outcomes like : - ✅ Answered (the lead picked up) - ❌ No Answer (rang but no pickup) - 📴 Failed / unreachable (number invalid or blocked) - 🟥 Hung up (lead or agent disconnected early) The recommendation is to place some test calls and examine the status fields in the webhook events or Get Call API response to understand the exact field names and values that indicate whether a call was answered . Important Note About Webhook Configuration: For inbound calls, the webhook must be configured at the phone number level to receive inbound webhook events [(3) ]() . For outbound calls, webhooks work at the agent level .
​ To learn more, see the sources I considered: [[1] Outbound Calls (Make Calls)](https://docs.retellai.com/deploy/outbound-call) [[2] Outbound status](https://discord.com/channels/1186424376300679209/1371593086341480509) [[3] webhook is not able to receive the inbound call data. It works for outbound calls though](https://discord.com/channels/1186424376300679209/1399815679275958292) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy now I need help to send status tags to CRM in between call through funtion. But the data needs to be static. Give me json
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer To send static status tags to your CRM during a call using a custom function, you can configure a Custom Function node in conversation flow [(1) ]() . Here's the JSON structure for the HTTP request: Custom Function Configuration:
Copy code
json
{
  "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) ]() :
Copy code
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) ]()
​ To learn more, see the sources I considered: [[1] Dynamic Variables](https://docs.retellai.com/build/dynamic-variables) [[2] Platform Changelogs | Retell AI](https://www.retellai.com/changelog) [[3] Create Phone Call](https://docs.retellai.com/api-references/create-phone-call) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy this body json not sending anything in Test.
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer When configuring a custom function in Retell AI to send static data to your CRM, you need to define the parameters using JSON schema format, not just a plain JSON body [(1) ]() [(2) ]() . The Issue: The "body" you showed isn't valid for Retell's custom function configuration. Retell expects a JSON schema that describes the structure of your parameters . Correct Parameter Schema for Static Values: For POST, PATCH, or PUT requests, define your parameters like this :
Copy code
json
{
  "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 .
​ To learn more, see the sources I considered: [[1] Custom function in conversation flow](https://docs.retellai.com/build/conversation-flow/custom-function) [[2] Integrate any system with custom function](https://docs.retellai.com/build/single-multi-prompt/custom-function) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy When Ai transfers the call, it doesn't detect VM and still tries to handoff
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer When an AI transfers a call, voicemail detection behavior depends on your configuration and the transfer type [(1) ]() [(2) ]() [(3) ]() . Why Voicemail Detection May Not Work During Transfer: Voicemail detection is configured at the agent level in Call Settings [(2) ]() . However, when you use a call transfer node, the call is handed off to an external phone number or SIP URI, and once the transfer succeeds, the original Retell agent's conversation flow ends [(3) ]() . This means the voicemail detection settings from your original agent may not apply to the transfer destination. Key Points About Transfer and Voicemail Detection: - Call transfer is similar to placing an outbound call [(1) ]() , so failures occur for similar reasons as outbound call failures - If human detection is enabled during transfer, the call may fail if a human is not successfully detected . Possible reasons include: - No human was actually present (e.g., it was an IVR or voicemail) - The other party spoke, but only after the detection timeout expired - The speech was too similar to an IVR or voicemail and was not recognized as human Voicemail Detection Configuration: Voicemail detection runs continuously within a timeout window and offers two options [(2) ]() : - **Hang up**: Disconnect immediately when voicemail is detected - **Leave a message**: Wait for the agent's turn to speak, then deliver a message Voicemail and IVR detection only run for the **f
irst 3 minutes of the call** . Known Issue with Conversation Flow: There's a documented issue where voicemail detection can interfere with conversation flow nodes designed to take messages [(4) ]() . When voicemail detection is enabled, the system may hang up even when the user wants to leave a message through your conversation flow . This happens because voicemail detection is applied globally at the agent level, not node-specifically . Recommendations: 1. Enable human detection in your call transfer node configuration to prevent transfers to voicemail [(1) ]() 2. Configure the transfer dial timeout to control how long the destination should ring [(3) ]() 3. If voicemail is detected during transfer, the disconnection reason will be
voicemail_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) ]()
​ To learn more, see the sources I considered: [[1] Debug call transfer failure](https://docs.retellai.com/reliability/call-performance) [[2] Handle voicemail and IVR](https://docs.retellai.com/build/handle-voicemail) [[3] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[4] Conversation Flow Hang up for message](https://discord.com/channels/1186424376300679209/1386503024565813330) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy tell me details about webhook events for calls and exact payload value for event type
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer Retell AI supports several webhook events for voice calls that deliver real-time notifications to your server [(1) ]() . Voice Call Webhook Events: The following event types are available : - **`call_started`**: Triggered when a new call begins, containing basic call information - **`call_ended`**: Triggered when a call completes, transfers, or encounters an error, containing all fields from the call object except
call_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:
Copy code
json
{
  "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 :
Copy code
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
  }
}
Key Technical Details: - The webhook has a 10-second timeout - If no success status (2xx) is received within 10 seconds, the webhook will be retried up to 3 times - Webhooks are triggered in order but are non-blocking - When a call did not connect (dial_failed, dial_no_answer, dial_busy) ,
call_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 payload
​ To learn more, see the sources I considered: [[1] Webhook Overview](https://docs.retellai.com/features/webhook-overview) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
if call is not answered
@AI Evy if call is not answered
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer If a call is not answered, you'll still receive webhook events, but with specific behavior [(1) ]() : What happens when a call isn't answered: -
call_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:
Copy code
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) ]() .
​ To learn more, see the sources I considered: [[1] Webhook Overview](https://docs.retellai.com/features/webhook-overview) [[2] How to send webhook events when a user doesn't pick up the phone or hangs up mid conversation?](https://discord.com/channels/1186424376300679209/1358279830906343554) [[3] Conversation Analysis](https://discord.com/channels/1186424376300679209/1343581117076471859) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
tell all disconnection reasons possible @AI Evy
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer All possible disconnection reasons in Retell AI are [(1) ]() [(2) ]() [(3) ]() [(4) ]() [(5) ]() : User-Initiated: -
user_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 - `err
or_no_audio_received` - No audio received -
error_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) ]() .
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy how to adjust voice speed in inbound call webhook
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer To adjust voice speed for inbound calls, use the inbound webhook response with the
agent_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 :
Copy code
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:
Copy code
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) ]() .
​ To learn more, see the sources I considered: [[1] Inbound call & SMS webhook](https://docs.retellai.com/features/inbound-call-webhook) [[2] Import Phone Number](https://docs.retellai.com/api-references/import-phone-number) [[3] Update Phone Number](https://docs.retellai.com/api-references/update-phone-number) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy and how can I set the inbound call webhook to play ring while attempting transfer
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer To configure ring audio during call transfer, use the call transfer node settings, not the inbound webhook [(1) ]() . The inbound webhook is for processing incoming calls before they connect, while transfer ring settings are configured in the transfer node itself [(1) ]() [(2) ]() . Configure ring audio in the call transfer node: For warm transfer or agentic warm transfer, you can set the on-hold music that plays while the transfer is being attempted [(1) ]() :
Copy code
json
{
  "on_hold_music": {
    "type": "default"
  }
}
Key transfer node settings: - **On-hold music**: The audio played to the caller while they are on hold during warm transfer - **Three-way ring tone**: For agentic warm transfer, this is the audio the original caller hears while the transfer agent is handling the handoff - **Transfer dial timeout**: Controls how long the destination should ring before timing out Important distinction: The inbound webhook (
inbound_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 .
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Inbound call & SMS webhook](https://docs.retellai.com/features/inbound-call-webhook) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy I'm using warm trabsfer, do I need to set this in inbound call webhook response
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer No, you don't need to set warm transfer ring/on-hold music settings in the inbound call webhook response [(1) ]() [(2) ]() . Where to configure warm transfer on-hold music: Warm transfer settings, including on-hold music, are configured in the call transfer node itself within your conversation flow [(2) ]() . The settings include: - **On-hold music**: The audio played to the caller while they are on hold - **Navigate IVR**: Prompt to help navigate if the transfer target is an IVR system - **Enable human detection**: When enabled, the agent checks if a human is present after the transfer target answers - **Whisper message**: A message spoken privately to the transfer target before connecting them to the original caller - **Three-way message**: A message spoken to both the transfer target and the original caller once the connection is established When to use the inbound webhook: The inbound webhook is used to dynamically override agent settings, set dynamic variables, or filter calls when they first arrive [(1) ]() . You would only need to use
agent_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) :
Copy code
json
{
  "call_inbound": {
    "override_agent_id": "agent_12345",
    "dynamic_variables": {
      "customer_name": "John Doe"
    }
  }
}
The warm transfer on-hold music and other transfer settings are part of your agent's configuration in the call transfer node, not something you typically set per-call via the inbound webhook [(2) ]() .
​ To learn more, see the sources I considered: [[1] Inbound call & SMS webhook](https://docs.retellai.com/features/inbound-call-webhook) [[2] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy for inbound calls, ai is not saying the transfer hand-off script
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer The AI agent will not speak during the call transfer node itself [(1) ]() . If you want the agent to say a handoff script like "Let me transfer you right away" before performing the transfer, you need to add a conversation node (with
skip 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) ](
sation-flow/node) .
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Conversation Flow agent potentially stay silent after function node](https://community.retellai.com/t/conversation-flow-agent-potentially-stay-silent-after-function-node/135) [[3] Node Overview](https://docs.retellai.com/build/conversation-flow/node) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy I'm asking about Whisper message, it's not saying this to transfer target. it says this for outbound calls
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer When configuring warm transfer with whisper messages, you should verify the following settings in your call transfer node configuration [(1) ]() : Whisper message configuration: - The whisper message is a message spoken privately to the transfer target before connecting them to the original caller - This message should be configured in the call transfer node settings under the warm transfer specific settings section Potential issues to check: 1. **Transfer type verification**: Ensure you've selected warm transfer (not cold transfer) in your transfer type configuration, as whisper messages are only available for warm transfer modes [(1) ]() [(2) ]() 2. **Telephony provider permissions**: Based on a documented case, warm transfer requires additional permissions from your telephony provider compared to cold transfer [(3) ]() . If whisper messages work for outbound calls but not inbound calls, this could indicate a permission or configuration issue with your telephony provider 3. **Caller ID settings**: The caller ID configuration can affect transfer behavior. You can configure which caller ID shows up to the transfer destination: either the Retell Agent's number or the User's Number [(1) ]() [(2) ]() . For warm transfer, this uses SIP DIAL and sets
from
and
P-Asserted-Identity
headers [(2) ]() 4. **SIP trunk configuration**: If you're using custom telephony (like Twilio SIP
trunk) , verify your SIP trunk settings allow warm transfer operations [(3) ]() . The documented case shows that warm transfer uses different SIP behavior than cold transfer and may require contacting your telephony provider to enable proper permissions Recommended troubleshooting steps: 1. Check your call transfer node to confirm warm transfer is selected and whisper message is configured [(1) ]() 2. Verify your telephony provider supports warm transfer for both inbound and outbound scenarios [(3) ]() 3. If using custom telephony, contact your provider to ensure warm transfer permissions are enabled 4. Review your SIP trunk settings if applicable
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Transfer call tool for single & multi-prompt agents](https://docs.retellai.com/build/single-multi-prompt/transfer-call) [[3] Warm transfer](https://discord.com/channels/1186424376300679209/1436106645632450671) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy when it transfers outbound calls, it says the whisper message correctly but when it tries to transfer an inbound call, it doesn't say the script
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer Based on the issue you're describing—whisper messages working for outbound calls but not for inbound calls—this points to a configuration or telephony provider permission issue specific to inbound call handling [(1) ]() [(2) ]() . Key differences between inbound and outbound warm transfers: For warm transfer, the system uses SIP DIAL and sets
from
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 settings
if using custom telephony (like Twilio SIP trunk) —the SIP trunk must allow warm transfer operations for inbound calls 4. **Test with agent detection settings**—verify that "Enable human detection" and "Agent detection timeout" are properly configured in your warm transfer settings [(1) ]() [(2) ]() The whisper message is configured correctly if it works for outbound calls, so the issue is likely related to inbound-specific telephony routing or permissions rather than your agent configuration .
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Transfer call tool for single & multi-prompt agents](https://docs.retellai.com/build/single-multi-prompt/transfer-call) [[3] Warm call transfer](https://discord.com/channels/1186424376300679209/1356928532101726338) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy are you dumb? it's working incase of outbound calls
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer I understand your frustration. Since whisper messages work correctly for outbound calls but not for inbound calls, this indicates an inbound-specific configuration issue. Check these settings for inbound calls: 1. Verify the inbound webhook is not overriding transfer settings [(1) ]() [(2) ]() - If you're using an inbound webhook (
inbound_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 c
orrect since it works for outbound calls. The issue is specific to how your inbound calls are routed or how your telephony provider handles inbound warm transfers [(1) ]() [(2) ]() [(3) ]() .
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Transfer call tool for single & multi-prompt agents](https://docs.retellai.com/build/single-multi-prompt/transfer-call) [[3] Warm transfer](https://discord.com/channels/1186424376300679209/1436106645632450671) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy I'm already using retell purchased twilio number
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer Since you're using a Retell-purchased Twilio number and whisper messages work for outbound but not inbound calls, here are specific troubleshooting steps: Verify warm transfer configuration in your call transfer node: [(1) ]() 1. Confirm warm transfer is enabled - Ensure you've selected "warm transfer" (not cold transfer) as your transfer type 2. Check whisper message configuration - The whisper message should be configured in the warm transfer specific settings section of your call transfer node 3. Review agent detection settings: - Enable human detection - When enabled, the agent checks if a human is present after the transfer target answers - Auto-greet - If enabled, the agent will immediately say "Hello" when the transfer target picks up, which encourages a response and increases the likelihood of detecting a human - Agent detection timeout - The maximum time the AI agent will wait to determine whether the transfer target is a human (default is 30 seconds) 4. Verify caller ID setting - You can configure which caller ID shows up to the transfer destination: either the Retell Agent's number or the User's Number [(1) ]() [(2) ]() . For warm transfer, this uses SIP DIAL and sets
from
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
[(
1) ]() [(2) ]() Since Retell Twilio numbers should support warm transfer with whisper messages for both inbound and outbound calls [(2) ]() , and your outbound calls work correctly, the issue may be related to agent detection timeout or human detection settings that behave differently for inbound scenarios.
​ To learn more, see the sources I considered: [[1] Call transfer node in conversation flow](https://docs.retellai.com/build/conversation-flow/call-transfer-node) [[2] Transfer call tool for single & multi-prompt agents](https://docs.retellai.com/build/single-multi-prompt/transfer-call) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy I'm using this in inbound webhook : "agent_override": { "agent": { "voice_id": "11labs-Cimo", "voice_speed": 0.96, "voice_temperature": 0.6, "interruption_sensitivity": 0.8, "max_call_duration_ms": 600000 }
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer The
agent_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 nodes
.
​ To learn more, see the sources I considered: [[1] Create Voice Agent](https://docs.retellai.com/api-references/create-agent) [[2] Update Voice Agent](https://docs.retellai.com/api-references/update-agent) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
a
@AI Evy now we have anther problem. the greeting/first message that Ai says is very robotic and too fast as compared to following conversation by Ai
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer To fix the robotic and fast first message, you can adjust the voice speed setting for your agent [(1) ]() . Configure voice speed: 1. Open the voice selection dropdown menu in your agent settings 2. Use the Voice Speed slider (ranging from 0.5x to 2.0x) to adjust the agent's speaking speed 3. You can also enable "Dynamically adjust based on user input" so the agent automatically adapts its speaking speed to match the user's pace during the call When dynamic voice speed is enabled, the agent tracks the user's words per minute and gradually shifts its own speed to align, making the conversation feel more natural . The user can also explicitly ask the agent to speak faster or slower, and the agent will adjust on the fly . Additional settings to improve naturalness: - **Responsiveness**: Adjust how responsive the agent is . Set it lower if you want the agent to wait longer before responding, which can make interactions feel less rushed - **Voice Temperature**: In your
agent_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.
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.
​ To learn more, see the sources I considered: [[1] Step 2: Configure the basic settings](https://docs.retellai.com/build/single-multi-prompt/configure-basic-settings) ​
a
@AI Evy the overall speed of agent is alright, problem is only there with first message
a
Thanks for the follow-up, @Alchemist. I'll get back to you soon.
### Answer To address the robotic and fast first message specifically (while keeping the rest of the conversation at the right speed) , you can use the begin_message_delay_ms setting [(1) ]() [(2) ]() [(3) ]() . This setting delays the first message by a specified amount of milliseconds, giving the agent more time to prepare and potentially making the delivery less rushed . Valid range is [0, 5000] milliseconds . This only applies when the agent speaks first . In your inbound webhook response, add:
Copy code
json
"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 .
​ To learn more, see the sources I considered: [[1] Get Voice Agent](https://docs.retellai.com/api-references/get-agent) [[2] Update Voice Agent](https://docs.retellai.com/api-references/update-agent) [[3] Get Agent Versions](https://docs.retellai.com/api-references/get-agent-versions) [[4] Step 2: Configure the basic settings](https://docs.retellai.com/build/single-multi-prompt/configure-basic-settings) ​
Feel free to tag @AI Evy with additional questions. I also appreciate feedback, it helps me improve.