Довідник подій
Кожен тип webhook-події та точний payload, який надсилає TicketWave.
Довідник подій
До кожної кінцевої точки можна підписати шість типів подій. Кожен запит використовує однакову оболонку — 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" }
}
}Тестові події
Кнопка Send test event надсилає справжній підписаний запит, у якого data має такий вигляд:
{
"event": "ticket.created",
"timestamp": "2026-08-26T12:00:00.000Z",
"guild_id": "123456789012345678",
"data": { "test": true }
}event — це перший тип, на який підписано endpoint. Перевіряйте data.test, якщо хочете пропускати тестові доставки в продакшн-логіці.
Наступні кроки
- Example Server (Обробка цих payload у Express)
- Webhooks (Підписування, повторні спроби та історія доставки)
How is this guide?
