TicketWave Logo
Webhooks

Référence des événements

Chaque type d’événement webhook et le payload exact envoyé par TicketWave.

Référence des événements

Six types d’événements peuvent être abonnés par point de terminaison. Chaque requête utilise le même enveloppe — event, timestamp, guild_id et data — et seul l’objet data diffère.

EventFires when
ticket.createdUn ticket est ouvert
ticket.closedUn ticket est fermé
ticket.updatedQuelque chose change sur un ticket ouvert
message.sentUn membre ou un membre du staff écrit dans un ticket
blacklist.addedUn membre est mis sur liste noire
blacklist.removedUne entrée de liste noire est levée

Les champs qui ne peuvent pas être résolus sont envoyés comme null plutôt que d’être omis — vous pouvez donc compter sur l’existence des clés. Un username vaut null lorsque Discord n’a pas renvoyé l’utilisateur.

Shared fields

Chaque événement de ticket contient ces champs :

FieldTypeDescription
ticket_idstringL’identifiant lisible du ticket selon votre modèle, par ex. ticket-1042
ticket_num_idnumberLe numéro séquentiel du ticket, par ex. 1042
channel_idstringLe salon Discord du ticket
categorystring | nullNom de la catégorie, null si le ticket n’en a pas
userobject | nullLe propriétaire du ticket sous la forme { id, username }

ticket.created

Envoyé juste après la création du salon du ticket.

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

Cet événement se déclenche lorsque le ticket est ouvert, donc avant que le membre n’ait écrit quoi que ce soit. Si vous avez besoin du premier message, écoutez aussi 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_byobjectQui l’a fermé. Les fermetures automatiques indiquent le bot
reasonstring | nullLa raison de la fermeture, null si aucune n’a été fournie

ticket.updated

Le fourre-tout pour les changements sur un ticket ouvert. action vous indique ce qui a changé, changes contient les détails de cette action précise.

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

Possible action values

actionMeaningchanges contains
ticket_claim:addUn membre du staff a pris le ticket en charge(empty)
ticket_unclaim:addLa prise en charge a été retirée(empty)
ticket_priority:addLa priorité a changépriority
ticket_rename:addLe salon a été renomménew_name
ticket_remind:addUn rappel a été envoyé(empty)
ticket_feedback:addLe membre a évalué le ticketstar_count, feedback
ticket_schedule_close:addUne fermeture a été programméeduration, schedule_time
ticket_request_close:addLe staff a demandé au membre de fermerduration, request_duration_time
ticket_request_close_accept:addLe membre a accepté(empty)
ticket_request_close_deny:addLe membre a refusé(empty)
ticket_close_cancel:addUne fermeture en cours a été annulée(empty)
ticket_additional_access:addUn utilisateur ou un rôle a été ajouté au ticketentity_type, entity_id, reason
ticket_additional_access:removeUn utilisateur ou un rôle a été retiréentity_type, entity_id, reason

Considérez cette liste comme ouverte. De nouvelles actions sont ajoutées au fur et à mesure que TicketWave évolue, et elles arrivent via ticket.updated. Faites un switch sur les actions qui vous intéressent et ignorez le reste au lieu de lever une erreur sur des valeurs inconnues.

Répondre à une étape de ticket ne produit pas d’événement. Un ticket avec de nombreuses étapes inonderait sinon votre point de terminaison pendant que le membre remplit encore le formulaire.


message.sent

Envoyé pour chaque message humain à l’intérieur d’un ticket ouvert. Les messages des bots — y compris TicketWave lui-même — sont ignorés.

{
  "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
contentstringLe texte brut du message. Vide pour les messages contenant uniquement une pièce jointe
authorobject{ id, username } de l’expéditeur
is_staffbooleantrue si l’expéditeur possède un rôle de support configuré

C’est de loin l’événement au plus grand volume — un serveur actif génère une requête par message. Abonnez-vous-y uniquement si vous avez réellement besoin de données au niveau du message, et assurez-vous que votre récepteur répond rapidement.


blacklist.added

Non lié à un ticket, donc ce payload n’a pas de 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" }
  }
}

Test events

Le bouton Send test event envoie une requête réelle et signée dont data est simplement :

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

event correspond au premier type auquel le point de terminaison est abonné. Vérifiez data.test si vous souhaitez ignorer les envois de test dans la logique de production.

Next Steps

How is this guide?