Skip to main content
Start typing with /typing:
Relay returns 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_limited with Retry-After in 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 answers 403 forbidden.

The indicator expires on its own

A chat.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:
An indicator you leave running clears itself once timeout_ms passes. An explicit stop clears it at once, which is what a reader expects when your reply has already landed.

Next steps