TicketWave Logo
Webhooks

이벤트 참조

모든 웹훅 이벤트 유형과 TicketWave가 보내는 정확한 페이로드입니다.

이벤트 참조

엔드포인트당 최대 6개의 이벤트 유형을 구독할 수 있습니다. 모든 요청은 동일한 envelope — event, timestamp, guild_id, data — 를 사용하며, data 객체만 달라집니다.

EventFires when
ticket.created티켓이 열릴 때
ticket.closed티켓이 닫힐 때
ticket.updated열린 티켓에서 다른 어떤 내용이 변경될 때
message.sent멤버 또는 스태프가 티켓에 글을 쓸 때
blacklist.added멤버가 블랙리스트에 추가될 때
blacklist.removed블랙리스트 항목이 해제될 때

해결할 수 없는 필드는 생략되지 않고 null로 전송됩니다 — 따라서 키가 존재한다고 가정해도 됩니다. Discord가 사용자를 반환하지 않으면 usernamenull입니다.

공통 필드

모든 티켓 이벤트에는 다음 필드가 포함됩니다:

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로 도착합니다. 알지 못하는 값에서 오류를 내기보다, 관심 있는 작업만 분기 처리하고 나머지는 무시하세요.

티켓 단계에 답변한다고 해서 이벤트가 생성되지는 않습니다. 그렇지 않으면 여러 단계가 있는 티켓은 멤버가 양식을 작성하는 동안 엔드포인트에 요청을 너무 많이 보낼 수 있습니다.


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_staffboolean보낸 사람이 설정된 지원 역할을 가지고 있으면 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?