mannankhan
02/17/2026, 7:35 AMAI Evy
02/17/2026, 7:36 AMAI Evy
02/17/2026, 7:36 AMAI Evy
02/17/2026, 7:36 AMAI Evy
02/17/2026, 7:36 AMmannankhan
02/17/2026, 7:45 AMAI Evy
02/17/2026, 7:45 AMAI Evy
02/17/2026, 7:45 AM///## Guideline
If the user says "hold on", "please wait", "one moment", or similar phrases indicating they need time, reply exactly: "NO_RESPONSE_NEEDED"
This approach uses prompt engineering to control the agent's behavior when it detects these phrases. The agent will follow your instructions and output the exact phrase you specify.
Important considerations:
- Retell AI's turn-taking model is designed to recognize conversational cues and determine when to respond or wait. [(2) ]() , [(3) ]()
- The turn-taking model combines contextual analysis with sound signals to understand whether a user is pausing or finished speaking.
- However, the actual "NO_RESPONSE_NEEDED" text would still be spoken unless you handle it differently in your application logic.
If your goal is to have the agent stay completely silent while the user is busy, you may want to instruct the agent to say something brief like "Sure, take your time" or "No problem, I'll wait" instead—since Retell doesn't have a native "hold" or "mute" feature for the agent.AI Evy
02/17/2026, 7:45 AMAI Evy
02/17/2026, 7:45 AMmannankhan
02/17/2026, 7:47 AMAI Evy
02/17/2026, 7:47 AMAI Evy
02/17/2026, 7:48 AMstart_speaker to "user" so the agent waits for the user to speak before responding. [(1) ]() [(2) ]()
Additionally, you can use begin_after_user_silence_ms to control how long the agent waits for the user before speaking (if the agent is configured to wait for the user first) .
json
{
"start_speaker": "user",
"begin_after_user_silence_ms": 2000
}
[(1) ]() , [(2) ]()
## Adjust Reminder Settings
You can configure reminder_max_count to 0 to disable the agent from reminding the user when they're silent. [(3) ]() [(4) ]()
You can also increase reminder_trigger_ms to delay how long the agent waits before prompting a silent user.
json
{
"reminder_max_count": 0,
"reminder_trigger_ms": 10000
}
[(3) ]() , [(4) ]()
## Increase End-Call Silence Threshold
Use end_call_after_silence_ms to extend how long the call stays active during silence (minimum 10,000 ms, default 600,000 ms / 10 min) . [(3) ]() [(4) ]()AI Evy
02/17/2026, 7:48 AMAI Evy
02/17/2026, 7:48 AMAI Evy
02/17/2026, 7:48 AMmannankhan
02/17/2026, 8:09 AMAI Evy
02/17/2026, 8:09 AMAI Evy
02/17/2026, 8:09 AMreminder_trigger_ms duration again
2. It will send another reminder, up to the reminder_max_count limit
3. After all reminders are exhausted and the user remains silent, the call will eventually disconnect based on end_call_after_silence_ms (default 600,000 ms / 10 min)
The sources don't explicitly document a reminder_required event/webhook—if you're referring to a specific webhook or WebSocket event, I don't have information about that particular behavior in the available documentation.AI Evy
02/17/2026, 8:09 AMAI Evy
02/17/2026, 8:10 AMmannankhan
02/17/2026, 8:11 AMAI Evy
02/17/2026, 8:11 AMAI Evy
02/17/2026, 8:12 AMreminder_required after some time — controlled by agent-level settings.
The WebSocket protocol shows that Retell sends reminder_required events when the user has been silent for a period after agent speech. [(1) ]()
interaction_type: "reminder_required"
The behavior is governed by these agent settings:
- **`reminder_trigger_ms`**: Triggers a reminder if the user has been silent for the specified duration after agent speech. Default is 10,000 ms (10 s) . [(2) ]()
- **`reminder_max_count`**: Controls how many times the agent reminds an unresponsive user. Default is 1. Set to 0 to disable reminders.
After all reminders are exhausted, the call will eventually disconnect based on end_call_after_silence_ms (default 600,000 ms / 10 min) .
**Regarding `response_id`**: You're correct that you need to capture the response_id from the incoming event. The documentation states that response_id is required in your response and "indicates which requested response this is answering." [(1) ]()
When a new response is needed, Retell sends a new event with a new response_id, and "all previous responses will be discarded."
So yes—if you want to send any response (including a "call is on hold" message) , you must include the correct response_id from the most recent reminder_required or response_required event.AI Evy
02/17/2026, 8:12 AMAI Evy
02/17/2026, 8:12 AMmannankhan
02/19/2026, 5:17 AMAI Evy
02/19/2026, 5:17 AMAI Evy
02/19/2026, 5:18 AMjson
{
"response_type": "response",
"response_id": 0,
"content": "",
"content_complete": true
}
This is useful for your "hold" scenario—when you receive a reminder_required event and want the agent to stay silent, you can respond with an empty string content to acknowledge the event without having the agent speak.AI Evy
02/19/2026, 5:18 AMAI Evy
02/19/2026, 5:18 AMmannankhan
02/21/2026, 8:04 AMAI Evy
02/21/2026, 8:04 AMAI Evy
02/21/2026, 8:05 AMAI Evy
02/21/2026, 8:05 AMAI Evy
02/21/2026, 8:05 AMAI Evy
02/22/2026, 10:51 AMmannankhan
02/22/2026, 10:51 AMAI Evy
02/22/2026, 10:51 AMcall.ended event) rather than through the LLM WebSocket.AI Evy
02/22/2026, 10:51 AMAI Evy
02/22/2026, 10:51 AMresponse_required
The documentation states that when a new response is needed, "a new event with response id will be sent, and all previous responses will be discarded."
This means Retell will send a new response_required event with a new response_id when it determines another response is needed. Retell continuously assesses when it's appropriate for the agent to speak and asks for content accordingly.
## The Loop Concern
Yes, this could create a loop. The documentation notes that "not all responses Retell ask for would get spoken out, cause the user might continue to speak even when Retell thought it would be agent's turn."
To handle this during hold, you'd need application-level logic to track hold state and respond appropriately (e.g., with empty content or a brief acknowledgment) .
## update_only Events During Hold
You should continue processing update_only events. These provide live transcript updates and turntaking information—they don't require a response from your server.
If you have auto_reconnect set to true in your config, you also need to respond to ping_pong events every 2 seconds to keep the connection alive. Retell will close the connection if there's no ping_pong for 5 seconds.
## Call End Signaling
The documentation shows various disconnection reasons like user_hangup, agent_hangup, inactivity, etc.
[(2) ]()
However, I don't have specific information in these sources about whether Retell sends a final update_only event with the complete tranAI Evy
02/22/2026, 10:51 AMmannankhan
02/23/2026, 4:53 PMAI Evy
02/23/2026, 4:53 PMAI Evy
02/23/2026, 4:53 PMresponse_id from Retell yet:
## 1. Use the Agent Interrupt Event
The agent_interrupt event allows you to jump into the conversation and speak content immediately—**without needing a `response_id`** from a response_required or reminder_required event.
[(1) ]()
json
{
"response_type": "agent_interrupt",
"content": "Your call is now on hold. Please wait.",
"content_complete": true
}
This event "interrupts both agent and user" and lets you speak content immediately.
## 2. Always Capture the Latest response_id
The documentation states that when a new response is needed, "a new event with response id will be sent, and all previous responses will be discarded."
For your application logic:
- Store the response_id from every response_required and reminder_required event you receive
- Use that stored ID when sending system messages
- If no response_id has been received yet (call just started) , use the agent_interrupt event instead
## Recommended Pattern
- **At call start or when no response_id exists**: Use agent_interrupt for system messages
- **After receiving any `response_required`/`reminder_required`**: Use the standard response event with the captured response_id
The agent_interrupt event is specifically designed for cases where you need to proactively send content without waiting for Retell to request it.AI Evy
02/23/2026, 4:53 PMAI Evy
02/23/2026, 4:53 PMmannankhan
02/23/2026, 7:29 PMAI Evy
02/23/2026, 7:29 PMAI Evy
02/23/2026, 7:29 PMresponse event fails in this scenario
The response event requires a valid response_id that "indicates which requested response this is answering." [(1) ]() This is designed to respond to response_required or reminder_required events from Retell.
When you send a response event out-of-band (not in direct reply to a Retell request) , Retell may not be expecting it, which can cause protocol issues like Error_llm_websocket_open.
## Why agent_interrupt is the correct approach
The agent_interrupt event is specifically designed for your use case—it allows you to "jump in the conversation and speak something immediately" without needing a response_id from a prior Retell request.
json
{
"response_type": "agent_interrupt",
"interrupt_id": 1,
"content": "Your hold time has expired. Goodbye.",
"content_complete": true,
"end_call": true
}
Key differences:
- agent_interrupt uses interrupt_id (a unique ID you maintain on your server) instead of response_id
- It "will stop the agent speech if the agent is speaking, or it will interrupt the user if the user is speaking"
- It supports end_call: true to end the call after the content is spoken
## Recommendation
Yes, switch your hold expiry message to use agent_interrupt with end_call: true, just like you did for the warning message.AI Evy
02/23/2026, 7:29 PMAI Evy
02/23/2026, 7:29 PMmannankhan
02/23/2026, 7:36 PMAI Evy
02/23/2026, 7:36 PMAI Evy
02/23/2026, 7:36 PMresponse event works during active calls
During normal call flow, Retell sends response_required events when it determines the agent should speak. Your server responds with a response event that includes the response_id from that request.
[(1) ]()
The documentation states: "When a new response is needed, a new event with response id will be sent, and all previous responses will be discarded."
So when your 20s inactivity timer fires during a normal active call, there's likely a recent response_id available from the ongoing conversation lifecycle, making the response payload valid.
## Why it breaks during hold expiry
The agent_interrupt event is specifically designed to "jump in conversation and speak content immediately, interrupts both agent and user."
Key distinction:
- **`response` event**: Requires a valid response_id that "indicates which requested response this is answering"
- **`agent_interrupt` event**: Uses interrupt_id (a unique ID you maintain on your server) and doesn't require a prior Retell request
During hold, you're not in the normal response lifecycle—Retell isn't actively requesting responses. Sending a response payload out-of-band (without a corresponding response_required turn) causes the protocol mismatch.
## The fix
Use agent_interrupt with end_call: true for hold expiry, same as your warning message.
[(2) ]()AI Evy
02/23/2026, 7:36 PMAI Evy
02/23/2026, 7:36 PM