Skip to main content

Webhook event payloads

This page documents the payload schema for each webhook event type. All payloads include the base fields (event_type, request_id, session_id, external_session_id, integration_id, desk_id, channel_type, account_id, account_slug, and context), plus the timestamp carried by the event itself. The examples below show a representative subset of the base fields rather than repeating all of them.


AI agent message​

Event type: message:brain_send

Sent when the AI agent responds to the user. The output.responses array contains one or more response objects.

{
"event_type": "message:brain_send",
"request_id": "req-123",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"output": {
"responses": [
{
"type": "text",
"text": "Hello! How can I help you today?",
"options": [
{
"label": "Check Order",
"text": "I want to check my order"
},
{
"label": "Support",
"text": "I need support"
}
]
}
]
}
}

Response types​

The output.responses array can contain multiple response objects. Each response has a type field and an action_id — the identifier of the dialog action that produced it, stable across sessions and useful for correlating a response with the dialog node that emitted it.

TypeDescription
textPlain text message, optionally with quick reply options.
imageImage attachment.
videoVideo attachment.
fileFile attachment.
urlA URL for your system to open or render.
carouselMultiple cards with buttons.
webviewOpen a webview.
surveyA survey to present to the user.
handoverTransfer to a human agent.
closeThe AI Agent ended the conversation.
pauseA delay before the next response, optionally showing a typing indicator.
whatsapp_flowA WhatsApp Flow. Only emitted by agents built for WhatsApp.

Moveo may also emit the internal types replay and reminder. They carry no message for the user — ignore any response type you do not handle rather than treating it as an error.

Text response

{
"type": "text",
"text": "Here's your order status.",
"options": [
{
"label": "Track Order",
"text": "Track my order"
}
]
}
FieldTypeDescription
typestring"text"
textstringThe message text.
optionsarrayOptional quick reply buttons.
options[].labelstringButton label displayed to the user.
options[].textstringThe value associated with this option. Your system is responsible for handling the button click and sending this text back as a user message if needed.

Image response

{
"type": "image",
"url": "https://example.com/image.jpg",
"name": "Product Image"
}
FieldTypeDescription
typestring"image"
urlstringImage URL.
namestringOptional image name/caption.

Video response

{
"type": "video",
"url": "https://example.com/video.mp4",
"name": "Tutorial Video",
"size": 5242880
}

URL response

{
"type": "url",
"url": "https://example.com/order/12345"
}
FieldTypeDescription
typestring"url"
urlstringThe URL to open or render.

File response

{
"type": "file",
"url": "https://example.com/document.pdf",
"name": "Invoice.pdf",
"size": 102400
}
FieldTypeDescription
typestring"file"
urlstringFile download URL.
namestringFilename.
sizeintegerFile size in bytes (optional).

Carousel response

{
"type": "carousel",
"cards": [
{
"title": "Product A",
"subtitle": "$29.99",
"media": {
"type": "image",
"url": "https://example.com/product-a.jpg"
},
"buttons": [
{
"type": "postback",
"label": "Buy Now",
"trigger_node_id": "node-buy-product-a"
},
{
"type": "url",
"label": "Learn More",
"url": "https://example.com/product-a"
}
]
}
]
}
FieldTypeDescription
typestring"carousel"
cardsarrayArray of card objects. Between 1 and 6.
cards[].titlestringCard title.
cards[].subtitlestringCard subtitle.
cards[].mediaobjectCard image or video (optional).
cards[].media.typestring"image" or "video".
cards[].media.urlstringMedia URL.
cards[].buttonsarrayAction buttons.
cards[].buttons[].typestring"postback", "url", "webview", "phone", or "event".
cards[].buttons[].labelstringButton text.
cards[].buttons[].urlstringURL for url, webview, and phone buttons.
cards[].buttons[].trigger_node_idstringDialog node triggered by postback and event buttons.
cards[].buttons[].heightstringWebview height for webview buttons.
cards[].buttons[].auto_openbooleanWhether a webview button opens automatically.
cards[].default_actionobjectOptional button applied when the card itself is tapped.

Handover response

Signals that the AI Agent is transferring the conversation to a human agent. The AI Agent stops replying from this point on.

