Call terminate stanza¶
Signalling - call-terminate
SIG-14 - status: draft - audio, video, group
The
Wire shape:
<call to="{peer-jid}">
<terminate call-id="{call-id}" call-creator="{call-creator-jid}"
[reason="{reason}"]>
[<destination>
<to jid="{device-jid}"/>...
</destination>]
</terminate>
</call>
<call> wrapper:
- MUST carry
to(peer JID). - MUST NOT carry a builder-supplied
id(unlike<preaccept>/<heartbeat>).
<terminate> action element:
- MUST carry
call-id— the call identifier from the offer (see call-offer), not the stanza id. - MUST carry
call-creator— JID of the call's creator. - MAY carry
reason(free-form string). When absent, the attribute MUST be omitted entirely (no emptyreason=""). - MAY contain a single
<destination>child, which MUST then contain one<to jid="..."/>per target device. When there are no extra devices,<destination>MUST be omitted.
Reason accepted_elsewhere is sent to a peer's other devices once the call is
accepted on one device; it pairs with the <destination> list of devices to
hang up. An ordinary hang-up MAY send no reason.
Inbound <terminate>:
- MUST be parsed for
call-idandcall-creator(both required). - MAY carry
duration— total call duration in seconds, non-negative integer fitting an unsigned 32-bit value. - MAY carry
audio_duration— audio-only duration, same encoding/range. - Both counters optional; a parser MUST treat absence as "not reported", not 0.
A receiver that does not recognize a <call> action child MUST ignore the
stanza rather than error.
Notes. The inbound parser reads duration/audio_duration but does not consume
reason, so a peer-sent reason is on the wire but not surfaced.
Requires: call-offer
Breakdown: flow-call-missed, flow-call-rejected, flow-outgoing-1to1
Implemented by
| Flavor | Status | Source | Notes |
|---|---|---|---|
whatsapp-rust |
working | history - blame - commits 674e851 |
build_terminate emits the action; the inbound parser decodes duration/audio_duration. |
zapo-caller |
working | — | signalling builder ported from this flavor's signaling.ts. |
Annotation wacrg:SIG-14 — 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 |
|---|---|
| wrote initial spec |
protocol history / diff - blame
Open questions - Full enumeration of reason values the server and clients emit; only accepted_elsewhere is confirmed from source. - Whether duration/audio_duration are ever sent on outbound terminates or only received. - Whether reason is expected (or validated) on inbound terminates, given the parser ignores it today.
References - wacore voip signaling builders (build_terminate) - wacore call stanza parser (terminate action)
Changelog¶
- 2026-06-21 — Initial spec entry.