Webhook event reference
Pre-release v1, published 2026-09-14. This page commits to the shape of the API, not to a
date. We will build exactly what is documented here. The shape can still change until
2026-10-14; after that, changes follow Versioning and stability.
The banner comes off one page at a time as each route goes live. While it is here, build against the contract and assume the route is not callable yet.
Every event below is also in the API Reference, under Webhook events, where each variant is selectable from a dropdown next to the payload.
Delivery, signature verification and retries: Webhook events.
Every event shares the same envelope; only data differs.
message
The envelope is the same on every channel. What differs is inside data: Instagram carries a
source and an Instagram sender, Telegram carries a Telegram user id and no source.
Instagram DM
Telegram
AI reply
Triggered by a comment, with an attachment
media_id appears only when the event originated from a post or reel.
A voice message
Attachments arrive as ordinary message events with a non-text type, never as a separate event.
text is empty and the payload is in attachments.
Attachment URLs are time-limited. Download the file when the event arrives rather than storing the URL and fetching it later.
A form submission
message.generating
The AI has started composing a reply. Show a typing indicator.
Hide the indicator when the matching message arrives. There is no explicit “stopped” event.
A generation that fails produces no message, so treat it as a timeout after a few seconds.
chat
A conversation changed state. status is one of answered, operator_attention,
not_answered, closed, or pending, and previous_status is what it was before.
Each one means something different for your side, so handle them separately rather than storing the string.
answered
operator_attention
not_answered
pending
closed
The AI or an operator replied. Nothing is waiting on anyone.
Closing starts a fresh context
When a chat closes, the prior history stops being sent as context to the AI. A later conversation with the same end user starts clean.
context_reset is not a deletion flag. Nothing is deleted. The messages remain, they simply
stop being replayed into the next conversation’s context. A partner who treated this as a
deletion instruction would discard a transcript we still hold.
reaction
Someone added or removed a reaction on a message. action tells you which, so the same handler
covers both: apply it on added, and undo it on removed.
added
removed
is_typing
A human started or stopped typing. This is distinct from message.generating, which is the
AI. You may want to render them differently: “Sara is typing” against “generating a reply”.
started
stopped
operator typing
A stopped event is not guaranteed. A connection can drop mid-typing, so expire the indicator
yourself after a few seconds rather than waiting for is_typing: false.