Webhooks
Receba notificações em tempo real quando eventos importantes acontecem no sistema. Webhooks são chamadas HTTP POST enviadas para sua URL quando leads são criados, atualizados ou quando tags são alteradas.
O que são Webhooks?
Em vez de você ficar consultando a API para saber se algo mudou (polling), nós enviamos uma notificação para você quando algo acontece.
❌ Sem Webhooks (Polling)
Você fica perguntando: "Tem lead novo? Tem lead novo?" a cada X segundos.
✅ Com Webhooks
Nós avisamos: "Olha, acabou de chegar um lead novo!" quando acontece.
Como Configurar
Acesse as configurações do integrador
No dashboard, navegue até Configurações → Integradores → [Seu Integrador].

Configure a URL do webhook
Informe a URL do seu servidor que receberá as notificações e selecione os eventos desejados.

Salve e copie o Secret
Ao salvar, um webhook secret será gerado. Use-o para validar as requisições.

Atenção
Eventos Disponíveis
Selecione apenas os eventos que você precisa para evitar processamento desnecessário.
🔗Magic Link (7 eventos)
MAGIC_LINK_CREATEDMagic link criadoMAGIC_LINK_SENTMagic link enviadoMAGIC_LINK_OPENEDMagic link abertoMAGIC_LINK_CLICKEDLink clicadoMAGIC_LINK_FORM_STARTEDFormulário iniciadoMAGIC_LINK_FORM_COMPLETEDFormulário preenchidoMAGIC_LINK_EXPIREDMagic link expirado👤Lead (9 eventos)
LEAD_CREATEDLead criadoLEAD_UPDATEDLead atualizadoLEAD_DELETEDLead excluídoLEAD_STATUS_CHANGEDStatus alteradoLEAD_ASSIGNEDAtribuído a usuárioLEAD_UNASSIGNEDDesatribuídoLEAD_TAG_ADDEDTag adicionadaLEAD_TAG_REMOVEDTag removidaLEAD_CONVERTEDConvertido em cliente📇Contact (6 eventos)
CONTACT_CREATEDContato criadoCONTACT_UPDATEDContato atualizadoCONTACT_DELETEDContato excluídoCONTACT_MERGEDContatos mescladosCONTACT_EMAIL_CHANGEDEmail alteradoCONTACT_PHONE_CHANGEDTelefone alteradoEstrutura do Payload
Todo webhook enviado possui a seguinte estrutura:
{
"event": "LEAD_CREATED",
"timestamp": "2024-01-15T10:30:00.000Z",
"webhookId": "wh_abc123",
"clientId": "client_xyz",
"data": {
// Dados específicos do evento
"lead": {
"id": "lead_123",
"externalId": "seu_id_123",
"status": "open",
"contact": {
"name": "João Silva",
"email": "joao@email.com"
},
"tags": ["interessado"]
}
}
}Headers da Requisição
| Campo | Tipo | Descricao |
|---|---|---|
Content-Type | string | Sempre application/json |
X-Webhook-Id | string | ID único do webhook |
X-Webhook-Event | string | Nome do evento (ex: LEAD_CREATED) |
X-Webhook-Timestamp | string | Timestamp ISO do envio |
X-Webhook-Signature | string | Assinatura HMAC-SHA256 para validação |
Validação de Assinatura
Sempre valide a assinatura para garantir que o webhook veio do ADS-Tools. A assinatura é calculada como HMAC-SHA256(payload, secret).
Exemplos de Validação
const crypto = require('crypto');
function validateWebhook(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(payload))
.digest('hex');
return signature === expectedSignature;
}
// Uso
const isValid = validateWebhook(
req.body,
req.headers['x-webhook-signature'],
process.env.WEBHOOK_SECRET
);Importante
Política de Retry
Se sua URL retornar erro (status ≥ 400 ou timeout), tentaremos novamente:
- 1ª tentativa: Imediatamente
- 2ª tentativa: Após 1 minuto
- 3ª tentativa: Após 5 minutos
- 4ª tentativa: Após 30 minutos
- 5ª tentativa: Após 2 horas
Após 5 tentativas falhas, o webhook é marcado como falho e requer reenvio manual.
Boas Práticas
Exemplo de Endpoint
Exemplo de endpoint que recebe webhooks com validação de assinatura:
// Express.js example
app.post('/webhooks/ads-tools', express.json(), async (req, res) => {
// 1. Validar assinatura
const signature = req.headers['x-webhook-signature'];
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(payload)
.digest('hex');
if (signature !== expectedSignature) {
return res.status(401).json({ error: 'Invalid signature' });
}
// 2. Responder rapidamente
res.status(200).json({ received: true });
// 3. Processar em background
const { event, data, webhookId } = req.body;
// Checar idempotência
if (await isWebhookProcessed(webhookId)) {
return; // Já processado
}
// Processar evento
switch (event) {
case 'LEAD_CREATED':
await handleLeadCreated(data.lead);
break;
case 'LEAD_TAG_ADDED':
await handleTagAdded(data.lead, data.tag);
break;
// ... outros eventos
}
await markWebhookProcessed(webhookId);
});