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#

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

next

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

terminal — no 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

dynamic

Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).

FieldTypeRequiredDefaultNotes
branchesarrayRequired—At least 2 items. Each item: key, label, condition.
default_branchstringOptional——

Condition#

type: condition

Evaluates a single expression and routes to the true or false handle.

Outputs

truefalse
FieldTypeRequiredDefaultNotes
expressionexpressionRequired——

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

dynamic

Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).

FieldTypeRequiredDefaultNotes
variablestringRequired——
casesarrayRequired—At least 1 item. Each item: value, label.
default_casebooleanOptionaltrue—

Delay#

type: delay

Pauses workflow execution for a fixed number of seconds without playing audio.

Outputs

next
FieldTypeRequiredDefaultNotes
secondsnumberRequired—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

loopdone
FieldTypeRequiredDefaultNotes
max_iterationsnumberRequired—Min 1 · max 100.
exit_conditionexpressionOptional——

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

next
FieldTypeRequiredDefaultNotes
texttemplateRequired——
interruptiblebooleanOptionalfalse—

Speak#

type: speak

Synthesizes and plays a text-to-speech utterance. Interruptible by default so callers can barge in.

Outputs

next
FieldTypeRequiredDefaultNotes
texttemplateRequired——
interruptiblebooleanOptionaltrue—
voice_overridestringOptional——

Listen#

type: listen

Captures one user utterance via speech-to-text and stores the transcript in a variable.

Outputs

next
FieldTypeRequiredDefaultNotes
save_to_variablestringRequired——
timeout_secondsnumberOptional10Min 1 · max 120.
languagestringOptional——

Wait#

type: wait

Keeps the line open in silence for a fixed interval — useful after asking the caller to find something.

Outputs

next
FieldTypeRequiredDefaultNotes
secondsnumberRequired—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

transferredfailed
FieldTypeRequiredDefaultNotes
destinationtemplateRequired—tel:+E164 or SIP URI.
announcementtemplateOptional——
play_dialtonebooleanOptionaltrue—

Hangup#

type: hangup

Ends the call or session, optionally speaking a farewell first.

Outputs

terminal — no outputs
FieldTypeRequiredDefaultNotes
farewelltemplateOptional——

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

dynamic

Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).

FieldTypeRequiredDefaultNotes
agent_idagent_refOptional—Reference a saved Agent, or configure inline.
system_prompttemplateRequired unless agent_id is set——
llm_providerenumOptional—One of openai, anthropic, google, openrouter.
llm_modelstringOptional——
temperaturenumberOptional—Min 0 · max 2.
stt_providerenumOptional—One of deepgram.
stt_languagestringOptional——
tts_providerenumOptional—One of cartesia.
tts_voicestringOptional——
toolstool_refsOptional——
knowledge_base_idsknowledge_refsOptional——
mcp_server_idsmcp_refsOptional——
greetingtemplateOptional——
max_turnsnumberOptional—Min 1 · max 200.
timeout_secondsnumberOptional—Min 10 · max 3600.
exit_intentsarrayOptional—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

next
FieldTypeRequiredDefaultNotes
target_agent_idagent_refRequired——
context_summarybooleanOptionaltrueSummarize conversation for the receiving agent.
announcementtemplateOptional——

LLM Completion#

type: llm

Makes a single non-conversational LLM completion call and stores the result in a variable. Nothing is spoken.

Outputs

next
FieldTypeRequiredDefaultNotes
prompttemplateRequired——
system_prompttemplateOptional——
providerenumOptional—One of openai, anthropic, google, openrouter.
modelstringOptional——
temperaturenumberOptional—Min 0 · max 2.
save_to_variablestringRequired——
json_modebooleanOptionalfalse—

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

dynamic

Output handles are created from the node's configuration (one per branch, intent, case, or exit intent).

FieldTypeRequiredDefaultNotes
input_variablestringOptional—Defaults to the last user utterance.
intentsarrayRequired—At least 2 items. Each item: key, label, description.
fallback_intentstringOptional——
save_to_variablestringOptional——

Classification#

type: classification

Classifies the value of a variable into one of your defined classes and stores the winning class key.

Outputs

next
FieldTypeRequiredDefaultNotes
input_variablestringRequired——
classesarrayRequired—At least 2 items. Each item: key, label.
save_to_variablestringRequired——

Summarization#

type: summarization

Summarizes the conversation so far (or a single variable) into a variable, capped at a word budget.

Outputs

next
FieldTypeRequiredDefaultNotes
scopeenumOptionalconversationOne of conversation, variable.
input_variablestringRequired if scope is variable——
save_to_variablestringRequired——
max_wordsnumberOptional120Min 10 · max 500.

Sentiment#

type: sentiment

Scores the sentiment of the conversation (or a variable) and stores the result — positive, neutral, or negative.

Outputs

next
FieldTypeRequiredDefaultNotes
scopeenumOptionalconversationOne of conversation, variable.
input_variablestringRequired if scope is variable——
save_to_variablestringRequired——

Data#

Set Variable#

type: set_variable

Assigns one or more variables. Values are templates, so they may interpolate other variables.

Outputs

next
FieldTypeRequiredDefaultNotes
assignmentsarrayRequired—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

next
FieldTypeRequiredDefaultNotes
variablestringRequired——
save_to_variablestringRequired——
default_valuestringOptional——

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

