Webhook event reference
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
Who sent it
sender is how you show a customer as a person rather than an id: their display name and
profile picture (avatar_url) arrive on every customer message, kept current by the channel.
avatar_url is a ParsChat link, not the channel’s. It does not expire and always serves the
customer’s current picture, so you can store it and use it directly as an <img src>. It is null
when we have no picture for that customer.
On Instagram, a customer who has only ever commented may arrive with username alone. Their first
direct message fills in name and avatar_url.
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.