Skip to content

Call Flow Builder

Fresh

Call Flow Builder

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Introduction

Call Flow Builder is a no-code visual tool for creating and managing voice applications directly in the Dashboard.

It features a simple drag-and-drop interface for creating complex call flows with multiple branches and decision points. All elements of the call flow are represented as nodes in a tree structure. You can easily add, remove, and rearrange elements in the call flow using the visual interface.

A sample call flow created with Call Flow Builder, showing connections between nodes.

A sample Call Flow showcasing input-gathering, recording, AI Agent, and TTS features.

Add or remove any element from the call flow by dragging it into the desired location, and define links between them using the connection lines.

Extend each flow by integrating external APIs, or by using SignalWire Markup Language (SWML). Call Flow Builder also offers built-in versioning to streamline testing multiple configurations.

Under the hood, Call Flow Builder generates valid SWML (SignalWire Markup Language), meaning all the power of SWML is available whenever you need more control over your call flows.


Get started

To get started with Call Flow Builder, open the Tools tab in the left menu of your SignalWire Dashboard.

Check out this brief demo to see how to add, configure, and connect nodes in Call Flow Builder.

Creating a New Call Flow

To create a new call flow, click on the Add New button in the Call Flow Builder section of the Dashboard. From here, you can give your call flow a name, and then click Save to create the new call flow. After creating the call flow, the Call Flow will show up in the list of call flows in the Dashboard.

Creating a new Call Flow in the SignalWire Dashboard.

Creating a new Call Flow.


Create a Call Flow

Once a Call Flow has been created, you can click on the More Options button to open the Call Flow Builder interface. From here, click on the Edit option to open the Call Flow Builder page.

Clicking on the edit option for a Call Flow.

Editing a Call Flow.

Add a node

When you first open a new Call Flow, you will see a canvas with a single node: the Handle Call node. This node is the entry point for incoming calls and serves as the start of all Call Flows. From here the Call Flow Builder interface allows you to create and manage call flow nodes using a visual drag-and-drop interface.

Every node has a single input connector on the left, and one or more output connectors on the right. These connectors allow you to connect nodes together to create flows and logical relationships.

Add nodes to the Call Flow by dragging them from the left-hand panel and dropping them onto the canvas. Starting with the Handle Call node, you can connect a node by clicking and dragging from the output connector (right side of node) to the input connector (left side of node) of another node. You will see an arrow connecting the two nodes, indicating that they are connected.

Adding a new node to a Call Flow.

Adding a new node to a Call Flow.


Configure nodes

Some nodes have configuration options that can be set by clicking on the node. This will open a configuration panel where you can set the options for that node. For example, the Play Audio or TTS node allows you to select an audio file or enter text to be played to the caller.

Configuring a node in a Call Flow.

Configuring a node in a Call Flow.


Delete a node

To delete a node, you can click on the delete icon located on the right side of the node. Additionally, you can delete a node if they have configuration options open by clicking the Delete node button in the configuration panel.

Deleting a node from a Call Flow.

Deleting a node from a Call Flow.


Variables

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Introduction

Variables allow you to create a dynamic Call Flow that responds to user input and other outside information.

While the Set Variables node allows you to manually create your own variables at any time, you can also use variables from Request nodes or even get variables from the inbound call. All variables must be in the following format to signal to the Call Flow Builder that it should process a variable: %{<variable>}.

Inbound Call Variables

The following variables exist for all inbound calls. At this time, the direction is always inbound, but the other values are very useful and can be referenced throughout the whole Flow.

%{call.from}

string

The phone number of the caller.

%{call.to}

string

The phone number the call was made to.

%{call.direction}

string

The direction of the call.

%{call.call_id}

string

The unique identifier for the call.

%{call.state}

string

The state of the call.

%{call.type}

string

The type of call.

Variable Example

Using a phone number as a variable in a Call Flow.

Pass the caller phone number using a variable.


Request Variables

Variables that you get from a Request node can be accessed using %{request_response.<object_field>}. For example, if we send a GET request to timeapi.io, the response we’ll receive will look like this:

{
  "year": 2023,
  "month": 7,
  "day": 27,
  "hour": 16,
  "minute": 9,
  "seconds": 9,
  "milliSeconds": 640,
  "dateTime": "2023-07-27T16:09:09.640945",
  "date": "07/27/2023",
  "time": "16:09",
  "timeZone": "America/Chicago",
  "dayOfWeek": "Thursday",
  "dstActive": true
}

