Pular para o conteúdo

Webhooks

Os webhooks entregam notificações HTTP POST em tempo real quando as tarefas assíncronas em segundo plano são concluídas, como a publicação bem-sucedida de postagens, falhas ou envios de respostas.


MétodoCaminhoDescriçãoEscopo Necessário
POST/v1/brand/webhooks/subscriptionsRegistra um novo endpoint de webhookwebhooks:write ou *
GET/v1/brand/webhooks/subscriptionsLista as assinaturas de webhook registradaswebhooks:read ou *
DELETE/v1/brand/webhooks/subscriptions/{id}Exclui uma assinatura de webhookwebhooks:write ou *

Nome do EventoCondição de Acionamento
sns.publish.succeededPostagem publicada com sucesso na rede social de destino
sns.publish.failedFalha na publicação da postagem (inclui código de erro e elegibilidade para nova tentativa)
sns.publish.blocked_entitlementPublicação bloqueada devido a limites de cota ou plano expirado
sns.reply.succeededComentário de resposta postado com sucesso
sns.reply.failedFalha no envio do comentário de resposta
sns.provider.notification_receivedWebhook em tempo real recebido de um provedor de SNS externo

📦 Exemplo de Payload de Webhook (sns.publish.succeeded)

Seção intitulada “📦 Exemplo de Payload de Webhook (sns.publish.succeeded)”
{
"event_id": "evt_01jm8za2example",
"event_type": "sns.publish.succeeded",
"schema_version": 1,
"occurred_at": "2026-08-16T03:30:00Z",
"producer": "ankk.sns",
"brand_ref": "brand_01jm8v4k9example",
"idempotency_key": "launch-2026-001",
"trace_id": "trc_9a8b7c6d",
"data": {
"content_id": "content_01jm8za2example",
"publish_job_id": "job_01jm8za2jobexample",
"sns_type": "instagram",
"connection_id": "conn_01jm8x9k2example",
"provider_post_id": "18029384756102938",
"permalink": "https://www.instagram.com/p/C-example/"
}
}

As requisições de webhook incluem cabeçalhos de verificação personalizados:

  • Social-Webhook-Signature: Payload da assinatura (t=1723780000,v1=hex_signature)
  • Social-Webhook-Timestamp: Timestamp Unix em segundos
  • Social-Webhook-Id: Identificador do evento
import crypto from 'node:crypto';
export function verifyWebhookSignature(
rawBody: string,
signatureHeader: string,
timestampHeader: string,
secret: string
): boolean {
const signedPayload = `${timestampHeader}.${rawBody}`;
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(signedPayload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signatureHeader),
Buffer.from(expectedSignature)
);
}
import hmac
import hashlib
def verify_webhook_signature(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
signed_payload = f"{timestamp}.".encode('utf-8') + raw_body
expected = hmac.new(secret.encode('utf-8'), signed_payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(signature, expected)

[!CAUTION] A verificação da assinatura deve usar o corpo da requisição bruto não analisado (raw body).