Webhook do Discord
Redirecione eventos do Zenovay para um canal do Discord — útil para salas de equipe de engenharia ou salas de guerra de crescimento da comunidade.
Os webhooks do Discord têm escopo por canal. Não é necessário bot Discord nem OAuth.
Webhooks de saída são um recurso Pro+. Faça upgrade do seu plano para habilitá-los.
1. Criar o webhook do Discord
- No Discord, abra o canal que deve receber os alertas do Zenovay.
- Clique no ícone de engrenagem (Editar canal) → Integrações → Webhooks → Novo Webhook.
- Dê um nome ("Zenovay Alerts") e um avatar, se desejar.
- Clique em Copiar URL do Webhook — ela terá o formato
https://discord.com/api/webhooks/123456789012345678/XXXXXXXX....
2. Adicionar o webhook no Zenovay
- Em
app.zenovay.com, acesse Settings → Webhooks. - Escolha o site para o qual deseja receber notificações.
- Clique em Add webhook.
- Preencha:
- Name:
Discord #ops(ou qualquer nome significativo) - URL: cole a URL do webhook do Discord do Passo 1
- Events: escolha os eventos que deseja monitorar
- Name:
- Clique em Create webhook.
- Clique no ícone de Send test event (ícone de avião de papel) — em cerca de 5 segundos, uma mensagem deverá aparecer no seu canal do Discord.
O Discord aceita JSON arbitrário, mas renderizará o payload bruto como texto simples. Para mensagens formatadas, veja o Passo 3.
3. (Opcional) Formatar com embeds do Discord
O Discord suporta embeds ricos com cores, campos e timestamps. O Zenovay envia um evento JSON genérico — para renderizá-lo como um embed, execute um pequeno relay:
// Cloudflare Workers / Node / Vercel — qualquer lugar que execute JS
export default {
async fetch(req) {
const event = await req.json();
const colour = event.event_type === 'website_down' ? 0xdc2626
: event.event_type === 'traffic_spike' ? 0x10b981
: 0x3b82f6;
const discordPayload = {
embeds: [{
title: `Zenovay: ${event.event_type}`,
description: `Event for site ${event.website_id}`,
color: colour,
fields: [
{ name: 'Event type', value: event.event_type, inline: true },
{ name: 'Time', value: event.timestamp, inline: true },
],
footer: { text: 'Zenovay Analytics' },
}],
};
await fetch(DISCORD_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(discordPayload),
});
return new Response('ok');
},
};
Aponte a URL do webhook do Zenovay para este relay em vez do Discord diretamente.
4. Verificar a assinatura do Zenovay
Para relays em produção, verifique a assinatura HMAC-SHA256 para garantir que apenas eventos genuínos do Zenovay cheguem ao Discord:
import { createHmac } from 'crypto';
const signature = req.headers.get('x-zenovay-signature'); // 'sha256=<hex>'
const provided = signature.replace(/^sha256=/, '');
const expected = createHmac('sha256', YOUR_WEBHOOK_SECRET)
.update(rawBody)
.digest('hex');
if (provided !== expected) {
return new Response('invalid signature', { status: 401 });
}
Seu segredo do webhook é exibido em Settings → Webhooks → clique no ícone de olho no cartão do webhook.
Solução de problemas
- Discord rejeita com HTTP 400: o receptor de webhook do Discord é rigoroso — payloads com chaves de nível superior desconhecidas podem retornar 400. Use o relay do Passo 3 para reformatar.
- Limites de taxa: os webhooks do Discord têm limite de taxa por canal (~30 mensagens por minuto). Para tipos de eventos muito frequentes como
traffic_spike, agrupe-os no seu relay ou filtre do lado do Zenovay. - O evento de teste chega, mas os eventos reais não: confirme que os tipos de eventos corretos estão selecionados na configuração do webhook do Zenovay. O evento de teste usa
event_type: 'test'independentemente do que estiver selecionado.