🔌 API de Ingestão

Como um sistema externo — SIEM, scanner, ERP, CMDB — empurra registros para a plataforma.

Como começar O token Descobrir os campos Enviar dados Exemplos por entidade Códigos de erro Perguntas

Como começar

1Peça o token ao administrador da empresa. Ele emite em Gestão da Empresa › Tokens de ingestão, escolhendo quais entidades o seu sistema pode gravar. Diga a ele o que você precisa escrever — um token com escopo maior que o necessário é risco desnecessário para os dois lados.
2Descubra o formato. Chame GET /api/ingestao-pub/entidades com o token. A resposta lista as entidades liberadas e, para cada uma, todos os campos com tipo, obrigatoriedade e exemplo. É a fonte da verdade — mais confiável que esta página, porque vem do mesmo código que valida.
3Teste sem gravar. Mande o mesmo corpo para POST /api/ingestao-pub/{entidade}/preview. Ele valida tudo e devolve linha a linha o que passaria e o que seria recusado, sem escrever nada. Use isto durante o desenvolvimento inteiro.
4Grave. Mesmo corpo, sem o /preview.

O token

Autenticação por Bearer token no cabeçalho:

Authorization: Bearer ing_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
O token define a empresa. Não existe cabeçalho, parâmetro ou campo do corpo para dizer em qual empresa gravar — isso sai do token e só dele. Um token pertence a uma empresa e nunca alcança outra.
O token aparece uma única vez, na tela em que foi criado. A plataforma guarda apenas um resumo criptográfico dele — nem o suporte consegue recuperá-lo. Guarde no cofre de segredos do seu sistema; se perder, peça a revogação e a emissão de um novo.

Escopo

Cada token grava apenas nas entidades marcadas pelo administrador. Um token do SIEM que tenta gravar em emissao recebe 403 — e a mensagem diz explicitamente que a entidade existe, mas está fora do escopo, para você não perder tempo procurando erro de digitação no nome.

Descobrir os campos

# O que este token pode gravar, e com quais campos
curl "https://SEU-DOMINIO/api/ingestao-pub/entidades" \
  -H "Authorization: Bearer $TOKEN"

Resposta (recortada):

{
  "sucesso": true,
  "dados": {
    "token": { "nome": "SIEM Produção", "prefixo": "ing_AbCdEfGh", "modo": "UPSERT" },
    "maxLinhasPorRequisicao": 500,
    "entidades": [{
      "entidade": "incidente_seguranca",
      "nome": "Incidentes de segurança (ISO 27001)",
      "endpoint": "POST /api/ingestao-pub/incidente_seguranca",
      "campos": [
        { "campo": "codigo", "rotulo": "Código *", "obrigatorio": true,
          "tipo": "texto", "exemplo": "INC-2026-0007" },
        { "campo": "tipo", "rotulo": "Tipo (CIA) *", "obrigatorio": true,
          "descricao": "Confidencialidade, Integridade ou Disponibilidade...",
          "exemplo": "Disponibilidade" }
      ]
    }]
  }
}
Use a chave campo, não o rotulo. É o engano mais comum de quem integra: o rótulo ("Código *") é o que aparece na planilha para o usuário final; o JSON usa "codigo". Campo com nome desconhecido é simplesmente ignorado — e se ele era obrigatório, a linha é recusada por "obrigatório" sem parecer relacionado.

Enviar dados

MétodoCaminhoO que faz
GET/api/ingestao-pub/entidadesLista o escopo do token e o formato de cada entidade
POST/api/ingestao-pub/{entidade}/previewValida e devolve o resultado sem gravar
POST/api/ingestao-pub/{entidade}Grava

Formato do corpo

{
  "linhas": [
    { "campo1": "valor", "campo2": "valor" },
    { "campo1": "valor", "campo2": "valor" }
  ]
}

Regras que valem para todas as entidades:

AssuntoRegra
DatasDD/MM/AAAA (aceita com hora). Também aceita ISO.
EnumsMandam-se em português por extenso, não o valor interno: "Disponibilidade", "Alta", "Encerrado". Sinônimos comuns são aceitos; se não for reconhecido, a mensagem de erro lista as opções válidas.
Sim/Não"Sim" / "Não" (também aceita true/false).
VazioOmitir a chave e mandar "" são equivalentes.
ReenvioNo modo UPSERT (padrão), reenviar o mesmo registro atualiza em vez de duplicar. A chave é o campo marcado como tal na entidade — geralmente codigo. É seguro reenviar a mesma janela de dados a cada execução.
Teto500 linhas por requisição (o valor real vem em maxLinhasPorRequisicao). Acima disso, 413 — divida em lotes.
Frequência60 requisições por minuto por origem.

Resposta

{
  "sucesso": true,
  "mensagem": "2 linha(s) gravada(s), 1 recusada(s).",
  "dados": {
    "entidade": "incidente_seguranca",
    "modo": "UPSERT",
    "preview": false,
    "loteId": "8f3c...",
    "totalLinhas": 3,
    "gravadas": 2,
    "recusadas": 1,
    "resultados": [
      { "linha": 1, "status": "OK", "id": "a1b2..." },
      { "linha": 2, "status": "OK", "id": "c3d4...", "aviso": "Ativo \"AT-9\" não está no inventário — incidente gravado sem vínculo com ativo." },
      { "linha": 3, "status": "ERRO", "erros": ["Data de detecção: \"32/13/2026\" não é uma data válida (use DD/MM/AAAA)."] }
    ]
  }
}
sucesso: true não significa que tudo entrou. Ele diz que o lote foi processado. Quem responde "o que entrou?" é gravadas / recusadas e a lista resultados. Monitore recusadas > 0 — senão o seu sistema vai achar que está sincronizando enquanto metade dos registros é rejeitada em silêncio.
aviso não é erro. A linha entrou; o aviso conta o que a plataforma interpretou, ignorou ou não conseguiu vincular. Vale registrar no seu log — é onde aparece "o responsável não é usuário da empresa" e coisas do gênero.

