WebhooksVisão geral

Webhooks

Como funcionam os Webhooks da Amplifique.me: eventos disponíveis, formato da requisição, validação de assinatura, política de retentativas com backoff exponencial e desativação automática de endpoints com falha.

Webhooks são notificações HTTP que a Amplifique.me envia para o seu sistema quando algo acontece na plataforma. É o inverso da API: em vez de você consultar a Amplifique.me periodicamente, nós avisamos você no momento em que o evento ocorre.

Use Webhooks para registrar respostas no seu CRM em tempo real, abrir um ticket automaticamente quando um Detrator responde, ou alimentar dashboards ao vivo.


Como funciona

Um evento acontece na plataforma

Por exemplo, um respondente finaliza uma pesquisa.

A Amplifique.me monta o payload

Buscamos os dados da resposta, do contato e da pesquisa e montamos o JSON do evento.

Uma entrega é criada para cada endpoint inscrito

Se você tem dois endpoints inscritos no mesmo evento, cada um recebe a sua própria entrega, com histórico e contagem de erros independentes.

Enviamos um POST para o seu endpoint

Você valida a assinatura, responde 200 e processa os dados.

As entregas passam por uma fila com controle de taxa. Em momentos de pico, uma entrega pode chegar alguns segundos depois do evento — o webhook não é um canal de latência garantida.


Eventos disponíveis

EventoQuando é disparado
cf_responseUma resposta de pesquisa foi finalizada pelo respondente
cf_response_incompleteUma resposta ficou em andamento ou abandonada — há respostas preenchidas, mas o respondente parou sem enviar

Você escolhe quais eventos cada endpoint recebe ao configurá-lo. Um endpoint só recebe os eventos que você marcou.


A requisição que você recebe

Sempre um POST com o corpo em JSON.

HeaderConteúdo
content-typeapplication/json
user-agentAmplifique.me Webhook Service
ampl-timeMomento da assinatura, em milissegundos desde a época Unix
ampl-signatureAssinatura HMAC-SHA256 do payload, em hexadecimal

Como validar a assinatura

Cada webhook é assinado com o secret do seu endpoint, disponível na tela de configuração do webhook na plataforma. Valide a assinatura antes de confiar no conteúdo — é o que garante que a requisição veio realmente da Amplifique.me.

A assinatura é o HMAC-SHA256, em hexadecimal, da string formada por:

{valor do header ampl-time}.{corpo cru da requisição}

Ou seja: o timestamp, um ponto, e o body exatamente como chegou.

Use o corpo cru (raw body) da requisição, antes de qualquer parse ou reserialização. Se você fizer JSON.parse e depois JSON.stringify, a ordem das chaves e o espaçamento podem mudar e a assinatura não vai bater.

Node.js (Express)

const crypto = require('crypto');
const express = require('express');

const app = express();

// guarde o corpo cru para poder validar a assinatura
app.use(express.json({
  verify: (req, res, buf) => { req.rawBody = buf; }
}));

app.post('/webhooks/amplifique', (req, res) => {
  const timestamp = req.header('ampl-time');
  const received  = req.header('ampl-signature');

  const expected = crypto
    .createHmac('sha256', process.env.AMPL_WEBHOOK_SECRET)
    .update(`${timestamp}.${req.rawBody.toString('utf8')}`, 'utf8')
    .digest('hex');

  // comparação em tempo constante evita ataques de timing
  const valid = received?.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));

  if (!valid) return res.status(401).send();

  // responda primeiro, processe depois
  res.status(200).send();
  processarEvento(req.body);
});

Python (Flask)

import hmac, hashlib, os
from flask import Flask, request

app = Flask(__name__)

@app.post('/webhooks/amplifique')
def amplifique_webhook():
    timestamp = request.headers.get('ampl-time', '')
    received  = request.headers.get('ampl-signature', '')

    payload  = f"{timestamp}.{request.get_data(as_text=True)}"
    expected = hmac.new(
        os.environ['AMPL_WEBHOOK_SECRET'].encode(),
        payload.encode(),
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(received, expected):
        return '', 401

    processar_evento(request.get_json())
    return '', 200

As entregas partem da infraestrutura de nuvem da Amplifique.me e não têm IP fixo. Valide a origem pela assinatura, não por lista de IPs permitidos.


O que esperamos da sua resposta

Resposta do seu endpointComo tratamos
200 ou 201Sucesso. A entrega é encerrada
Qualquer outro statusFalha. Entra na fila de retentativas
Sem resposta em até 20 segundosFalha por timeout

Somente 200 e 201 contam como sucesso. Códigos comuns de "aceito" como 202 Accepted e 204 No Content são tratados como falha e vão gerar retentativas. Se o seu framework responde 204 por padrão quando o handler não retorna corpo, defina o status explicitamente como 200.

Responda o mais rápido possível e faça o processamento pesado de forma assíncrona. O limite de 20 segundos vale para o tempo total da requisição — se o seu processamento demora, você recebe entregas duplicadas por timeout, mesmo tendo processado tudo com sucesso.


Retentativas e backoff

Quando uma entrega falha, ela é reagendada automaticamente com backoff exponencial: o intervalo dobra a cada nova tentativa, começando em 1 minuto.

São até 8 tentativas por evento, distribuídas ao longo de aproximadamente 2 horas:

TentativaIntervalo desde a anteriorTempo acumulado
1ª— (imediata)0
2ª1 minuto1 min
3ª2 minutos3 min
4ª4 minutos7 min
5ª8 minutos15 min
6ª16 minutos31 min
7ª32 minutos1h 03min
8ª64 minutos2h 07min

Se a 8ª tentativa também falhar, o evento é encerrado permanentemente e não será mais reenviado. O histórico completo de tentativas continua disponível nos logs do webhook.

Uma indisponibilidade curta do seu sistema é absorvida sem perda: como a última tentativa acontece mais de 2 horas depois da primeira, uma janela de manutenção de 30 minutos normalmente é recuperada automaticamente.


Desativação automática de endpoints

Além do controle por evento, cada endpoint tem um contador de erros que mede sua saúde ao longo do tempo:

  • Cada entrega que falha soma 1 ao contador
  • Cada entrega bem-sucedida subtrai 1 (o contador nunca fica negativo)
  • Quando o contador passa de 50, o endpoint é desativado e para de receber eventos

O contador se recupera sozinho: um endpoint que volta a funcionar vai zerando os erros acumulados a cada entrega bem-sucedida. A desativação só acontece quando as falhas superam consistentemente os sucessos.

Alertas por e-mail

Se você informou um e-mail ao configurar o webhook, enviamos um aviso quando falhas são detectadas, com link direto para a tela do webhook. Para não gerar excesso de mensagens durante uma indisponibilidade longa, há um intervalo mínimo de 4 horas entre alertas do mesmo endpoint.

Reativando um endpoint

Um endpoint desativado não volta sozinho. Corrija o problema no seu sistema e reative o webhook nas configurações da plataforma. Os eventos ocorridos enquanto ele estava desativado não são reenviados.


Logs de entrega

Na tela do webhook na plataforma você acompanha cada tentativa de entrega, com o status HTTP retornado, o corpo da resposta do seu servidor, o tempo de resposta e o horário. É o primeiro lugar para olhar quando um evento não chegou como esperado.


Boas práticas


Próximos passos

Como configurar Webhooks?

Passo a passo para criar seu primeiro webhook na plataforma.