speak decision. Turn-taking
rewrites it into 1–5 short chat messages, scheduled a beat apart, and
delivers them on the thread’s WebSocket as turn_taking.message events (with a
turn_taking.typing indicator around them). The response tells you what was
scheduled; the messages themselves arrive over the socket. See
Receiving messages from the agent.
Before it is paced, your draft is refined through a Theory of Mind pass —
predicting how it will land for the people in the thread, and rewording it to
head off the predicted damage. This happens inside respond, so you do not need
to call foresee yourself first; doing so runs the
refinement twice. Pass a system_prompt so the rewrite keeps your agent’s voice.
Pass the turn_epoch from the
submit_messages that returned
speak. If a newer batch has arrived since, the draft is stale: nothing is
scheduled, nothing is billed, and the response is superseded: true.
This call is billable, unless it is superseded. Because the draft is refined
through Theory of Mind, a respond meters two billable units: the reply and
the refinement. The refinement appears as theoryofmind on your
usage summary. See
Billing.
This call is idempotent: retrying the same reply does not schedule it twice.
Authorization
string
required
Your bearer token:
Bearer <token>. See Authentication.Request body
string
required
The thread to reply in.
string
required
The agent’s drafted reply, 1–4000 characters. This is the text that gets
paced into chat messages.
integer
required
The
turn_epoch from the deciding submit_messages. Required: a reply whose
epoch is behind the thread’s current turn is dropped as stale (an
interruption).string
Optional system-prompt text — the agent’s identity, character, and style —
applied while rewriting the reply so it stays in the agent’s voice. Up to
100,000 characters. Sent per request.
string
Optional display name for the agent in this reply, 1–255 characters. Sent per
request, so each agent in a group chat can send its own.
PacingOverrides
Optional per-reply overrides for how the reply is paced out. Each field you
omit keeps its default; the overrides apply to this reply only and never
change the thread’s or account’s defaults.
object
Optional opaque JSON object carried with this reply. It is never read or
acted on — it is echoed back verbatim on every
turn_taking.message event the
reply produces, so you can correlate delivered messages with your own state
(for example a reply_to_message_id for bubble placement).Serialized, it must be at most 4096 bytes.Request
Response
ScheduledMessage[]
The chat messages the reply was paced into, in delivery order. Each is also
pushed over the WebSocket as a
turn_taking.message event at its
deliver_at. Empty when superseded is true.boolean
true when the draft was stale because a newer batch arrived first. Nothing
was scheduled and nothing was billed — draft again against the latest
decision. false on a normal reply.200 OK
200 OK (superseded)
Errors
A stale draft is not an error — it returns
200 with superseded: true.
See Errors for the envelope shape.
Example
Next
- Record an event — report typing and edits for behavioural signals.

