TicketWave Logo
Webhooks

Справочник событий

Каждый тип webhook-события и точный payload, который отправляет TicketWave.

Справочник событий

На каждый endpoint можно подписаться на шесть типов событий. Каждый запрос использует один и тот же envelope — event, timestamp, guild_id и data — и отличается только объект data.

EventFires when
ticket.createdТикет открыт
ticket.closedТикет закрыт
ticket.updatedЧто-то ещё изменилось в открытом тикете
message.sentУчастник или сотрудник пишет в тикете
blacklist.addedУчастник добавлен в чёрный список
blacklist.removedЗапись в чёрном списке снята

Поля, которые не удаётся определить, отправляются как null, а не опускаются — так что вы можете рассчитывать на наличие ключей. username равен null, когда Discord не вернул пользователя.

Общие поля

Каждое событие тикета содержит эти поля:

FieldTypeDescription
ticket_idstringЧитаемый id тикета из вашего шаблона, например ticket-1042
ticket_num_idnumberПорядковый номер тикета, например 1042
channel_idstringКанал Discord, в котором находится тикет
categorystring | nullНазвание категории, null, если у тикета её нет
userobject | 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"
  }
}
FieldTypeDescription
closed_byobjectКто закрыл тикет. При автоматическом закрытии указывается бот
reasonstring | 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

actionMeaningchanges 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"
  }
}
FieldTypeDescription
contentstringСырой текст сообщения. Пусто для сообщений только с вложениями
authorobject{ id, username } отправителя
is_staffbooleantrue, если у отправителя есть настроенная роль поддержки

Это событие с самым большим объёмом с большим отрывом — на загруженном сервере оно создаёт по одному запросу на каждое сообщение. Подписывайтесь на него только если вам действительно нужны данные на уровне сообщений, и убедитесь, что ваш получатель отвечает быстро.


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?