Buscar K
Aparência
Aparência
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.
| Campo | Tipo | O que é |
|---|---|---|
alert.id | número | Identificador do alerta |
alert.nome | texto | Nome do alerta |
alert.type | texto | trigger (agendado) ou condition (condicional) |
alert.app_id | número ou null | Aplicação monitorada, no condicional |
user.id | número | Identificador do destinatário |
user.nome | texto | Nome do destinatário |
user.email | texto | Login do destinatário, que é o e-mail dele |
tenantId | número | Tenant do alerta |
timestamp | texto ISO 8601, UTC | Momento em que a entrega foi criada. Igual em todas as tentativas |
content | lista | Os blocos, na ordem do alerta |
Se o usuário foi removido entre o disparo e o envio, user chega só com id.
Todo item de content tem id, type, nome (o título do bloco) e generated, cujo formato depende do tipo.
| Bloco na tela | type | generated |
|---|---|---|
| Texto | text | { "text": "..." }, com as variáveis já substituídas |
| Análise com IA | ai | { "text": "...", "steps": [...] } |
| Relatório | report | { "pdf": "<url>", "xlsx": "<url>" }, só com os formatos gerados; {} se a geração falhou |
| Gráfico | chart | { "chart": "<url do PNG>" }, ou { "error": "<mensagem>" } se a imagem falhou |
| Dashboard | chart | { "kind": "dashboard", "format": "pdf" ou "png", "url": "<url>" }, ou {} se a geração falhou |
| Investigação | sentinela | Objeto 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.
Cada item de steps é uma consulta que a IA fez:
| Campo | O que é |
|---|---|
kind | Sempre query |
title | O que a consulta buscou |
chartUrl | Imagem do resultado, quando houver |
permalink | Link para abrir a consulta no Lumo |
rowCount | Linhas devolvidas |
summary | Resumo do resultado |
Só kind e title vêm sempre; os outros podem faltar.
| Campo | O que é |
|---|---|
estado | ok, 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 |
manchetes | Lista de { texto, impacto_fmt, severidade }, vazia sem Incluir os 3 maiores achados |
link | Link para a investigação no Lumo, ou null fora do estado ok |
pdf_url | Link do PDF, ou null sem Anexar o PDF da rodada ou quando o PDF não pôde ser gerado (aviso explica) |
legenda, nota, aviso | Textos de apoio já formatados. aviso pode ser null |
sintese | Sempre 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.
{
"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.