Skip to content

Best tools to search messages across Kafka topics

Comparisons
Chad Harris·September 22, 2026·16 min read

Searching messages across Kafka topics means reading records from one or more topics, decoding them, and keeping only the ones that match a condition, because Kafka stores an append-only log with no index on message content. The tools that do it are the Apache CLI (kafka-console-consumer.sh) and kcat piped through jq, the Kafka UIs with a search feature (Kpow with its kJQ filter language, Kafbat UI, AKHQ, Kafka Magic, Conduktor and Redpanda Console), SQL layers such as Lenses SQL Studio and ksqlDB, and offloading topics into a search index. Kpow is Factor House’s product, and I work at Factor House as a Solutions Architect, so it is scored on the same rubric and the same sources as every other option.

Why every Kafka search is a scan

A Kafka topic is a set of partition logs addressed by offset and, through the time index, by timestamp. Nothing inside Kafka indexes the key or the value. So “find the order with ID 8841” always means reading records from a starting point, deserializing each one, and testing it against the condition. Every tool on this page does that. They differ in where the reading and testing happens, how much of the topic they read, and what they let you write as a condition.

The search matters more than its reputation suggests. In my operational issues webinar I said that if I had a dollar for every time I heard a lost message complaint, only to find the message was actually on Kafka all along, I would have a lot more money than I do. Most of the time the message is there, and the incident is really a search problem. Six criteria decide how fast a tool answers it, and every option is scored against them in this order.

Scan scope and cost. Because every search reads records, the tool should let you bound what it reads: a time window, a starting offset, a single partition, an exact key, and a limit on results and on records scanned. An unbounded scan of a large topic is slow for you and adds fetch load on the brokers serving it, so a tool that only reads from the beginning is the wrong tool for a production topic.

Where the filter runs. Either the tool’s server consumes the records and sends only matches to your browser, or every record crosses to your machine and the filter runs there. A CLI pipeline is the second kind: kcat fetches and prints every record, and jq or grep discards most of them locally.

Filter language. A substring match finds a line containing “false”. A structured filter tests .value.trade.compliance.audit == false on a specific field, with type casts and time comparisons. The first finds candidates, and the second finds the record.

Multi-topic scope. Incidents rarely stay in one topic. A tool that searches several topics in one query, by list, by regex, or by the topics a consumer group reads, saves one query per topic.

Deserialization. The records have to be decoded before any field-level filter can run. Avro, Protobuf and JSON Schema with a schema registry, plus plain JSON and strings, cover most clusters, and a topic you do not know the format of needs automatic detection or trial and error.

Access control, masking and audit on results. Searching production data during an incident often means looking at customer data. The tool should control who can query which topics, mask sensitive fields in results, and record who searched what. The Kafka data masking tools comparison scores the masking side on its own.

The options, compared

Every cell comes from the tool’s own documentation or source code. “Not documented” means it does not appear in the tool’s own material, not that the feature is absent.

Tool Filter language Where the filter runs Scan scope controls Multi-topic in one query Deserialization Access control and masking on results Source
kafka-console-consumer.sh with grep or jq None built in. Pipe to grep or jq Your machine, after every record is fetched Start offset, partition, max messages, timeout Yes, by topic regex with --include Configurable deserializers, output as text Only Kafka ACLs on the consuming user Apache Kafka quickstart
kcat with jq None built in. Its README pipes to jq Your machine Offsets, partition, message count, exit at end Not as a search, one pipeline per topic in practice Avro with a schema registry, per its README Only Kafka ACLs kcat README
Kpow (kJQ) kJQ, a jq-like language with type casts and time arithmetic, plus AI filter generation (Enterprise) Kpow’s server, which returns only matches to the browser Slice, bounded window, partition and key modes, result and scan limits, streaming search Yes, a topic list, a topic regex, or a consumer group’s topics Avro, Protobuf, JSON Schema, JSON, strings and more, with automatic detection, custom serdes (paid) RBAC per topic, data masking policies and a user-action audit log (Enterprise) Kpow data inspect docs
Kafbat UI CEL expressions Kafbat’s backend Not documented beyond the message view’s own options Not documented Schema registry serde, Protobuf file serde and others Free RBAC with a message read permission, and masking Kafbat UI features
AKHQ Match on key, value, header key or header value by equals, contains or not contains AKHQ’s backend Per topic data view No, search is per topic. Live tail takes several topics Avro and Protobuf with a registry Free RBAC, regex masking AKHQ repository
Kafka Magic JavaScript over message fields Not documented Not documented No, its query guide searches a topic JSON and Avro Community Edition free, Professional licensed Kafka Magic query guide
Conduktor Console Global search, field search, JavaScript filters, JQ projection, SQL on topics Conduktor’s server Not documented in the pages checked Not documented Not documented in the pages checked Masking and audit not in the free tier Conduktor docs: Topics, Community Edition (text only)
Lenses SQL Studio SQL snapshot queries Lenses SQL clauses Yes, a query can join topics Not documented in the pages checked Data policies mask fields by name Lenses docs: SQL concepts, Data policies (text only)
ksqlDB SQL pull and push queries over a declared stream ksqlDB servers SQL clauses Through joins between declared streams The format declared on the stream Not documented in the pages checked ksqlDB queries documentation
Redpanda Console JavaScript push filters per record Redpanda Console’s backend Not documented in the pages checked Not documented JSON, Avro, Protobuf, CBOR, XML, MessagePack, text and binary RBAC needs an enterprise licence Redpanda docs: Programmable Push Filters (text only)
Offload to a search index The index’s query language The index Whatever is retained in the index Yes, across everything you index Decoded on the way in by a sink connector The index’s own access control Kafka Connect sink to Elasticsearch or OpenSearch

