# Filter Messages with JavaScript in Redpanda Console

> For the complete documentation index, see [llms.txt](https://docs.redpanda.com/llms.txt). Component-specific: [streaming-full.txt](https://docs.redpanda.com/streaming-full.txt)

---
title: Filter Messages with JavaScript in Redpanda Console
latest-redpanda-tag: v25.2.1
latest-console-tag: v3.7.3
latest-operator-version: v26.1.4
# EOL = End-of-Life (support lifecycle status)
page-is-nearing-eol: "true"
page-is-past-eol: "false"
page-eol-date: July 31, 2026
latest-connect-version: 4.93.0
docname: ui/programmable-push-filters
page-component-name: streaming
page-version: "25.2"
page-component-version: "25.2"
page-component-title: Streaming
page-relative-src-path: ui/programmable-push-filters.adoc
page-edit-url: https://github.com/redpanda-data/docs/edit/v/25.2/modules/console/pages/ui/programmable-push-filters.adoc
description: Learn how to filter Kafka records using custom JavaScript code within Redpanda Console.
page-git-created-date: "2024-09-11"
page-git-modified-date: "2026-05-26"
support-status: nearing end-of-life
---

<!-- Source: https://docs.redpanda.com/streaming/25.2/console/ui/programmable-push-filters.md -->

You can use push-down filters in Redpanda Console to search through large Kafka topics that may contain millions of records. Filters are JavaScript functions executed on the backend, evaluating each record individually. Your function must return a boolean:

-   `true`: record is included in the frontend results.

-   `false`: record is skipped.


Multiple filters combine logically with `AND` conditions.

## [](#add-a-javascript-filter)Add a JavaScript filter

To add a JavaScript filter:

1.  Navigate to the topic’s **Messages** page.

2.  Click **Add filter > JavaScript Filter**.

3.  Define your JavaScript filtering logic in the provided input area.


![JavaScript filter in Redpanda Console](https://docs.redpanda.com/streaming/current/console/_images/js-filter.png)

## [](#resource-usage-and-performance)Resource usage and performance

JavaScript filters are executed on the backend, consuming CPU and network resources. The performance of your filter depends on the complexity of your JavaScript code and the volume of data being processed. Complex JavaScript logic or large data volumes may increase CPU load and network usage.

## [](#available-javascript-properties)Available JavaScript properties

Redpanda Console injects these properties into your JavaScript context:

| Property | Description | Type |
| --- | --- | --- |
| headers | Record headers as key-value pairs (ArrayBuffers) | Object |
| key | Decoded record key | String |
| keySchemaID | Schema Registry ID for key (if present) | Number |
| partitionId | Partition ID of the record | Number |
| offset | Record offset within partition | Number |
| timestamp | Timestamp as JavaScript Date object | Date |
| value | Decoded record value | Object/String |
| valueSchemaID | Schema Registry ID for value (if present) | Number |

> 📝 **NOTE**
>
> Values, keys, and headers are deserialized before being injected into your script.

## [](#javascript-filter-examples)JavaScript filter examples

### [](#filter-by-header-value)Filter by header value

**Scenario:** Records tagged with headers specifying customer plan type.

Sample header data (string value)

```json
headers: {
  "plan_type": "premium"
}
```

JavaScript filter

```javascript
let headerValue = headers["plan_type"];
if (headerValue) {
  let stringValue = String.fromCharCode(...new Uint8Array(headerValue));
  return stringValue === "premium";
}
return false;
```

**Scenario:** Records include a header with JSON-encoded customer metadata.

Sample header data (JSON value)

```json
headers: {
"customer": "{"orgID":"123-abc","name":"ACME Inc."}"
}
```

JavaScript filter

```javascript
let headerValue = headers["customer"];
if (headerValue) {
  let stringValue = String.fromCharCode(headerValue);
  let valueObj = JSON.parse(stringValue);
  return valueObj["orgID"] === "123-abc";
}
return false;
```

### [](#filter-by-timestamp)Filter by timestamp

**Scenario:** Retrieve records from a promotional event.

JavaScript filter

```javascript
return timestamp.getMonth() === 10 && timestamp.getDate() === 24;
```

### [](#filter-by-schema-id)Filter by schema ID

**Scenario:** Filter customer activity records based on Avro schema version.

JavaScript filter

```javascript
return valueSchemaID === 204;
```

### [](#filter-json-record-values)Filter JSON record values

**Scenario:** Filter transactions by customer ID.

Sample JSON record

```json
{
  "transaction_id": "abc123",
  "customer_id": "cust789",
  "amount": 59.99
}
```

JavaScript filter (top-level property)

```javascript
return value.customer_id === "cust789";
```

**Scenario:** Filter orders by item availability.

Sample JSON record

```json
{
  "order_id": "ord456",
  "inventory": {
    "item_id": "itm001",
    "status": "in_stock"
  }
}
```

JavaScript filter (nested property)

```javascript
return value.inventory.status === "in_stock";
```

**Scenario:** Filter products missing price information.

JavaScript filter (property absence)

```javascript
return !value.hasOwnProperty("price");
```

### [](#filter-string-keys)Filter string keys

**Scenario:** Filter sensor data records by IoT device ID.

JavaScript filter

```javascript
return key === "sensor-device-1234";
```