{
"type": "handover",
"metadata": {
"zendesk_department_id": "support"
}
}
FieldTypeDescription
typestring"handover"
metadataobjectOptional flat key-value map configured on the dialog action, used to route the transfer.
department_idstringDeprecated. A target department set on older agents, still sent where it was configured. Prefer metadata.

Any message shown to the user before a transfer arrives as a separate text response, not as a field on this one.

Close response

Signals that the AI Agent ended the conversation.

{
"type": "close"
}

Pause response

A deliberate delay before the next response, used to pace a multi-part reply.

{
"type": "pause",
"duration": 2,
"show_typing": true
}
FieldTypeDescription
typestring"pause"
durationintegerDelay in seconds.
show_typingbooleanWhether to show a typing indicator for the duration.

Webview response

{
"type": "webview",
"url": "https://example.com/form",
"name": "Order form",
"label": "Fill out form",
"height": "full",
"auto_open": false
}
FieldTypeDescription
typestring"webview"
urlstringWebview URL.
namestringWebview name.
labelstringButton label.
heightstring"full", "tall", "compact", or "new_window".
auto_openbooleanWhether the webview should open without the user tapping the button.

A survey response has the same fields as a webview response and points at a survey URL.


Human agent message​

Event type: message:send

Sent when a human agent from Moveo's live chat replies to the user.

{
"event_type": "message:send",
"request_id": "req-456",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"from": {
"agent_id": "agent-123",
"agent_name": "Sarah Johnson",
"agent_avatar": "https://example.com/avatars/sarah.jpg",
"team_id": "support-team"
},
"to": {
"user_id": "user-789"
},
"body": {
"text": "Hi! I'm Sarah from support. How can I help you?",
"attachments": []
}
}
FieldTypeDescription
from.agent_idstringAgent's unique identifier.
from.agent_namestringAgent's display name.
from.agent_avatarstringURL to agent's avatar (optional).
from.team_idstringAgent's team/department ID (optional).
to.user_idstringTarget user ID.
body.textstringMessage text.
body.attachmentsarrayAttachments (same format as input attachments).

Typing indicator​

Event type: message:compose

Sent when someone starts or stops typing.

{
"event_type": "message:compose",
"request_id": "req-789",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"author_id": "agent-123",
"author_name": "Sarah Johnson",
"author_type": "agent",
"action": "start"
}
FieldTypeDescription
author_idstringID of the person typing.
author_namestringName of the person typing.
author_typestring"agent" or "brain".
actionstring"start" or "stop".

Message read​

Event type: message:read

Sent when messages are marked as read.

{
"event_type": "message:read",
"request_id": "req-101",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"author_type": "agent"
}
FieldTypeDescription
author_typestringWho marked messages as read: "agent", "brain", or "visitor".

Message delivered​

Event type: message:delivered

Sent when messages are confirmed delivered.

{
"event_type": "message:delivered",
"request_id": "req-102",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"author_type": "brain"
}

Member join​

Event type: conversation:member_join

Sent when an agent joins the conversation.

{
"event_type": "conversation:member_join",
"request_id": "req-103",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"author_id": "agent-123",
"author_name": "Sarah Johnson",
"author_type": "agent"
}

Member leave​

Event type: conversation:member_leave

Sent when an agent leaves the conversation.

{
"event_type": "conversation:member_leave",
"request_id": "req-104",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"author_id": "agent-123",
"author_name": "Sarah Johnson",
"author_type": "agent"
}

Conversation closed​

Event type: conversation:closed

Sent when a conversation is marked as resolved.

{
"event_type": "conversation:closed",
"request_id": "req-105",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"status": "resolved",
"agent_id": "agent-123",
"agent_name": "Sarah Johnson"
}

Conversation reopened​

Event type: conversation:reopened

Sent when a resolved conversation is reopened.

{
"event_type": "conversation:reopened",
"request_id": "req-106",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000
}

Session closed​

Event type: session:closed

Sent when a session is explicitly closed.

{
"event_type": "session:closed",
"request_id": "req-107",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000,
"status": "closed"
}

Session expired​

Event type: session:expired

Sent when a session expires due to inactivity timeout.

{
"event_type": "session:expired",
"request_id": "req-108",
"session_id": "sess-456",
"external_session_id": "your-session-789",
"integration_id": "intg-001",
"desk_id": "desk-456",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000
}