To reference the hour, date, and dayOfWeek from this response as variables in the Call Flow, we would format the variables like this:

%{request_response.hour}``%{request_response.date}``%{request_response.dayOfWeek}

Please note that response values that are strings will need special formatting to be used with conditional expressions or JavaScript operators. Use the format %{vars.request_response.<object_field>'} to use the value of the string.

In the example above, the response parameter dayOfWeek has a string value of Thursday. The following condition will only be met when the day of the week is Thursday:

%{vars.request_response.dayOfWeek == 'Thursday'}

You can also use slice() to remove everything from the string after the third character to give you a shortened day of the week (Fri, Sat, Mon):

Key: short_day Value: %{vars.request_response.dayOfWeek.slice(0,3)}

Variables with JavaScript Operators

You can use variables along with standard Javascript operators. This can be useful if you need to alter a variable or pass a condition that matches an expression.

For example, you can use the slice() method to remove everything from the %{call.from} variable except for the area code of an inbound caller. Within a Set Variables node, you can set the following:

Key:area_code

Value:%{call.from.slice(2,5)}

You can even combine this with a Conditions node as in the example below. Condition 1 uses the OR operator to check if the area code is 321 or 407.

If either of those is true, the call is forwarded to +15552223333. A second condition in the same node checks for a 419 area code and forwards the call to +15553334444.

Condition 1: %{area_code}==321||%{area_code}==407 Condition 2: %{area_code}==419

Using slice to alter a variable.

Use the slice() method to alter a variable.

Using a phone number as a variable in a Call Flow.

Using slice to alter a variable.


Versioning

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Introduction

Call Flow Builder offers built-in versioning. This feature empowers users to test different configurations of a Call Flow without affecting the live version, and to revert to a previous version if needed.

Once a Call Flow has been created, you can click on the Version History button located in the top left corner of the Call Flow Builder interface. This will open a panel showing all the versions of the call flow, along with a timestamp of when the version was created.

Opening the version history of a Call Flow.

Opening the version history of a Call Flow.


Deploy a new version

If you wish to make edits to a call flow, you can create a new version making any changes you need. Once you are satisfied with the new version, you can click the Deploy button to make the new version the live version of the call flow. When a new version is saved, it will add a new entry to the version history. The name of the version will be +1 from the previous version. E.g. Version 1.0, Version 2.0, Version 3.0, etc.

Deploying a new version of a Call Flow.

Deploying a new version of a Call Flow.


Revert changes

If you need to revert to a previous version of a call flow, open the version history panel by clicking the Version History button. Select the version to which you wish to revert. Click the Restore button to confirm.

Reverting to a previous version of a Call Flow.

Reverting to a previous version of a Call Flow.


AI Agent

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

This node is used to connect to a SignalWire conversational AI agent. The AI agent can be used to handle natural language processing, sentiment analysis, make and handle API calls, and other conversational tasks.

Learn more about AI Agents with our comprehensive Getting Started guide!

Node Settings

AI Agent Name

string

The name of the AI agent to connect to. The dropdown menu will populate with any AI Agent Resource that have been created in your SignalWire portal.

Example

In this example, we will create a simple call flow that connects to an AI agent after the call is answered.

AI Agent node.

AI Agent node.


Answer Call

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Answer Call marks the beginning of a call flow.

This node is not strictly required, as all notes that progress the flow will also answer the call when connected to the originating Handle Call node.

The Answer Call node.

The Answer Call node.

Node Settings

None


Conditions

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

A Conditions node works like a JavaScript if statement.

A condition field can reference variables that have been set in the flow with %{Key}, Request node responses accessed with %{request_response.<object_field>}, or call parameters such as %{call.from}. Add additional conditions to create else if conditions.

The Cond # path will be executed for a truthy condition. The Else path will be executed for a falsy condition.

Output Node Connectors

Condition

string

The condition that is evaluated to determine which path to take. Additional conditions can be added by clicking the Add condition button. Additional conditions will act as JavaScript else-if statements.

Else

string

The path to take if none of the conditions are met.

Node Settings

Conditions

string

The conditions that are evaluated to determine which path to take. Additional conditions can be added by clicking the Add condition button. Additional conditions will act as JavaScript else-if statements.

Example

Use conditions to create a block list

In this example, we immediately hang up calls from specific numbers on our block list and forward call from a VIP directly to our administration number. All other calls will connect to the main reception number.

Block or pass through calls based on caller number.

Block or pass through calls based on caller number.


Execute SWML

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Execute a remote SWML document and return to the current document. Use %{return_value.['object_field']} to reference the return values from the external SWML.

Output Node Connectors

Condition

string

The condition that is evaluated to determine which path to take. Additional conditions can be added by clicking the Add condition button. Additional conditions will act as JavaScript else-if statements.

Else

string

The path to take if none of the conditions are met.

Node Settings

URL

string

The URL of the SWML document to execute. The URL must return swml in valid JSON or YAML format.

Params

object

The parameters to pass to the SWML document.

Meta

object

The metadata to pass to the SWML document. A JSON object to serialize.

Conditions

string

The conditions that are evaluated to determine which path to take. Additional conditions can be added by clicking the Add condition button. Additional conditions will act as JavaScript else-if statements.

Example

In this example, we will execute a SWML script that is hosted on a remote server. When making a request to the server, we will pass the User and Token parameters.

The SWML document will return a JSON object with a play method field. This play field will be used for TTS (Text-to-Speech) in the current document and will welcome the user with the User parameter and say the Token parameter.

Execute SWML node example that executes a remote SWML document.

Call Flow using the Execute SWML node.

Execute SWML Node Settings

  • URL: Self-hosted ngrok URL.
  • Params: { "Content-Type": "application/json", "User": "user_1", "Token": "123" }
  • Meta: None
  • Condition: %{return_value.return_value} === 1

SWML Document

Below is the SWML document that will be executed.

andJSON

sections:
  main:
    - play: 'say: Hello <USER_NAME>, welcome to the SWML demo! Your token is <TOKEN>!'

Server Code

Below is the server code that will return the SWML document.

Node.js
Python

Pre-requisites

  • ExpressJs installed in your environment.
  • ngrok installed in your environment.
const express = require('express');
const ngrok = require('ngrok');
const app = express();

// Body parser middleware to handle JSON payloads
app.use(express.json());

// Define the route
app.post('/swml', (req, res) => {

    let reqBody = req.body;
    console.log(reqBody);

    let user = reqBody.params.User;
    let token = reqBody.params.Token;

    const swml = {
        "sections": {
            "main": [\
                {\
                    "play": `say: Hello ${user}, welcome to the SWML demo! Your token is ${token}!`\
                }\
            ]
        }
    };

    res.json(swml);
});

// Start the server and use ngrok to expose it
const port = 5000;
app.listen(port, async () => {
    const url = await ngrok.connect(port);
    console.log(`Server running on ${url}`);
});

Forward to Phone

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

This node will allow you to forward the incoming call to another phone or SIP endpoint.

Output Node Connectors

Success

string

Call is forwarded successfully. The connector will be triggered when the call is successfully forwarded to the phone number.

No Answer

string

Call is not answered. The connector will be triggered when the call is not answered by the phone number.

Busy

string

Call is busy. The connector will be triggered when the call is busy.

Decline

string

Call is declined. The connector will be triggered when the call is declined.

Error

string

An error occurred. The connector will be triggered when an error occurs while forwarding the call.

Node Settings

Default From

string

The default phone number to use as the caller ID when forwarding the call.

Default Timeout

integer

The time in seconds to wait for the call to be answered before timing-out and either disconnecting the call or attempting a new number.

Default Value: 45 seconds.

Call State URL

string

A webhook URL that will receive a POST request containing call details each time a Call State Event is triggered. You will need to choose which events you want listen for in the next field. If no events are chosen, the URL will receive no requests.

Call State Events

string

The events that will trigger a POST request to the Call State URL.

Possible Values:created, ringing, answered, ended

Call Numbers

string

Only shows when multiple numbers are added.

A toggle option to change the behavior of the forwarding of the call. If set to Sequential, the call will be forwarded to the next number in the list if the previous number is busy, declined, or not answered. If set to Simultaneously, the call will be forwarded to all numbers in the list at the same time.

Possible Values:Sequential, Simultaneously

Phone Number Configuration

One or more phone numbers can be added to the node. Additional phone numbers can be added by clicking the Add Phone Number button. Depending on the Call Numbers property, the call will be forwarded to the next number in the list (Sequential) or to all numbers in the list at the same time (Simultaneously).

To

string

The phone number or SIP endpoint to forward the call to.

From

string

The phone number to use as the caller ID when forwarding the call. If not set, Default From will be used.

Timeout

integer

The time in seconds to wait for the call to be answered before timing out and either disconnecting the call or attempting a new number. If not set, Default Timeout will be used.

Enable Whisper

boolean

This executes SWML when the call is answered. The SWML will be executed before connecting the call.

Handle Via:External URL that is hosted off the SignalWire platform, or a SWML script resource.

Examples

Preserve Original Caller ID When Forwarding

This example shows how to forward calls while preserving the original caller’s phone number as the caller ID. This is useful when you want the person receiving the forwarded call to see who originally called, rather than your SignalWire number.

In this flow, the Handle Call node receives the incoming call and passes it to the Forward to Phone node, which forwards the call to the destination number. The key configuration is setting the From field to %{call.from} - this variable contains the original caller’s phone number, ensuring that the person receiving the forwarded call will see the original caller’s number on their caller ID rather than your SignalWire number.

If the forward is successful, the call connects directly. If the call fails for any reason (no answer, busy, declined, or error), the flow routes to Hang Up Call. This approach is particularly useful for business scenarios where you want to maintain transparency about who is calling.

A Call Flow that uses the Forward to Phone node to forward the call while preserving the original caller ID.

Forward call while preserving original caller ID

Forward to SIP

In order to dial a SIP endpoint, format the To field with with “sip:” followed by the endpoint’s address. For example:

To:sip:alice@example.com

If the endpoint is unavailable, the flow will follow one of the four failed routes depending on the SIP signaling that is received. You can give individual actions for each signal, or route them all back into the same node.

A Call Flow that uses the Forward to Phone node to forward the call to a sip endpoint.

Forward to SIP


Forward to multiple SIP endpoints and phone

You can combine SIP dialing and Phone number dialing in the same node. The example below is set to Sequential dialing, so the sales endpoint will first ring for 20 seconds. After that, the call will ring the support endpoint for 20 more seconds before finally dialing out to +15552223333.

Forward to multiple SIP endpoints and phone numbers sequentially using the Forward to Phone node.

Forward to multiple SIP endpoints and phone numbers sequentially using the Forward to Phone node.


Gather Input

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

This node is used to gather input from the caller using DTMF or speech recognition. During the gather period, the call can use an audio file or text-to-speech to prompt the caller to enter the input.

Multiple input options can be configured to gather multiple pieces of information from the caller using the Add option button. Additionally, actions can be taken based on the input received. For every input option you can configure, an output node connection will be created to handle the input received.

Output Node Connectors

Input Option

string

The output node connector for the first input option configured. This connector will be used when the input received matches the input option. Additional output node connectors will be created for each input option configured.

Unknown

string

The output node connector for when the input received does not match any of the input options configured.

No Input

string

The output node connector for when no input is received from the caller.

Node Settings

Text to Speech

object

Configure the text-to-speech settings for the gather input node. See Text to Speech Settings.

Audio File

object

Configure the audio file settings for the gather input node. See Audio File Settings.

Text to Speech Settings

Language

string

The language to use for the text-to-speech.

Gender

string

The gender of the voice to use for the text-to-speech.

Voice

string

The voice to use for the text-to-speech.

Text

string

The text to convert to speech.

Wait for Input

integer

The amount of time to wait for the caller to enter input.

Possible Values: A number between 1-99 is required.

Wait for Digits

integer

The amount of time to wait for the caller to enter input.

Possible Values: A number between 1-99 is required.

Input Options

array

The input options to gather from the caller. Additional options can be added through the Add option button inside the node. See Input Options.

Audio File Settings

Audio File

string

The URL of a audio file to play to the caller.

Input Options

array

The input options to gather from the caller. Additional options can be added through the Add option button inside the node. See Input Options.

Input Options

Caller presses

string

The DTMF key that the caller must press to select this input option.

Possible Values: A value of 0-9, *, or # is required.

Or says

string

The speech recognition value that the caller must say to select this input option.

Examples

Simple Input

You can choose to accept both Speech and DTMF tones with your IVR. The caller in this example can either press 1 or say “sales” to connect with the sales line.

Gather Input node example that accepts both DTMF and speech input.

Gather input as speech or DTMF and send call to the selected channel.

Input with infinite loop prevention

If you plan to loop your “No Input” route, you probably want to disconnect a call if the Gather Input node attempts to loop the call more than 2 times. You can do that with a combination of a Set Variables node and a Conditions node. If a caller dials your number and sits on the line in silence, your Flow will disconnect the call after a couple of loops.

Call Flow that prevents an infinite loop with a count and condition check.

Call Flow that prevents an infinite loop with a count and condition check.

Accept any speech option

The “Unknown” route from the Gather Input node can be useful if you want to accept any and all speech recognition from your caller. A word or phrase is required in your Option 1 “Or Says” field so that your Gather Input node knows it is collecting speech.

You can route that option to the same flow as the “Unknown” route so all speech options continue the same path. The variable %{prompt_value} can then be used in any node and will contain all speech that was detected.

Call Flow that accepts any speech and repeats it back to the caller.

Call Flow that accepts any speech and repeats it back to the caller.


Handle Call

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

The Handle Call node is used to handle an incoming call. It is the first node in the call flow, does not have an input connector and is mandatory in every call flow. The Handle Call node cannot be deleted from the call flow and an additional Handle Call node cannot be added to the call flow. The first node connected to the Handle Call node is the starting point of the call flow.

Node Settings

None


Example

In the example below, the Handle Call node is connected to the Answer Call node, which is the starting point of the call flow. After the call is answered, the call flow continues with the Play Audio or TTS node to play a TTS message to the caller.

Handle Call Node being used in a Call Flow.

Handle Call Node being used in a Call Flow


Hang Up Call

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

The Hang Up Call node will disconnect a call and end the flow.

This node is not strictly required, as calls will automatically end when the call reaches the end of a flow.

The Reason parameter is used for logging purposes and does not change the behavior of the Hang Up Call node.

The Hangup Call node.

The Hangup Call node.

Node Settings

Reason

string

The reason for hanging up the call.

Possible Values:Busy, Decline, Hang up

Default Value:Busy


Overview

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Introduction

A call flow consists of a series of nodes, which represent different actions that can be taken during a call. Each node has a specific purpose, and you can connect nodes together to create a complete calling application.

Starting node

Starting nodes are the first nodes in a call flow and are used to handle incoming calls.

NodeDescription
Handle CallHandles an incoming call. Starting point in the Call Flow

Action

Action nodes perform specific actions during a Call Flow, such as playing audio, answering/hanging up a call, or sending an SMS.

NodeDescription
Answer CallAnswers an incoming call.
Hang Up CallHangs up the call.
Play Audio or TTSPlays an audio file or text-to-speech message to the caller.
Send SMSSends an SMS message to the caller.

Forwarding

Forwarding nodes transfer the call to another number.

NodeDescription
Forward to PhoneForwards the call to a phone number.

Record

Record nodes record the caller’s/callee’s voice/voicemail.

NodeDescription
Start Call RecordingStarts recording the call.
Stop Call RecordingStops recording the call.
Voicemail RecordingRecords a voicemail.

Input

Input nodes collect input or http requests from the caller.

NodeDescription
AI AgentConnects the call to an AI agent.
Gather InputCollects input from the caller.
RequestSends an HTTP request.

Decision

Decision nodes make decisions based on the conditions specified.

NodeDescription
ConditionsEvaluates conditions and branches the call flow accordingly.
Execute SWMLExecutes SWML code.
Set VariablesSwitches variables based on conditions.
Unset VariablesUnsets a variable.

Play Audio or TTS

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

This node allows you to play an audio file, play silence, play a ringtone, or play text-to-speech.

Node Settings

Text to Speech

object

Text to Speech node options. See Text to Speech Settings.

Play Audio File

object

Play Audio file node options. See Play Audio File Settings.

Text to Speech Settings

Node options for Text to Speech.

Language

string

The language to use for the text-to-speech.

Gender

string

The gender of the voice to use for the text-to-speech.

Voice

string

The voice to use for the text-to-speech.

Please note that any voices that show (premium) next to the name will be billed at the Premium TTS rate.

Text

string

The text to convert to speech. SSML can be used to customize the speech. The text can also include variables to be replaced with the variable value.

SSML Example:<speak>Here is a <say-as interpret-as="characters">SSML</say-as> example</speak>

Variables Example:Hello, you got a call from %{call.from}

Play Audio File Settings

Node options for Play Audio File.

Audio File

string

A URL of a audio file to play.

Additionally a ringtone or silence can be played over the call.

Ringtone Format:silence:<time in seconds> (ex: silence:5)

Silence Format:ring:<time in seconds><ringtone code> (ex: ring:5:jp)

Example

Text to Speech node example with variable.

Text to Speech node example with variable


Request

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

This node will allow you to make a GET, POST, PUT, or DELETE request to the specified URL. The response can be accessed in later nodes with %{request_response_body}, and if you choose to save the response fields as variables, you can reference them with %{request_response.<object_field>}.

It is important to note that later Request nodes will overwrite the %{request_response} variables, so either use them immediately or store them with a Set Variables node.

Output Node Connectors

Condition

string

User-defined success condition. The condition can be based on the requests response body in the following format: %{request_response.<object_field>}. Additional conditions can be added by clicking the Add condition button, which will create a new connector.

Else

string

The default output connector when the condition is not met.

Failure

string

The output connector when the request fails.

Node Settings

URL

string

A public URL to make the request to.

Method

string

The HTTP method to use for the request.

Possible Values:GET, POST, PUT, DELETE

Headers

object

A list of headers to include in the request. Each header should be in JSON format { key: value }

Example:{ "Content-Type": "application/json", "X-Custom-Header": "foo" }

Body

object

The body of the request. This field can be used to send any string or JSON data that can be serialized.

Example:{"user": { "id": 123, "role": "admin", "isActive": true }}

Examples

Using webhook.site to test requests

You can test the Request node with webhook.site. In the Request node, use the unique URL provided by webhook.site and copy the Body of the example below. You will get a POST to your webhook with details about the incoming call.

Request node example with webhook.site.

Request node example with webhook.site


Route a call based on a request to check time

You may want your Flow to behave differently depending on the time of day. You can use timeapi.io to request the current time. This example uses an IANA timezone to look up the time and sets Cond 1 to:

%{request_response.hour} >= 10 &&%{request_response.hour} < 20.

If the time is between 10am and 8pm, the success condition TTS will play. If a condition is not met, the call will be routed to the Else connector, which will play the TTS node. If the request fails, the call will be routed to the Failure connector, which will also play the TTS node.

Request node example with timeapi.io.

Request node example with timeapi.io


Send SMS

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

The Send SMS node is used to send an SMS to a phone number.

Node Settings

To Phone Number

string

The phone number to which the SMS will be sent.

From Phone Number

string

The phone number from which the SMS will be sent.

SMS Text

string

The text of the SMS that will be sent.

Example

Send SMS with variable

The example below is connected with a Request node that sends a request to a joke API. Knowing the parameters of the API response, the node can pull the request’s response with %{request_response.joke}. This example also includes messaging opt-out verbiage since this is important to avoid SMS spam blocks.

Sending an SMS with a variable in Call Flow Builder.

Sending an SMS with a variable in Call Flow Builder


Send SMS notification as Call Whisper

You might be using Call Flow Builder to forward calls to a personal cell phone. The example below will send an SMS to the specified phone number just before forwarding a call to that same number. This way you’ll receive a text letting you know this is a forwarded call from SignalWire and which original SignalWire number your caller dialed.

Sending an SMS notification as a Call Whisper.

Sending an SMS notification as a Call Whisper.


Set Variables

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Use this node to set variables that can be accessed from other nodes in the Call Flow.

The value can be a static value set as a string ("value"), a variable from another node such as a request response ( %{request_response.<object_field>} ), or a call parameter ( %{call.from}).

Access these variables in other blocks with %{<Key>} and unset variables with the Unset Variables node.

Node Settings

Key

string

The name of the variable to set.

Value

string

The value to set the variable to. This can be a static value, a variable from another node, or a call parameter.

Example

Use Set Variables if you plan to use multiple Request nodes in the same Flow and you need the variables to carry across the entire Flow.

This example makes a request to an API for temperature and location. The request’s response is saved in variables called my_temperature and my_location.

In order to make a new request to a new webhook, the Set Variables node is essential because the second Request node will overwrite the request_response. Your first variables will remain accessible using %{vars.my_temperature} and %{vars.my_location}.

Set variables from a request response.

Set variables from a request response.


Start Call Recording

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

This node triggers background recording of both sides of the call. The recording will automatically stop if the call is disconnected. To manually stop the recording, use the Stop Call Recording node.

Node Settings

Recording Name

string

The name of the recording file. The name is user-defined.

Default Value:Recording 1

Stereo

boolean

If enabled, the recording will be in stereo. If disabled, the recording will be in mono.

Default Value:toggled off

Beep

boolean

If enabled, a beep sound will be played at the beginning of the recording.

Default Value:toggled off

Terminators

string

The DTMF digits that will stop the recording. The recording will stop when any of the specified digits are pressed.

Default Value:None

Format

string

The format of the recording file. The available formats are wav and mp3.

Default Value:wav

Example

A Call Flow that answers a call then starts a recording.

A Call Flow that answers a call then starts a recording.


Stop Call Recording

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Stops the specified recording action. Reference the recording URL in other nodes in the Flow using the variable %{record_call_url}. You can also access the recording URL from the call log details in your RELAY Space.

Node Settings

Recording Name

string

The name of the recording to stop. This should be connected to a Start Call Recording node and match the recording name.

Example

You can pair this node with a Request node to send the recording URL to the webhook of your choice.

Please note that any later recordings in the Flow will overwrite the %{record_call_url} variable, so the Request node should immediately follow this Stop Call Recording node or use Set Variables to save this URL for a later request.

Record a call and save the URL to a variable.

Record a call and save the URL to a variable.


Unset Variables

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

The Unset Variables is used to clear any variable that was set using Set Variables. All currently set variables are populated in the dropdown menu. You can unset multiple variables in one node by selecting multiple variables from the dropdown menu.

Node Settings

Variables

array

The variables that you want to unset. Variables will show in the drop-down menu if they are set in the call flow. Variables are set by Set Variables node.

Example

In the example below, we answer the call and set a variable from_number with the value of the caller’s number. We then play a message to the caller and unset the from_number variable.

Unset a variable from a Call Flow node.

Unset a variable from a Call Flow node.


Voicemail Recording

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

This node uses the asynchronous recording method to record a voicemail. Reference the recording URL in other nodes in the Flow using the variable %{record_url}. You can also access the recording URL from the call log details in your RELAY Space.

Node Settings

Stereo

boolean

Record in stereo. Toggle this on to separate the two legs of the call recording into left and right channels.

Default Value:Toggled Off

Beep

boolean

Play a beep before recording starts.

Default Value:Toggled Off

Terminators

string

DTMF digits that will stop the recording. Multiple DTMF tones can be added by being seperated by a comma.

Default Value:None

Possible Values: Digits 0-9, *, #

Maximum Recording Length

integer

The maximum length of the recording in seconds.

Possible Values:1-3600 seconds

Initial Timeout

integer

The time in seconds to wait for the first DTMF digit before starting the recording.

Possible Values:1-99 seconds

End Silence Timeout

integer

The time in seconds to wait for the end of the call before ending the recording.

Possible Values:1-99 seconds

Format

string

The format of the recording.

Possible Values:wav, mp3

Examples

Simple voicemail with goodbye message

For a traditional voicemail experience, we recommend pairing the Voicemail Recording node with a Play Audio or TTS node and including a beep before recording. Including a terminator (in this case, a # sign) will allow nodes to run after the caller is finished leaving their voicemail.

Play TTS and record voicemail.

Play TTS and record voicemail.


Record voicemail and send recording URL as a POST request

You can pair this node with a Request node to send the recording URL to the webhook of your choice. Please note that any later recordings in the Flow will overwrite the %{record_url} variable, so the Request node should immediately follow this Voicemail Recording node or use Set Variables to save this URL for a later request.

Record voicemail and send URL and call data as a POST request.

Record voicemail and send URL and call data as a POST request.


Record voicemail and send recording URL as SMS

You may want to be notified about a new voicemail with an SMS. You can follow the Voicemail Recording node with a Send SMS node and again access call data and the recording URL with the {call.} and {record_url} variables.

Record voicemail and send URL and call data as an SMS.

Record voicemail and send URL and call data as an SMS.

SignalWire Developer Documentation