Here is how the scores work out. On filter language, Kpow’s kJQ, Conduktor’s JavaScript and SQL, Lenses SQL, ksqlDB and Redpanda Console’s JavaScript all express structured conditions, and AKHQ’s match modes and the CLI’s grep do not. On where the filter runs, every UI here filters in its own backend, and only the CLI pipelines pull every record to your machine. On multi-topic search in one query, Kpow documents a topic list, a regex and a consumer-group mode, Lenses and ksqlDB get there through joins, and the console consumer can read several topics by regex but filters nothing. On scan scope, Kpow documents the most controls. On masking, Kafbat UI and AKHQ include it free, while Kpow, Conduktor and Redpanda put it or RBAC behind a paid tier. The search index beats all of them on query speed once data is in it, at the cost of running a second system and only finding what you indexed.

Rank 1

Kpow with kJQ

factorhouse.io

52 out of 60 Total

Listed first because it is our product. Scores are unadjusted.

Filter
kJQ, compiled and run on Kpow's server
Scan modes
Slice, bounded window, partition, key
Governance
RBAC, masking, audit log: Enterprise
Scan scope and cost
9 out of 10
Where the filter runs
8 out of 10
Filter language
8 out of 10
Multi-topic scope
10 out of 10
Deserialization
8 out of 10
Access control, masking, audit
9 out of 10

What it is. The data inspect feature in Factor House’s Kafka management UI, with kJQ as its filter language.

Filter and where it runs. kJQ filters are “compiled and executed on the server, allowing you to search tens of thousands of messages a second”, per Kpow’s documentation. The server is Kpow’s own process, which consumes from the brokers and sends only matching records to your browser. kJQ supports field access, type casts such as to-double, comparison and logical operators, and time arithmetic against record timestamps. In Enterprise, a configured AI model (AWS Bedrock, OpenAI, Anthropic or Ollama) can turn a plain-English request into a kJQ filter.

Scope and multi-topic. Four modes bound the scan: slice (from a point in time), bounded window (start and end), partition (from an optional offset) and key (exact key match). A query returns 100 results by default and can be continued, and streaming search keeps going until it hits the result limit, a scan limit or the end of the topic (Kpow streaming search docs). One query can cover a list of topics, every topic matching a regex, or the topics a consumer group is reading, provided those topics share compatible serdes.

Deserialization and access. Built-in serdes include Avro, JSON Schema, Protobuf, JSON and strings, an Auto option detects the format, and custom serdes are a paid feature. Protobuf without a registry needs a custom serde. RBAC controls who can query topic data, data masking policies redact fields in results with the applied policies shown in the query context, and the audit log captures user actions. RBAC, masking and the audit log are Enterprise features.

Where it wins and where it falls short. It leads on scope controls and multi-topic search in one query. It falls short of a search index on raw speed for repeated searches across long history, because it is still a scan, and its governance features need the Enterprise licence, from $4,500 per cluster per year. Community Edition includes kJQ and multi-topic search for up to three clusters.

Source. Kpow data inspect, kJQ manual and Kpow AI models.

Rank 2

Offloading to a search index

43 out of 60 Total