Exemplos por entidade

SIEM → incidente de segurança

Atenção ao campo tipo: ele classifica a propriedade violada (a tríade Confidencialidade / Integridade / Disponibilidade), não o vetor de ataque. Ransomware que derrubou o serviço é "Disponibilidade""Ransomware" e "Vazamento de dados" não são valores válidos.

curl -X POST "https://SEU-DOMINIO/api/ingestao-pub/incidente_seguranca" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "linhas": [{
      "codigo": "INC-2026-0007",
      "titulo": "Indisponibilidade do portal de protocolo",
      "descricao": "Falha no cluster de banco deixou o portal fora por 4h10",
      "tipo": "Disponibilidade",
      "severidade": "Alta",
      "dataDeteccao": "12/03/2026",
      "status": "Encerrado",
      "ativoAfetado": "AT-2026-0001",
      "dadosPessoaisEnvolvidos": "Não",
      "rootCause": "Disco cheio no nó primário sem alerta configurado"
    }]
  }'

Scanner de vulnerabilidade → inventário de ativos

curl -X POST "https://SEU-DOMINIO/api/ingestao-pub/ativo_informacao/preview" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"linhas":[{"codigo":"AT-SRV-0042","nome":"Servidor de aplicação — nó 2"}]}'

Repare no /preview: rode assim até a saída ficar limpa. Só então tire o sufixo.

GRC → risco corporativo

curl -X POST "https://SEU-DOMINIO/api/ingestao-pub/risco_corporativo" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"linhas":[{"codigo":"R-2026-014","titulo":"Dependência de fornecedor único de nuvem"}]}'

Medidor / ERP → ESG

curl -X POST "https://SEU-DOMINIO/api/ingestao-pub/consumo_energia" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"linhas":[{"competencia":"03/2026"}]}'
Os campos exatos de cada entidade — inclusive os obrigatórios que os exemplos acima abreviam — vêm de GET /entidades. Ela é gerada do mesmo código que valida, então nunca fica desatualizada em relação a esta página.

Códigos de erro

Erro sempre traz sucesso: false, um codigo estável (bom para tratar no seu código) e um erro em texto (bom para o log).

HTTPcodigoO que significa e o que fazer
401TOKEN_AUSENTEFaltou o cabeçalho Authorization: Bearer ....
401TOKEN_INVALIDOO token não é reconhecido. Confira se copiou inteiro (não tem espaço nem quebra de linha).
401TOKEN_REVOGADOO administrador revogou. Não adianta repetir — peça a emissão de um novo e reconfigure.
401TOKEN_INATIVODesativado temporariamente. Reversível: peça a reativação.
401TOKEN_EXPIRADOPassou da validade. A mensagem traz a data. Peça renovação.
401TOKEN_SEM_ESCOPOO token existe mas nenhuma entidade foi liberada nele. É configuração incompleta do lado do cliente.
403ENTIDADE_FORA_DO_ESCOPOA entidade existe, mas este token não pode gravar nela. A resposta traz entidadesDoToken. Não é erro de digitação — é decisão do administrador.
404ENTIDADE_DESCONHECIDANão existe entidade com esse nome. A resposta traz entidadesExistentes. Isto sim costuma ser digitação.
400CORPO_INVALIDOO corpo não é {"linhas":[{...}]}, ou algum item não é objeto.
400LOTE_VAZIOlinhas veio vazio.
413LOTE_GRANDE_DEMAISPassou do teto. A resposta traz maximo e recebidas. Divida.
429Passou de 60 requisições por minuto. Espere e repita — com espaçamento, não em rajada.
500ERRO_INTERNOFalha nossa. Pode repetir com segurança no modo UPSERT.
401 e 403 não se resolvem repetindo. São estado do token, não instabilidade. Se o seu sistema tem retry automático, exclua esses dois da política — repetir só vai encher o log do cliente e disparar o limite de requisições.

Perguntas

Posso reenviar os mesmos dados toda hora?

Sim, no modo UPSERT (padrão). O registro é casado pela chave da entidade e atualizado. É o desenho recomendado: mande a janela inteira a cada execução, em vez de tentar controlar do seu lado o que já foi enviado.

No modo INSERT, o reenvio é reportado como duplicata (não vira erro, mas também não grava). Se o seu sistema reenvia, peça um token em UPSERT.

O que acontece se uma linha do lote falhar?

As outras entram normalmente. Não há transação de lote inteiro: uma linha ruim no meio de 500 não descarta as 499 boas. A recusada aparece em resultados com o motivo, e você reenvia só ela depois de corrigir.

Como sei se o registro entrou de verdade?

Cada item de resultados com status: "OK" traz o id gerado. Além disso, todo lote fica registrado na plataforma — o administrador vê no histórico de importações, com o nome do token como origem.

Preciso de um token por sistema?

É a recomendação. Com um token por sistema dá para revogar o do scanner sem derrubar o do ERP, e o histórico diz qual sistema gravou o quê. Um token compartilhado por três integrações vira um problema quando um deles precisa sair.

Existe um endpoint para consultar/apagar dados?

Não. Esta API só grava. É deliberado: o token é entregue a um sistema de terceiro, e leitura em massa dos dados do cliente é uma superfície diferente, que merece controle próprio. Para leitura, use a API autenticada por sessão de usuário.

E se a entidade que eu preciso não estiver liberada?

O administrador da empresa acrescenta no escopo do token, na tela de tokens de ingestão — sem precisar gerar um token novo nem reconfigurar o seu sistema. Peça a ele.