Skip to main content

Outbound webhooks

Moveo delivers bot responses, agent messages, and session events to your webhook endpoint via HTTP POST requests.

Webhook request format

All webhook requests include the following headers:

HeaderDescription
Content-Typeapplication/json
X-Moveo-SignatureHMAC-SHA256 signature of the request body. See webhook security.
X-Moveo-RegionCluster of the Moveo deployment that sent the event, for example eu-central.
X-Moveo-Account-IdThe account the event belongs to.
X-Moveo-Account-SlugHuman-readable name of that account.
X-Moveo-Session-IdThe session the event belongs to.
X-Moveo-Request-IdCorrelation identifier for this delivery.

Every header except Content-Type, X-Moveo-Signature, and X-Moveo-Region is omitted when Moveo does not know the value. Treat a missing header as unknown, not as an error.

Do not authorize on headers

Use these headers for logging and routing only. The signature covers the request body, not the headers, so a caller can forge them. Every header value above also appears as a field in the body — verify the signature, then read the value from the body, where it is trustworthy.

Every webhook payload contains these base fields:

{
"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",
"channel_type": "chat",
"account_id": "acc-123",
"account_slug": "acme-co",
"context": {
"user": {
"user_id": "user-789"
}
},
"timestamp": 1789084800000
}
FieldTypeDescription
event_typestringType of event. See event types.
request_idstringUnique identifier for this request.
session_idstringMoveo's internal session ID.
external_session_idstringYour session ID, if provided during session creation.
integration_idstringThe integration ID associated with this session.
desk_idstringThe desk ID associated with this session.
channel_typestringThe session's channel type: chat, email, or voice.
account_idstringThe Moveo account this event belongs to. Always present.
account_slugstringHuman-readable name of that account. Always present.
contextobjectSession context object, if available. See sessions for the context schema.
timestampintegerEvent creation time as a Unix timestamp in milliseconds.

account_id and account_slug are covered by the signature, so they are safe to use for deciding which tenant's data an event belongs to. When Moveo cannot determine the account, both are an empty string — treat that as unknown and reject the event rather than routing on it.

external_session_id, integration_id, desk_id, channel_type, and context are omitted when the value is unavailable. timestamp carries the original event creation time and is absent on events that have no payload of their own, namely conversation:reopened and session:expired.


Event types

Event typeDescription
message:brain_sendAI agent sends a message to the user.
message:sendMoveo live chat agent sends a message to the user.
message:composeTyping indicator (start/stop).
message:readMessages marked as read.
message:deliveredMessages marked as delivered.
conversation:member_joinAgent joined the conversation.
conversation:member_leaveAgent left the conversation.
conversation:closedConversation marked as resolved.
conversation:reopenedConversation reopened.
session:closedSession closed.
session:expiredSession expired due to timeout.

For detailed payload schemas of each event type, see event payloads.


Event subscription

You can filter which events you receive by configuring subscribed_events during integration setup.

Example: Only receive bot and agent messages.

{
"subscribed_events": ["message:brain_send", "message:send"]
}

If subscribed_events is empty or not set, you receive all event types.


Next steps