Appearance
Call Flow Builder
FreshCall 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.
| Node | Description |
|---|---|
| Handle Call | Handles 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.
| Node | Description |
|---|---|
| Answer Call | Answers an incoming call. |
| Hang Up Call | Hangs up the call. |
| Play Audio or TTS | Plays an audio file or text-to-speech message to the caller. |
| Send SMS | Sends an SMS message to the caller. |
Forwarding
Forwarding nodes transfer the call to another number.
| Node | Description |
|---|---|
| Forward to Phone | Forwards the call to a phone number. |
Record
Record nodes record the caller’s/callee’s voice/voicemail.
| Node | Description |
|---|---|
| Start Call Recording | Starts recording the call. |
| Stop Call Recording | Stops recording the call. |
| Voicemail Recording | Records a voicemail. |
Input
Input nodes collect input or http requests from the caller.
| Node | Description |
|---|---|
| AI Agent | Connects the call to an AI agent. |
| Gather Input | Collects input from the caller. |
| Request | Sends an HTTP request. |
Decision
Decision nodes make decisions based on the conditions specified.
| Node | Description |
|---|---|
| Conditions | Evaluates conditions and branches the call flow accordingly. |
| Execute SWML | Executes SWML code. |
| Set Variables | Switches variables based on conditions. |
| Unset Variables | Unsets 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.
