Skip to content

Variables & Extractions

A flow is only useful if data can move from one node to the next — the token from a login response, the id from a created resource, a count from a list. Probe carries that data through {{...}} references, the same syntax you already use in Composer.

An extraction is a named value pulled out of a request node's response. Add one in the node's inspector:

  • Name — what downstream nodes will call it.
  • SourceBody (a dotted JSON path, e.g. data.items[0].id), Header (a header name), or Status (the HTTP status code — no path needed).

A node can have as many extractions as it needs. Naming one publishes it as {{nodeName.outputs.name}} for every downstream node.

Inside any request node's URL, headers, query params, or body, {{...}} is replaced at run time. There are four forms:

| Reference | Reads | |---|---| | {{nodeName.outputs.extractionName}} | A named extraction you declared on nodeName. | | {{nodeName.body.path}} | A dotted JSON path straight out of nodeName's response body — no extraction needed first. | | {{nodeName.header.Header-Name}} | A response header from nodeName (case-insensitive). | | {{nodeName.status}} | nodeName's HTTP status code. | | {{envVar}} | An environment or global variable — see below. |

The .body/.header/.status forms mean you don't have to declare an extraction for a one-off reference — only add a named extraction when you'll reference the same value from more than one place, or want it to show up as a labeled edge value on the canvas.

{{envVar}} with no dot resolves against the active Composer environment of the request's collection, then global variables, exactly like Composer's own variable resolution. This is how you keep a baseUrl or a static apiKey out of every node and swap it by switching environments.

What happens when a reference doesn't resolve

Section titled “What happens when a reference doesn't resolve”

Two different things can go wrong with a {{...}} reference, and Probe treats them differently:

  • Unknown node or variable — the token doesn't name any node in the flow and isn't a defined environment/global variable. A request node with an unresolved reference anywhere in it fails outright rather than sending a request with a literal {{...}} in it.
  • Known node, missing value — the node exists and ran, but the path/header/output you asked for wasn't in its response (a missing JSON key, an out-of-range array index, a header that wasn't sent). Most nodes treat this the same as unresolved and fail. Condition nodes are more forgiving: a missing value evaluates as "doesn't exist" rather than blocking the branch, so you can use the exists operator to route around an optional field.

If a request node's assertions fail, or the request itself errors, the node is marked failed and its extractions are never published — not even the ones a passing response would have produced. Any downstream node referencing {{failedNode.outputs.x}} sees an unresolved reference and fails too, cascading down the graph. This is deliberate: a flow shouldn't silently continue with data from a step that didn't actually succeed.

Everything downstream of a failed node that only depends on it — directly or transitively — ends up skipped rather than run, the same way a condition node's untaken branch is skipped.