Nodes overview
Builtin flow node types, ports, edges, and when to use each
Flows are graphs of nodes linked by edges. Each executable type has handles (ports), an execute-time wire input (previous output), and an output stored as {{nodes.<id>}}.
Read How flows work for connection rules, fan-out vs branches, and wire vs templates.
Builtin types
| Type | In | Out | Output (summary) |
|---|---|---|---|
| start | 0 | 1 (max 1 edge) | {} |
| input | 1 | 1 | Flow run input object |
| form | 1 | 1 | Submitted field object (pauses until submit) |
| http | 1 | 1 · fan-out ok | { status, body, headers, … } |
| extract | 1 | 1 | JMESPath result on wire |
| template | 1 | 1 | Rendered string |
| set | 1 | 1 | Passthrough + vars |
| if | 1 | true / false | { condition } |
| switch | 1 | cases + default | { matched } |
| delay | 1 | 1 | Passthrough |
| foreach | 1 | 1 (complete) · fan-out ok | { results, count, truncated } |
| try | 1 | success / failed | body exit output · or { failed, error, input } |
| subflow | 1 | 1 | Subflow output |
| output | 1 | 0 | Flow result |
| assert | 1 | 1 | { ok: true } or throws |
| transform | 1 | 1 | Mapped object |
| merge | 1 | 1 | Merged object |
| join | N | 1 · fan-out ok | { [predId]: output, … } |
| json | 1 | 1 | Subset / passthrough |
| log | 1 | 1 | Input + { logged } |
| inspect | 1 | 1 | Selected JSON |
| note | 0 | 0 | Not executed · no edges |
Execution model
- Exactly one
start; all executable nodes reachable from it.notemay be disconnected and never has edges. - Nodes run along edges from
start(branch filters bysourceHandle). - Each node receives the previous output as execute input (the wire). JMESPath roots there:
body.id, not a template. - Run panel /
--inputis{{input.*}}. Aninputnode places that object on the wire. setupdatesvars.- Linear nodes may fan-out to several children (same output). Each node (except
join) may have at most one incoming edge.
Shared conventions
- Optional
labelfor the UI. - Templated strings: template syntax.
- JMESPath nodes always query the wire, not run input (unless you first put run data on the wire with an
inputnode).
Example chain
start → input → http (login) → extract (body.id) → http (profile) → output
| Step | How you read data |
|---|---|
| HTTP needs credentials | {{input.username}} or secrets |
| Next needs id from login | extract body.id or later {{nodes.login.body.id}} |
| Wrong | Mustache for wire fields with no scope; extract input.username when you meant run input |
Samples: demo-main-nodes.flow.json, login-and-profile.flow.json, kitchen-sink.flow.json.