Per-RPC status across all Kafka 4.x API keys. Versions are the range Surgewave
advertises in ApiVersions. "Kafka" is the latest range published by
Apache Kafka 4.2 — they match unless noted.
See the overview page for headline numbers, status-legend
explanations, and source-of-truth pointers. The canonical document lives at
CONFORMANCE.md
in the repository root.
Core data plane
Key
API
Surgewave
Status
Handler
Notes
0
Produce
0–13
Wired
DataApiHandler
Quotas, dedup, deferred delivery, TTL. MinVersion 0 (not 3) is intentional for librdkafka compression detection.
KIP-496. Conservative: a group with active members rejects the delete with GROUP_SUBSCRIBED_TO_TOPIC for every requested partition (Surgewave doesn't decode the classic-protocol Subscription bytes). Empty groups always allow.
Consumer Group v2 (KIP-848)
Key
API
Surgewave
Status
Handler
Notes
68
ConsumerGroupHeartbeat
0–1
Wired
ConsumerGroupV2ApiHandler
Server-side assignment, no SyncGroup round-trip. ConsumerGroupV2Reconciler + ConsumerGroupV2Coordinator ship full state machine; persistence verified by ConsumerGroupV2PersistenceTests.
69
ConsumerGroupDescribe
0–1
Wired
ConsumerGroupV2ApiHandler
Share Groups (KIP-932)
Key
API
Surgewave
Status
Handler
Notes
76
ShareGroupHeartbeat
1
Wired
ShareGroupApiHandler
Queue-style consumer protocol.
77
ShareGroupDescribe
1
Wired
ShareGroupApiHandler
78
ShareFetch
1–2
Wired
ShareGroupApiHandler
Visibility timeout, redelivery counter.
79
ShareAcknowledge
1–2
Wired
ShareGroupApiHandler
Ack/Nack/Renew.
90
DescribeShareGroupOffsets
0–1
Wired
ShareGroupApiHandler
91
AlterShareGroupOffsets
0
Wired
ShareGroupApiHandler
92
DeleteShareGroupOffsets
0
Wired
ShareGroupApiHandler
83
InitializeShareGroupState
—
Not implemented
—
Internal state APIs not exposed; share-group state lives inside the coordinator.
Per-id projection onto on-the-wire TransactionState shape; unknown ids surface as error rows rather than being dropped.
66
ListTransactions
0–2
Wired
same → HandleListTransactions
Threads StateFilters / ProducerIdFilters / KIP-994 DurationFilter / KIP-1152 TransactionalIdPattern straight through; pathological-regex DoS defence applies on the wire path too.
67
AllocateProducerIds
0–1
Wired (controller-side)
—
Producer ID pool inside ProducerStateManager.
Confluent.Kafka 2.x transactional clients (InitTransactions / BeginTransaction /
ProduceAsync / SendOffsetsToTransaction / CommitTransaction) round-trip green
against an embedded Surgewave broker — see the six tests in
tests/Kuestenlogik.Surgewave.IntegrationTests/TransactionTests.cs (commit, abort, isolation
levels, mixed transactions, producer fencing, consume-process-produce EOS).
Topic & partition admin
Key
API
Surgewave
Status
Handler
Notes
19
CreateTopics
2–7
Wired
TopicAdminHandler
20
DeleteTopics
1–6
Wired
TopicAdminHandler
21
DeleteRecords
0–2
Wired
TopicAdminHandler
Truncate at offset.
37
CreatePartitions
0–3
Wired
TopicAdminHandler
75
DescribeTopicPartitions
0
Wired
MetadataApiHandler
KIP-966 paginated metadata fetch — used by Java Kafka client 4.0+ to walk large clusters in bounded chunks. Honours ResponsePartitionLimit and StartingCursor; emits NextCursor when truncated.
KIP-460. Per-partition: prefers an ISR member, falls back to first ISR, then unclean (any alive replica) when ISR is empty. Top-level error = NotController when this broker isn't the cluster controller.
KIP-455. Builds a ReassignmentPlan and hands it to the manager's 4-state machine (Pending → Adding → Syncing → Completing → Completed). Cancel-via-empty-Replicas surfaces as InvalidRequest per partition — the manager doesn't expose a cancel API yet.
Filters by topic if specified; returns active state with TargetReplicas / AddingReplicas / RemovingReplicas.
Configuration
Key
API
Surgewave
Status
Handler
Notes
32
DescribeConfigs
1–4
Wired
ConfigApiHandler
33
AlterConfigs
0–2
Wired
ConfigApiHandler
44
IncrementalAlterConfigs
0–1
Wired
ConfigApiHandler
74
ListConfigResources
0–1
Wired
TelemetryApiHandler
KIP-1106. Returns the configured ClientTelemetryConfig.RequestedMetrics as ConfigResource rows when telemetry is enabled; empty list otherwise.
Security
Key
API
Surgewave
Status
Handler
Notes
17
SaslHandshake
0–1
Wired
SecurityApiHandler
PLAIN, SCRAM-SHA-256/512, and OAUTHBEARER (KIP-936). OAUTHBEARER stands up when Surgewave:Security:OAuthBearer:Enabled=true and OAUTHBEARER is in SaslMechanisms — JWT validation against OidcAuthority (well-known discovery) or JwksUri, configurable issuer + audience + principal claim.
KIP-554 SCRAM credential listing. Returns mechanism + iterations per user across both stores (SHA-256 + SHA-512). Empty user list enumerates everything. Users with no credential surface as ResourceNotFound.
KIP-554 SCRAM upsert + delete. Per-row error coding. Upsertion derives StoredKey + ServerKey per RFC 5802. Stores stand up in-memory when SCRAM is in SaslMechanisms — the wire RPC is the canonical provisioning path.
Quotas
Key
API
Surgewave
Status
Handler
Notes
48
DescribeClientQuotas
0–1
Wired
QuotaApiHandler
49
AlterClientQuotas
0–1
Wired
QuotaApiHandler
Cluster, log dirs, producers
Key
API
Surgewave
Status
Handler
Notes
23
OffsetForLeaderEpoch
—
Not implemented
—
34
AlterReplicaLogDirs
1–2
Wired (rejects)
TopicAdminHandler
KIP-113 partition log-dir move. Surgewave runs with a single data dir per broker — every requested partition is rejected with LogDirNotFound so admin tools see the precise reason.
35
DescribeLogDirs
1–5
Wired
TopicAdminHandler
Single LogDirResult entry per response with LogDir = LogManager.DataDirectory and per-partition TotalSize from each IPartitionLog.TotalSize. v4+ TotalBytes / UsableBytes come from DriveInfo; -1 if the volume isn't readable.
KIP-664. Per-partition listing of active producer state — producers that never wrote to or held a transaction on a partition are excluded. LastTimestamp and CoordinatorEpoch are returned as -1 (Surgewave doesn't track them per partition); CurrentTxnStartOffset is 0 when the producer holds an open transaction on the partition, -1 otherwise.
64
UnregisterBroker
0
Wired (controller)
ClusterMembershipHandler
KIP-895.
Inter-broker / KRaft
Key
API
Surgewave
Status
Handler
Notes
4
LeaderAndIsr
0–7
Wired
InterBrokerApiHandler
5
StopReplica
0–3
Wired
InterBrokerApiHandler
6
UpdateMetadata
0–8
Wired
InterBrokerApiHandler
7
ControlledShutdown
0–3
Wired
InterBrokerApiHandler
52
Vote
0–1
Wired
RaftApiHandler
53
BeginQuorumEpoch
0–1
Wired
RaftApiHandler
54
EndQuorumEpoch
0–1
Wired
RaftApiHandler
55
DescribeQuorum
0–3
Wired
RaftApiHandler
59
FetchSnapshot
0
Wired
RaftApiHandler
62
BrokerRegistration
0–4
Wired
ClusterMembershipHandler
63
BrokerHeartbeat
0–4
Wired
ClusterMembershipHandler
70
ControllerRegistration
—
Not implemented
—
73
AssignReplicasToDirs
—
Not implemented
—
80
AddRaftVoter
0
Wired (rejects)
RaftApiHandler
KIP-853 online voter reconfiguration is not implemented in this Surgewave release; the handler returns UnsupportedVersion (35) with a stable message pointing operators at static config + restart. The wire is bound (rather than left to the dispatcher's generic no-handler fallback) so admin tools see a precise error code instead of "version mismatch".
81
RemoveRaftVoter
0
Wired (rejects)
RaftApiHandler
Same as above.
82
UpdateRaftVoter
0
Wired (rejects)
RaftApiHandler
Same as above.
Telemetry (KIP-714)
Key
API
Surgewave
Status
Handler
Notes
71
GetTelemetrySubscriptions
0
Wired
TelemetryApiHandler
When Surgewave:Telemetry:Enabled=true, returns the configured push interval and metric subscription set so librdkafka 2.x clients start pushing OTLP metrics. When disabled (default), advertises an empty set with a 5-min backoff — preserves the pre-G9 stub behaviour so an upgrade doesn't change wire traffic.
72
PushTelemetry
0
Wired
TelemetryApiHandler → ITelemetryIngestor
Default LoggingTelemetryIngestor logs each push and emits surgewave.broker.client_telemetry.{pushes_received, bytes_received, terminating_pushes} counters on the broker meter. Operators plug in a custom ITelemetryIngestor to forward OTLP payloads to a collector or topic.