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.
| Event | Fires when |
|---|---|
ticket.created | Un ticket est ouvert |
ticket.closed | Un ticket est fermé |
ticket.updated | Quelque chose change sur un ticket ouvert |
message.sent | Un membre ou un membre du staff écrit dans un ticket |
blacklist.added | Un membre est mis sur liste noire |
blacklist.removed | Une 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 :
| Field | Type | Description |
|---|---|---|
ticket_id | string | L’identifiant lisible du ticket selon votre modèle, par ex. ticket-1042 |
ticket_num_id | number | Le numéro séquentiel du ticket, par ex. 1042 |
channel_id | string | Le salon Discord du ticket |
category | string | null | Nom de la catégorie, null si le ticket n’en a pas |
user | object | null | Le 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"
}
}| Field | Type | Description |
|---|---|---|
closed_by | object | Qui l’a fermé. Les fermetures automatiques indiquent le bot |
reason | string | null | La 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
action | Meaning | changes contains |
|---|---|---|
ticket_claim:add | Un membre du staff a pris le ticket en charge | (empty) |
ticket_unclaim:add | La prise en charge a été retirée | (empty) |
ticket_priority:add | La priorité a changé | priority |
ticket_rename:add | Le salon a été renommé | new_name |
ticket_remind:add | Un rappel a été envoyé | (empty) |
ticket_feedback:add | Le membre a évalué le ticket | star_count, feedback |
ticket_schedule_close:add | Une fermeture a été programmée | duration, schedule_time |
ticket_request_close:add | Le staff a demandé au membre de fermer | duration, request_duration_time |
ticket_request_close_accept:add | Le membre a accepté | (empty) |
ticket_request_close_deny:add | Le membre a refusé | (empty) |
ticket_close_cancel:add | Une fermeture en cours a été annulée | (empty) |
ticket_additional_access:add | Un utilisateur ou un rôle a été ajouté au ticket | entity_type, entity_id, reason |
ticket_additional_access:remove | Un 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"
}
}| Field | Type | Description |
|---|---|---|
content | string | Le texte brut du message. Vide pour les messages contenant uniquement une pièce jointe |
author | object | { id, username } de l’expéditeur |
is_staff | boolean | true 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
- Example Server (Gérez ces payloads dans Express)
- Webhooks (Signature, retries et historique de livraison)
How is this guide?
