Buscar K
Aparência
Aparência
Todas as operações da API numa página só, na ordem do menu. Autenticação, erros e limite de pedidos estão em API. O arquivo OpenAPI fica em /api.yml.
API REST para integrar um sistema ao Lumo: criar e administrar Tenants, usuários, grupos e acesso a dados, disparar cargas do HorusETL, conversar com o Chat com Dados e guardar arquivos. A visão geral, com autenticação, erros e limites, está em API.
Todo pedido leva um token no header Authorization: Bearer <token>. São dois:
| Token | Onde pegar | Rotas |
|---|---|---|
| Client Token | Cadastro do Cliente no HEC, aba Desenvolvedor | /tenants |
| Tenant Token | Cadastro do Tenant no HEC, aba Desenvolvedor, ou o token de cada Tenant em GET /tenants |
/tenant |
Token ausente ou inválido responde HTTP 401 com o texto Unauthorized, sem JSON.
Toda resposta de erro em JSON traz code, um código fixo ao lado de message
(ex.: TENANT_NAME_TAKEN, USER_NOT_FOUND, VALIDATION_ERROR). Decida pelo code:
a mensagem pode mudar de redação, o código não. Nas rotas /tenant, o status HTTP
segue a causa (400, 403, 404, 409); até 28/10/2026, parte desses erros voltava com
HTTP 200 e success: false. Nas rotas /tenants, criar, alterar e excluir recusam
com HTTP 400. Erro sem código próprio recebe um genérico pelo status:
VALIDATION_ERROR (400), NOT_FOUND (404), INTERNAL_ERROR (500) e
REQUEST_FAILED (os demais). A lista completa está em API › Códigos.
Até 100 pedidos por segundo por endereço IP. Acima disso, HTTP 429 com o texto
Too Many Requests e o header Retry-After, com os segundos até liberar: espere
esse tempo e repita.
Lista os Tenants do Cliente do token.
Com ?external_id=, retorna só o tenant com esse ID do seu sistema (lista vazia se
não houver).
page_size (1 a 100) liga a paginação, com page a partir de 1. A resposta traz a
página em data, ordenada por id, e pagination com page, page_size e total.
Sem page_size, a lista vem inteira e page é ignorado. include_users=false deixa
sys_users_tenants de fora, com ou sem paginação.
O campo token de cada tenant é o Tenant Token dele, o que autentica as rotas
/tenant. Os dois tokens estão em Autenticação.
| Campo | Descrição |
|---|---|
id |
ID interno do tenant |
nome |
Nome do tenant |
external_id |
ID do tenant no seu sistema, se informado na criação |
token |
Tenant Token para autenticar em /tenant/* |
status, statusDetail |
Estado do tenant: provisioning, failed, awaiting_credentials, loading ou ready |
dominio |
Domínio de acesso (ex: empresa.horusbi.com.br) |
ativo |
Se o tenant está ativo |
development_variables |
Variáveis globais do ETL, sempre como lista. Variável protegida vem sem value |
config |
Configurações do tenant |
dw_desks, bi_desks |
Mesas de Dados e Mesas de Aplicação |
bi_apps |
Aplicações DataViz |
dw_tables |
Tabelas do HorusDW |
sys_users_tenants |
Usuários vinculados |
Token de acesso do cliente
Filtra pelo ID do tenant no seu sistema
"1234"Tenants por página. Liga a paginação
501100Número da página, a partir de 1. Ignorado sem page_size
111Com false, cada tenant vem sem sys_users_tenants. Outro valor é ignorado
falseTenants do Cliente
Altera um Tenant do Cliente, identificado por id. Só os campos enviados mudam,
mas ativo é obrigatório em toda chamada. Mudança em development_variables fica
no histórico do Tenant.
ativo: false tranca o login de todos os usuários e pode ser revertido. O efeito na
cobrança está em Recursos e cobrança.
development_variables aceita objeto {"NOME": "valor"} ou lista, e substitui a
lista inteira: variável que não vier é removida do tenant.
Uma variável que continua guarda o que você não mandou dela: descrição, proteção e valores por agente. Trocar o valor de uma protegida mantém a proteção.
Na lista, cada item aceita key, value, description, is_secret e
agent_overrides. Variável protegida mandada sem value mantém o valor gravado.
[
{"key": "DB_HOST", "value": "10.0.0.5",
"agent_overrides": [{"tokenId": 852, "value": "10.9.0.7"}]},
{"key": "DB_PWD", "is_secret": true}
]
agent_overrides dá um valor próprio a um Agente ETL: o agente 852 recebe
10.9.0.7, e os outros recebem 10.0.0.5. tokenId é o id do agente, o mesmo de
agent.id na resposta da criação, e o agente precisa estar ligado ao tenant. Item
sem agent_overrides mantém os valores por agente gravados; lista vazia remove todos.
| Campo | Descrição |
|---|---|
nome |
Nome do tenant |
ativo |
false tranca o login; true libera |
dominio |
Domínio de acesso |
development_variables |
Variáveis globais do ETL |
config |
Configurações do tenant |
| Mensagem | Causa |
|---|---|
Tenant not found |
ID não existe ou não pertence ao cliente |
Invalid development_variables format... |
Variável sem key ou com value nulo |
Invalid development_variables agent_overrides... |
agent_overrides fora do formato [{tokenId, value}] |
Agente ETL ... não está ligado a este tenant. |
tokenId de agente que não atende o tenant |
Token de acesso do cliente
Tenant alterado
Cria um Tenant no Cliente do token e, se houver template, aplica o template nele. O passo a passo do provisionamento completo está em Tenant automático.
external_id de um tenant que já existe no cliente, a chamada devolve esse
tenant com created: false e não cria outrotoken for informado, o Agente ETL dono desse token é vinculado ao tenanttemplateId for informado, o template é aplicado. Com templateGroupId, vale a
versão vigente da Linha de Produto. Sem os dois, vale o Template Padrão do
cliente, se houverdata.token, o agente
em agent e o que o template deixou vazioA chamada é síncrona: só responde depois de aplicar o template inteiro, o que pode levar dezenas de segundos. Configure o timeout do seu cliente HTTP para pelo menos 2 minutos.
A criação não dispara carga. As tabelas do template nascem vazias e ficam assim
até o primeiro horário dos agendamentos. Para carregar na hora, use
POST /tenant/etl-schedules/run com o Tenant Token devolvido.
token (Agente ETL)token é o token de um Agente ETL já instalado, o mesmo que aparece em
HorusETL › Agentes. Esse agente passa a executar as cargas do tenant novo. Use para
um agente na nuvem que atende todos os seus tenants, mandando o mesmo token em
todas as criações.
Sem token, o apply do template cria um agente novo só para o tenant, e os
Dataflows ficam presos a ele. É o caminho para a origem num banco na rede do
cliente final: a resposta traz esse agente em agent, com dedicado: true e o
token dele em agent.token, para você instalá-lo lá. Até ele ser instalado, a
carga disparada pela API fecha com AGENT_OFFLINE.
development_variables preenche as variáveis globais que os Dataflows do template
leem ({API_KEY}, {CNPJ_EMPRESA}). Aceita objeto ou lista:
{ "API_KEY": "chave-da-api-deste-cliente", "CNPJ_EMPRESA": "12345678000190" }
[
{"key": "API_KEY", "value": "chave-da-api-deste-cliente"},
{"key": "CNPJ_EMPRESA", "value": "12345678000190"}
]
Cada variável precisa de valor: 0 e texto vazio são aceitos, null recusa a
criação. Variável do template que não vier aqui entra no tenant vazia e aparece em
variaveisVazias.
Na lista, cada item aceita também description e is_secret. Com is_secret: true
a variável é protegida: o valor não volta mais nas leituras, nem pela API nem na tela.
Valor por agente (agent_overrides) só entra pelo PUT /tenants, depois que o
tenant existe.
Só template do cliente do token. templateId de template de outro cliente responde
Template not found, igual a um id que não existe.
nome precisa ser único na plataforma inteira, não só no seu cliente.
Inclua o ID do cliente final no seu sistemadominio, o tenant fica em dataviz.horusbi.com.br, e a URL de login
transparente sai com esse endereçodominio enviadoO tenant é gravado antes do template ser aplicado. Se o apply falhar, o tenant
fica criado e incompleto, com status: failed e o passo em statusDetail.step.
Com external_id, repita a mesma chamada: ela devolve o tenant existente
(created: false), inclusive quando duas chamadas chegam juntas. Sem
external_id, uma nova tentativa com o mesmo nome é recusada; procure o tenant
em GET /tenants. Nos dois casos, aplique o template nele com
POST /tenant/templates/apply.
| Mensagem | Causa |
|---|---|
Nome do Tenant indisponível para uso... |
Já existe tenant com esse nome na plataforma |
Token inválido! |
token não corresponde a nenhum Agente ETL |
Invalid development_variables format... |
Variável sem key ou com valor null |
Duplicated development_variables key: ... |
A mesma key duas vezes na lista |
Template not found |
templateId não existe ou é de outro cliente |
Envie templateId ou templateGroupId, não os dois. |
Os dois campos no mesmo pedido |
Linha de Produto não encontrada ou sem versão vigente. |
templateGroupId não é do cliente ou a Linha não tem versão vigente |
Token de acesso do cliente
Tenant criado, ou o existente com o mesmo external_id
Exclui o tenant: ele é marcado como excluído, sai de GET /tenants e o Tenant Token
dele para de valer. Não há como desfazer pela API.
Para só trancar o acesso, use PUT /tenants com ativo: false, que pode ser
revertido. O efeito de cada um na cobrança está em
Recursos e cobrança.
| Mensagem | Causa |
|---|---|
Tenant not found |
ID não existe ou não pertence ao cliente |
Cliente HTTP que não manda DELETE com corpo pode usar POST /tenants/delete, com o
mesmo corpo e o mesmo efeito.
Token de acesso do cliente
Tenant excluído
O mesmo DELETE /tenants, por POST, para cliente HTTP que não manda DELETE com
corpo. Mesmo corpo, mesmo efeito.
Token de acesso do cliente
Tenant excluído
Lista os templates do Cliente do token. O id vai em templateId de
POST /tenants, na criação, ou de POST /tenant/templates/apply, num Tenant que já
existe.
A lista traz todas as versões de cada Linha de Produto, inclusive as descontinuadas.
vigente diz qual usar: numa Linha de Produto, é a versão corrente dela; fora de
Linha, todo template que não foi descontinuado. Para sempre aplicar a vigente sem
guardar id de versão, mande templateGroupId (o linha.id) em POST /tenants.
Token de acesso do cliente
Templates do Cliente
Devolve o Tenant do token, com os mesmos campos de cada item de GET /tenants. Usa o
Tenant Token em vez do Client Token.
| Campo | Descrição |
|---|---|
id |
ID interno do tenant |
nome |
Nome do tenant |
token |
O próprio Tenant Token |
external_id |
ID do tenant no seu sistema, se informado na criação |
status, statusDetail |
Estado do tenant (ver o schema Tenant) |
dominio |
Domínio de acesso |
ativo |
Se o login está liberado |
development_variables |
Variáveis globais do ETL |
config |
Configurações do tenant |
dw_desks |
Mesas de Dados |
bi_desks |
Mesas de Aplicação |
bi_apps |
Aplicações DataViz |
dw_tables |
Tabelas (resumo) |
sys_users_tenants |
Usuários vinculados |
Token de acesso do tenant
O Tenant do token
Tabelas do HorusDW do Tenant e o estado da última carga de cada uma.
Lista as tabelas do HorusDW no Tenant, com as colunas de cada uma e o resultado da última carga. Tabela excluída e coluna excluída não aparecem.
O Tenant Token age pelo Tenant inteiro: a lista traz todas as tabelas, sem os bloqueios e o acesso à tabela de cada usuário.
| Campo | Descrição |
|---|---|
id |
ID da tabela |
nome |
Nome técnico da tabela (ex: fat_vendas) |
columns |
Colunas, na ordem de exibição |
ultima_carga |
Data da última carga, do Dataflow ativo que alimenta a tabela e rodou por último. null se nenhum rodou |
status_ultima_carga |
Resultado dessa carga (success, error) |
linhas_ultima_carga |
Linhas que essa carga gravou, só quando ela teve sucesso. Numa carga Incremental, menos que o total |
linhas |
Total atual de linhas. Só com ?linhas=true, que deixa a consulta mais lenta |
| Campo | Descrição |
|---|---|
id |
ID da coluna |
column_name |
Nome técnico da coluna |
data_type |
Tipo de dado (STRING, NUMBER, DATE) |
label |
Rótulo que aparece na tela |
column_type |
column para coluna gravada na tabela, expression para coluna calculada |
Token de acesso do tenant
Com true, soma o total atual de linhas de cada tabela
Tabelas do Tenant
Lista os usuários ativos do Tenant do token. O mesmo usuário pode estar em outros Tenants; aqui só aparece o vínculo com este.
| Campo | Descrição |
|---|---|
login |
E-mail do usuário, único na plataforma |
nome |
Nome que aparece na tela |
ultimo_login |
Último acesso a este Tenant |
groups |
IDs dos grupos do usuário |
bi_desks |
IDs das Mesas de Aplicação liberadas para o usuário |
apps_deny |
IDs das Aplicações Bloqueadas para o usuário |
Passe email (ou login, que é o mesmo campo) para buscar um usuário só. data
vazio quer dizer que o e-mail não está vinculado a este tenant, e é o sinal para
criar o usuário com POST /tenant/users.
Token de acesso do tenant
Filtra pelo login (e-mail) exato do usuário
"ana.souza@cliente.com.br"Mesmo efeito de email
Filtra pelo ID do usuário
Usuários do Tenant
Altera um usuário do Tenant, identificado por login, que não muda. Só os campos
enviados mudam.
Cada lista enviada substitui a anterior inteira:
| Campo | Efeito |
|---|---|
groups |
Grupos do usuário. O grupo Administradores e os grupos administrados pelo fornecedor da plataforma ficam, mesmo fora da lista |
bi_desks |
Mesas de Aplicação liberadas |
apps_deny |
Aplicações Bloqueadas |
tables |
Tabelas liberadas ao usuário, com filtro de linha. Tabela fora da lista perde a liberação; num item já liberado, campo omitido mantém o valor |
O filtro de linha vai em tables: cada item libera uma tabela, com os filtros, as colunas
ocultas e a permissão de exportar. Não precisa de Datamart, e a liberação feita por Datamart
não muda com este campo. Exemplos em
Filtrar as linhas de cada usuário.
| Mensagem | Causa |
|---|---|
Usuário não encontrado |
Login não existe ou não está vinculado ao tenant |
Este usuário é administrado pelo fornecedor da plataforma... |
Usuário que a API não altera (403) |
Este grupo é administrado pelo fornecedor da plataforma... |
ID em groups de um grupo que a API não altera (403) |
O grupo de administrador não pode ser atribuído pela API. |
groups inclui o grupo Administradores (403) |
App {id} não encontrado |
ID em apps_deny não existe no tenant |
Mesa de aplicação {id} não encontrada |
ID em bi_desks não existe |
Grupo {id} não encontrado |
ID em groups não existe no tenant |
Liberação de tabela inválida: ... |
Item de tables com coluna de outra tabela, operador sem o valor que pede ou tabela que não é do tenant (400, TABLE_ACCESS_INVALID) |
Os não encontrados respondem 404. A alteração para no primeiro erro, e o que veio antes dele no corpo já ficou gravado.
Token de acesso do tenant
Usuário alterado
Cria o usuário e o põe no Tenant. Login que já está neste Tenant é recusado.
O usuário é um só na plataforma: login que já existe em outro tenant é vinculado a
este, sem criar outro. Nesse caso password é ignorado (vale a senha atual) e nome
muda o nome do usuário em todos os tenants dele.
Sem password, o usuário nasce sem senha e entra só pelo login transparente
(POST /tenant/login).
O grupo de administrador não pode ser atribuído pela API.
O vínculo com o tenant é gravado antes das permissões. Se um ID de groups, bi_desks
ou apps_deny for recusado, a resposta é de erro, mas o usuário já está no tenant:
repetir a chamada responde Login já está cadastrado. Corrija com PUT /tenant/users.
| Campo | Descrição |
|---|---|
groups |
IDs dos grupos |
bi_desks |
IDs das Mesas de Aplicação a liberar |
apps_deny |
IDs das Aplicações a bloquear |
tables |
Tabelas a liberar, com filtro de linha |
O filtro de linha vai em tables: cada item libera uma tabela, com os filtros, as colunas
ocultas e a permissão de exportar. Não precisa de Datamart, e a liberação feita por Datamart
não muda com este campo. Exemplos em
Filtrar as linhas de cada usuário.
| Mensagem | Causa |
|---|---|
Login já está cadastrado |
Usuário já vinculado ao tenant |
O grupo de administrador não pode ser atribuído pela API. |
groups inclui o grupo administrador |
Limite de N usuário(s) atingido... |
Franquia de usuários do tenant esgotada. Volta como HTTP 409 (até 28/10/2026, 500 com a mensagem só no campo error) |
App {id} não encontrado |
ID em apps_deny não existe |
Mesa de aplicação {id} não encontrada |
ID em bi_desks não existe |
Grupo {id} não encontrado |
ID em groups não existe |
Liberação de tabela inválida: ... |
Item de tables com coluna de outra tabela, operador sem o valor que pede ou tabela que não é do tenant (400, TABLE_ACCESS_INVALID) |
Os não encontrados respondem 404; o grupo Administradores, 403.
Token de acesso do tenant
Operação processada
Tira o usuário do tenant: o vínculo é marcado como excluído e as sessões dele neste tenant são encerradas (a aba aberta cai no próximo pedido). O usuário continua na plataforma e nos outros tenants dele.
| Mensagem | Causa |
|---|---|
Usuário não encontrado |
Login não existe ou não está vinculado ao tenant (404) |
Este usuário é administrado pelo fornecedor da plataforma... |
Usuário que a API não altera (403) |
Token de acesso do tenant
Operação processada
Grava as suítes e as Funções do Sistema de um grupo. O que cada função libera está em Papéis.
suites, quando vem com itens, vira a lista do grupo: a suíte que ficou de fora sai,
e as funções dela saem junto. Ausente ou vazia, as suítes ficam como estãopermissionMatrix, quando vem com itens, vira a lista do grupo: a função que ficou
de fora sai. Ausente ou vazia, as funções ficam como estãoread: false, create, update, delete e publish são gravados como falsealias de função que não existe é ignorado, sem erro| Alias da suíte | Suíte |
|---|---|
dw |
HorusDW |
bi |
DataViz |
etl |
HorusETL |
hec |
HEC |
Corpo inválido responde 400. Os outros erros voltam com HTTP 200, em data.success: false e data.message.
| Mensagem | Causa |
|---|---|
Tenant não encontrado |
Tenant inativo |
Grupo não encontrado |
ID não existe ou não pertence ao tenant |
Este grupo é administrado pelo fornecedor da plataforma... |
Grupo que a API não altera |
Token de acesso do tenant
Pedido processado. Confira data.success
Devolve as suítes e as Funções do Sistema de um grupo, no formato que
POST /tenant/groups/functions aceita de volta.
suites traz os alias das suítes do grupo. permissions traz as funções gravadas e,
com tudo false, as funções ainda não gravadas das suítes do grupo, em ordem de
suite_alias e alias.
permissions| Campo | Descrição |
|---|---|
alias |
Identificador da função |
nome |
Nome da função na tela |
suite_alias |
Suíte da função |
read, create, update, delete, publish |
Ver, Criar, Editar, Excluir e Publicar |
is_blocked |
Função bloqueada |
Voltam com HTTP 200, em data.success: false.
| Mensagem | Causa |
|---|---|
Grupo não encontrado |
ID não existe ou não pertence ao tenant |
Token de acesso do tenant
Funções do grupo. Confira data.success
Lista os grupos ativos do Tenant, com membros e acessos. Os acessos de um grupo valem para todos os membros; a regra está em Acesso a dados.
Grupo administrado pelo fornecedor da plataforma não aparece, e usuário administrado
pelo fornecedor não aparece em users.
| Campo | Descrição |
|---|---|
id |
ID do grupo |
nome |
Nome do grupo |
bi_desks |
IDs das Mesas de Aplicação liberadas |
apps_deny |
IDs das Aplicações Bloqueadas |
users |
IDs dos membros |
Token de acesso do tenant
Grupos do Tenant
Altera um grupo do Tenant, identificado por id. Só os campos enviados mudam, e cada
lista enviada substitui a anterior inteira.
| Campo | Efeito |
|---|---|
nome |
Nome do grupo |
bi_desks |
Mesas de Aplicação liberadas, por ID |
apps_deny |
Aplicações Bloqueadas, por ID |
users |
Membros, por login (e-mail). Só usuário que já está no Tenant |
tables |
Tabelas liberadas ao grupo, com filtro de linha. Tabela fora da lista perde a liberação; num item já liberado, campo omitido mantém o valor |
O filtro de linha vai em tables: cada item libera uma tabela, com os filtros, as colunas
ocultas e a permissão de exportar. Não precisa de Datamart, e a liberação feita por Datamart
não muda com este campo. Exemplos em
Filtrar as linhas de cada usuário.
Para pôr ou tirar um membro, mande a lista inteira com ou sem ele. Usuário administrado pelo fornecedor da plataforma continua no grupo mesmo fora da lista.
A API não altera o grupo Administradores nem grupo administrado pelo fornecedor.
A alteração para no primeiro erro, e o que veio antes dele no corpo já ficou gravado.
| Mensagem | Status | Causa |
|---|---|---|
ID do grupo é obrigatório |
400 | Campo id não enviado |
Grupo não encontrado |
404 | ID não existe ou não pertence ao tenant |
O grupo de administrador não pode ser editado pela API. |
403 | Grupo Administradores |
Este grupo é administrado pelo fornecedor da plataforma... |
403 | Grupo que a API não altera |
App {id} não encontrado |
404 | ID em apps_deny não existe |
Mesa de aplicação {id} não encontrada |
404 | ID em bi_desks não existe |
Usuário {login} não encontrado |
404 | Login não existe ou não está no tenant |
O usuário {login} é administrado pelo fornecedor da plataforma... |
403 | Login de usuário que a API não altera |
Liberação de tabela inválida: ... |
400 | Item de tables com coluna de outra tabela, operador sem o valor que pede ou tabela que não é do tenant (TABLE_ACCESS_INVALID) |
Token de acesso do tenant
Operação processada
Cria um grupo no Tenant. Só nome é obrigatório; id é recusado, porque a plataforma
gera o seu.
Os outros campos dão os acessos e os membros iniciais, com as mesmas regras de
PUT /tenant/groups. O grupo é gravado antes deles: se um ID ou login for recusado, a
resposta é de erro, mas o grupo já existe com o nome. Pegue o id em
GET /tenant/groups e corrija com PUT /tenant/groups, em vez de repetir a criação.
| Mensagem | Status | Causa |
|---|---|---|
Não é possível criar um grupo com um ID específico |
400 | Campo id foi enviado |
Nome do grupo é obrigatório |
400 | Campo nome vazio ou não enviado |
App {id} não encontrado |
404 | ID em apps_deny não existe |
Mesa de aplicação {id} não encontrada |
404 | ID em bi_desks não existe |
Usuário {login} não encontrado |
404 | Login não existe ou não está no tenant |
Liberação de tabela inválida: ... |
400 | Item de tables com coluna de outra tabela, operador sem o valor que pede ou tabela que não é do tenant (TABLE_ACCESS_INVALID) |
Token de acesso do tenant
Operação processada
Marca o grupo como excluído. Ele sai de GET /tenant/groups, e os membros deixam de
receber os acessos dele; os acessos que vêm de outros grupos ou do cadastro de cada
usuário ficam. Não há como restaurar pela API.
| Mensagem | Status | Causa |
|---|---|---|
ID do grupo é obrigatório |
400 | Campo id não enviado |
Grupo não encontrado |
404 | ID não existe, não é do tenant ou já foi excluído |
Este grupo é administrado pelo fornecedor da plataforma... |
403 | Grupo que a API não altera |
Token de acesso do tenant
Operação processada
Login transparente, para abrir o Lumo dentro do seu sistema.
Gera a URL de login transparente de um usuário do tenant: quem já entrou no seu sistema abre o Lumo sem digitar senha. O passo a passo está em Login transparente.
O token é um JWT que vale 1 hora a partir de quando foi gerado e pode ser usado mais de uma vez nesse prazo. A sessão aberta pela URL acaba junto com ele, mesmo com o usuário navegando. Gere uma URL nova cada vez que o usuário abrir o Lumo no seu sistema e, em sessão longa, recarregue o iframe com uma URL nova antes de completar 1 hora.
A sessão fica presa a este tenant e a este usuário: dentro dela não é possível trocar de tenant nem acessar como outro usuário.
A resposta vem sem o envelope status/data. O host da url é o domínio do tenant.
Se o domínio do tenant tem mais de um endereço separado por vírgula, monte a URL com
o seu domínio: https://<dominio>/auth/api/<token>?showMenu=0.
| Campo | Descrição |
|---|---|
success |
true quando a URL foi gerada |
token |
O JWT de login |
url |
URL para iframe, redirecionamento ou WebView |
Valem para a sessão inteira, não só para a primeira página.
| Parâmetro | Valores | Descrição |
|---|---|---|
showMenu |
0 / 1 |
0 esconde o menu principal. Padrão 1; a url já vem com 0 |
showDesksIcon |
0 / 1 |
0 esconde o ícone de Mesas. Padrão 1 |
forceTheme |
light / dark |
Força o tema claro ou escuro |
ref |
Base64 | Rota que abre depois do login, em ASCII codificado em Base64 |
Com ref, a rota /app/report/1 vira L2FwcC9yZXBvcnQvMQ==:
https://[dominio]/auth/api/[token]?showMenu=0&ref=L2FwcC9yZXBvcnQvMQ==
Os jeitos de abrir a URL e como montar um menu próprio com showMenu=0 estão em
Login transparente.
| Status | Mensagem | Causa |
|---|---|---|
| 404 | Usuário não encontrado |
Login não existe ou não está vinculado ao tenant |
| 403 | Este usuário não pode entrar pela API do tenant. |
Usuário da equipe da plataforma |
As duas falhas trazem success: false. Até 28/10/2026 elas voltavam com HTTP 200.
Token de acesso do tenant
Operação processada
Aplica um template do Cliente no Tenant do token. É o caminho para instalar um template
num Tenant que já existe, ou reaplicar uma versão nova; na criação, mande templateId em
POST /tenants. Os templates do Cliente estão em GET /tenants/templates.
O template traz tabelas do HorusDW, Dataflows, agendamentos, Aplicações com Dashboards,
os nomes das variáveis globais (o valor fica no Tenant) e as conexões, que nascem vazias
e se preenchem em PUT /tenant/credentials/{id}.
Por padrão o apply só acrescenta: nada que já existe no Tenant é removido. Com
espelhar=true, ele também poda o conteúdo de produto que não está no template; use
dryRun=true para ver a poda antes.
Com preview: true, nada é gravado. A resposta diz, por mesa, conexão, variável,
tabela, Dataflow, agendamento e aplicação, se o apply vai criar (create), reescrever
(update) ou manter (keep), e lista em rebuilds as tabelas que serão recriadas e
ficarão vazias até a próxima carga. Com espelhar: true junto, traz também o plano
do espelho em plan.
dryRun continua como sempre: com espelhar, devolve o plano do espelho; sem
espelhar, instala o template de verdade. Para ver antes sem instalar, use
preview.
Tabela criada ou reconstruída pelo apply fica vazia até a próxima carga. A resposta
traz em reloadPlan essas tabelas, em ordem de dependência; para carregar na hora,
mande os itens em POST /tenant/templates/reload.
A resposta também traz credenciaisVazias, variaveisVazias e tabelasVazias: o
que o template criou sem valor ou sem carga.
| Mensagem | Causa |
|---|---|
Tenant not found |
Tenant não existe ou foi excluído |
Template not found |
Não existe template ativo com esse templateId, ou ele é de outro cliente |
Token de acesso do tenant
Operação processada
Dispara as cargas dos Dataflows do reloadPlan devolvido por
POST /tenant/templates/apply, em lote e em ordem de dependência. Serve para encher
na hora as tabelas que o apply criou ou reconstruiu, que ficam vazias até a próxima carga.
As cargas vão para os agentes, agrupadas por agente. A resposta traz o executionId
para acompanhar em GET /tenant/executions/{id}. Os Dataflows de um agente offline
falham na execução com AGENT_OFFLINE, sem abortar o lote. Lote com Dataflow que
ainda está rodando pela API devolve a execução aberta, com alreadyRunning: true.
Só Dataflow do próprio tenant: flowId de outro tenant, inativo ou inexistente
responde 404 com FLOW_NOT_FOUND. Item cujo Agente ETL (o tokenId dele, o do
Dataflow ou o agente padrão do tenant) não está ativo no tenant responde 409 com
AGENT_OFFLINE, e nada é disparado.
Token de acesso do tenant
Lote enfileirado
Lista os Dataflows ativos do Tenant. Cada Dataflow é uma carga do HorusETL, da origem até uma tabela do HorusDW.
| Campo | Descrição |
|---|---|
id |
ID do Dataflow, o flowId de POST /tenant/flows/run |
nome |
Nome do Dataflow |
deskId |
Mesa de Dados do Dataflow |
tableId |
Tabela de destino, quando há |
load_type |
Extração: Total, Incremental ou Temporal (na tela, Janela) |
versao |
Versão atual do Dataflow |
O que cada Extração faz está em Tipos de carga.
Token de acesso do tenant
Dataflows ativos do Tenant
Dispara agora um Dataflow do Tenant. A resposta volta antes da carga terminar.
data: true só confirma o pedido. Se a carga terminou e se o agente estava online,
você acompanha pelo executionId em GET /tenant/executions/{id}: agente offline
ou recusa aparecem lá, com errorCode, e o status HTTP continua 200.
Disparar de novo um Dataflow que ainda está rodando pela API não começa outra carga:
a resposta traz o executionId da execução aberta, com alreadyRunning: true.
contextcontext é obrigatório e diz o que esta execução traz da origem. Fora do Total, o
que a carga faz com a tabela depende da Gravação do Dataflow; as regras estão em
Tipos de carga.
context |
O que traz |
|---|---|
Total |
A origem inteira. Troca toda a parte do Dataflow na tabela, qualquer que seja a Gravação |
Incremental |
O que mudou desde a última carga |
Temporal:* |
Um intervalo de datas (na tela, Janela) |
A janela vai no formato Temporal:tipo:valor:
| Formato | Exemplo | Janela |
|---|---|---|
Temporal:Days:N |
Temporal:Days:30 |
Últimos N dias |
Temporal:Future:N |
Temporal:Future:7 |
Próximos N dias |
Temporal:Year:AAAA |
Temporal:Year:2024 |
O ano inteiro |
Temporal:Month:MM-AAAA |
Temporal:Month:01-2024 |
O mês inteiro |
code |
Status | Causa |
|---|---|---|
FLOW_NOT_FOUND |
404 | O id não existe neste Tenant ou o Dataflow está inativo |
Token de acesso do tenant
Pedido aceito. O resultado fica na execução
Lista os agendamentos do HorusETL no Tenant, ativos e inativos, com os Dataflows e os gatilhos de cada um. Agendamento excluído não aparece; de cada um, só vêm os Dataflows e os gatilhos ativos.
| Campo | Descrição |
|---|---|
id |
ID do agendamento, o scheduleId de POST /tenant/etl-schedules/run |
nome |
Nome do agendamento |
ativo |
Se o agendamento está ativo |
flows |
Dataflows do agendamento, na ordem em que rodam |
triggers |
Gatilhos: quando o agendamento roda |
| Campo | Descrição |
|---|---|
type |
Tipo de gatilho |
period |
Intervalo em minutos, no gatilho periódico |
start_time |
Hora de início (HH:MM) |
end_time |
Hora de término (HH:MM) |
start_when |
Data e hora a partir das quais o gatilho vale |
Token de acesso do tenant
Agendamentos do Tenant
Dispara agora um agendamento do Tenant, mesmo inativo: os Dataflows ativos dele rodam um
depois do outro, na ordem do agendamento. A resposta volta antes das cargas terminarem. Para um Dataflow só,
com a Extração escolhida, use POST /tenant/flows/run.
data: true só confirma o pedido. Se os Dataflows terminaram, você acompanha pelo
executionId em GET /tenant/executions/{id}: agente offline ou recusa aparecem
lá, com errorCode, e o status HTTP continua 200.
Disparar de novo um agendamento que ainda está rodando pela API não começa outra
carga: a resposta traz o executionId da execução aberta, com alreadyRunning: true.
code |
Status | Causa |
|---|---|---|
SCHEDULE_NOT_FOUND |
404 | O id não existe neste Tenant ou o agendamento foi excluído |
Token de acesso do tenant
Pedido aceito. O resultado fica na execução
Estado de uma carga disparada por POST /tenant/flows/run,
POST /tenant/etl-schedules/run ou POST /tenant/templates/reload, pelo
executionId que veio na resposta do disparo.
status |
Significado |
|---|---|
queued |
O agente ainda não começou |
running |
Algum Dataflow começou ou terminou, e algum ainda está aberto |
succeeded |
Todos os Dataflows terminaram com sucesso |
failed |
A execução falhou; o motivo está em errorCode e message |
Cada Dataflow tem o seu estado em flows, com rows (linhas gravadas), rowsIn
e rowsOut.
errorCode |
Causa |
|---|---|
AGENT_OFFLINE |
Nenhum Agente ETL ativo para o tenant, ou o agente estava offline. Nada foi disparado |
AGENT_REJECTED |
O agente recusou o comando |
FLOW_FAILED |
Um Dataflow falhou. O texto do agente está em message |
SCHEDULE_FAILED |
O agendamento terminou com algum Dataflow em falha |
NOT_STARTED |
O agente não começou a carga em 2 horas |
TIMEOUT |
A carga começou e não terminou em 24 horas |
Só execução do próprio tenant. id de outro tenant ou inexistente responde 404.
Token de acesso do tenant
O executionId devolvido pelo disparo
"uuid"Estado da execução
Lista as conexões de banco ativas do Tenant. O template cria a conexão vazia no tenant
novo; filled diz se ela já tem algum campo preenchido.
A leitura nunca devolve password, e segredos dentro de connection string voltam
como ******. Os campos dependem do tipo (type); no PostgreSQL são hostname,
database, username, password e extra (opcional).
Token de acesso do tenant
Conexões do tenant
Grava os campos de uma conexão do tenant, cifrados como no HorusETL.
******, mantém o valor gravadoResponde com a conexão gravada, no mesmo formato da listagem.
Token de acesso do tenant
ID da conexão, de GET /tenant/credentials
Conexão gravada
Lista os Datamarts do Tenant, com as tabelas e os donos de cada um. O Datamart agrupa tabelas por assunto, e é nele que o dono libera o acesso a cada tabela; o conceito está em Acesso a dados.
O acesso de usuários e grupos às tabelas de um Datamart está em
GET /tenant/datamart/{id}/user e GET /tenant/datamart/{id}/group.
| Campo | Descrição |
|---|---|
id |
ID do Datamart |
nome |
Nome do Datamart |
dm_tables |
Tabelas do Datamart, com as colunas. Tabela excluída não aparece |
owners |
Donos do Datamart |
Token de acesso do tenant
Datamarts do Tenant
Cria um Datamart, quando o corpo vem sem id, ou altera o Datamart desse id. nome,
dm_tables e owners são obrigatórios nos dois casos.
Na alteração, dm_tables e owners viram as listas do Datamart: o que ficou de fora
sai, o que é novo entra.
| Campo | De onde vem o ID |
|---|---|
dm_tables[].tableId |
GET /tenant/tables. Tabela não excluída do Tenant |
owners[].userId |
GET /tenant/users. Usuário do Tenant |
Os IDs são conferidos antes de gravar: com erro, nada muda.
| Mensagem | Status | Causa |
|---|---|---|
Invalid userId |
404 | Usuário não existe ou não é do tenant |
Invalid tableId |
404 | Tabela não existe, não é do tenant ou foi excluída |
Datamart not found |
404 | id que não existe neste tenant (na alteração) |
Token de acesso do tenant
Datamart gravado
Lista o acesso às tabelas de um Datamart dado a cada usuário. Um registro por usuário e
tabela. Usuário excluído, tabela excluída e usuário administrado pelo fornecedor da
plataforma não aparecem. O acesso dado a grupos está em GET /tenant/datamart/{id}/group.
O que cada recorte faz está em Acesso a dados.
| Campo | Descrição |
|---|---|
userId, user |
O usuário (id, nome, login) |
tableId, table |
A tabela (id, nome) |
allowed |
true dá acesso à tabela |
allow_export |
Pode exportar a tabela |
expires_in |
Data em que o acesso vence. null sem validade |
hidden_columns |
IDs das colunas escondidas |
filters |
Filtros de linha |
Datamart not found (404) quando o id não é de um Datamart deste tenant.
Token de acesso do tenant
ID do Datamart
1Acesso de usuários às tabelas do Datamart
Grava o acesso de um usuário a uma tabela, no Datamart do id. Há um registro por
Datamart, tabela e usuário: se ele já existe, é substituído; senão, é criado. O que cada
recorte faz está em Acesso a dados.
| Campo | Regra |
|---|---|
userId |
Usuário ativo no Tenant. Obrigatório |
tableId |
Tabela não excluída do Tenant. Obrigatório |
allowed |
true dá acesso; false grava o registro sem acesso. Obrigatório |
allow_export |
Libera exportar a tabela. Obrigatório |
expires_in |
Data e hora em que o acesso vence. Não aceita null |
hidden_columns |
IDs das colunas a esconder (o id de columns em GET /tenant/tables) |
filters |
Filtros de linha: column com column_id (ID da coluna) e expression (AGP para o valor da coluna), operator (como = ou IN) e value, em texto |
Na troca de um registro que já existe, campo opcional que não vier mantém o valor
gravado. Por isso uma validade gravada não se tira por aqui: expires_in não aceita
null.
| Mensagem | Status | Causa |
|---|---|---|
Datamart not found |
404 | id que não é de um Datamart deste tenant |
Table not found |
404 | tableId não existe no tenant |
Invalid userId |
404 | Usuário não existe ou não está ativo no tenant |
User is managed by the platform provider... |
403 | Usuário que a API não altera |
Token de acesso do tenant
ID do Datamart
1Acesso gravado
Lista o acesso às tabelas de um Datamart dado a cada grupo. Os campos são os de
GET /tenant/datamart/{id}/user, com groupId e group no lugar de userId e user.
Os acessos de um grupo valem para todos os membros. Como o acesso de grupo e o de usuário se combinam está em Acesso a dados.
Datamart not found (404) quando o id não é de um Datamart deste tenant.
Token de acesso do tenant
ID do Datamart
1Acesso de grupos às tabelas do Datamart
Grava o acesso de um grupo a uma tabela, no Datamart do id. Funciona como
POST /tenant/datamart/{id}/user, com groupId no lugar de userId: um registro por
Datamart, tabela e grupo, substituído se já existe, e campo opcional que não vier mantém
o valor gravado.
| Mensagem | Status | Causa |
|---|---|---|
Datamart not found |
404 | id que não é de um Datamart deste tenant |
Table not found |
404 | tableId não existe no tenant |
Invalid groupId |
404 | Grupo não existe ou foi excluído |
This group is managed by the platform provider... |
403 | Grupo que a API não altera |
Token de acesso do tenant
ID do Datamart
1Acesso gravado
Conversar com o assistente de IA em nome de um usuário, com resposta em streaming (SSE) ou JSON.
Manda uma pergunta ao assistente do Chat com Dados em nome de um usuário do Tenant e devolve a resposta. O assistente consulta os dados com o acesso desse usuário: só vê as Aplicações e tabelas que ele vê, com as mesmas restrições de linha e coluna.
A resposta vem em streaming (SSE) por padrão. Para receber tudo de uma vez em JSON,
mande ?stream=false ou o header Accept: application/json. O formato dos eventos,
com exemplos em Node.js e Python, está em Streaming do chat.
Sem threadId, a mensagem abre uma conversa nova, e o id dela chega no evento
thread (ou em threadId, no modo JSON). Mande esse id nas próximas mensagens para
o assistente lembrar o que já foi dito.
O userId precisa ser de um usuário ativo no Tenant e com permissão de IA. Para
achar o id a partir do e-mail, use GET /tenant/users?email=.
No modo SSE, só a validação do corpo responde com status de erro (400). O resto
chega como evento error dentro de uma resposta HTTP 200. No modo JSON:
| Status | code |
Causa |
|---|---|---|
| 400 | VALIDATION_ERROR |
Corpo inválido |
| 403 | REQUEST_FAILED |
Usuário fora do Tenant, inativo ou sem permissão de IA |
| 404 | NOT_FOUND |
threadId que não existe, ou de outro usuário |
| 500 | INTERNAL_ERROR |
Falha ao gerar a resposta |
Token de acesso do tenant
Com false, a resposta vem em JSON de uma vez. Com true, vem em SSE mesmo com Accept: application/json
"true""false""false"Resposta do assistente, em SSE ou JSON
Diz se o Tenant está perto ou além do limite mensal de IA, sem gastar crédito. Consulte antes de mandar mensagens para avisar o usuário em vez de deixar a pergunta falhar. A regra do limite está em Créditos de IA.
state |
Quer dizer |
|---|---|
ok |
Abaixo de 90% do limite |
warn |
90% ou mais, ou além do limite num Tenant que não bloqueia |
block |
Além do limite: novas mensagens são recusadas |
Com userId, actions traz o que aquele usuário pode fazer para liberar (contratar
créditos ou configurar uma chave de IA própria no HEC). Sem userId, actions vem
vazio. Se a consulta falhar, a resposta é ok.
Token de acesso do tenant
Usuário para quem calcular as ações possíveis
123Estado do limite
Lista as conversas de um usuário, da mais nova para a mais antiga. Por padrão, só
as abertas por esta API (origin=api); as conversas do chat na tela não entram.
Token de acesso do tenant
Dono das conversas
123Origem das conversas
"api"Conversas do usuário
Abre uma conversa sem mensagens e devolve o id. Use quando precisar do threadId
antes da primeira pergunta; senão, mande a mensagem sem threadId e a conversa
nasce junto.
Esta rota não confere se o usuário é do Tenant. A conferência acontece no envio da mensagem.
Token de acesso do tenant
Conversa aberta
Devolve as mensagens de uma conversa aberta pela API, da mais antiga para a mais
nova. A conversa precisa ser do userId informado; de outro usuário ou outro
Tenant, a resposta é 404.
Token de acesso do tenant
"bi_3f6a1c2e-8b4d-4e7a-9c1f-2d5e8a7b4c10"Dono da conversa
123Mensagens da conversa
Responde sempre {"cancelled": true} e não interrompe nada. Existe só para
compatibilidade.
Para parar de receber uma resposta, feche a conexão SSE. O servidor para de mandar eventos, mas o assistente termina a resposta mesmo assim, e o consumo de IA conta inteiro.
Token de acesso do tenant
Sempre esta resposta
Lista os arquivos do Tenant, paginados. Arquivo excluído e upload por URL pré-assinada que não foi confirmado não aparecem.
total e totalBytes contam todos os arquivos que passam no filtro, não só os da
página.
Token de acesso do tenant
Arquivos por página. Acima de 200, vale 200
50200Quantos arquivos pular
0Só arquivos desta origem. Outro valor é ignorado
"api""hec""dw""etl"Parte do nome do arquivo, sem diferença de maiúscula e minúscula
"vendas"Ordem por nome, tamanho ou data de criação
"name""size""date""date""asc""desc""desc"Página de arquivos
Devolve os dados de um arquivo do Tenant.
Token de acesso do tenant
Id do arquivo
"a1b2c3d4-e5f6-7890-abcd-ef1234567890""uuid"Dados do arquivo
O arquivo some da lista e para de abrir na hora. O conteúdo é apagado do armazenamento 7 dias depois, e não há como restaurar pela API.
Imagem enviada por um Cadastro que ainda aparece em algum registro, ou no histórico dele, não pode ser excluída.
Token de acesso do tenant
Id do arquivo
"a1b2c3d4-e5f6-7890-abcd-ef1234567890""uuid"Arquivo excluído
Arquivo público abre pela url sem token. Arquivo privado só abre com um link
assinado (POST /tenant/files/{id}/sign).
Sem o campo public no corpo, o arquivo fica privado.
Token de acesso do tenant
Id do arquivo
"a1b2c3d4-e5f6-7890-abcd-ef1234567890""uuid"Visibilidade alterada
Envia um arquivo de até 200 MiB num pedido só. Acima disso, a resposta é HTTP 413
com o texto File size limit has been reached, e o arquivo precisa ir pela URL
pré-assinada (POST /tenant/files/presign), que aceita até 2 GB. O passo a passo
está em Upload grande.
O arquivo entra privado, com origin: api. Se já existe um arquivo com o mesmo
nome enviado por esta rota, o conteúdo dele é substituído e o id continua o mesmo.
Token de acesso do tenant
O arquivo. O campo precisa se chamar file
"binary"Nome com que o arquivo fica guardado. Sem ele, vale o nome original
Arquivo guardado
Primeiro passo do envio de arquivo grande, até 2 GB. Devolve uma URL pré-assinada
para você mandar os bytes direto ao armazenamento com PUT, sem passar pela API.
A URL vale 15 minutos. Depois do PUT, chame POST /tenant/files/confirm.
O PUT precisa levar o header Content-Type igual ao mime mandado aqui (sem
mime, application/octet-stream). Outro valor invalida a assinatura e o
armazenamento responde 403.
O arquivo entra privado, com origin: hec. O passo a passo está em
Upload grande.
Token de acesso do tenant
URL de envio
Último passo do envio de arquivo grande. A API lê o tamanho real direto no armazenamento e recusa arquivo acima de 2 GB. Até a confirmação, o arquivo não aparece na lista, e o que não for confirmado em 24 horas é apagado.
Token de acesso do tenant
Arquivo confirmado
Gera um link que abre o arquivo sem login até expirar, mesmo que ele seja privado. Quem tiver o link abre o arquivo quantas vezes quiser dentro da validade.
ttl é a validade em segundos, de 60 (1 minuto) a 604800 (7 dias). Valor fora da
faixa vira o limite mais próximo; sem ttl, ou com valor inválido, vale 3600 (1 hora).
Token de acesso do tenant
Id do arquivo
"a1b2c3d4-e5f6-7890-abcd-ef1234567890""uuid"Link gerado