Type
Pattern: Kafka Connect sink
Targets
Elasticsearch or OpenSearch
Trade-off
Finds only what you indexed
Scan scope and cost
10 out of 10
Where the filter runs
8 out of 10
Filter language
7 out of 10
Multi-topic scope
8 out of 10
Deserialization
6 out of 10
Access control, masking, audit
4 out of 10

What it is. Streaming a topic into Elasticsearch or OpenSearch with a Kafka Connect sink connector, and searching there.

Filter and where it runs. The index’s query language, against an actual index.

Scope and multi-topic. Anything you chose to index, for as long as the index keeps it, which can be longer than the topic’s retention.

Deserialization and access. Records are decoded on the way in, and access is the index’s own.

Where it wins and where it falls short. It is the only option that is not a scan at query time. It costs a second system, a pipeline that can itself fail, and it only finds fields and topics you decided to index before you needed them.

Source. The sink connector’s own documentation for your index. For keeping long history queryable in a table format rather than a search index, see Apache Iceberg.

Rank 3

Lenses SQL Studio

lenses.io

36 out of 60 Total

Type
SQL feature of Lenses, commercial
Filter
Snapshot SQL, joins across topics
Masking
Data policies by field name
Scan scope and cost
6 out of 10
Where the filter runs
8 out of 10
Filter language
9 out of 10
Multi-topic scope
7 out of 10
Deserialization
1 out of 10
Access control, masking, audit
5 out of 10

What it is. The SQL query feature of Lenses, a commercial Kafka management product.

Filter and where it runs. Snapshot SQL queries against topic data, run by Lenses. A query can reference more than one topic, as in a join.

Scope and multi-topic. SQL clauses bound the query, and joins cover several topics.

Deserialization and access. Data policies mask fields by name.

Where it wins and where it falls short. It beats Kpow for analysts who already think in SQL and for joins across topics. It is a commercial product with its own agent per cluster.

Source. Lenses documentation: SQL concepts and Data policies (named in text, not linked).

Rank 4

ksqlDB

ksqldb.io

34 out of 60 Total

Type
SQL engine, Confluent Community License
Before the first query
Declare a stream over the topic
Queries
Pull and push
Scan scope and cost
6 out of 10
Where the filter runs
8 out of 10
Filter language
8 out of 10
Multi-topic scope
6 out of 10
Deserialization
5 out of 10
Access control, masking, audit
1 out of 10

What it is. A SQL engine for Kafka under the Confluent Community License.

Filter and where it runs. A stream must first be declared over the topic, which “registers it on an underlying Apache Kafka topic”. Pull queries return results as of now, and the documentation includes pull queries against a stream.

Scope and multi-topic. SQL clauses, and joins between declared streams.

Deserialization and access. Records are read in the format declared when the stream is created.

Where it wins and where it falls short. Good for a question you will ask repeatedly, since the stream definition persists. Heavy for a one-off incident search, because it means running ksqlDB servers and declaring streams first.

Source. ksqlDB queries and CREATE STREAM reference.

Rank 5

33 out of 60 Total

Type
Open source Kafka UI, Apache 2.0
Filter
CEL expressions
Masking
Free: remove, replace or mask fields
Scan scope and cost
3 out of 10
Where the filter runs
8 out of 10
Filter language
7 out of 10
Multi-topic scope
1 out of 10
Deserialization
7 out of 10
Access control, masking, audit
7 out of 10

What it is. An open source web UI for Apache Kafka under Apache 2.0.

Filter and where it runs. User-defined CEL message filters, evaluated in Kafbat’s Java backend, per its features page and source.

Scope and multi-topic. Multi-topic search in one query is not documented.

Deserialization and access. A schema registry serde is configured automatically when registry properties are set, and a Protobuf file serde exists. RBAC includes a message read permission on topics, and data masking can remove, replace or mask fields in the messages view.

Where it wins and where it falls short. It beats Kpow on price for masking and RBAC, which are free. It trails on multi-topic search and on documented scan controls.

Source. Kafbat UI features, serdes and data masking.

Rank 6

Redpanda Console

redpanda.com

30 out of 60 Total

Type
Web console, Business Source License
Filter
JavaScript push filters per record
Decoders
JSON, Avro, Protobuf, CBOR, XML, MessagePack
Scan scope and cost
1 out of 10
Where the filter runs
8 out of 10
Filter language
7 out of 10
Multi-topic scope
1 out of 10
Deserialization
9 out of 10
Access control, masking, audit
4 out of 10

What it is. Redpanda’s web console, under the Business Source License.

Filter and where it runs. Programmable push filters are “JavaScript functions executed on the backend, evaluating each record individually”.

