support.conversation.blocked
A creator silences a member's support messages.
A block lives on the conversation, not the member. It silences their support traffic only — the member keeps their subscription, their access and every other interaction with the bot, and they are given no indication that anything changed.
When this fires
A creator blocks the member behind a support conversation:
- Dashboard — Block member in the thread's header menu in the support inbox.
- REST —
POST /v1/support/conversations/{conversation}/block. - MCP — the
block_support_contacttool.
It does not fire when:
- The conversation is already blocked. Blocking twice writes nothing the second time and emits nothing — the call is idempotent.
- A member is banned from the project. That is
member.banned, a different mechanism that removes access rather than silencing a thread. - The member's message is dropped because of rate limiting. Flood protection is automatic and raises no event.
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.conversation.blocked",
"created_at": "2026-09-06T09:30:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"conversation_id": "9e042b6f-5d81-4c37-a920-7b3e18cf6d45",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"subscriber_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80"
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always support.conversation.blocked for this event. |
created_at | ISO 8601 timestamp | Server-side emission time. |
api_version | string | Webhook API contract version. |
project_id | string UUID | Project this event belongs to. |
data.conversation_id | string UUID | The conversation that was blocked. GET /v1/support/conversations/{conversation} now reports blocked: true. |
data.project_id | string UUID | Mirrors the envelope project_id. |
data.subscriber_id | string UUID | The member whose support messages are now dropped. |
Caveats
- Blocking does not resolve the thread. Its
statusis whatever it was —open,pending,snoozedorresolved— and stays that way until someone changes it. If you keep a queue in sync, treat a blocked thread as one that will receive no new inbound messages, not as a closed one. - From this moment the member's messages are dropped at ingestion. No
support.message.receivedfires for them, and a blocked member's message cannot reopen a resolved thread, so nosupport.conversation.reopenedfires either. - The block is scoped to this thread. There is one conversation per member per channel, so a member who also writes in over another channel has a separate thread with its own block state.
- The member's history is untouched. Every message they sent before the block stays readable over the API and in the dashboard.
Related events
support.conversation.unblocked— the block is lifted.support.message.received— what stops arriving for this member while the block is in place.member.banned— removing a member's access, which is not what a block does.- Support events overview — back to family overview.
How is this guide?