TicketWave Logo
Webhooks

Довідник подій

Кожен тип webhook-події та точний payload, який надсилає TicketWave.

Довідник подій

До кожної кінцевої точки можна підписати шість типів подій. Кожен запит використовує однакову оболонку — 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" }
  }
}

Тестові події

Кнопка 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?