Справочник событий
Каждый тип webhook-события и точный payload, который отправляет TicketWave.
Справочник событий
На каждый endpoint можно подписаться на шесть типов событий. Каждый запрос использует один и тот же envelope — event, timestamp, guild_id и data — и отличается только объект data.
| Event | Fires when |
|---|---|
ticket.created | Тикет открыт |
ticket.closed | Тикет закрыт |
ticket.updated | Что-то ещё изменилось в открытом тикете |
message.sent | Участник или сотрудник пишет в тикете |
blacklist.added | Участник добавлен в чёрный список |
blacklist.removed | Запись в чёрном списке снята |
Поля, которые не удаётся определить, отправляются как null, а не опускаются — так что вы можете рассчитывать на наличие ключей. username равен null, когда Discord не вернул пользователя.
Общие поля
Каждое событие тикета содержит эти поля:
| Field | Type | Description |
|---|---|---|
ticket_id | string | Читаемый id тикета из вашего шаблона, например ticket-1042 |
ticket_num_id | number | Порядковый номер тикета, например 1042 |
channel_id | string | Канал Discord, в котором находится тикет |
category | string | null | Название категории, null, если у тикета её нет |
user | object | null | Владелец тикета в виде { id, username } |
ticket.created
Отправляется сразу после создания канала тикета.
{
"event": "ticket.created",
"timestamp": "2026-08-26T08:23:11.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1042",
"ticket_num_id": 1042,
"channel_id": "998877665544332211",
"category": "🤖 Support",
"user": { "id": "987654321098765432", "username": "Luna" },
"created_at": "2026-08-26T08:23:11.000Z"
}
}Это срабатывает, когда тикет открыт, то есть до того, как участник что-либо написал. Если вам нужно первое сообщение, дополнительно слушайте message.sent.
ticket.closed
{
"event": "ticket.closed",
"timestamp": "2026-08-26T07:45:02.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1041",
"ticket_num_id": 1041,
"channel_id": "998877665544332211",
"category": "💸 Payment",
"user": { "id": "987654321098765432", "username": "Luna" },
"closed_by": { "id": "112233445566778899", "username": "Staff_01" },
"reason": "Issue resolved",
"closed_at": "2026-08-26T07:45:02.000Z"
}
}| Field | Type | Description |
|---|---|---|
closed_by | object | Кто закрыл тикет. При автоматическом закрытии указывается бот |
reason | string | null | Причина закрытия, null, если её не указали |
ticket.updated
Универсальное событие для изменений в открытом тикете. action показывает, что изменилось, а changes содержит детали конкретного действия.
{
"event": "ticket.updated",
"timestamp": "2026-08-26T14:02:19.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1038",
"ticket_num_id": 1038,
"channel_id": "998877665544332211",
"category": "🤖 Support",
"user": { "id": "987654321098765432", "username": "Luna" },
"action": "ticket_priority:add",
"changes": { "priority": "high" },
"reason": null,
"updated_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}Возможные значения action
action | Meaning | changes contains |
|---|---|---|
ticket_claim:add | Сотрудник взял тикет | (empty) |
ticket_unclaim:add | Принятие тикета снято | (empty) |
ticket_priority:add | Приоритет изменён | priority |
ticket_rename:add | Канал был переименован | new_name |
ticket_remind:add | Было отправлено напоминание | (empty) |
ticket_feedback:add | Участник оценил тикет | star_count, feedback |
ticket_schedule_close:add | Было запланировано закрытие | duration, schedule_time |
ticket_request_close:add | Сотрудник попросил участника закрыть тикет | duration, request_duration_time |
ticket_request_close_accept:add | Участник согласился | (empty) |
ticket_request_close_deny:add | Участник отказался | (empty) |
ticket_close_cancel:add | Идёт закрытие было отменено | (empty) |
ticket_additional_access:add | Пользователь или роль были добавлены в тикет | entity_type, entity_id, reason |
ticket_additional_access:remove | Пользователь или роль были удалены | entity_type, entity_id, reason |
Считайте этот список открытым. По мере роста TicketWave добавляются новые действия, и они приходят как ticket.updated. Обрабатывайте только те действия, которые вам нужны, а остальные просто игнорируйте, вместо того чтобы падать на неизвестных значениях.
Ответ на шаг тикета не создаёт событие. Иначе тикет с большим количеством шагов засыпал бы ваш endpoint запросами, пока участник ещё заполняет форму.
message.sent
Отправляется для каждого сообщения человека внутри открытого тикета. Сообщения от ботов — включая сам TicketWave — пропускаются.
{
"event": "message.sent",
"timestamp": "2026-08-26T22:10:55.000Z",
"guild_id": "123456789012345678",
"data": {
"ticket_id": "ticket-1040",
"ticket_num_id": 1040,
"channel_id": "998877665544332211",
"message_id": "1234567890123456789",
"content": "Hello, how can I help you?",
"author": { "id": "112233445566778899", "username": "Staff_01" },
"is_staff": true,
"sent_at": "2026-08-26T22:10:55.000Z"
}
}| Field | Type | Description |
|---|---|---|
content | string | Сырой текст сообщения. Пусто для сообщений только с вложениями |
author | object | { id, username } отправителя |
is_staff | boolean | true, если у отправителя есть настроенная роль поддержки |
Это событие с самым большим объёмом с большим отрывом — на загруженном сервере оно создаёт по одному запросу на каждое сообщение. Подписывайтесь на него только если вам действительно нужны данные на уровне сообщений, и убедитесь, что ваш получатель отвечает быстро.
blacklist.added
Не привязано к тикету, поэтому в этом payload нет ticket_id.
{
"event": "blacklist.added",
"timestamp": "2026-08-26T18:33:47.000Z",
"guild_id": "123456789012345678",
"data": {
"user": { "id": "111223344556677889", "username": "BadActor" },
"reason": "Spam",
"added_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}blacklist.removed
{
"event": "blacklist.removed",
"timestamp": "2026-08-26T18:40:12.000Z",
"guild_id": "123456789012345678",
"data": {
"user": { "id": "111223344556677889", "username": "BadActor" },
"removed_by": { "id": "112233445566778899", "username": "Staff_01" }
}
}Test events
Кнопка Send test event отправляет реальный подписанный запрос, у которого data выглядит так:
{
"event": "ticket.created",
"timestamp": "2026-08-26T12:00:00.000Z",
"guild_id": "123456789012345678",
"data": { "test": true }
}event — это первый тип, на который подписан endpoint. Проверяйте data.test, если хотите пропускать тестовые доставки в production-логике.
Next Steps
- Example Server (Обработка этих payload в Express)
- Webhooks (Подпись, повторы и история доставки)
How is this guide?
