Hi,
I am using Retell to work with a custom LLM through Websocket connection.
I have the pipeline working fine except for DTMF input. I am not receiving any DTMF input in the transcript of any of the WebSocket events.
I can see the user entry in the Retell chat history as:
User pressed keypad: 5136549875#
The agent setting has ‘User Keypad Input Detection’ turned on and ‘Termination Key’ as ‘#’.
How can I debug what is going wrong here?
Hi @admin15
DTMF input from users is captured and included in the transcript that Retell sends to your custom LLM via WebSocket. Since you can see “User pressed keypad: 5136549875#” in the Retell chat history, the DTMF detection is working correctly on Retell’s side.
In the WebSocket transcript array, DTMF input appears as a user role utterance with the keypad content. Check the transcript field in the response_required and update_only events your server receives the DTMF digits should appear in the content field of a user transcript entry.
To debug:
Log all incoming WebSocket events on your server — specifically the transcript array in response_required and update_only events.
If you’re still not seeing it in the raw WebSocket messages, Tell us here
Thank You
Hi @shaw , thank you for you response.
I logged all the websocket events and transcripts in the response_required and update_only events, but I couldn’t find the DTMF entry in the transcripts array.
I can provide a log of all 65 events from the websocket side of the call_id: call_b465c693ecb8c7c7031433de075, if that would be helpful.
Let me know if you need any additional information I can provide to help debug the issue.
Thanks.
Hi @admin15
Thank you for providing the call ID. I’ve shared it with our team for review.
We’ll keep you updated as soon as we have more information.
Best regards
Hi @admin15
Hi! Team looked into your call and found the issue — DTMF input data is delivered through the transcript_with_tool_calls field in WebSocket events, which requires opting in via your config response. Currently, your WebSocket server sends this config when the connection opens:
```json
{
“response_type”: “config”,
“config”: { “auto_reconnect”: true, “call_details”: true }
}
```
To receive DTMF input, you need to add transcript_with_tool_calls: true:
```json
{
“response_type”: “config”,
“config”: { “auto_reconnect”: true, “call_details”: true, “transcript_with_tool_calls”: true }
}
```
Once enabled, all WebSocket events update_only and response_required) will include a transcript_with_tool_calls array that contains DTMF entries like {"role": "dtmf", "digit": "5105158585#", "time_sec": 3.618} interleaved with the regular transcript.
Thank You
Thank you @shaw for the update. Will try out the solution as suggested.
It would be good to include this in the documentation. All my searches suggested that DTMF should appear as regular transcript.
Thanks again for you help.