Skip to content

Call offer stanza

Signalling - call-offer

SIG-01 - status: review - audio, video

A caller opens a 1:1 call with a stanza whose child proposes the session, carries per-device media keys, and seeds transport negotiation.

Send a top-level <call> stanza with id (stanza id, correlates the server <ack>), from, and to. Its <offer> child MUST carry call-id (opaque logical call identifier, echoed in every later stanza for this call) and call-creator.

<offer> children MUST appear in this exact order; a mis-ordered offer is rejected by the server with error 439:

privacy → audio(8000) → audio(16000) → net(medium) → capability
        → (destination | enc) → encopt(keygen) → device-identity
  • Media: two nodes <audio enc="opus" rate="8000"> and <audio enc="opus" rate="16000">.
  • <capability ver="1"> body MUST be the fixed 7-byte blob 01 05 f7 09 e4 bb 13.
  • <encopt keygen="2"> selects the v2 SRTP key path.
  • Each recipient device MUST receive its own <enc> node carrying the call key encrypted to that device's Signal session: type="pkmsg" to establish, type="msg" to reuse. A multi-device callee receives several <enc> nodes.

Breakdown: call-key, group-call-crypto, srtp-master-key, warp-crypto, opus, video-packetization, stun-relay, call-accept, call-ack, call-mute, call-preaccept, call-reject, call-relaylatency, call-terminate, call-transport, flow-call-missed, flow-call-rejected, flow-incoming-1to1, flow-outgoing-1to1, group-call, video-call

Implemented by

Flavor Status Source Notes
whatsapp-rust working history - blame - commits 674e851
zapo-caller working

Annotation wacrg:SIG-01 — 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 - Full meaning of the packed bitfield. - Whether an explicit media-key length/salt is carried, or all is derived from the Signal plaintext.

References - Signal Protocol (X3DH + Double Ratchet)

Changelog

  • 2026-06-21 — Initial spec entry.

Back to the full spec