In CloudRadial AutomationAI, every node in a workflow can read data produced by earlier nodes. The connection between them is a JSON data contract: each node writes an output object, and later nodes reference it with binding expressions. This article is for workspace users with the Admin role or higher who build workflows in the Designer.
- How Node Output Is Shaped
- Referencing Another Node
- The Trigger Payload
- Node Metadata
- Filters
- Default vs. Explicit Inputs
- Mixed Strings and Type Coercion
How Node Output Is Shaped
Each node writes a single JSON object that AutomationAI exposes at nodes.<node-id>.output. A node is addressed by its stable id, not its display name, so renaming a node never breaks an expression that references it.
Script nodes set their output explicitly. Each language has one call for emitting output and one for reading input:
| Language | Emit output | Read input |
|---|---|---|
| PowerShell | Set-NodeOutput | Get-NodeInput |
| Python | set_output | get_input |
| C# | SetOutput | GetInput |
The object you emit becomes the node's output:
# PowerShell
Set-NodeOutput @{ users = @($u1, $u2); count = 2 }
# Python
set_output({ "users": users, "count": 2 })
// C#
SetOutput(new { users = new[] { u1, u2 }, count = 2 });
After this runs, the fields are reachable from any later node as nodes.<id>.output.users and nodes.<id>.output.count.
Referencing Another Node
A binding expression is wrapped in double braces and always starts with the nodes scope keyword, followed by the node id and a suffix. The only suffixes are output, status, and durationMs.
{{ nodes.fetch.output.userId }}
Walk into nested objects with dot paths, and into arrays with a zero-based numeric index in square brackets:
{{ nodes.fetch.output.users[0].id }}
If a reference points at something that does not exist — an unknown node id, a missing property, or an array index out of range — the expression fails with a clear error rather than returning a blank value, so the problem surfaces while you are building the workflow.
The Trigger Payload
The data that started the run is available through a synthetic node named trigger. Reference its fields the same way you reference any node's output:
{{ nodes.trigger.output.orderId }}
This is how a workflow reads the JSON sent by a webhook, the trigger input you supply when testing, or the payload that started a scheduled or manual run.
Node Metadata
Besides output, two metadata suffixes are available on every node that has run:
{{ nodes.<id>.status }}— the step's status as a string{{ nodes.<id>.durationMs }}— how long the step took, in milliseconds
Both are scalar values. You cannot navigate into them with a further path.
Filters
Append a filter to an expression with a pipe (|) to transform the resolved value. AutomationAI supports four filters:
length— the count of items in an array, or the number of characters in a stringdefault:"<value>"— substitutes the given literal when the value is nullstring— converts the value to its string formint— converts the value to a whole number
Examples:
{{ nodes.fetch.output.users | length }}
{{ nodes.fetch.output.note | default:"[]" }}
{{ nodes.fetch.output.count | string }}
{{ nodes.trigger.output.qty | int }}
The default argument is a JSON literal: a quoted string, a number, true, false, or null. An unknown filter name fails the expression.
Default vs. Explicit Inputs
A node receives input in one of two ways:
- Default input — a node with no explicit bindings receives the entire output object of the node that ran immediately before it
- Explicit parameters — when you define bindings on a node, it receives exactly the named values you map, and nothing else
Explicit bindings are a list of name-and-expression pairs, where each name is the key the script reads and each expression is a binding:
[
{ "name": "userId", "expression": "{{ nodes.fetch.output.users[0].id }}" },
{ "name": "total", "expression": "{{ nodes.fetch.output.count | int }}" }
]
The script then reads those parameters by name. Pass no name to read the whole input bag, or a name to read one value (a missing key returns null / None):
# PowerShell — read one value, or the whole bag
$userId = Get-NodeInput -Name userId
$all = Get-NodeInput
# Python
user_id = get_input("userId")
all_input = get_input()
// C#
var userId = Node.GetInput("userId"); // JsonElement?
var all = Node.GetInput(); // all values
Mixed Strings and Type Coercion
When an expression is the entire value, it resolves to the underlying type — a number stays a number, an array stays an array, an object stays an object. When you embed one or more bindings inside surrounding text, AutomationAI splices each resolved value into the string and returns a string:
Order {{ nodes.trigger.output.orderId }} has {{ nodes.fetch.output.users | length }} users
In mixed strings, null becomes an empty string, booleans become true or false, and objects and arrays are rendered as JSON. Use the string and int filters when you need to force a specific type.
Comments
0 comments
Please sign in to leave a comment.