support.message.sent
A reply to a member is recorded and queued for delivery.
This fires when the reply is recorded and queued, not when the member
receives it. Delivery happens on a queue and can still fail — a member who has
blocked the bot is unreachable. Read delivery_status from the support API
for the outcome.
When this fires
A creator or team member replies to a member, from any surface: the dashboard inbox, the Telegram relay DM, the REST API, or the reply_support_conversation MCP tool.
It does not fire when:
- The reply was recorded as an internal note. Notes are private remarks for your team, are never delivered to the member, and raise no event.
- An automated acknowledgement goes out. The project's auto-reply is a system message, not a creator reply.
Required ability
support-conversation:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "support.message.sent",
"created_at": "2026-08-20T10:07:00Z",
"api_version": "2026-05-01",
"project_id": "prj_01HX...",
"data": {
"message_id": "smg_01HX...",
"conversation_id": "sup_01HX...",
"project_id": "prj_01HX...",
"subscriber_id": "usr_01HX...",
"type": "text"
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always support.message.sent for this event. |
created_at | ISO 8601 timestamp | Server-side emission time — when the reply was queued. |
api_version | string | Webhook API contract version. |
project_id | string ULID | Project this event belongs to. |
data.message_id | string ULID | The stored reply. |
data.conversation_id | string ULID | Thread the reply belongs to. |
data.project_id | string ULID | Mirrors the envelope project_id. |
data.subscriber_id | string ULID | The member the reply is addressed to. |
data.type | string | text, or the media kind when the reply carried an attachment. |
Caveats
- The payload does not say who replied. Read
author_user_idfromGET /v1/support/conversations/{conversation_id}/messagesif you need to attribute it to a specific team member. - The member sees the reply prefixed with the project's support name, so it reads as coming from a person rather than from the bot. That prefix is added at delivery and is not part of the stored body.
- Pairing this with
support.message.receivedgives you first-response time. The conversation's ownfirst_response_atis stamped only once, on the first human reply, which is the more reliable SLA measure.
Related events
support.message.received— the member's side.support.conversation.resolved— usually the next step after a reply.- Support events overview — back to family overview.
How is this guide?