-
Notifications
You must be signed in to change notification settings - Fork 0
SIP PBX Dial Actions
Andrey Egorov edited this page May 18, 2026
·
5 revisions
The Dial resource creates, controls, and waits on outbound dial sessions.
| Operation | Purpose | Output branches |
|---|---|---|
Make Call |
Create a new outbound dial. |
Result, plus Unavailable for Mode = Extension
|
Break |
Stop an active dial. | Result |
Wait Event |
Wait for ringing, progress, answer, reject, fail, or timeout. | Dynamic selection plus fixed terminal branches |
| Field | Meaning |
|---|---|
dialId |
Identifier of the dial session. |
legId |
Master leg returned when the created dial has one immediately available. |
stillDialingLegCount |
Remaining in-progress attempts after a Wait Event result. |
| Parameter | Required | Shown when | Description |
|---|---|---|---|
Mode |
Yes | Always |
Trunk, Extension, Direct, or WebSocket. |
Trunk Ref |
Yes | Mode = Trunk |
Public trunk ref used for outbound routing. |
Destinations |
Yes |
Mode = Trunk or Direct
|
Comma-separated phone numbers or SIP users. Do not include server or auth data here. |
SIP Connection |
Yes | Mode = Direct |
SIP credential used for direct outbound signaling. |
Extensions |
Yes | Mode = Extension |
Comma-separated extension numbers. Calls every matching endpoint across all visible extensions refs in the current workflow scope. |
Transport Profile |
Yes | Mode = WebSocket |
OpenAI Realtime, Gemini Live, or Generic. |
These options are available for Mode = Trunk, Direct, and Extension.
| Option | Description |
|---|---|
Call Strategy |
All In Parallel or Sequential. |
Sequential Attempt Timeout (Seconds) |
Timeout per sequential attempt. |
Sequential Gap (Seconds) |
Delay between sequential attempts. |
Caller Number |
Outbound caller number override. |
Caller Name |
Outbound caller display name override. |
Custom SIP Headers |
Extra SIP headers applied to outbound SIP attempts. |
| Option | Description |
|---|---|
Codecs |
Allowed SIP audio codecs for this direct dial. This is an allow-list only, not a priority override. The runtime keeps its built-in codec priority. |
DTMF Methods |
Allowed DTMF methods for this direct dial: RFC2833, SIP INFO, Inband. This is a filter only, not a priority override. |
| Option | Description |
|---|---|
Only Free Endpoints |
If enabled, only endpoints that are registered and not currently in a live call are targeted. |
| Mode | Behavior |
|---|---|
Trunk |
Outbound media filters come from the resolved trunk trigger for the selected Trunk Ref. |
Extension |
Outbound media filters come from the resolved extensions trigger route for each targeted endpoint. |
Direct |
Outbound media filters come from the dial action itself through the direct-only Codecs and DTMF Methods options. |
| Parameter | Required | Shown when | Description |
|---|---|---|---|
WebSocket Start Mode |
No |
Transport Profile = OpenAI Realtime or Gemini Live
|
Immediate starts the provider session as soon as the leg is ready. Deferred waits for Attach Voice Agent. |
| Parameter | Required | Description |
|---|---|---|
OpenAI API |
Yes | OpenAI credential for realtime session setup. |
OpenAI Realtime Model |
No | Realtime-capable model used for the session. |
OpenAI Realtime Voice |
No | Voice identifier used by the session. |
OpenAI Input Transcription Model |
No | Input transcription model for speech-to-text. |
OpenAI Instructions |
No | Session instructions prompt. |
OpenAI Prompt ID |
No | Prompt registry ID. |
OpenAI Prompt Version |
No | Prompt version string. |
OpenAI Prompt Variables JSON |
No | JSON object with prompt variables. |
| Parameter | Required | Description |
|---|---|---|
Gemini API |
Yes | Gemini credential for live session setup. |
Gemini Live Model |
No | Live-capable Gemini model. |
Gemini Live Voice |
No | Voice identifier used by the session. |
Gemini Live API Version |
No | API version string. |
Gemini Live Instructions |
No | Session instructions prompt. |
| Parameter | Required | Description |
|---|---|---|
WebSocket URL |
Yes | Target WebSocket URL. |
Generic WebSocket Headers JSON |
No | JSON object with outgoing headers. |
Generic WebSocket Initial Messages JSON |
No | JSON array of messages sent immediately after connect. |
Generic Outgoing Audio Event Type |
No | Event type used for PBX-to-WebSocket audio. |
Generic Outgoing Audio Field |
No | Field name used for PBX-to-WebSocket audio payload. |
Generic Outgoing Audio Sample Rate |
No | Sample rate for PBX-to-WebSocket audio. |
Generic Incoming Audio Event Types |
No | Comma-separated event types treated as WebSocket-to-PBX audio. |
Generic Incoming Audio Field |
No | Field name used for WebSocket-to-PBX audio payload. |
Generic Incoming Audio Sample Rate |
No | Sample rate for WebSocket-to-PBX audio. |
For WebSocket behavior and AI orchestration, see AI and WebSocket Legs.
| Branch | Shown when | Fields |
|---|---|---|
Result |
Always |
dialId, optional legId, optional sipPbx.dialId, optional sipPbx.legId
|
Unavailable |
Mode = Extension only |
reason, message, extensionNumbers
|
| Parameter | Required | Description |
|---|---|---|
Options -> Dial ID |
No | Explicit dial target. If omitted, resolves from item.json.dialId, then item.json.sipPbx.dialId. |
Options -> Reason |
No | User-defined break reason string. |
| Branch | Fields |
|---|---|
Result |
dialId |
| Parameter | Required | Description |
|---|---|---|
Overall Timeout (Seconds) |
No | Maximum total wait time before the action takes the Timeout branch. |
Master Leg ID |
No | Optional leg retained for the duration of the wait so it does not expire by TTL. Also used as the source of interrupt events for the Interrupted branch. |
Interrupt On |
No | Optional wait interrupt signals from the master leg. Currently supports DTMF. This interrupts the wait itself, not the dial. |
Additional Outputs |
No | Enables extra branches: Ringing, Progress, Rejected. |
Dial IDs |
No | Explicit wait target list. If empty, the node falls back to the current item dial ID. |
| Branch | When it appears |
|---|---|
Ringing |
Only if enabled in Additional Outputs
|
Progress |
Only if enabled in Additional Outputs
|
Rejected |
Only if enabled in Additional Outputs
|
Answered |
Always |
Interrupted |
Always |
Timeout |
Always |
Failed |
Always |
| Field | Meaning |
|---|---|
dialId |
Dial that produced the event. |
legId |
Attempt leg associated with the event, when present. |
eventType |
Dial event type such as ringing, progress, answered, interrupted, rejected, failed, or timeout. |
reason |
Failure or rejection reason when relevant. |
interruptReason |
Present on Interrupted, for example call_dtmf or call_ended. |
digit |
Present on DTMF-based Interrupted. |
stillDialingLegCount |
Number of attempts still in progress after this event. |
dial.wait also uses the shared built-in interruptReason catalog, but only the master-leg subset:
call_dtmfcall_ended
| Situation | Result |
|---|---|
| Master leg ends while the wait is active | The action takes Interrupted with interruptReason = "call_ended". |
Interrupt On includes DTMF and the master leg receives DTMF |
The action takes Interrupted with interruptReason = "call_dtmf" and includes the detected digit. Queued matching DTMF is observed non-destructively, so a later call.wait on the same leg can still see it. |
A matching call_ended or DTMF event was already queued on the master leg before dial.wait started |
The action can take Interrupted immediately from that queued event. Matching queued call_ended and DTMF events are not consumed by this immediate check. |
Interrupt On does not include DTMF and the master leg receives DTMF |
The wait ignores that DTMF and consumes it from the master leg event queue. A later call.wait will not see it. |
The dial itself reaches answered, failed, or timeout first |
The action takes the corresponding dial branch instead. |
The master leg is destroyed while dial.wait is active |
The action always takes Interrupted with interruptReason = "call_ended", even if Interrupt On is empty or does not include DTMF. |
Master Leg ID affects only the wait itself:
- it keeps the watched leg retained while
dial.waitis active - it can interrupt the wait on
call_ended - it can optionally interrupt the wait on
DTMF
It does not stop the dial. If the master leg ends, the dial can continue running unless some other runtime component, such as queue ownership, stops it separately.