← Guides

Configurar Webhooks

Receba notificações HTTP em tempo real quando eventos ocorrem no CRM — sem necessidade de polling.

Pré-requisitos

  • Um usuário administrador no CRM: os webhooks são criados na tela do CRM, não pela API com Service Account
  • Um endpoint HTTPS publicamente acessível para receber eventos

Passo 1: Escolha os eventos

Os eventos estão listados em Eventos disponíveis. Com o token de um Service Account você também consulta a lista que a sua conta aceita:

cURL
curl https://minha-empresa.platform-api.magnetcustomer.com/api/webhooks/triggers \
  -H "Authorization: Bearer YOUR_TOKEN"
Response 200
[
  {
    "_id": "Oportunidades",
    "triggers": [
      { "key": "deal.created", "label": "Oportunidade criada", "group": "deal", "groupName": "Oportunidades" },
      { "key": "deal.won", "label": "Oportunidade ganha", "group": "deal", "groupName": "Oportunidades" }
    ]
  }
]

Passo 2: Crie o webhook no CRM

  1. Como administrador, abra Integrações › Webhooks e crie um novo webhook.
  2. Informe um título, a URL do seu endpoint e os eventos que ele deve receber.
  3. Escolha a autenticação HMAC e defina um secret. O seu endpoint usa o mesmo secret para validar cada entrega.

Passo 3: Validar assinatura HMAC

Cada entrega de webhook inclui um header X-Webhook-Signature. Sempre verifique para evitar spoofing:

Express.js
import crypto from 'crypto';

function verifyWebhookSignature(
  payload: string,
  signature: string,
  secret: string
): boolean {
  const expected = `sha256=${crypto
    .createHmac('sha256', secret)
    .update(payload, 'utf8')
    .digest('hex')}`;

  const sigBuffer = Buffer.from(signature ?? '', 'utf8');
  const expBuffer = Buffer.from(expected, 'utf8');

  if (sigBuffer.length !== expBuffer.length) return false;

  return crypto.timingSafeEqual(sigBuffer, expBuffer);
}

app.post('/webhooks/crm', express.raw({ type: 'application/json' }), (req, res) => {
  const sig = req.headers['x-webhook-signature'] as string;
  const valid = verifyWebhookSignature(req.body.toString(), sig, process.env.WEBHOOK_SECRET!);

  if (!valid) return res.status(401).json({ error: 'Invalid signature' });

  const event = JSON.parse(req.body.toString());
  console.log('Event received:', event.event);

  res.json({ received: true });
});

Passo 4: Confirme rápido

Responda com um status 2xx assim que a assinatura for válida e faça o trabalho pesado depois. Entregas que falham ou estouram o tempo são reenviadas: veja a política de reenvio. O conteúdo de data depende do evento: registre o corpo das primeiras entregas enquanto monta a integração.