Workflows
Reading values from an API response
Pick a single value, find an item, list a field or loop through a collection from a reference or HTTP response — with the data picker, no hand-written JSON paths.
An API call returns one JSON document; a workflow usually needs one value from it (the first customer's name), one item (the customer whose id is 42), one field of every item (all emails) or a loop over the items. The designer's data picker does all four from the response model, so you click fields instead of writing paths.
Where the model comes from
Every reference carries a response model — the nested fields, lists and their item fields, types, descriptions and example values:
| Source | How |
|---|---|
| OpenAPI / Swagger import | The 2xx response schema, with every $ref resolved |
| Test in the reference builder | Inferred from the real response (samples are merged, so optional fields show up); Capture from test response merges another sample on demand |
| Database references | The table's columns, as a list of rows |
| Connectors | The fields the connector catalogue declares |
| Older references | Derived from their declared outputs until the next test |
An HTTP Request node gets one by pasting a sample response under Response model. Data-table queries (rows), agents' output schemas and custom steps' declared outputs are modelled automatically.
The data picker
Every expression field in the node settings has an Insert data button ([ ]), and the toolbar's Variables → Data tab shows the same tree. It lists only what exists when the selected step runs:
- Steps before this one (following the connections), each with its outputs — for a reference:
responseand its levels, e.g.Get Customers › response › data[] › address › city. - Current item inside a loop body (and Outer loop item for nested loops), with the item's fields.
- Task fields, workflow variables and the trigger row.
Search by name, move with the arrow keys (→ opens a level, ← closes it) and press Enter to insert. A plain value inserts its path, e.g. {{get_customers_response.total}}.
Single value or collection
A list (shown as data[]), or any field inside one, asks how you want it:
| Choice | Inserts | Result for the sample below |
|---|---|---|
| First item | {{get_customers_response.data.0.email}} | ada@example.com |
| Item at index… (1 = first) | {{get_customers_response.data.1.email}} | grace@example.com |
| Find item where… | {{=FIND_WHERE(get_customers_response.data, "id", 2, "email")}} | grace@example.com |
| All values of a field as a list | {{=PLUCK(get_customers_response.data, "email")}} | ["ada@example.com", "grace@example.com"] |
| Count of items | {{=COUNT(get_customers_response.data)}} | 2 |
| Loop through each item | {{item.email}}, and wraps the step in a Loop | one run of the step per customer |
{ "total": 2, "data": [
{ "id": 1, "name": "Ada", "email": "ada@example.com", "address": { "city": "Wellington" } },
{ "id": 2, "name": "Grace", "email": "grace@example.com", "address": { "city": "Auckland" } }
] }Paths index lists with a number segment (data.0.email); data[0].email works too. Nested fields use dots: {{=PLUCK(get_customers_response.data, "address.city")}}. Find's value can be a variable: {{=FIND_WHERE(get_customers_response.data, "id", {{task_data.customer_id}}, "name")}}.
Loops
Loop through each item inserts a Loop For Each before the step: the step becomes the loop body (Each Item), the steps after it continue from Done, and {{item.<field>}} is inserted. Inside the body the picker shows Current item with the item's fields.
On a Loop node, Items to loop through suggests every list available at that point — lists inside responses, data-table rows, set-variable and split results, workflow variables holding lists, agent and custom-step list outputs, and the current item's lists for a nested loop — grouped by step, with an example item. Type to filter, ↑↓ and Enter to choose. Free text still works; a value that is known not to be a list shows a warning.
Named outputs are optional
You can still map reference outputs to variables (Outputs → Variables). In a Call Reference node the Response model tree also has + on each field to add a named output (custom_outputs: name + path relative to the response). Existing output mappings keep working unchanged.