# Connections (/workflows/connections)





Connections determine when blocks run. **Connection tags** read values from blocks that have already run. This page covers tag syntax and common output shapes; [data flow](/workflows/data-flow) explains how those values become available.

## Tag syntax [#tag-syntax]

```text
<blockName.path.to.data>
```

* `blockName` is the source block's name. Matching ignores case, whitespace, and periods: a block named My Agent resolves through `<myagent.content>`.
* The field path is case-sensitive.
* `variable`, `loop`, and `parallel` are reserved prefixes for [workflow variables](/workflows/variables) and container context.

Type `<` in a supported field to open the reference picker, or drag an available output into the field:

<Image variant="detail" background="ridges" src="/static/docs-captures/connections-picker.webp" alt="Typing a less-than sign in an Agent message opens the reference picker with the connected Start block" width="636" height="550" className="mx-auto w-full max-w-xl" />

## Nested and array fields [#nested-and-array-fields]

Use dots for object fields and brackets for array indices:

```text
<agent.tokens.total>
<api.data.results[0].id>
<api.data.users[0].name>
```

Multiple array indices, such as `items[0][1]`, are supported. Check the output panel for the actual structure; a path depends on what the source block produced.

## Using tags in text and code [#using-tags-in-text-and-code]

Text fields can combine a reference with static text:

```text
Customer <start.customerId> requested: <start.message>
```

In a Function block, use referenced values in code:

```javascript
const name = <start.name>
const total = <api.data.total>
return { greeting: `Hello, ${name}!`, totalWithTax: total * 1.1 }
```

Function references preserve value types for JavaScript or Python: strings remain strings, objects remain objects, and `null` remains null. In ordinary text fields, objects are JSON-stringified and primitives become text. Confirm a value is numeric before calculating with it; convert numeric text explicitly when needed.

When a known source block did not run on the selected path, its reference resolves empty: usually `""`, or `null` in Function code. An unknown block name can remain unsubstituted, while an invalid field can fail resolution. These are different problems; inspect the source output and the run's active path.

## Common block outputs [#common-block-outputs]

These abbreviated examples use blocks named Agent, API, Function, Condition, Router, and Evaluator. Replace that name with your source block's normalized name. Additional and optional fields depend on the block and runtime.

<Tabs items="['Agent', 'API', 'Function', 'Condition', 'Router', 'Evaluator']">
  <Tab>
    ```json
    {
      "content": "The generated response",
      "model": "claude-sonnet-5-5",
      "tokens": { "input": 120, "output": 85, "total": 205 },
      "toolCalls": { "list": [], "count": 0 }
    }
    ```

    Read text with `<agent.content>` and tool activity with `<agent.toolCalls.list>` or `<agent.toolCalls.count>`. A successful structured response exposes its fields at the top level, except names overwritten by standard metadata. See [Agent response format](/workflows/blocks/agent#response-format) for naming guidance, provider support, and malformed-output behavior.
  </Tab>

  <Tab>
    ```json
    {
      "data": { "message": "Response body" },
      "status": 200,
      "headers": { "content-type": "application/json" }
    }
    ```

    `data` can be any response-body type. These normal outputs describe a successful request. Non-2xx responses, network failures, and timeouts use the [API block's error path](/workflows/blocks/api).
  </Tab>

  <Tab>
    ```json
    {
      "result": "Function return value",
      "stdout": "Code output",
      "files": []
    }
    ```

    `result` can be any return-value type. `stdout` contains bounded diagnostic output; see [Function output limits](/workflows/blocks/function#outputs). Remote execution includes `files` metadata; local JavaScript can omit that field.
  </Tab>

  <Tab>
    ```json
    {
      "conditionResult": true,
      "selectedPath": {
        "blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1",
        "blockType": "agent",
        "blockTitle": "Follow-up Agent"
      },
      "selectedOption": "condition-1"
    }
    ```

    `conditionResult` reports the rule result. `selectedOption` identifies the selected branch; `selectedPath` describes its next block and can be null when no destination is connected.
  </Tab>

  <Tab>
    ```json
    {
      "context": "I need help resetting my password",
      "model": "claude-sonnet-5-5",
      "tokens": { "input": 120, "output": 85, "total": 205 },
      "selectedRoute": "customer-service",
      "reasoning": "The request needs account support",
      "selectedPath": {
        "blockId": "2acd9007-27e8-4510-a487-73d3b825e7c1",
        "blockType": "agent",
        "blockTitle": "Customer Service Agent"
      }
    }
    ```

    `context` is the analyzed input, `selectedRoute` identifies the chosen route, and `reasoning` explains the decision. `selectedPath` describes the destination. A no-match routing error uses Router's error behavior.
  </Tab>

  <Tab>
    ```json
    {
      "content": "The original content being evaluated",
      "model": "claude-sonnet-5-5",
      "tokens": { "input": 120, "output": 85, "total": 205 },
      "metric1": 8.5,
      "metric2": 7.2
    }
    ```

    `content` is the evaluated input. Metric names are lowercased. Missing scores or an unparseable response can produce `0`; see [Evaluator outputs](/workflows/blocks/evaluator#outputs) for numeric coercion and validation guidance.
  </Tab>
</Tabs>

## Related docs [#related-docs]

* [How blocks pass data](/workflows/data-flow)
* [Variables](/workflows/variables)
* [Function](/workflows/blocks/function)
