NeuroHub Metaby @goldneuron.io
OpenAPI 3.1
Integração para parceiros

Documentação de integração

Conecte outros softwares ao NeuroHub Meta para incorporar o onboarding de canais e receber eventos autenticados de WhatsApp Business, Messenger e Instagram.

Base URL · https://provider.neuros.my HTTPS obrigatório OpenAPI 3.1
01 / ESCOPO

O contrato público, sem ambiguidades

O hub é a camada de onboarding e roteamento de eventos oficiais da Meta. Ele mantém credenciais e tokens no servidor, entregando ao software parceiro apenas o que é necessário para operar a integração.

Suportado

  • Receber eventos Meta por forwarding HTTPS.
  • Abrir onboarding de WABA, Messenger e Instagram.
  • Consultar a disponibilidade do serviço.
  • Filtrar destinos por produto/canal.

Fora deste contrato

  • O hub não expõe tokens de canal para terceiros.
  • O hub não envia mensagens como proxy da Graph API.
  • Apps e canais não possuem listagem pública.
  • A sessão do painel não é credencial de integração.
02 / INÍCIO RÁPIDO

Do endpoint ao primeiro evento

Prepare um endpoint público

Disponibilize uma URL HTTPS que aceite POST JSON, por exemplo https://seu-software.com/webhooks/neurohub.

Cadastre o destino e gere o segredo

No painel, abra Apps → Editar → Outros pontos, informe a URL, selecione o produto e gere um segredo dedicado. O gerador usa 256 bits de entropia e entrega 64 caracteres hexadecimais.

Preserve o corpo bruto

Leia os bytes originais antes do parse JSON. Eles são necessários para validar a assinatura HMAC.

Responda rapidamente com 2xx

Confirme o recebimento após persistir ou enfileirar o evento. Processamento pesado deve ocorrer de forma assíncrona no seu software.

Teste com um evento real

Envie uma mensagem ao canal conectado e confirme o status do forwarding no painel do hub.

03 / WEBHOOK

Contrato de entrega de eventos

O destino recebe o mesmo corpo JSON autenticado que chegou da Meta. O hub não remodela nem remove campos do payload.

Método
POST
Content-Type
application/json
X-Hub-App
Identificador interno do app que recebeu o evento.
X-NeuroHub-Timestamp
Unix timestamp, em segundos, incluído no material assinado para proteção contra replay.
X-NeuroHub-Signature-256
HMAC próprio do hub no formato sha256=<hex>, calculado com o segredo dedicado do destino.
X-Hub-Signature-256
Assinatura original da Meta, preservada apenas como proveniência. Não exige nem justifica compartilhar o App Secret.
Corpo
Envelope original da Meta; a estrutura varia por produto e tipo de evento.
Sucesso
Qualquer resposta HTTP entre 200 e 299.
Exemplo · WABA
{
  "object": "whatsapp_business_account",
  "entry": [{
    "id": "WABA_ID",
    "changes": [{
      "field": "messages",
      "value": {
        "metadata": { "phone_number_id": "PHONE_NUMBER_ID" },
        "messages": [{
          "id": "wamid.EXEMPLO",
          "from": "5511999999999",
          "type": "text",
          "text": { "body": "Olá" }
        }]
      }
    }]
  }]
}
Compatibilidade futura: aceite campos desconhecidos e use os identificadores de evento/mensagem da Meta para idempotência. Não valide o payload com schema fechado.
04 / SEGURANÇA

Verifique antes de processar

Valide X-NeuroHub-Signature-256 com o segredo dedicado do destino. O material assinado é timestamp + "." + corpo bruto. Rejeite timestamps fora de uma janela curta e compare o HMAC em tempo constante.

Node.js
import { createHmac, timingSafeEqual } from "node:crypto";

function validSignature(rawBody, timestamp, received, partnerSecret) {
  if (!/^\d{10}$/.test(timestamp)) return false;
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;

  const expected = "sha256=" + createHmac("sha256", partnerSecret)
    .update(timestamp + ".")
    .update(rawBody)
    .digest("hex");

  const a = Buffer.from(received || "");
  const b = Buffer.from(expected);
  return a.length === b.length && timingSafeEqual(a, b);
}
Importante: não faça JSON.parse antes de validar e nunca compartilhe o App Secret da Meta. Compartilhe somente o segredo dedicado do destino, por canal seguro, e rotacione-o informando um novo valor no editor.
05 / ONBOARDING

Conexão incorporável de canais

Ative Permitir botão público de conexão no app e copie o snippet gerado no próprio card. O hub cria um state assinado e conduz o usuário pelo fluxo oficial da Meta.

Endpoint
GET /embed/connect?app=APP_PUBLICADO&channel=waba&lang=pt
ParâmetroObrigatórioValoresUso
appSimGerado pelo hubUse exatamente o valor presente no snippet do painel.
channelSimwaba, messenger, instagramSeleciona o fluxo de conexão.
langNãopt, en, esIdioma da interface; padrão pt.
Segurança do fluxo: a URL pública não contém App Secret nem token. O state é assinado, tem validade curta e é consumido no intercâmbio OAuth.
06 / OPERAÇÕES

Saúde do serviço

HTTP
GET /health

{
  "status": "ok",
  "uptime": 3600.25,
  "apps": 1,
  "channels": 3
}

Considere o hub disponível quando a resposta for 200 e status for ok. Os contadores são informativos e não substituem uma API de inventário.

07 / GARANTIAS

Comportamento operacional

Uma tentativa

Cada evento gera uma tentativa por destino. Não há retry automático; use alertas e reconciliação no parceiro.

Timeout controlado

O padrão operacional é 10 segundos. Responda após enfileirar, não após concluir tarefas pesadas.

Sem redirects

O hub não segue 3xx. Configure diretamente a URL HTTPS final.

Rede pública

Formato e IPs literais são validados ao salvar; DNS privado/reservado é bloqueado novamente antes de cada envio.

Corpo original

A assinatura NeuroHub é calculada sobre o timestamp e os mesmos bytes de payload aceitos da Meta.

2xx é sucesso

Qualquer outro status é registrado como falha no histórico, quando o histórico estiver ativo.

08 / TROUBLESHOOTING

Solução de problemas

O destino foi recusado ao salvar

Use HTTPS, sem credenciais na URL, sem fragmento e sem host local ou IP literal privado/reservado. Para domínios, a resolução DNS é validada e fixada imediatamente antes de cada entrega.

O evento não chegou ao meu software

Confirme que o destino está ativo, que o filtro inclui o produto correto e que a Meta enviou um webhook assinado ao app. Consulte o status do forwarding no histórico do painel.

O onboarding mostra “indisponível”

O app pode estar sem embed público, sem credenciais completas ou com um canal inválido. Gere novamente o snippet no card do app após salvar a configuração.

Posso listar canais ou enviar mensagens por essa API?

Não neste contrato público. O hub mantém tokens e inventário protegidos e não funciona como proxy de envio. Para uma integração parceira com API própria e credenciais dedicadas, fale com a @goldneuron.io.