Reference · Tools

Filter

Selectively screen data

Action Core Nodes v1

The Filter node evaluates each incoming data item against conditions you define and routes only the matches forward — for example, keeping only orders where status equals 'active' or amount exceeds a threshold. Items that don't match are dropped from the execution path entirely. Use it any time you need to narrow a dataset before the next step in your workflow.

Node type
Action
Parameters
4
Outputs
Matched, Unmatched, Error
Credentials
None required

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

DirectionPort(s)
InputInput
OutputMatched, Unmatched, Error

Credentials

This tool does not require any credentials.

Parameters

ParameterTypeRequiredDefaultDescription
Combine ConditionsoptionsYesandHow to combine multiple filter conditions. AND requires all conditions to pass; OR requires at least one.
Options: and, or
ConditionsfixedCollectionYes{}Define the filter conditions. Each condition specifies a field, data type, operation, and comparison value.
— FieldstringYesThe field path to evaluate (e.g., ‘status’, ‘user.email’, ‘items[0].name’). Supports expressions like {{ $json.fieldName }}.
— Data TypeoptionsYesstringThe data type of the field. This determines which operations are available.
Options: string, number, boolean, date, array, object
— Operation (operation)optionsYesequalsThe 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)optionsYesequalsThe 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)optionsYesisTrueThe comparison operation to perform on the boolean field. (shown when Data Type is boolean)
Options: isTrue, isFalse, isEmpty, isNotEmpty
— Operation (operation)optionsYesafterThe 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)optionsYescontainsThe 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)optionsYeshasKeyThe comparison operation to perform on the object field. (shown when Data Type is object)
Options: hasKey, notHasKey, keyCountEquals, keyCountGreaterThan, keyCountLessThan, isEmpty, isNotEmpty
— ValuestringNoThe value to compare against. Supports expressions like {{ $json.compareField }}. (hidden when Operation is isEmpty, isNotEmpty, isTrue, isFalse, isEven, isOdd, isInPast, isInFuture)
OptionscollectionNo{}Additional filter options.
— Ignore CasebooleanNofalseWhen enabled, string comparisons will be case-insensitive.
— Include Filter MetadatabooleanNofalseWhen enabled, adds _filter metadata to passed items showing which conditions matched.
Max ConcurrencynumberNo50Maximum 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:

{
  "_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:

{
  "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:

{
  "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:

{
  "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:

{
  "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

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes 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)

Frequently asked questions

What happens to items that don't match my filter condition?

The Filter node has three outputs: Matched, Unmatched, and Error. Items that fail your condition are routed to the Unmatched output rather than disappearing silently — you can connect that output to a separate branch if you need to handle rejected items, or leave it disconnected to drop them.

I'm filtering on a number, but my condition isn't matching. What am I doing wrong?

The Filter node requires the `value` parameter to be a string even when you're comparing numbers or dates. Pass '100' rather than 100, for example. The node handles the type comparison internally based on the `dataType` you select, so make sure that field is set to match the kind of data you're testing.

How do I filter on a boolean field — can I use equals true?

There is no boolean equals option. To test boolean fields, use the `isTrue` or `isFalse` operations instead. These don't require a value parameter — just select the field and pick the appropriate operation.

Do I need to provide a value for every condition I add?

No. Operations like `isEmpty` and `isNotEmpty` don't require a `value` parameter at all — they only need the field reference. Supplying a value with those operations won't break anything, but it also won't be used.

What's the correct structure for defining conditions in the Filter node?

Conditions must be defined using the `rules` groupKey inside the `conditions` parameter — skipping that groupKey will cause your rules to be ignored or throw an error. Options like case-sensitivity settings go directly under the `options` key with no groupKey required, so the nesting is shallower there than it is for conditions.

Build with the Filter node

Drop it into a workflow, wire it to an agent, or call it on a schedule.

Open BusyBot

Last updated . Spotted something wrong? Tell us.