Skip to main content

Template Syntax

Node parameters can contain dynamic expressions that are resolved at runtime, just before each node executes. This is how you pass the output of one node as the input to the next.

All expressions use double curly braces: {{ expression }}

Set isExpression: true on the param whenever its value contains a {{ ... }} expression.

Node Output References (@nodeId)

Reference the output of any upstream node using the @ prefix followed by the node's id.

"{{ @nodeId }}"

When a node produces an array, {{ @nodeId }} resolves to the current item being processed (the worker iterates automatically). Use explicit indexing when you need a specific element.

// Full output (current item when iterating)
"{{ @fetchEntries }}"

// Specific field
"{{ @fetchEntries.title }}"
"{{ @fetchEntries.metadata.source }}"

// Explicit array index
"{{ @fetchEntries[0] }}"
"{{ @fetchEntries[2].title }}"

// Deeply nested path
"{{ @ocrNode.documents[0].pages[1].content }}"

Input Data ($input)

Access the payload passed to the workflow at execution time. See Running Workflows for how to pass input data.

"{{ $input.query }}"
"{{ $input.userId }}"
"{{ $input.config.maxResults }}"

Execution Context ($context)

Access information about the current execution.

"{{ $context.jobId }}"           // Numeric job ID
"{{ $context.currentIndex }}" // Current index when iterating an array
"{{ $context.totalItems }}" // Total number of items being processed
"{{ $context.startTime }}" // Unix timestamp when the job started

Node Metadata ($meta)

Access performance and timing information about a node that has already executed.

"{{ $meta.fetchEntries.executionTime }}"  // Execution duration in ms
"{{ $meta.fetchEntries.itemCount }}" // Number of items produced
"{{ $meta.fetchEntries.errors }}" // Array of errors, if any
"{{ $meta.fetchEntries.startTime }}" // Unix timestamp
"{{ $meta.fetchEntries.endTime }}" // Unix timestamp

Global Configuration ($global)

Access global configuration values and constants.

"{{ $global.config.maxRetries }}"
"{{ $global.config.defaultTimeout }}"
"{{ $global.constants.APP_NAME }}"
"{{ $global.settings.environment }}"

Mixing Static and Dynamic Values

Static values and expressions can appear side by side in the same params object:

{
"params": {
"version": {
"value": "1.0.0",
"isExpression": false,
"isAttachedToInputNode": false
},
"query": {
"value": "{{ $input.searchQuery }}",
"isExpression": true,
"isAttachedToInputNode": false
},
"documentTitle": {
"value": "{{ @ocrNode.documents[0].title }}",
"isExpression": true,
"isAttachedToInputNode": false
},
"jobId": {
"value": "{{ $context.jobId }}",
"isExpression": true,
"isAttachedToInputNode": false
}
}
}

Quick Reference

ExpressionResolves to
{{ @nodeId }}Current item from node nodeId output
{{ @nodeId.field }}Specific field from node output
{{ @nodeId[N].field }}Field from the Nth item of node output
{{ $input.field }}Field from the workflow's input payload
{{ $context.jobId }}Current job ID
{{ $context.currentIndex }}Current iteration index
{{ $context.totalItems }}Total items in the current iteration
{{ $meta.nodeId.executionTime }}Execution time of a completed node (ms)
{{ $meta.nodeId.itemCount }}Number of items produced by a node
{{ $global.config.key }}Global configuration value

Error Reference

ErrorCause
Node 'x' not foundThe referenced node ID does not exist in the graph
Unknown namespace: xThe $x prefix is not one of meta, context, input, global
Unsupported expression: xExpression does not start with @ or $