Skip to content

Payload do webhook ​

Tipo
Referência
Para
Desenvolvedor
Na tela
HEC › Tenants › Avançado › Canais de Alerta

Cada POST do webhook leva um objeto JSON com o alerta, o destinatário daquela entrega e a lista de blocos já gerados. Um POST corresponde a um destinatário: o conteúdo foi gerado com o acesso a dados dele.

Raiz ​

CampoTipoO que é
alert.idnúmeroIdentificador do alerta
alert.nometextoNome do alerta
alert.typetextotrigger (agendado) ou condition (condicional)
alert.app_idnúmero ou nullAplicação monitorada, no condicional
user.idnúmeroIdentificador do destinatário
user.nometextoNome do destinatário
user.emailtextoLogin do destinatário, que é o e-mail dele
tenantIdnúmeroTenant do alerta
timestamptexto ISO 8601, UTCMomento em que a entrega foi criada. Igual em todas as tentativas
contentlistaOs blocos, na ordem do alerta

Se o usuário foi removido entre o disparo e o envio, user chega só com id.

Blocos ​

Todo item de content tem id, type, nome (o título do bloco) e generated, cujo formato depende do tipo.

Bloco na telatypegenerated
Textotext{ "text": "..." }, com as variáveis já substituídas
Análise com IAai{ "text": "...", "steps": [...] }
Relatórioreport{ "pdf": "<url>", "xlsx": "<url>" }, só com os formatos gerados; {} se a geração falhou
Gráficochart{ "chart": "<url do PNG>" }, ou { "error": "<mensagem>" } se a imagem falhou
Dashboardchart{ "kind": "dashboard", "format": "pdf" ou "png", "url": "<url>" }, ou {} se a geração falhou
InvestigaçãosentinelaObjeto descrito abaixo

Gráfico e Dashboard chegam os dois com type: "chart". Para separar, olhe generated.kind: só o Dashboard gerado tem kind: "dashboard". Só o Gráfico traz error em falha; Dashboard e Relatório que falharam chegam com generated vazio, então confira se as chaves existem antes de usar.

Passos da IA ​

Cada item de steps é uma consulta que a IA fez:

CampoO que é
kindSempre query
titleO que a consulta buscou
chartUrlImagem do resultado, quando houver
permalinkLink para abrir a consulta no Lumo
rowCountLinhas devolvidas
summaryResumo do resultado

Só kind e title vêm sempre; os outros podem faltar.

Investigação ​

CampoO que é
estadook, sem_rodada, indisponivel ou sem_permissao
investigation{ id, nome, pausada }. Em indisponivel e sem_permissao, chega como { id: 0, nome: "", pausada: false }
run{ id, finished_at, window_start, window_end }, ou null. finished_at em ISO 8601; as janelas em AAAA-MM-DD
resumo{ impacto, unidade, impacto_fmt, novas, continuam, resolvidas, total }, ou null
manchetesLista de { texto, impacto_fmt, severidade }, vazia sem Incluir os 3 maiores achados
linkLink para a investigação no Lumo, ou null fora do estado ok
pdf_urlLink do PDF, ou null sem Anexar o PDF da rodada ou quando o PDF não pôde ser gerado (aviso explica)
legenda, nota, avisoTextos de apoio já formatados. aviso pode ser null
sinteseSempre null. Mantido para não quebrar receptores antigos

Só estado: "ok" traz resumo e manchetes preenchidos.

Arquivos nunca vão dentro do JSON. Os links apontam para o armazenamento da plataforma (https://storage.horusbi.com.br/download/...) ou, num Tenant com domínio próprio, para https://<domínio do tenant>/storage/download/.... O pdf_url da Investigação é diferente: um link assinado (/f/<id>/<arquivo>?token=...) que expira em 7 dias. Baixe o arquivo assim que receber o POST, se precisar guardá-lo.

Exemplo ​

json
{
  "alert": {
    "id": 412,
    "nome": "Vendas do dia",
    "type": "trigger",
    "app_id": null
  },
  "user": {
    "id": 87,
    "nome": "Maria Souza",
    "email": "maria.souza@empresa.com.br"
  },
  "tenantId": 23,
  "timestamp": "2026-10-30T10:30:00.512Z",
  "content": [
    {
      "id": "5f1c2a9e-0b7d-4c3e-9a51-2d8f6e4b7c10",
      "type": "text",
      "nome": "Resumo",
      "generated": { "text": "Vendas de ontem: R$ 145.230,80" }
    },
    {
      "id": "a83e4d12-6f90-4b2a-8c7e-1f5d9b3a2e64",
      "type": "chart",
      "nome": "Vendas por filial",
      "generated": { "chart": "https://storage.horusbi.com.br/download/abc123.png" }
    },
    {
      "id": "0d9b7f35-2c41-4e8a-b6d3-7a1e5c9f8b22",
      "type": "chart",
      "nome": "Painel comercial",
      "generated": {
        "kind": "dashboard",
        "format": "pdf",
        "url": "https://storage.horusbi.com.br/download/def456.pdf"
      }
    },
    {
      "id": "e47a1c08-93b5-4f6d-a2e9-6c3b8d0f1a57",
      "type": "report",
      "nome": "Pedidos parados",
      "generated": {
        "pdf": "https://storage.horusbi.com.br/download/ghi789.pdf",
        "xlsx": "https://storage.horusbi.com.br/download/ghi789.xlsx"
      }
    },
    {
      "id": "b12f6e93-7d84-4a0c-9e35-4f8a2c6d1b09",
      "type": "ai",
      "nome": "Análise",
      "generated": {
        "text": "Três filiais caíram mais de 15% contra a média...",
        "steps": [
          {
            "kind": "query",
            "title": "Vendas de ontem por filial",
            "rowCount": 12,
            "permalink": "https://app.horusbi.com.br/..."
          }
        ]
      }
    }
  ]
}

O id de cada bloco é um UUID criado pelo editor quando o bloco entra no alerta. Ele se mantém entre envios e serve para identificar o bloco mesmo que o nome mude.

Relacionado ​