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
| Expression | Resolves 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
| Error | Cause |
|---|---|
Node 'x' not found | The referenced node ID does not exist in the graph |
Unknown namespace: x | The $x prefix is not one of meta, context, input, global |
Unsupported expression: x | Expression does not start with @ or $ |