TicketWave Logo
Webhooks

Tham chiếu sự kiện

Mọi loại sự kiện webhook và payload chính xác mà TicketWave gửi.

Tham chiếu sự kiện

Có thể đăng ký sáu loại sự kiện cho mỗi endpoint. Mọi request đều dùng cùng một envelope — event, timestamp, guild_iddata — và chỉ đối tượng data là khác nhau.

Sự kiệnKích hoạt khi
ticket.createdMột ticket được mở
ticket.closedMột ticket được đóng
ticket.updatedBất cứ thứ gì khác thay đổi trên một ticket đang mở
message.sentThành viên hoặc staff viết trong ticket
blacklist.addedMột thành viên bị đưa vào blacklist
blacklist.removedMột mục blacklist được gỡ bỏ

Các trường không thể phân giải sẽ được gửi dưới dạng null thay vì bị bỏ qua — vì vậy bạn có thể tin rằng các key luôn tồn tại. usernamenull khi Discord không trả về người dùng.

Các trường dùng chung

Mọi sự kiện ticket đều có các trường sau:

TrườngKiểuMô tả
ticket_idstringID ticket dễ đọc theo mẫu của bạn, ví dụ ticket-1042
ticket_num_idnumberSố ticket tăng dần, ví dụ 1042
channel_idstringKênh Discord của ticket
categorystring | nullTên danh mục, null nếu ticket không có
userobject | nullChủ ticket dưới dạng { id, username }

ticket.created

Được gửi ngay sau khi kênh ticket tồn tại.

{
  "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"
  }
}

Sự kiện này được kích hoạt khi ticket được mở, tức là trước khi thành viên viết bất cứ điều gì. Nếu bạn cần tin nhắn đầu tiên, hãy lắng nghe thêm 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"
  }
}
TrườngKiểuMô tả
closed_byobjectAi đã đóng ticket. Các lần đóng tự động sẽ báo bot
reasonstring | nullLý do đóng, null nếu không có

ticket.updated

Sự kiện tổng quát cho các thay đổi trên một ticket đang mở. action cho bạn biết điều gì đã thay đổi, còn changes chứa chi tiết của hành động cụ thể đó.

{
  "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" }
  }
}

Các giá trị action có thể có

actionÝ nghĩachanges chứa
ticket_claim:addMột staff đã nhận ticket(trống)
ticket_unclaim:addViệc nhận ticket đã được hủy(trống)
ticket_priority:addĐộ ưu tiên đã thay đổipriority
ticket_rename:addKênh đã được đổi tênnew_name
ticket_remind:addMột lời nhắc đã được gửi(trống)
ticket_feedback:addThành viên đã đánh giá ticketstar_count, feedback
ticket_schedule_close:addMột lần đóng đã được lên lịchduration, schedule_time
ticket_request_close:addStaff đã yêu cầu thành viên đóng ticketduration, request_duration_time
ticket_request_close_accept:addThành viên đã chấp nhận(trống)
ticket_request_close_deny:addThành viên đã từ chối(trống)
ticket_close_cancel:addMột lần đóng đang diễn ra đã bị hủy(trống)
ticket_additional_access:addMột người dùng hoặc vai trò đã được thêm vào ticketentity_type, entity_id, reason
ticket_additional_access:removeMột người dùng hoặc vai trò đã bị xóaentity_type, entity_id, reason

Hãy xem danh sách này là mở rộng. Các hành động mới sẽ được thêm khi TicketWave phát triển, và chúng sẽ xuất hiện dưới dạng ticket.updated. Hãy xử lý những action bạn quan tâm và bỏ qua phần còn lại thay vì ném lỗi với các giá trị không xác định.

Trả lời một bước của ticket sẽ không tạo ra sự kiện. Nếu không, một ticket có nhiều bước sẽ làm endpoint của bạn bị spam trong khi thành viên vẫn đang điền form.


message.sent

Được gửi cho mọi tin nhắn của người thật bên trong một ticket đang mở. Tin nhắn từ bot — bao gồm cả TicketWave — sẽ bị bỏ qua.

{
  "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"
  }
}
TrườngKiểuMô tả
contentstringNội dung thô của tin nhắn. Để trống với tin nhắn chỉ có tệp đính kèm
authorobject{ id, username } của người gửi
is_staffbooleantrue nếu người gửi có vai trò hỗ trợ đã được cấu hình

Đây là sự kiện có tần suất cao nhất rất nhiều — một máy chủ bận rộn sẽ tạo ra một request cho mỗi tin nhắn. Chỉ đăng ký nếu bạn thực sự cần dữ liệu ở mức tin nhắn, và hãy đảm bảo bên nhận phản hồi thật nhanh.


blacklist.added

Không gắn với ticket, nên payload này không có 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" }
  }
}

Sự kiện kiểm thử

Nút Send test event sẽ gửi một request thật, đã được ký, với data chỉ là:

{
  "event": "ticket.created",
  "timestamp": "2026-08-26T12:00:00.000Z",
  "guild_id": "123456789012345678",
  "data": { "test": true }
}

event là loại đầu tiên mà endpoint đã đăng ký. Hãy kiểm tra data.test nếu bạn muốn bỏ qua các lần gửi thử trong logic production.

Các bước tiếp theo

How is this guide?