Skip to main content
client.lowlevel (WaLowLevelCoordinator) is the raw escape hatch beneath the typed coordinators. Use it to send protocol stanzas the high-level API doesn’t cover, issue custom IQs, or intercept inbound stanzas.
This is unsafe by design — you’re building protocol nodes by hand. Prefer the typed coordinators when one exists; reach for lowlevel only for protocol surfaces zapo doesn’t wrap yet.

Binary nodes

Everything here speaks BinaryNode — zapo’s representation of a WhatsApp protocol stanza:

Sending a node

sendNode writes a raw stanza. Failures that look like a transient receipt-send issue are buffered to the receipt queue and logged rather than thrown.

Issuing an IQ

query sends an IQ stanza and awaits the matching response (within timeoutMs). It throws if the client isn’t connected.

Intercepting incoming nodes

Register a handler for inbound nodes that match a tag (and optional subtype). The handler returns a Promise<boolean> — return true when you’ve handled the node. registerIncomingHandler returns an unregister function.
WaIncomingNodeHandlerRegistration:
You can also remove a registration explicitly:

Filtering inbound stanzas

A stanza filter runs before the typed handlers. Return true to drop a stanza entirely. zapo still sends the appropriate ack for message/receipt/notification, so the server stops re-delivering it.
Auth-critical success and failure stanzas bypass filters — you can’t drop them, so the connection and pairing flow always stays intact.
Inbound nodes are also observable read-only via the debug_transport_node_in / debug_transport_node_out events — handy for discovering stanza shapes before you write a handler.
Last modified on May 28, 2026