Documentation
Templates and expressions
Updated September 17, 2026
Nodes read each other's data through sandboxed Jinja templates. Validation rejects references to nodes that are not upstream, so a typo fails while you edit instead of halfway through a run.
What a template can read
{{ trigger.<field> }}: the payload that started the run.{{ nodes.<id>.output }}: what an upstream node returned on the port that fired.{{ nodes.<id>.ports.<port> }}and{{ nodes.<id>.status }}: per-port output and the node's status.{{ run.id }}and{{ run.started_at }}.{{ args.<field> }}: inside an HTTP Request node attached as a tool, the arguments the agent called it with.
Template fields
Fields such as an agent's user prompt or an HTTP node's URL are rendered as text. A field that is exactly one expression keeps the raw value instead, so an object stays an object:
{
"summary": "Ticket from {{ trigger.customer }}: {{ trigger.message }}",
"ticket": "{{ trigger }}"
}Expression fields
Reading agent output
An Agent node returns text, and structured when an output schema is set. Branch on structured fields rather than parsing text.
Keep reading
- Agent node: Claude with tools and structured outputThe Agent node calls Claude with your prompt, can call attached HTTP tools in a loop, and returns text plus schema-validated structured output for branching.
- Set node: build JSON with templatesThe Set node builds a new JSON object from templates, to reshape data between AI workflow steps and keep agent prompts small.
- Building workflows on the canvasHow Novalink workflows are structured: triggers, nodes, ports, data edges and tool edges, branching and merging, and how the executor decides what runs.
Build it on the canvas
Create a free account and run your first workflow in the browser, or run Novalink on your own machine.