Webhooks
Receba eventos assinados do SociaHive no seu próprio endpoint HTTPS e verifique a assinatura.
Um webhook envia um POST HTTPS para o seu endpoint quando algo acontece na sua conta do SociaHive: um post agendado é publicado ou falha, uma automação começa para alguém ou encontra um erro, um modelo do WhatsApp é aprovado ou rejeitado.
Adicione um no painel, em Integrações → Webhooks, ou pela API REST (/api/v1/webhooks, escopos webhooks:read e webhooks:write).
Qualquer pessoa pode configurar um webhook, mas os eventos só são entregues enquanto o seu plano inclui acesso à API (o teste grátis e todos os planos pagos). Os webhooks que você criou continuam lá e voltam a enviar quando você faz upgrade.
Limites por plano
| Plano | Webhooks |
|---|---|
| Free | 0 |
| Creator | 2 |
| Studio | 5 |
| Pro | 10 |
| Agency | 50 |
O limite vale para integration_type webhook, custom e n8n. As assinaturas do Zapier e do Make (zapier, make) não contam.
Eventos
| Evento | Quando | Campos de data |
|---|---|---|
post.published | Um post agendado foi ao ar em uma plataforma | postId, platform, accountId, platformPostId |
post.failed | Um post agendado não pôde ser publicado em uma plataforma | postId, platform, accountId, error |
flow.triggered | Uma automação começou para alguém | flowId, executionId, platform, accountId, senderId |
flow.error | Uma automação parou com um erro | flowId, executionId (quando conhecido), flowName, errorMessage, errorNodeId |
whatsapp.template_status | A Meta aprovou, rejeitou ou pausou um modelo do WhatsApp | accountId, templateName, templateLanguage, event, reason |
post.review_decision | Um cliente aprovou um post, pediu mudanças ou deixou um comentário em um link de revisão | postId, reviewLinkId, kind (approved, changes_requested, comment), reviewerName, comment (quando houver) |
post.plug_fired | Um plug de um post disparou (um repost ou um comentário) | plug_id, post_id, account_id, platform, metric, threshold, value, action |
Um post publicado em três plataformas envia três eventos post.published, um por plataforma.
O post.review_decision exige os links de revisão para clientes (Studio, Pro e Agency) e o post.plug_fired exige os plugs (todos os planos pagos). Assinar um evento que o seu plano não inclui devolve 400.
O contato nos eventos sobre uma pessoa
flow.triggered, flow.error (quando indica a pessoa), os eventos de assinantes da newsletter e data.collected também trazem contact, a pessoa como o SociaHive a conhece no momento do envio do evento:
Os campos personalizados usam como chave os nomes que você vê no SociaHive. contact não é enviado quando o SociaHive ainda não tem um contato para a pessoa.
Aceitos, mas ainda não enviados
Você pode assinar estes eventos pela API (o app do Make e o nó do n8n os oferecem), mas o SociaHive ainda não os envia. Um webhook inscrito nesses eventos passa a recebê-los quando forem lançados, sem nenhuma mudança do seu lado.
| Evento | Significado previsto |
|---|---|
message.received | Alguém enviou um direct para uma das suas contas |
comment.received | Alguém comentou em um dos seus posts |
flow.completed | Uma automação terminou para alguém |
account.disconnected | Uma conta conectada foi desconectada |
O painel só oferece os eventos que são enviados hoje.
Limitar um webhook a algumas contas
Defina account_ids (IDs das contas conectadas, de GET /api/v1/connected-accounts) para receber só os eventos dessas contas. Deixe vazio para todas as contas. Os eventos informam a conta como accountId (post.plug_fired: account_id). Os eventos que não informam conta (flow.error, post.review_decision) sempre são enviados.
Formato da requisição
Responda com qualquer status 2xx em até 10 segundos. Deixe o trabalho demorado para depois de responder.
Verificar a assinatura
Toda requisição é assinada com o segredo de assinatura do webhook, que aparece uma vez ao criar o webhook (e de novo apenas quando você gera um novo segredo).
O X-SociaHive-Signature tem o formato t=<segundos unix>,v1=<hex>. O v1 é o HMAC-SHA256 do texto <t>.<corpo bruto da requisição>, com o seu segredo como chave.
- Leia o corpo bruto antes de qualquer leitura de JSON: serializar de novo muda os bytes.
- Calcule o HMAC e compare com o
v1em tempo constante. - Rejeite a requisição se o
testiver a mais de cinco minutos de agora. Isso impede ataques de repetição (replay).
Entrega e novas tentativas
- A entrega é pelo menos uma vez. O mesmo evento pode chegar mais de uma vez; use o
id(também emX-SociaHive-Event-Id) para ignorar duplicatas. - Uma entrega que falha (resposta que não seja
2xx, tempo esgotado ou falta de conexão) é tentada até 5 vezes no total, com intervalos cada vez maiores entre as tentativas. - Depois de 3 eventos seguidos que falham em todas as tentativas, o webhook é desligado e você recebe uma notificação no app. Corrija o endpoint e ligue o webhook de novo; a contagem de falhas recomeça do zero.
- Não há garantia de que os eventos cheguem em ordem. Use o
timestampse a ordem importar. - Os endpoints precisam ser URLs
httpspúblicas. Endereços privados e internos são recusados.
Testes
O botão Enviar teste no painel envia na hora um evento assinado e mostra o código de status e o tempo:
Funciona em um webhook desligado, então você pode testar um endpoint antes de ligá-lo de novo. Dá para enviar 5 testes por minuto.
API REST
| Método | Caminho | O que faz |
|---|---|---|
GET | /api/v1/webhooks | Lista seus webhooks, inclusive os desligados |
POST | /api/v1/webhooks | Cria um: target_url, events, e opcionalmente integration_type (webhook por padrão, custom, n8n, make, zapier) e account_ids. A resposta inclui signing_secret |
PATCH | /api/v1/webhooks/{id} | Altera target_url, events, account_ids ou active (true liga de novo e zera a contagem de falhas) |
DELETE | /api/v1/webhooks/{id} | Exclui. Depois você pode adicionar a mesma URL de novo |
Cada webhook em uma resposta traz last_delivery_at, last_status (o status HTTP, ou null quando o endpoint não respondeu) e last_error.