Nameless
09/29/2026, 8:21 AMAI Evy
09/29/2026, 8:21 AMAI Evy
09/29/2026, 8:21 AMjson
{
"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"
}
}
}
The chosen language must be supported by the selected voice and a speech recognition provider, so check the language picker in the dashboard for valid combinations. [(1) ]()
Two things to keep in mind:
- The response must be valid JSON in this structure. A community thread notes that returning a non-JSON "first incoming item" response from n8n was the cause of a failed inbound webhook. [(3) ]()
- If the webhook fails or returns an invalid format, Retell retries up to 3 total attempts, then falls back to the number's inbound agent if one is set, otherwise the call is disconnected. [(2) ]()AI Evy
09/29/2026, 8:21 AMjson
{
"event": "call_inbound",
"event_timestamp": 1780012672105,
"call_inbound": {
"call_id": "call_12345",
"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"
}
}
}
Your endpoint responds with JSON (2xx status) with fields grouped under call_inbound. All fields are optional. To set the language for that call, return an agent_override object. The agent group supports a language field, among others. Overrides apply only to that call and must satisfy the same validation rules as agent creation (for example, voice/language compatibility) .
The documentation doesn't include a sample response showing a language value specifically. The sample response below shows the general structure with agent_override, and you would add language inside the agent object:AI Evy
09/29/2026, 8:21 AMAI Evy
09/29/2026, 8:21 AMNameless
09/30/2026, 7:01 AMAI Evy
09/30/2026, 7:01 AMAI Evy
09/30/2026, 7:01 AMlanguage field inside agent_override.agent in your inbound webhook response. The documentation lists language as a supported field in the agent group, but it doesn't show a sample value or the exact language code format, so check the language picker in the dashboard for valid values. [(1) ]()
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"
}
}
}AI Evy
09/30/2026, 7:01 AMlanguage value, so you would add language inside the agent object yourself. The chosen language must be supported by both the selected voice and a speech recognition provider. [(2) ]()
For a standalone prompt per language, the documented approach is to build one agent per language and pick it per call:
- Return override_agent_id (and optionally override_agent_version) in the webhook response to route the call to a different agent. [(1) ]()
- Each language-specific agent can then have its own prompt and its own single language setting. A single-language agent transcribes in one language, uses that language's pronunciation, and responds in that language. [(2) ]()
- If you use an agent override, the target agent is resolved by id/version first, then agent_override is applied on top for that call only. [(1) ]()
Through agent_override.retell_llm, you can also override begin_message per call, but the documentation doesn't list a field for overriding the full prompt in the inbound webhook.
I don't have documented guidance on swapping the full prompt text via the webhook beyond routing to a different agent and using dynamic variables (for example, {{customer_name}} in the begin_message) . [(3) ]()AI Evy
09/30/2026, 7:01 AMAI Evy
09/30/2026, 7:02 AMNameless
09/30/2026, 7:06 AMAI Evy
09/30/2026, 7:06 AMAI Evy
09/30/2026, 7:07 AM{{user_name}} exists is the documented form for testing whether a variable is set. [(2) ]()
- An Extract DV node can capture a value from the conversation as a dynamic variable. Variable types are Text, Number, Boolean, and Enum. [(1) ]()
Equation: {{user_name}} existsAI Evy
09/30/2026, 7:07 AMAI Evy
09/30/2026, 7:07 AMAI Evy
09/30/2026, 7:07 AMAI Evy
10/02/2026, 3:36 AMNameless
10/02/2026, 3:36 AMAI Evy
10/02/2026, 3:37 AMAI Evy
10/02/2026, 3:37 AMAI Evy
10/02/2026, 3:37 AMNameless
10/02/2026, 3:37 AMAI Evy
10/02/2026, 3:37 AMAI Evy
10/02/2026, 3:37 AMpython
import os
from retell import Retell
client = Retell(
api_key=os.environ.get("RETELL_API_KEY") , # This is the default and can be omitted
)
conversation_flow_response = client.conversation_flow.retrieve(
conversation_flow_id="conversation_flow_id",
)
print(conversation_flow_response.conversation_flow_id)AI Evy
10/02/2026, 3:37 AMversion query parameter, which defaults to the latest version.
Update a conversation flow
A community thread confirms there is an update conversation flow API, and that it is the one that creates tools, while the create endpoint accepted a tools parameter without applying it. [(2) ]() The thread links the [Update Conversation Flow API reference]() , but the sources here don't include its Python signature or parameters. I won't invent that call.
What you can do with the documented pieces
- Use client.conversation_flow.retrieve(...) to fetch the flow, which returns fields such as nodes, tools, global_prompt, and start_node_id. [(1) ]()
- Edit that data in your own code, then send it back through the update endpoint, following the parameters on the Update Conversation Flow reference page.
Create is documented with required fields model_choice, nodes, and start_speaker, which is useful if you want to create a new flow from a modified copy instead. [(3) ]()
If you'd like, I can try a general draft based on my own knowledge, though it won't be backed by the documented update call.AI Evy
10/02/2026, 3:37 AMAI Evy
10/02/2026, 3:37 AM