TicketWave Logo
Webhooks

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.

EventFires when
ticket.createdUm ticket é aberto
ticket.closedUm ticket é fechado
ticket.updatedQualquer outra coisa muda em um ticket aberto
message.sentUm membro ou a equipe escreve em um ticket
blacklist.addedUm membro é colocado na blacklist
blacklist.removedUma 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:

FieldTypeDescription
ticket_idstringO id legível do ticket, seguindo o seu padrão, por exemplo ticket-1042
ticket_num_idnumberO número sequencial do ticket, por exemplo 1042
channel_idstringO canal do Discord do ticket
categorystring | nullNome da categoria, null se o ticket não tiver nenhuma
userobject | nullO 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"
  }
}
FieldTypeDescription
closed_byobjectQuem fechou. Fechamentos automáticos informam o bot
reasonstring | nullO 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

actionMeaningchanges contains
ticket_claim:addUm membro da equipe reivindicou o ticket(empty)
ticket_unclaim:addA reivindicação foi removida(empty)
ticket_priority:addA prioridade mudoupriority
ticket_rename:addO canal foi renomeadonew_name
ticket_remind:addUm lembrete foi enviado(empty)
ticket_feedback:addO membro avaliou o ticketstar_count, feedback
ticket_schedule_close:addUm fechamento foi agendadoduration, schedule_time
ticket_request_close:addA equipe pediu para o membro fecharduration, request_duration_time
ticket_request_close_accept:addO membro aceitou(empty)
ticket_request_close_deny:addO membro recusou(empty)
ticket_close_cancel:addUm fechamento em andamento foi cancelado(empty)
ticket_additional_access:addUm usuário ou cargo foi adicionado ao ticketentity_type, entity_id, reason
ticket_additional_access:removeUm usuário ou cargo foi removidoentity_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"
  }
}
FieldTypeDescription
contentstringO texto bruto da mensagem. Vazio em mensagens que contêm apenas anexos
authorobject{ id, username } de quem enviou
is_staffbooleantrue 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?