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:

SourceHow
OpenAPI / Swagger importThe 2xx response schema, with every $ref resolved
Test in the reference builderInferred from the real response (samples are merged, so optional fields show up); Capture from test response merges another sample on demand
Database referencesThe table's columns, as a list of rows
ConnectorsThe fields the connector catalogue declares
Older referencesDerived 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: response and 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:

ChoiceInsertsResult 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 Loopone run of the step per customer
Sample response (Get Customers)
{ "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.