Skip to content

Rejected call flow

Signalling - flow-call-rejected

SIG-18 - status: draft - audio, video

Callee-decline flow: acknowledge the <offer>, then emit a single <reject> without entering preaccept, accept, media-keying, relay, or transport.

Composes call-offer, call-ack, and call-reject into a terminal sequence. Per-stanza wire layouts are defined by those parts.

Callee side — on inbound <offer>, to decline, in order:

  1. Acknowledge per call-ack: send the generic transport <ack> keyed to the <call> stanza id, and the offer <receipt> echoing <offer call-id call-creator/>. Both MUST be sent regardless of the decision to reject.

  2. Send a <call> stanza whose single action child is <reject> per call-reject:

  3. to MUST be the JID the <offer> was received from.

  4. call-id and call-creator MUST be copied verbatim from the <offer>.
  5. <reject> MUST be empty.

MUST NOT on this path:

  • MUST NOT send <preaccept> or <accept> for the same call-id; <reject> is terminal for that offer from that device.
  • MUST NOT decrypt or derive media keys from the offer's <enc> callKey, and MUST NOT perform relay allocation, candidate exchange (<transport>), or relay-latency probing (<relaylatency>).
  • MUST NOT send <terminate> for a call that never progressed past the offer.

Caller side. The caller MUST treat a received <reject> for an outstanding offer as a decline by that device. The <reject> arrives wrapped in an inbound <call> and is acknowledged by the generic <call> ack only; no offer receipt is emitted in response to a <reject>.

Multi-device. Each offered device decides independently and MAY emit its own <reject> carrying the same call-id/call-creator. Cross-device fan-out is unspecified.

Requires: call-offer, call-ack, call-reject, call-preaccept, call-accept, call-terminate, flow-incoming-1to1

Implemented by

Flavor Status Source Notes
whatsapp-rust working history - blame - commits d68af6c listen mode default-rejects: acks the offer, then sends with no media work
zapo-caller working reject builder ported from zapo-caller signaling.ts

Annotation wacrg:SIG-18 — 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 - Whether the caller emits a terminate or notice to the callee's sibling devices once one device rejects, or whether each device rejects independently with no cross-device fan-out. - Whether a rejecting device must wait for the offer receipt to be sent before emitting , or whether the two may be pipelined. - Whether the caller surfaces a distinct call-state (declined vs. unanswered) on receiving versus a missed-call timeout (see flow-call-missed).

References - RFC 2119 — Key words for use in RFCs

Changelog

  • 2026-06-21 — Initial spec entry.

Back to the full spec