이벤트 참조
모든 웹훅 이벤트 유형과 TicketWave가 보내는 정확한 페이로드입니다.
이벤트 참조
엔드포인트당 최대 6개의 이벤트 유형을 구독할 수 있습니다. 모든 요청은 동일한 envelope — event, timestamp, guild_id, data — 를 사용하며, data 객체만 달라집니다.
| Event | Fires when |
|---|---|
ticket.created | 티켓이 열릴 때 |
ticket.closed | 티켓이 닫힐 때 |
ticket.updated | 열린 티켓에서 다른 어떤 내용이 변경될 때 |
message.sent | 멤버 또는 스태프가 티켓에 글을 쓸 때 |
blacklist.added | 멤버가 블랙리스트에 추가될 때 |
blacklist.removed | 블랙리스트 항목이 해제될 때 |
해결할 수 없는 필드는 생략되지 않고 null로 전송됩니다 — 따라서 키가 존재한다고 가정해도 됩니다. Discord가 사용자를 반환하지 않으면 username은 null입니다.
공통 필드
모든 티켓 이벤트에는 다음 필드가 포함됩니다:
| 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로 도착합니다. 알지 못하는 값에서 오류를 내기보다, 관심 있는 작업만 분기 처리하고 나머지는 무시하세요.
티켓 단계에 답변한다고 해서 이벤트가 생성되지는 않습니다. 그렇지 않으면 여러 단계가 있는 티켓은 멤버가 양식을 작성하는 동안 엔드포인트에 요청을 너무 많이 보낼 수 있습니다.
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
티켓과 연결되지 않으므로 이 페이로드에는 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" }
}
}테스트 이벤트
테스트 이벤트 보내기 버튼은 data가 다음과 같은 실제 서명된 요청을 전송합니다:
{
"event": "ticket.created",
"timestamp": "2026-08-26T12:00:00.000Z",
"guild_id": "123456789012345678",
"data": { "test": true }
}event는 엔드포인트가 구독한 첫 번째 유형입니다. 운영 로직에서 테스트 전송을 건너뛰고 싶다면 data.test를 확인하세요.
다음 단계
- Example Server (Express에서 이 페이로드를 처리하기)
- Webhooks (서명, 재시도 및 전송 기록)
How is this guide?
