Skip to content

Mute signalling

Signalling - call-mute

SIG-13 - status: draft - audio, video

A participant signals an in-call mute state change by sending a <call> stanza wrapping a <mute_v2> action.

On a local microphone mute state change, a participant MUST send:

<call to="{peer}">
  <mute_v2 call-id="{call-id}"
           call-creator="{call-creator}"
           mute-state="{state}"/>
</call>
  • to on <call> MUST be the peer JID. No id attribute is set on this action.
  • call-id MUST equal the offer's call-id (see call-offer).
  • call-creator MUST equal the call's call-creator JID and MUST be byte-identical to the value on every other action of the same call.
  • mute-state MUST carry the new mute state as a string attribute value.
  • The tag MUST be mute_v2 (sent verbatim on the wire). <mute_v2> MUST have no child elements; all state is in attributes.
  • A fresh <mute_v2> MUST be sent on each transition; it expresses the new absolute state, not a toggle.
  • This is informational signalling only: the sender MUST NOT renegotiate transport, codecs, or keys (see call-transport). Muting is realised on the media stream independently (e.g. ceasing audio or sending silence).

Requires: call-offer, call-transport

Implemented by

Flavor Status Source Notes
whatsapp-rust working history - blame - commits 674e851 build_mute_v2 in wacore/src/voip/stanza.rs constructs the outbound stanza; no inbound parser yet (mute_v2 is not in the action allow-list).
zapo-caller planned

Annotation wacrg:SIG-13 — a flavor marks its implementation site in source with this comment; a script clones the source, finds it, and attaches the commit blame/permalink.

Contributors

Contributor Role
Rajeh Taher Rajeh Taher wrote initial spec

protocol history / diff - blame

Open questions - The set of valid mute-state values is not pinned by the source; the builder accepts an arbitrary string. The on-wire encoding (e.g. "muted"/"unmuted" vs a numeric flag) is unconfirmed. - Whether video mute is signalled by the same mute_v2 action (e.g. an additional video-state attribute) or by a separate action is unknown. - Whether the receiver acknowledges (with a generic or a dedicated receipt) is not established; the inbound side does not yet parse this action. - Whether a v1 action precedes mute_v2 on older clients, and how versions interoperate, is unknown.

References - WhatsApp call signalling — mute_v2 builder

Changelog

  • 2026-06-21 — Initial spec entry.

Back to the full spec