Guides
Node reference
Every node type available in the Vollo workflow builder — its configuration fields, defaults, and output handles. Nodes are grouped into seven categories. This reference matches workflow schema version 1.
Nodes are connected by edges from an output handle on the source node to the input of the target node. Most nodes have a single next output; branching nodes expose one handle per outcome (for example true/false, or answered/no_answer/failed), and a few build their handles dynamically from configuration. Fields typed template accept {{variable}} interpolation; fields typed expression use the safe expression grammar.
Flow
7 nodes
Voice
6 nodes
AI
7 nodes
Data
4 nodes
Integrations
5 nodes
Knowledge
3 nodes
Telephony
5 nodes
Flow#
Start#
type: start
· min 1 per workflow · max 1 per workflow
Entry point of every workflow. Execution begins here when a call is answered or a session connects. Exactly one per workflow.
Outputs
This node has no configuration fields.
End#
type: end
Terminates the workflow cleanly. The session or call is wrapped up and a workflow.completed event is emitted.
Outputs
This node has no configuration fields.
Branch#
type: branch
Routes execution down one of several labeled branches. Each branch has an expression; the first branch whose condition evaluates to true wins.
Outputs
Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
branches | array | Required | — | At least 2 items. Each item: key, label, condition. |
default_branch | string | Optional | — | — |
Condition#
type: condition
Evaluates a single expression and routes to the true or false handle.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
expression | expression | Required | — | — |
Switch#
type: switch
Compares a variable against a list of case values and routes to the matching case's handle, with an optional default.
Outputs
Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
variable | string | Required | — | — |
cases | array | Required | — | At least 1 item. Each item: value, label. |
default_case | boolean | Optional | true | — |
Delay#
type: delay
Pauses workflow execution for a fixed number of seconds without playing audio.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
seconds | number | Required | — | Min 0.1 · max 300. |
Loop#
type: loop
Repeats the subgraph connected to its loop handle until the exit condition is true or the iteration cap is reached, then continues via done.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
max_iterations | number | Required | — | Min 1 · max 100. |
exit_condition | expression | Optional | — | — |
Voice#
Greeting#
type: greeting
Speaks an opening line as soon as the node is reached. By default it cannot be barged in on, so the caller hears the full greeting.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
text | template | Required | — | — |
interruptible | boolean | Optional | false | — |
Speak#
type: speak
Synthesizes and plays a text-to-speech utterance. Interruptible by default so callers can barge in.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
text | template | Required | — | — |
interruptible | boolean | Optional | true | — |
voice_override | string | Optional | — | — |
Listen#
type: listen
Captures one user utterance via speech-to-text and stores the transcript in a variable.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
save_to_variable | string | Required | — | — |
timeout_seconds | number | Optional | 10 | Min 1 · max 120. |
language | string | Optional | — | — |
Wait#
type: wait
Keeps the line open in silence for a fixed interval — useful after asking the caller to find something.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
seconds | number | Required | — | Min 0.5 · max 60. |
Transfer to Human#
type: transfer
Attempts a warm transfer of the live conversation to a human at a phone number or SIP URI.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
destination | template | Required | — | tel:+E164 or SIP URI. |
announcement | template | Optional | — | — |
play_dialtone | boolean | Optional | true | — |
Hangup#
type: hangup
Ends the call or session, optionally speaking a farewell first.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
farewell | template | Optional | — | — |
AI#
Agent#
type: agent
Runs a full conversational AI agent — LLM, speech-to-text, and text-to-speech — either referencing a saved Agent or configured inline. Each exit intent you define becomes an output handle the LLM can signal to leave the node.
Outputs
Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
agent_id | agent_ref | Optional | — | Reference a saved Agent, or configure inline. |
system_prompt | template | Required unless agent_id is set | — | — |
llm_provider | enum | Optional | — | One of openai, anthropic, google, openrouter. |
llm_model | string | Optional | — | — |
temperature | number | Optional | — | Min 0 · max 2. |
stt_provider | enum | Optional | — | One of deepgram. |
stt_language | string | Optional | — | — |
tts_provider | enum | Optional | — | One of cartesia. |
tts_voice | string | Optional | — | — |
tools | tool_refs | Optional | — | — |
knowledge_base_ids | knowledge_refs | Optional | — | — |
mcp_server_ids | mcp_refs | Optional | — | — |
greeting | template | Optional | — | — |
max_turns | number | Optional | — | Min 1 · max 200. |
timeout_seconds | number | Optional | — | Min 10 · max 3600. |
exit_intents | array | Optional | — | Each item: key, label, description. Each exit intent becomes an output handle; the LLM signals it via an exit tool. |
Handoff#
type: handoff
Transfers the conversation to a different saved Agent, optionally summarizing the conversation so far as context for the receiving agent.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
target_agent_id | agent_ref | Required | — | — |
context_summary | boolean | Optional | true | Summarize conversation for the receiving agent. |
announcement | template | Optional | — | — |
LLM Completion#
type: llm
Makes a single non-conversational LLM completion call and stores the result in a variable. Nothing is spoken.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
prompt | template | Required | — | — |
system_prompt | template | Optional | — | — |
provider | enum | Optional | — | One of openai, anthropic, google, openrouter. |
model | string | Optional | — | — |
temperature | number | Optional | — | Min 0 · max 2. |
save_to_variable | string | Required | — | — |
json_mode | boolean | Optional | false | — |
Intent Detection#
type: intent
Classifies an utterance into one of your defined intents. Each intent becomes an output handle; unmatched input follows the fallback intent.
Outputs
Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
input_variable | string | Optional | — | Defaults to the last user utterance. |
intents | array | Required | — | At least 2 items. Each item: key, label, description. |
fallback_intent | string | Optional | — | — |
save_to_variable | string | Optional | — | — |
Classification#
type: classification
Classifies the value of a variable into one of your defined classes and stores the winning class key.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
input_variable | string | Required | — | — |
classes | array | Required | — | At least 2 items. Each item: key, label. |
save_to_variable | string | Required | — | — |
Summarization#
type: summarization
Summarizes the conversation so far (or a single variable) into a variable, capped at a word budget.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
scope | enum | Optional | conversation | One of conversation, variable. |
input_variable | string | Required if scope is variable | — | — |
save_to_variable | string | Required | — | — |
max_words | number | Optional | 120 | Min 10 · max 500. |
Sentiment#
type: sentiment
Scores the sentiment of the conversation (or a variable) and stores the result — positive, neutral, or negative.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
scope | enum | Optional | conversation | One of conversation, variable. |
input_variable | string | Required if scope is variable | — | — |
save_to_variable | string | Required | — | — |
Data#
Set Variable#
type: set_variable
Assigns one or more variables. Values are templates, so they may interpolate other variables.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
assignments | array | Required | — | At least 1 item. Each item: variable, value. |
Get Variable#
type: get_variable
Copies a variable (with an optional fallback default) into another variable.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
variable | string | Required | — | — |
save_to_variable | string | Required | — | — |
default_value | string | Optional | — | — |
Transform#
type: transform
Applies a built-in transformation — case changes, trimming, type coercion, JSON encode/decode, digit extraction, or E.164 normalization — to a variable.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
input_variable | string | Required | — | — |
operation | enum | Required | — | One of uppercase, lowercase, trim, number, boolean, json_parse, json_stringify, extract_digits, e164. |
save_to_variable | string | Required | — | — |
JSON Path#
type: json
Extracts a value from a JSON variable using a dot path and stores it in a variable.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
input_variable | string | Required | — | — |
path | string | Required | — | Dot path, e.g. data.items.0.name. |
save_to_variable | string | Required | — | — |
default_value | string | Optional | — | — |
Integrations#
HTTP Request#
type: http_request
Calls an external HTTP API. Response fields can be mapped into workflow variables; failures route to the error handle.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
method | enum | Required | — | One of GET, POST, PUT, PATCH, DELETE. |
url | template | Required | — | — |
headers | key_value | Optional | — | — |
query | key_value | Optional | — | — |
body | template | Optional | — | — |
body_type | enum | Optional | json | One of json, form, raw. |
timeout_seconds | number | Optional | 10 | Min 1 · max 60. |
retries | number | Optional | 0 | Min 0 · max 5. |
auth | enum | Optional | none | One of none, bearer, basic, header. |
auth_secret_key | secret_ref | Required unless auth is none | — | — |
response_mapping | array | Optional | — | Each item: path, variable. |
save_status_to | string | Optional | — | — |
Webhook#
type: webhook
Posts a JSON payload to your endpoint mid-workflow. Defaults to the standard event envelope and supports HMAC signing.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
url | template | Required | — | — |
payload | template | Optional | — | JSON template; defaults to the standard event envelope. |
headers | key_value | Optional | — | — |
auth | enum | Optional | none | One of none, bearer, basic, header, hmac. |
auth_secret_key | secret_ref | Required unless auth is none | — | — |
timeout_seconds | number | Optional | 10 | Min 1 · max 30. |
retries | number | Optional | 2 | Min 0 · max 5. |
response_mapping | array | Optional | — | Each item: path, variable. |
Function Tool#
type: function
Invokes a saved Function Tool defined in your workspace and stores its result.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
tool_id | tool_ref | Required | — | — |
arguments | key_value | Optional | — | — |
save_to_variable | string | Optional | — | — |
MCP Tool#
type: mcp_tool
Calls a named tool on a connected MCP server and stores its result.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
mcp_server_id | mcp_ref | Required | — | — |
tool_name | string | Required | — | — |
arguments | key_value | Optional | — | — |
save_to_variable | string | Optional | — | — |
timeout_seconds | number | Optional | 30 | Min 1 · max 120. |
API Tool#
type: api_tool
Invokes a saved API Tool (a declaratively configured HTTP tool) and stores its result.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
tool_id | tool_ref | Required | — | — |
arguments | key_value | Optional | — | — |
save_to_variable | string | Optional | — | — |
Knowledge#
Knowledge Search#
type: knowledge_search
Runs a semantic search against a knowledge base and stores the top matches. Routes to found or not_found.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
knowledge_base_id | knowledge_ref | Required | — | — |
query | template | Required | — | — |
top_k | number | Optional | 4 | Min 1 · max 20. |
save_to_variable | string | Required | — | — |
min_score | number | Optional | — | Min 0 · max 1. |
RAG Answer#
type: rag
Retrieves relevant knowledge-base passages and generates a grounded answer, optionally speaking it immediately.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
knowledge_base_id | knowledge_ref | Required | — | — |
question | template | Required | — | — |
top_k | number | Optional | 4 | Min 1 · max 20. |
save_to_variable | string | Required | — | — |
speak_answer | boolean | Optional | false | — |
Document Search#
type: document_search
Searches a knowledge base at document granularity and stores the best match.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
knowledge_base_id | knowledge_ref | Required | — | — |
query | template | Required | — | — |
save_to_variable | string | Required | — | — |
Telephony#
Dial#
type: dial
Places an outbound leg to a phone number from one of your provisioned caller IDs and routes on the outcome.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
to_number | template | Required | — | — |
from_phone_number_id | phone_number_ref | Required | — | — |
timeout_seconds | number | Optional | 30 | Min 5 · max 120. |
Transfer Call#
type: transfer_call
Blind-transfers the active call to another destination via SIP.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
destination | template | Required | — | — |
play_dialtone | boolean | Optional | true | — |
Collect DTMF#
type: dtmf
Collects DTMF keypad digits from the caller, ended by a terminator key or timeout.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
prompt | template | Optional | — | — |
num_digits | number | Optional | 1 | Min 1 · max 32. |
terminator | string | Optional | # | — |
timeout_seconds | number | Optional | 10 | Min 1 · max 60. |
save_to_variable | string | Required | — | — |
Call Recording#
type: call_recording
Starts or stops recording of the active call.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
action | enum | Required | — | One of start, stop. |
Call Status#
type: call_status
Snapshots the current call state (direction, numbers, duration so far) into a variable as JSON.
Outputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
save_to_variable | string | Required | — | — |
Config field types#
The tables above use the following field types:
| Type | Meaning |
|---|---|
string, number, boolean | Plain scalar values. |
template | Text with {{variable}} interpolation. See Templates. |
expression | A safe boolean expression. See Expressions. |
enum | One of a fixed set of values, listed in the Notes column. |
array | A list of objects; the item shape is listed in the Notes column. |
key_value | A map of string keys to template values (headers, query params, arguments). |
secret_ref | The key of a workflow secret variable. The value is stored encrypted and never returned by the API. |
agent_ref, tool_ref/tool_refs, mcp_ref/mcp_refs, knowledge_ref/knowledge_refs, phone_number_ref | The ID of a saved Agent, Function/API Tool, MCP server, knowledge base, or phone number in your workspace (plural forms accept a list). |
Run POST /workflows/{id}/validate (or press Validate in the builder) to check a draft against these schemas before publishing. Unknown variables referenced by templates are reported as warnings; missing required fields, bad enum values, and out-of-range numbers are errors.