TicketWave Logo
Webhooks

イベントリファレンス

すべての webhook イベントタイプと、TicketWave が送信する正確なペイロード。

イベントリファレンス

各エンドポイントごとに、6種類のイベントを購読できます。すべてのリクエストは同じエンベロープ — eventtimestampguild_iddata — を使用し、異なるのは 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

これは圧倒的に 最も件数の多い イベントです。忙しいサーバーではメッセージごとに 1 件のリクエストが発生します。本当にメッセージ単位のデータが必要な場合にのみ購読し、受信側はすばやく応答するようにしてください。


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

テストイベント

Send test event ボタンは、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?