next
FieldTypeRequiredDefaultNotes
input_variablestringRequired——
operationenumRequired—One of uppercase, lowercase, trim, number, boolean, json_parse, json_stringify, extract_digits, e164.
save_to_variablestringRequired——

JSON Path#

type: json

Extracts a value from a JSON variable using a dot path and stores it in a variable.

Outputs

next
FieldTypeRequiredDefaultNotes
input_variablestringRequired——
pathstringRequired—Dot path, e.g. data.items.0.name.
save_to_variablestringRequired——
default_valuestringOptional——

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

successerror
FieldTypeRequiredDefaultNotes
methodenumRequired—One of GET, POST, PUT, PATCH, DELETE.
urltemplateRequired——
headerskey_valueOptional——
querykey_valueOptional——
bodytemplateOptional——
body_typeenumOptionaljsonOne of json, form, raw.
timeout_secondsnumberOptional10Min 1 · max 60.
retriesnumberOptional0Min 0 · max 5.
authenumOptionalnoneOne of none, bearer, basic, header.
auth_secret_keysecret_refRequired unless auth is none——
response_mappingarrayOptional—Each item: path, variable.
save_status_tostringOptional——

Webhook#

type: webhook

Posts a JSON payload to your endpoint mid-workflow. Defaults to the standard event envelope and supports HMAC signing.

Outputs

successerror
FieldTypeRequiredDefaultNotes
urltemplateRequired——
payloadtemplateOptional—JSON template; defaults to the standard event envelope.
headerskey_valueOptional——
authenumOptionalnoneOne of none, bearer, basic, header, hmac.
auth_secret_keysecret_refRequired unless auth is none——
timeout_secondsnumberOptional10Min 1 · max 30.
retriesnumberOptional2Min 0 · max 5.
response_mappingarrayOptional—Each item: path, variable.

Function Tool#

type: function

Invokes a saved Function Tool defined in your workspace and stores its result.

Outputs

successerror
FieldTypeRequiredDefaultNotes
tool_idtool_refRequired——
argumentskey_valueOptional——
save_to_variablestringOptional——

MCP Tool#

type: mcp_tool

Calls a named tool on a connected MCP server and stores its result.

Outputs

successerror
FieldTypeRequiredDefaultNotes
mcp_server_idmcp_refRequired——
tool_namestringRequired——
argumentskey_valueOptional——
save_to_variablestringOptional——
timeout_secondsnumberOptional30Min 1 · max 120.

API Tool#

type: api_tool

Invokes a saved API Tool (a declaratively configured HTTP tool) and stores its result.

Outputs

successerror
FieldTypeRequiredDefaultNotes
tool_idtool_refRequired——
argumentskey_valueOptional——
save_to_variablestringOptional——

Knowledge#

type: knowledge_search

Runs a semantic search against a knowledge base and stores the top matches. Routes to found or not_found.

Outputs

foundnot_found
FieldTypeRequiredDefaultNotes
knowledge_base_idknowledge_refRequired——
querytemplateRequired——
top_knumberOptional4Min 1 · max 20.
save_to_variablestringRequired——
min_scorenumberOptional—Min 0 · max 1.

RAG Answer#

type: rag

Retrieves relevant knowledge-base passages and generates a grounded answer, optionally speaking it immediately.

Outputs

next
FieldTypeRequiredDefaultNotes
knowledge_base_idknowledge_refRequired——
questiontemplateRequired——
top_knumberOptional4Min 1 · max 20.
save_to_variablestringRequired——
speak_answerbooleanOptionalfalse—

type: document_search

Searches a knowledge base at document granularity and stores the best match.

Outputs

foundnot_found
FieldTypeRequiredDefaultNotes
knowledge_base_idknowledge_refRequired——
querytemplateRequired——
save_to_variablestringRequired——

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

answeredno_answerfailed
FieldTypeRequiredDefaultNotes
to_numbertemplateRequired——
from_phone_number_idphone_number_refRequired——
timeout_secondsnumberOptional30Min 5 · max 120.

Transfer Call#

type: transfer_call

Blind-transfers the active call to another destination via SIP.

Outputs

transferredfailed
FieldTypeRequiredDefaultNotes
destinationtemplateRequired——
play_dialtonebooleanOptionaltrue—

Collect DTMF#

type: dtmf

Collects DTMF keypad digits from the caller, ended by a terminator key or timeout.

Outputs

collectedtimeout
FieldTypeRequiredDefaultNotes
prompttemplateOptional——
num_digitsnumberOptional1Min 1 · max 32.
terminatorstringOptional#—
timeout_secondsnumberOptional10Min 1 · max 60.
save_to_variablestringRequired——

Call Recording#

type: call_recording

Starts or stops recording of the active call.

Outputs

next
FieldTypeRequiredDefaultNotes
actionenumRequired—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

next
FieldTypeRequiredDefaultNotes
save_to_variablestringRequired——

Config field types#

The tables above use the following field types:

TypeMeaning
string, number, booleanPlain scalar values.
templateText with {{variable}} interpolation. See Templates.
expressionA safe boolean expression. See Expressions.
enumOne of a fixed set of values, listed in the Notes column.
arrayA list of objects; the item shape is listed in the Notes column.
key_valueA map of string keys to template values (headers, query params, arguments).
secret_refThe 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_refThe ID of a saved Agent, Function/API Tool, MCP server, knowledge base, or phone number in your workspace (plural forms accept a list).
Validation

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.