Referência de Eventos
Todos os tipos de evento de webhook e o payload exato que o TicketWave envia.
Referência de Eventos
É possível assinar seis tipos de evento por endpoint. Toda requisição usa o mesmo envelope — event, timestamp, guild_id e data — e apenas o objeto data muda.
| Event | Fires when |
|---|---|
ticket.created | Um ticket é aberto |
ticket.closed | Um ticket é fechado |
ticket.updated | Qualquer outra coisa muda em um ticket aberto |
message.sent | Um membro ou a equipe escreve em um ticket |
blacklist.added | Um membro é colocado na blacklist |
blacklist.removed | Uma entrada da blacklist é removida |
Campos que não podem ser resolvidos são enviados como null em vez de serem omitidos — assim, você pode confiar que as chaves existirão. Um username é null quando o Discord não retornou o usuário.
Shared fields
Todo evento de ticket carrega estes campos:
| Field | Type | Description |
|---|---|---|
ticket_id | string | O id legível do ticket, seguindo o seu padrão, por exemplo ticket-1042 |
ticket_num_id | number | O número sequencial do ticket, por exemplo 1042 |
channel_id | string | O canal do Discord do ticket |
category | string | null | Nome da categoria, null se o ticket não tiver nenhuma |
user | object | null | O dono do ticket como { id, username } |
ticket.created
Enviado logo depois que o canal do ticket existe.
{
"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"
}
}Isso é disparado quando o ticket é aberto, ou seja, antes de o membro ter escrito qualquer coisa. Se você precisar da primeira mensagem, ouça també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"
}
}| Field | Type | Description |
|---|---|---|
closed_by | object | Quem fechou. Fechamentos automáticos informam o bot |
reason | string | null | O motivo do fechamento, null se nenhum tiver sido informado |
ticket.updated
O evento genérico para mudanças em um ticket aberto. action informa o que mudou, e changes traz os detalhes daquela ação específica.
{
"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 | Um membro da equipe reivindicou o ticket | (empty) |
ticket_unclaim:add | A reivindicação foi removida | (empty) |
ticket_priority:add | A prioridade mudou | priority |
ticket_rename:add | O canal foi renomeado | new_name |
ticket_remind:add | Um lembrete foi enviado | (empty) |
ticket_feedback:add | O membro avaliou o ticket | star_count, feedback |
ticket_schedule_close:add | Um fechamento foi agendado | duration, schedule_time |
ticket_request_close:add | A equipe pediu para o membro fechar | duration, request_duration_time |
ticket_request_close_accept:add | O membro aceitou | (empty) |
ticket_request_close_deny:add | O membro recusou | (empty) |
ticket_close_cancel:add | Um fechamento em andamento foi cancelado | (empty) |
ticket_additional_access:add | Um usuário ou cargo foi adicionado ao ticket | entity_type, entity_id, reason |
ticket_additional_access:remove | Um usuário ou cargo foi removido | entity_type, entity_id, reason |
Trate esta lista como aberta. Novas ações são adicionadas conforme o TicketWave cresce, e elas chegam como ticket.updated. Faça um switch apenas nas ações que importam para você e ignore o restante em vez de lançar erro para valores desconhecidos.
Responder a uma etapa do ticket não produz um evento. Caso contrário, um ticket com muitas etapas inundaria seu endpoint enquanto o membro ainda estivesse preenchendo o formulário.
message.sent
Enviado para cada mensagem humana dentro de um ticket aberto. Mensagens de bots — incluindo o próprio TicketWave — são ignoradas.
{
"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 | O texto bruto da mensagem. Vazio em mensagens que contêm apenas anexos |
author | object | { id, username } de quem enviou |
is_staff | boolean | true se quem enviou tiver uma função de suporte configurada |
Este é, de longe, o evento de maior volume — em um servidor movimentado, ele gera uma requisição por mensagem. Assine-o apenas se você realmente precisar de dados por mensagem e certifique-se de que seu receptor responda rapidamente.
blacklist.added
Não está ligado a um ticket, então este payload não tem 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
O botão Send test event envia uma requisição real e assinada, cujo data é apenas:
{
"event": "ticket.created",
"timestamp": "2026-08-26T12:00:00.000Z",
"guild_id": "123456789012345678",
"data": { "test": true }
}O event é o primeiro tipo ao qual o endpoint está inscrito. Verifique data.test se quiser ignorar envios de teste na lógica de produção.
Next Steps
- Example Server (Lidar com esses payloads no Express)
- Webhooks (Assinatura, tentativas de reenvio e histórico de entregas)
How is this guide?