Scope and multi-topic. Multi-topic search in one query is not documented.

Deserialization and access. JSON, Avro, Protobuf, CBOR, XML, MessagePack, text and binary, per its README. Authorization needs an enterprise licence.

Where it wins and where it falls short. The widest list of decoders here, with a capable server-side filter. Writing JavaScript mid-incident has a steeper floor than a jq-style expression.

Source. Redpanda documentation: Programmable Push Filters, and the Redpanda Console README on GitHub (named in text, not linked).

Rank 7

AKHQ

akhq.io

29 out of 60 Total

Type
Open source Kafka UI, Apache 2.0
Match modes
Equals, contains, not contains
Search scope
One topic per search
Scan scope and cost
3 out of 10
Where the filter runs
8 out of 10
Filter language
4 out of 10
Multi-topic scope
2 out of 10
Deserialization
6 out of 10
Access control, masking, audit
6 out of 10

What it is. An open source web UI for Apache Kafka under Apache 2.0.

Filter and where it runs. Its topic data endpoint searches by key, value, header key or header value, with equals, contains or not-contains matching, evaluated in the AKHQ backend.

Scope and multi-topic. Search is per topic. Only the live tail view accepts a list of topics.

Deserialization and access. Avro and Protobuf decoding, free RBAC, and regex-based data masking.

Where it wins and where it falls short. It is free with masking included, but substring matching finds candidates rather than the one record, and there is no cross-topic search.

Source. AKHQ repository and AKHQ configuration docs.

Rank 8

Conduktor Console

conduktor.io

26 out of 60 Total

Type
Commercial console, free Community Edition
Filter
Search, JavaScript, JQ projection, SQL
Paid tier only
Masking and audit logs
Scan scope and cost
1 out of 10
Where the filter runs
8 out of 10
Filter language
9 out of 10
Multi-topic scope
1 out of 10
Deserialization
1 out of 10
Access control, masking, audit
6 out of 10

What it is. A commercial Kafka console with a free Community Edition.

Filter and where it runs. Its topics documentation describes three filter methods “executed on the server”: global search, search in a specific field, and JavaScript filters, plus a JQ projection. Its Community Edition page lists SQL queries on topics.

Scope and multi-topic. Its docs describe no multi-topic search in one query.

Deserialization and access. Its Community Edition page lists data masking and audit logs as outside the free tier.

Where it wins and where it falls short. It matches Kpow on server-side structured filtering and adds SQL. Masking and audit cost extra, and its published pricing is per seat.

Source. Conduktor documentation: Topics, and Console Community Edition (named in text, not linked).

Rank 9

kafka-console-consumer.sh with grep or jq

kafka.apache.org

23 out of 60 Total

Type
Consumer CLI, ships with Apache Kafka
Filter
grep or jq in your shell
Multi-topic
--include topic regex
Scan scope and cost
5 out of 10
Where the filter runs
1 out of 10
Filter language
4 out of 10
Multi-topic scope
6 out of 10
Deserialization
5 out of 10
Access control, masking, audit
2 out of 10

What it is. The consumer CLI that ships with Apache Kafka.

Filter and where it runs. It has no filter. It prints records, and grep or jq in your shell discards the ones you do not want, after every record has crossed the network.

Scope and multi-topic. You set the start offset, partition, maximum messages and a timeout. --include takes a regular expression of topics, so it can read several topics at once. Formatter properties add the key, timestamp and headers to the output.

Deserialization and access. Key and value deserializers are configurable, and access is whatever Kafka ACLs allow the user running it.

Where it wins and where it falls short. It is free and ships with every Kafka install, and it falls short on anything structured, and every search starts from a blank shell with no saved query and no record of who looked at what.

Source. Apache Kafka quickstart and the console consumer’s options in the Apache Kafka source.

Rank 10

20 out of 60 Total

Type
Open source Kafka CLI, formerly kafkacat
Decode
-s value=avro -r <registry-url>
Filter
Pipe to jq
Scan scope and cost
5 out of 10
Where the filter runs
1 out of 10
Filter language
4 out of 10
Multi-topic scope
2 out of 10
Deserialization
6 out of 10
Access control, masking, audit
2 out of 10

What it is. The open source Kafka CLI formerly called kafkacat.

Filter and where it runs. kcat has no predicate of its own. Its README shows the intended pattern: decode with -s value=avro -r <registry-url> and pipe to jq, filtering on your machine.

