Reference · Tools
Filter
Selectively screen data
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
| 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:
{
"_filter": {
"passed": true,
"conditionsEvaluated": 2,
"combineMode": "and",
"evaluatedAt": 1765432100000
}
}
- Data Type decides which operations are available and how both sides are read: a
numbercondition parses both values as numbers and never matches a field that is not numeric, and adatecondition 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
Matchedcarrying an_errorobject — 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
| 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
rulesgroupKey insideconditions - The
valueparameter should be a string, even for numbers and dates - Booleans are tested with
isTrue/isFalse— there is no booleanequalsoption - Some operations like
isEmptyandisNotEmptydon’t require avalueparameter - Use appropriate operations based on the selected
dataType - The
optionsfields are nested directly under theoptionskey (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 BusyBotLast updated . Spotted something wrong? Tell us.