TicketWave Logo
Webhooks

Visão geral

Receba eventos do TicketWave como solicitações HTTP assinadas na sua própria aplicação.

Webhooks

Um webhook é uma solicitação HTTP que o TicketWave envia para você. Sempre que algo acontece no seu servidor — um ticket é aberto, um membro é colocado na blacklist — o TicketWave faz um POST de um corpo JSON para uma URL sua.

Essa é a diferença em relação aos Canais de Log: canais de log escrevem um embed no Discord para humanos lerem, enquanto os webhooks entregam o evento bruto ao seu código.

Webhooks são um recurso premium. Sem premium, endpoints não podem ser criados e nenhum evento é entregue.

Criar um Endpoint

Abra a página de endpoints

Painel do servidor → WebhooksEndpoints.

Adicione um endpoint

Clique em Add Endpoint e preencha dois campos:

FieldDescription
Endpoint URLA URL https:// que recebe as solicitações
Event TypesQuais eventos este endpoint deve receber

Um endpoint só recebe os tipos que você marcar. Não é permitido selecionar nenhum — escolha pelo menos um.

Copie o segredo de assinatura

O TicketWave gera um segredo de assinatura (whsec_…) no momento em que o endpoint é criado. Abra a lista de endpoints, revele-o com o ícone de olho e copie-o para a configuração da sua aplicação.

Trate o segredo como uma senha. Quem o tiver pode forjar solicitações que passam na verificação da assinatura. Guarde-o em uma variável de ambiente, nunca no seu repositório.

Envie um evento de teste

Use o botão Send test event (o avião de papel) na linha do endpoint. Ele entrega uma solicitação real, totalmente assinada, com "test": true no payload, para que você possa confirmar que o seu receptor funciona antes que um ticket real dependa disso.

O resultado aparece no histórico de Webhooks como qualquer outra entrega.

Requisitos do Endpoint

RequirementDetail
SchemeApenas https://http:// é rejeitado
HostDeve ser resolvível publicamente. Endereços privados, loopback, link-local e CGNAT são recusados
ResponseQualquer status 2xx conta como sucesso
TimeoutVocê tem 10 segundos para responder
RedirectsNão são seguidos. Um 3xx conta como falha
LimitAté 5 endpoints por servidor

A verificação do host acontece tanto quando você salva o endpoint quanto antes de cada entrega, então um domínio que depois passe a resolver para um endereço interno deixa de receber entregas.

A Solicitação

Toda entrega é um POST com um corpo JSON.

Headers

HeaderExampleMeaning
Content-Typeapplication/jsonSempre JSON
User-AgentTicketWave-Webhooks/1.0.5A versão do bot que o enviou
X-TicketWave-Eventticket.createdO tipo do evento
X-TicketWave-Deliverywh_3f2a…Id único desta entrega
X-TicketWave-Timestamp1786224191Segundos Unix, parte da assinatura
X-TicketWave-Signaturesha256=9f86d0…HMAC da solicitação

Body

Todo payload usa o mesmo envelope. Apenas data muda conforme o tipo de evento:

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

Veja a Referência de Eventos para o objeto data de cada tipo.

Verificando a Assinatura

Qualquer pessoa que descubra a URL do seu endpoint pode enviar uma solicitação POST para ele. A assinatura é como você distingue uma entrega real do TicketWave de uma forjada.

Verifique sempre. Um endpoint não verificado que cria ou encerra coisas no seu sistema é uma porta aberta.

Como a assinatura é construída

O TicketWave junta o timestamp e o corpo bruto da solicitação com um ponto, e executa HMAC-SHA256 sobre o resultado usando o segredo do seu endpoint:

signed_payload = X-TicketWave-Timestamp + "." + raw_request_body
signature      = HMAC_SHA256(signed_payload, your_endpoint_secret)

O header carrega esse digest em hexadecimal e com prefixo: sha256=<digest>.

O que o seu receptor deve fazer

Leia o corpo bruto. Verifique contra os bytes exatos que você recebeu. Se o seu framework analisar o JSON primeiro e você o reserializar, a ordem das chaves ou os espaços podem mudar e o digest não vai bater.

Recalcule o HMAC sobre timestamp + "." + rawBody com o seu segredo.

Compare em tempo constante (crypto.timingSafeEqual no Node). Um === simples vaza informação de tempo.

Verifique se o timestamp é recente — cinco minutos de tolerância é um bom padrão. O timestamp está dentro do payload assinado, então um atacante não pode reenviar uma solicitação antiga com um timestamp novo.

Uma implementação completa está na página Example Server.

Retries

Uma entrega que falha é reenviada automaticamente.

Attempts3 (a primeira tentativa mais 2 retries)
Backoff1 segundo, depois 5 segundos
Retried onErros de rede, timeouts, 408, 429 e qualquer 5xx
Not retried onQualquer outro 4xx — isso significa que o seu endpoint rejeitou a solicitação de propósito

Por causa dos retries, o seu endpoint pode receber o mesmo evento duas vezes. Use X-TicketWave-Delivery como chave de idempotência: lembre-se dos ids que você já processou e ignore repetições.

As entregas não têm ordem. Se dois tickets forem criados ao mesmo tempo, as solicitações podem chegar em qualquer ordem — use o campo timestamp no corpo se a ordem importar para você.

Histórico de Entregas

A página Webhooks do painel lista todas as entregas com seu status, código de resposta, duração e número de tentativas. Abra uma linha para ver o payload exato da solicitação enviada e a resposta que o seu servidor retornou.

Entregas com falha podem ser reenviadas na página de detalhes com Retry Webhook. Isso envia o payload original novamente para o mesmo endpoint e registra uma nova entrega.

O histórico é mantido por 30 dias e depois é limpo automaticamente.

Solução de Problemas

ProblemFix
O endpoint não pode ser salvoA URL precisa ser https:// e resolver para um endereço público
Tudo aparece como falha sem código de respostaA solicitação nunca chegou até você — timeout, falha de DNS ou conexão recusada
A assinatura nunca bateVocê está fazendo hash do corpo analisado em vez dos bytes brutos, ou esqueceu o prefixo timestamp + "."
As entregas param depois de um tempoVerifique se o seu host começou a retornar 4xx — esses não são reenviados
Um evento nunca chegaO endpoint não está inscrito nesse tipo, ou o servidor perdeu o premium
Eventos duplicadosEsperado em retries — faça deduplicação com base em X-TicketWave-Delivery

Próximos Passos

How is this guide?