# Filter (/docs/nodes/utility/filter)

Conditionally pass or block data based on an expression.



The Filter node evaluates a condition and either passes data downstream or stops execution at that branch.

Configuration [#configuration]

| Field                | Type   | Required                        | Description                                              |
| -------------------- | ------ | ------------------------------- | -------------------------------------------------------- |
| Node Label           | text   | No                              | Display name shown on the canvas                         |
| expression           | string | Yes                             | Value to evaluate (supports template expressions)        |
| operator             | string | Yes                             | Comparison: `equals`, `not_equals`, `contains`, `exists` |
| value                | string | For equals/not\_equals/contains | Comparison value                                         |
| Output Variable Name | string | No                              | Optional response name for downstream references         |

How it works [#how-it-works]

1. The `expression` is rendered using upstream node data
2. The `operator` compares the rendered value against `value`
3. If true, data passes through. If false, the branch stops.

If you set an Output Variable Name, downstream nodes can reference the filter result by that name. Leave it empty if you only need pass/block behavior.

Examples [#examples]

Only continue if a value exists (non-empty):

```
expression: {birdeyeResponse.data.value}
operator: exists
```

Check if a field matches a specific value:

```
expression: {birdeyeResponse.data.symbol}
operator: equals
value: SOL
```

Check if a field contains a keyword:

```
expression: {aiResponse.data}
operator: contains
value: bullish
```

For numeric comparisons (greater than, less than), use the [Condition](/docs/nodes/utility/condition) node instead.

Output [#output]

When the expression passes the operator check:

```json
{ "filtered": false, "passed": true, "value": "SOL" }
```

When it does not pass, downstream nodes on this branch are skipped and the node records:

```json
{
  "filtered": true,
  "passed": false,
  "reason": "Expression \"{birdeyeResponse.data.symbol}\" resolved to \"BONK\" which did not pass equals check"
}
```

An empty expression short-circuits to `{ "filtered": true, "reason": "Filter expression is empty" }`.

If you set an Output Variable Name, downstream nodes can read the result, for example `{filterResponse.passed}` or `{filterResponse.value}`. The `value` field is the rendered expression string, not the original template.

Next steps [#next-steps]

* [Condition](/docs/nodes/utility/condition) - multi-path branching with routes
* [Transform](/docs/nodes/utility/transform) - reshape data before filtering
