flow_data is the JSON document that defines a SuperFlow workflow graph. The workflow endpoints accept it in three places: Create Workflow, Update Workflow, and inline in Execute Workflow. This page describes the envelope, the node object, connections, and the expression syntax. The full catalog of node types lives in the node types reference.
If you build workflows in the Studio editor, you rarely need this page. It exists for callers who construct or modify
flow_data programmatically. For a task-oriented walkthrough of the same concepts in the UI, see the SuperFlow node reference.Envelope
flow_data is a JSON object describing a directed graph of nodes. The engine recognizes the following top-level keys and ignores any others.
The engine validates the document on submission. The
nodes array must be non-empty, and there must be exactly one node of type lyzr-nodes-base.trigger; zero trigger nodes or more than one is an error. Connections whose source name does not match a real node are ignored, as are connection targets that are empty or reference a non-existent node.
Node object
Each entry innodes is an object with the following keys.
Connections and error edges
connections is keyed by the source node’s name, not its id. Each value is an object with two optional keys, main for the success path and error for the failure path. Both keys have the same shape: an array of output slots, where slot i (for example main[i]) is itself an array of target objects. The slot index is the source node’s output index.
Each target object has three keys.
When a node has
settings.handleErrors set to true and fails permanently, downstream execution follows its error edges instead of aborting the run. Without handleErrors, a permanent failure aborts the run. error slots use the identical nested shape as main.
Expression syntax
Before a node runs, itsparameters are resolved recursively. For every string value at any depth, including strings nested in objects and arrays, the engine first strips a single leading = (the expression-mode prefix, as in "={{ $json.x }}"), then resolves every {{ ... }} block.
If the whole string after the = prefix is exactly one {{ ... }} block, the resolved value keeps its native type (number, boolean, object, or array). Otherwise each block is interpolated into the surrounding string: primitives become text, and objects and arrays are JSON-encoded. The practical consequence is that every string parameter on every node supports expressions.
The following forms are supported inside {{ }}.
Dot-paths traverse object keys and array indices, for example
results.0.name. A missing key or an out-of-range index yields null.
A bare reference such as $json.x, $('N').json.x, or $node[...] is resolved directly with its native type preserved. An expression containing operators, arithmetic, or concatenation, such as {{ $json.score % 2 }}, is evaluated as JavaScript after each reference is substituted with its JSON value; a runtime error yields null.
$items is not available in workflow expressions. Only $json, $input, $node[...], and $(...) are supported. $items exists only inside the Code node’s JavaScript sandbox.Complete minimal example
The following document defines a trigger feeding a Set node, with onemain connection.
connections is keyed by node name (“Trigger”), not by id. main[0] is output slot 0, and its inner array holds the targets fed from that slot. The = prefix marks the Set value as an expression, so {{ $json.name }} resolves against the trigger’s output item.