Keypad (DTMF)
Collect touch-tone keypad input during a call, masked by default.
When a caller presses keys on their phone (touch-tones), OpenPhn can capture the digits and surface them into the call transcript. This is useful for menu selections ("press 1 for sales"), confirmation codes, or any short numeric entry the AI asks for out loud.
Digit collection is off by default and enabled per-flow. There is no dashboard toggle yet — it's configured in the flow YAML.
Enable it on a flow
Add a keypad block as a sibling of nodes in your flow definition:
name: order-status
entry: ask_order
nodes:
# ...
keypad:
ending_mode: terminator # terminator | fixed_length | timeout
terminators: ["#", "*"] # keys that END the sequence (terminator mode)
# max_length: 6 # required for fixed_length mode
# timeout_ms: 4000 # inter-digit gap that ends timeout mode
sensitive: true # mask the collected digits in the transcriptEnding modes
| Mode | Sequence ends when… |
|---|---|
terminator | the caller presses a terminator key (# / *). The terminator itself is not part of the collected digits. |
fixed_length | the caller has entered max_length digits. |
timeout | no new digit arrives within timeout_ms of the previous one. |
Masking is the default
OpenPhn masks collected digits in the transcript unless you explicitly
mark the field non-sensitive. A confirmation code shows as ••••, not the
raw value — the same discipline a PCI-conscious IVR uses, so card numbers
or SSNs entered on the keypad don't land in plaintext logs.
Set sensitive: false only for non-secret input (e.g. a menu choice)
where seeing the raw digit in the transcript is helpful.
Keypad capture works across every voice engine — pipecat decodes the touch-tones before they reach the model. Collected sequences are reliable in the transcript; surfacing them back to the speech-to-speech model mid-turn is best-effort.