<!-- BusyBot node reference — https://busybot.net/tools/filter/ -->

> Node: Filter (`filter`) · Action · v1
> Category: Core Nodes · Credentials: none
> Updated: 2026-08-16

# Filter

> Keep items matching a condition

## Overview

Selectively passes data items through the workflow based on specific criteria. Items that do not meet the filter conditions are dropped from the execution path.

**Category:** Core Nodes  
**Tool Name:** `filter`  
**Version:** 1

**Appearance:** Icon: `filter` | Color: `#06b6d4`

## Node Type

**Action** — processes input items and produces output

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Matched`, `Unmatched`, `Error` |

## Credentials

This tool does not require any credentials.

### Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Combine Conditions | `options` | Yes | `and` | How to combine multiple filter conditions. AND requires all conditions to pass; OR requires at least one. |
| | | | | Options: `and`, `or` |
| Conditions | `fixedCollection` | Yes | `{}` | Define the filter conditions. Each condition specifies a field, data type, operation, and comparison value. |
| — Field | `string` | Yes | — | The field path to evaluate (e.g., 'status', 'user.email', 'items[0].name'). Supports expressions like {{ $json.fieldName }}. |
| — Data Type | `options` | Yes | `string` | The data type of the field. This determines which operations are available. |
| | | | | Options: `string`, `number`, `boolean`, `date`, `array`, `object` |
| — Operation (`operation`) | `options` | Yes | `equals` | The comparison operation to perform on the string field. _(shown when Data Type is `string`)_ |
| | | | | Options: `equals`, `notEquals`, `contains`, `notContains`, `startsWith`, `notStartsWith`, `endsWith`, `notEndsWith`, `regex`, `notRegex`, `isEmpty`, `isNotEmpty` |
| — Operation (`operation`) | `options` | Yes | `equals` | The comparison operation to perform on the number field. _(shown when Data Type is `number`)_ |
| | | | | Options: `equals`, `notEquals`, `greaterThan`, `greaterThanOrEqual`, `lessThan`, `lessThanOrEqual`, `isEven`, `isOdd`, `isEmpty`, `isNotEmpty` |
| — Operation (`operation`) | `options` | Yes | `isTrue` | The comparison operation to perform on the boolean field. _(shown when Data Type is `boolean`)_ |
| | | | | Options: `isTrue`, `isFalse`, `isEmpty`, `isNotEmpty` |
| — Operation (`operation`) | `options` | Yes | `after` | The comparison operation to perform on the date field. _(shown when Data Type is `date`)_ |
| | | | | Options: `equals`, `notEquals`, `after`, `afterOrEqual`, `before`, `beforeOrEqual`, `isInPast`, `isInFuture`, `isEmpty`, `isNotEmpty` |
| — Operation (`operation`) | `options` | Yes | `contains` | The comparison operation to perform on the array field. _(shown when Data Type is `array`)_ |
| | | | | Options: `contains`, `notContains`, `lengthEquals`, `lengthGreaterThan`, `lengthLessThan`, `lengthGreaterThanOrEqual`, `lengthLessThanOrEqual`, `isEmpty`, `isNotEmpty` |
| — Operation (`operation`) | `options` | Yes | `hasKey` | The comparison operation to perform on the object field. _(shown when Data Type is `object`)_ |
| | | | | Options: `hasKey`, `notHasKey`, `keyCountEquals`, `keyCountGreaterThan`, `keyCountLessThan`, `isEmpty`, `isNotEmpty` |
| — Value | `string` | No | — | The value to compare against. Supports expressions like {{ $json.compareField }}. _(hidden when Operation is `isEmpty`, `isNotEmpty`, `isTrue`, `isFalse`, `isEven`, `isOdd`, `isInPast`, `isInFuture`)_ |
| Options | `collection` | No | `{}` | Additional filter options. |
| — Ignore Case | `boolean` | No | `false` | When enabled, string comparisons will be case-insensitive. |
| — Include Filter Metadata | `boolean` | No | `false` | When enabled, adds _filter metadata to passed items showing which conditions matched. |
| Max Concurrency | `number` | No | `50` | Maximum number of items to evaluate concurrently. |

## Output Data

One output item per matching input item, on the `Matched` branch. The item JSON passes through unchanged and binary data is forwarded; the node only adds a property when Include Filter Metadata is on. Items that fail the conditions are separated out and keep their original JSON.

With Include Filter Metadata on, each passing item carries:

```json
{
  "_filter": {
    "passed": true,
    "conditionsEvaluated": 2,
    "combineMode": "and",
    "evaluatedAt": 1765432100000
  }
}
```

- Data Type decides which operations are available and how both sides are read: a `number` condition parses both values as numbers and never matches a field that is not numeric, and a `date` condition never matches a value it cannot parse as a date.
- Ignore Case applies to string and array comparisons only.
- A node with no conditions configured passes every item through.
- With error handling set to **continue** (the default), an item that fails evaluation travels out on `Matched` carrying an `_error` object — check for it downstream rather than assuming everything on that branch matched.

## Usage Examples

- filter only active users
- keep items where status is complete
- remove entries without email addresses
- select only orders over $100
- find records from last week

## Example Configuration

Keep only the items whose status is active:

```json
{
  "type": "filter",
  "parameters": {
    "combineMode": "and",
    "conditions": {
      "rules": [
        {
          "field": "status",
          "dataType": "string",
          "operation": "equals",
          "value": "active"
        }
      ]
    }
  }
}
```

Keep anything that is either high priority or flagged urgent, ignoring case:

```json
{
  "type": "filter",
  "parameters": {
    "combineMode": "or",
    "conditions": {
      "rules": [
        {
          "field": "priority",
          "dataType": "string",
          "operation": "equals",
          "value": "high"
        },
        {
          "field": "urgent",
          "dataType": "boolean",
          "operation": "isTrue"
        }
      ]
    },
    "options": {
      "ignoreCase": true,
      "includeMetadata": true
    }
  }
}
```

Keep recent orders above a threshold — a number and a date condition combined with AND:

```json
{
  "type": "filter",
  "parameters": {
    "combineMode": "and",
    "conditions": {
      "rules": [
        {
          "field": "total",
          "dataType": "number",
          "operation": "greaterThanOrEqual",
          "value": "500"
        },
        {
          "field": "createdAt",
          "dataType": "date",
          "operation": "after",
          "value": "{{ $json.periodStart }}"
        }
      ]
    },
    "maxConcurrency": 25
  }
}
```

Keep records that carry a tag and a nested identifier:

```json
{
  "type": "filter",
  "parameters": {
    "combineMode": "and",
    "conditions": {
      "rules": [
        {
          "field": "tags",
          "dataType": "array",
          "operation": "contains",
          "value": "important"
        },
        {
          "field": "metadata",
          "dataType": "object",
          "operation": "hasKey",
          "value": "userId"
        }
      ]
    }
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Evaluates a condition against each input item and routes matches to the output. Use when you need to narrow a dataset to items meeting specific criteria (e.g., status equals active, amount greater than threshold). Produces only the items that satisfy the filter condition.

### Key Points

- Always use the `rules` groupKey inside `conditions`
- The `value` parameter should be a string, even for numbers and dates
- Booleans are tested with `isTrue` / `isFalse` — there is no boolean `equals` option
- Some operations like `isEmpty` and `isNotEmpty` don't require a `value` parameter
- Use appropriate operations based on the selected `dataType`
- The `options` fields are nested directly under the `options` key (no groupKey needed)