HMAC-SHA256, retry exponencial 24h, replay 30 dias, dedupe por event_id. Reentrega quando seu endpoint cai. Não perde evento.
Signature · HMAC-SHA256Toda requisição traz x-arara-signature e x-arara-timestamp. Você compara com HMAC do body usando seu secret. Constant-time. Sem isso, qualquer um manda evento falso.
import crypto from 'crypto'
app.post('/arara/webhook', (req, res) => {
const signature = req.headers['x-arara-signature']
const timestamp = req.headers['x-arara-timestamp']
const body = req.rawBody
const expected = crypto
.createHmac('sha256', process.env.ARARA_SIGNING_SECRET)
.update(`${timestamp}.${body}`)
.digest('hex')
if (!crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected),
)) {
return res.status(401).json({ error: 'invalid_signature' })
}
const event = JSON.parse(body)
// ... process
res.sendStatus(200)
})Retry exponencialBackoff exponencial até 24h, com jitter. Status 5xx ou timeout dispara retry. Status 4xx (exceto 429) é falha permanente — DLQ pra inspeção. Replay manual dos últimos 30 dias.
event evt_a8x9k2 · message.deliveredresolvido em +2h502502504503200Event typesmessage.queuedMensagem persistida com retry policymessage.sentPush para Meta Cloud API completoumessage.deliveredAparelho do cliente confirmou recebimentomessage.readCliente abriu a mensagemmessage.repliedCliente respondeu (vira thread no Inbox)message.failedFalha permanente (bloqueado, número inválido)link.clickedCliente tocou em Smart Linktemplate.approvedMeta aprovou template submetidotemplate.rejectedMeta rejeitou (motivo no payload)broadcast.completedCampanha terminou disparop50 ~80ms desde o evento na Arara até POST no seu endpoint. p95 ~250ms. Se seu endpoint demora pra responder, retry pode adiar entrega futura, mas não atrasa novos.
Dashboard → Webhooks → Rotate. Secret novo gerado, antigo continua válido por 24h. Você atualiza env, deploya, deleta o antigo. Zero downtime.
Sim. Cada org pode ter N endpoints. Filtros por event type por endpoint. Sandbox usa endpoint dedicado pra você testar sem afetar produção.
Arara considera entregue. Você precisa idempotência interna pra reprocessar via replay. Padrão recomendado: persiste evento na sua fila local, processa async, retorna 200 cedo.
Sim. event_id único no payload. Se Arara enviar 2x (raro, mas pode em casos extremos), você usa o id pra dedupar do seu lado. SDKs têm helper.
Sim. Dashboard → Events → filtra → Replay. API: POST /v1/events/{id}/replay. Útil pra reprocessar quando seu sistema teve bug e ignorou eventos válidos.
Sim. IPs de saída são fixos e listados em docs. Plano Business tem failover endpoint pra garantir delivery se primário cair.
Endpoint, signing secret, escolhe events. SDKs validam signature por você.