Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

API support matrix

37 of the protocol's 87 api keys, listed in wire-code order. Every row is negotiated per connection — the version column is deliberately absent, because there is no fixed version to report. See Version negotiation.

APICodeRoutingMutatingSent by
Fetch1partition leadernoread
ListOffsets2partition leadernoadmin, read
Metadata3anynoconn, meta
OffsetCommit4group coordinatoryesadmin
OffsetFetch5group coordinatornoadmin
FindCoordinator6anynometa
DescribeGroups11group coordinatornoadmin
ListGroups12anynoadmin
SaslHandshake13anynoconn
ApiVersions14anynoconn
CreateTopics15controlleryesadmin
DeleteTopics16controlleryesadmin
DeleteRecords17anyyesadmin
DescribeAcls25anynoadmin
CreateAcls26anyyesadmin
DeleteAcls27anyyesadmin
DescribeConfigs28anynoadmin
DescribeLogDirs31specific brokernoadmin
SaslAuthenticate32anynoconn
CreatePartitions33controlleryesadmin
DeleteGroups38group coordinatoryesadmin
ElectLeaders39controlleryesadmin
IncrementalAlterConfigs40anyyesadmin
AlterPartitionReassignments41controlleryesadmin
ListPartitionReassignments42controllernoadmin
OffsetDelete43group coordinatoryesadmin
DescribeClientQuotas44anynoadmin
AlterClientQuotas45anyyesadmin
DescribeUserScramCredentials46anynoadmin
AlterUserScramCredentials47anyyesadmin
DescribeCluster56anynoadmin
DescribeProducers57specific brokernoadmin
DescribeTransactions61txn coordinatornoadmin
ListTransactions62anynoadmin
ConsumerGroupDescribe65group coordinatornoadmin
DescribeTopicPartitions71anynoadmin
ShareGroupDescribe73group coordinatornoadmin

Reading the table

Routing is the class from crates/kafka-meta/src/routing.rs. Sending to the wrong class does not produce an error — it produces a NOT_CONTROLLER or NOT_COORDINATOR retry loop that presents as a flaky cluster. See Metadata, routing and the pool.

Mutating is ApiKey::is_mutating, which is what a read-only client refuses before opening a socket. Note the entries that look surprising in both directions: OffsetCommit and OffsetDelete are mutating because they write group state, while SaslHandshake, SaslAuthenticate and FindCoordinator are not, for reasons the read-only gate chapter explains.

DeleteRecords, CreateAcls, IncrementalAlterConfigs and the quota and SCRAM alters route to any broker rather than to the controller, which is correct — these are not controller-only APIs even though they mutate.

The other 50

Not implemented, and they fall into four groups.

Consumer-group membership and the transactional write path — the real gap. Produce (0) is implemented; what remains is InitProducerId (18) and the transaction write path (AddPartitionsToTxn 20, AddOffsetsToTxn 21, EndTxn 22, TxnOffsetCommit 24), classic membership (JoinGroup 7, Heartbeat 8, LeaveGroup 9, SyncGroup 10), KIP-848 membership (ConsumerGroupHeartbeat 64), and share consumption (ShareGroupHeartbeat 72, ShareFetch 74, ShareAcknowledge 75).

This is the scope boundary, not an oversight — the library writes records, but observes groups and transactions without joining or starting one. See Non-goals and Roadmap.

Broker-internal and KRaft APIs, which a client has no business sending: Vote (48), BeginQuorumEpoch (49), EndQuorumEpoch (50), AlterPartition (52), Envelope (54), FetchSnapshot (55), BrokerRegistration (58), BrokerHeartbeat (59), UnregisterBroker (60), AllocateProducerIds (63), ControllerRegistration (66), AssignReplicasToDirs (69), the Raft voter APIs (76–78), and the share-group state APIs (79–83) that live between broker and coordinator. DescribeQuorum (51) is the one in this group a UI might plausibly want.

Superseded. AlterConfigs (29) is deliberately absent — IncrementalAlterConfigs (40) replaces it, and using the older API silently resets every config you did not mention. There is no reason to offer it.

Not yet needed. Delegation tokens (34–37), OffsetForLeaderEpoch (19), AlterReplicaLogDirs (30), UpdateFeatures (53), the telemetry APIs (67–68), ListConfigResources (70), and the share-group offset admin APIs (84–86). These are ordinary gaps — nothing structural stops them being added.

Keeping this page honest

The table is generated from two sources of truth and must be regenerated when either changes:

  • crates/kafka-conn/src/api_key.rs — the wire codes and is_mutating
  • crates/kafka-meta/src/routing.rs — the routing class

The docs CI job asserts that every crates/… path cited anywhere in this book exists, so a refactor that moves a file fails the build rather than leaving a citation that is confidently wrong. It does not yet verify the rows of this table against the source; that check is worth adding the first time this page goes stale.