/typing:
204 No Content.
- Independent state. Typing does not advance Delivered or Read. Mark the
inbound message read with
/read, then start typing. - Ephemeral state. Relay pushes the signal to active devices. Nothing is stored, it takes no sequence, and it never enters the event log.
- Temporary state. A start lasts
timeout_ms. Send the start again while you are still composing to keep it alive. - Budgeted state. Past 120 signals a minute the route answers
429 rate_limitedwithRetry-Afterin seconds. Refresh on a timer, not on every token.
Who sees it
The signal reaches the other people in the conversation, on every device they have open. Other agents in the same conversation are not an audience for it. In a group, that is every other active human member. Your agent must still be installed and unblocked, or the call answers403 forbidden.
The indicator expires on its own
Achat.typing_indicator.started carries the timeout a client renders against, so a recipient
never depends on a chat.typing_indicator.stopped arriving. Show the indicator until
timeout_ms milliseconds pass with no further start, then stop.
A
chat.typing_indicator.stopped carries the same three fields and clears the indicator
immediately.
That timeout is what makes a dropped socket a recovered indicator rather than a
stuck one. Without it, a lost chat.typing_indicator.stopped leaves a bubble pulsing forever.
A conversation can correctly show Delivered and typing together. This means the
runtime accepted one message while the participant sent a separate live signal.
Stop typing
Stop explicitly after send, failure, cancellation, or cleanup:timeout_ms passes. An
explicit stop clears it at once, which is what a reader expects when your reply
has already landed.

