OpenPhn docs
Concepts

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 transcript

Ending modes

ModeSequence ends when…
terminatorthe caller presses a terminator key (# / *). The terminator itself is not part of the collected digits.
fixed_lengththe caller has entered max_length digits.
timeoutno 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.

On this page