Scope and multi-topic. Offsets (including “the last N messages”), partitions, a message count and exit at end of partition. A format string with -f prints topic, partition, offset, key, headers and payload.

Deserialization and access. Avro through a schema registry is the format its README documents. Access is Kafka ACLs.

Where it wins and where it falls short. It is the fastest CLI for one topic and the simplest way to print a record’s raw bytes. It shares the console consumer’s limits on scope, sharing and audit.

Source. kcat README.

Rank 11

Kafka Magic

kafkamagic.com

20 out of 60 Total

Type
Kafka GUI, free Community Edition
Filter
JavaScript over message fields
Formats
JSON and Avro
Scan scope and cost
1 out of 10
Where the filter runs
5 out of 10
Filter language
7 out of 10
Multi-topic scope
1 out of 10
Deserialization
5 out of 10
Access control, masking, audit
1 out of 10

What it is. A Kafka GUI with a free Community Edition and a licensed Professional Edition.

Filter and where it runs. Its query guide describes JavaScript queries referencing any combination of message fields, for JSON or Avro messages.

Scope and multi-topic. The guide is titled as searching for messages in a topic. No multi-topic search is documented.

Deserialization and access. JSON and Avro. No Protobuf in the query guide.

Where it wins and where it falls short. It gives you a free, expressive filter, one topic at a time.

Source. Kafka Magic query guide and pricing.

How Factor House approaches it

Finding data is the reason most people install Kpow in the first place. Derek, our co-founder and CEO, described it on a podcast as the thing everyone uses Kpow for: you put messages into Kafka, you do not know what happened to them, and you use the data inspector to find out. Kpow’s data inspect is built around the criteria above. kJQ gives a structured filter that runs on Kpow’s server, the four query modes and the scan limit bound what gets read, and one query can span a topic list, a regex or everything a consumer group consumes. Each record shows its schema ID and deserializer, and records that fail to deserialize can be kept and flagged or listed on their own, which turns a poison message hunt into a query. The full procedure for that case is in how to find and skip a poison pill in Kafka, and once found, dead-lettered records are the subject of Kafka DLQ tools.

A kJQ filter for failed orders with more than three retries in the last thirty minutes looks like this:

.value.status == "failed" and .value.retryCount | to-long > 3 and .timestamp > now - pt30m

For teams that do not want to learn the syntax during an incident, Kpow Enterprise can generate the filter from a plain-English request using your own AI model, as covered in the post on accelerating incident response with AI queries. Results can be exported, copied, or produced to another topic, which is how a found message gets replayed. The kJQ manual has the full operator reference.

The test worth running in a Kpow demo is a real cross-topic search: pick a topic regex that covers several topics, write a kJQ filter on one field, bound it to the last hour, and see how long it takes to get from the question to the matching records.

For the step-by-step on running a query in Kpow once you have picked a tool, see how to query a Kafka topic.

Product demo · 8 min

Apache Kafka data inspection & search: Kpow demo

Chad Harris walks through data inspection in Kpow: filtering topic data with kJQ, running high-volume streaming searches with no scan limit, narrowing scans by partition or key, and downloading, cloning, or producing result sets to other topics.

Kpow live demo

Search Kafka messages with kJQ

Open the Kpow demo and filter topic data with kJQ, with automatic deserialization and no consumer to write.

Built for platform and data engineers running Kafka in production.

Try the Kpow demo

FAQ

How do I search for a message across multiple Kafka topics?

Use a tool that takes several topics in one query: Kpow’s data inspect accepts a topic list, a topic regex or a consumer group, and Lenses SQL and ksqlDB can join topics. With the CLI, kafka-console-consumer.sh --include '<regex>' reads several topics but filtering is up to grep or jq on your machine.

Can I search Kafka messages by field value?

Yes, with a structured filter: kJQ in Kpow, CEL in Kafbat UI, JavaScript in Conduktor, Kafka Magic and Redpanda Console, or SQL in Lenses and ksqlDB. AKHQ matches key, value and headers by equals or contains rather than by field.

Why is searching Kafka slow?

Kafka has no index on message content, so every search reads and decodes records from a starting point. Bound the search with a time window, partition or key, and use a tool that filters on its server rather than on your laptop. If you search the same history repeatedly, sink it into a search index.

Is there a free tool to search Kafka messages?

kafka-console-consumer and kcat with jq are free, as are Kafbat UI and AKHQ. Kpow Community Edition is free for up to three clusters and includes kJQ and multi-topic search.

The rest of the operational picture is in the complete Kafka guide.

Related reading