Klingo: Relatórios
Endpoints da WebApiAlcance para trabalhar com relatórios do sistema Klingo - a plataforma de gestão de clínicas médicas integrada à Alcance. Cobrem a sincronização sob demanda (dispara a chamada na API da Klingo, persiste o resultado no banco), a listagem paginada dos relatórios já executados pelo usuário e a leitura individual de um registro com o dataset completo (colunas + linhas).
Todos os endpoints exigem autenticação. Veja Autenticação para o fluxo de API Key. O Swagger oficial está em api.contabilidadealcance.com.br/docs.
Escopo compartilhado
O recurso é derivado do 1º segmento após /api/v1/, que é klingo. Portanto os escopos são klingo:read / klingo:write - não klingo_relatorio. Esse escopo klingo é compartilhado com Klingo: Despesas e Klingo: Consumos: uma API Key com klingo:read enxerga a leitura dos três domínios.
Base path
/api/v1/klingo/relatorioEscopos necessários
klingo:read- listagem paginada e leitura individual de relatórios persistidosklingo:write- sincronização (dispara a API externa e escreve no banco)
O escopo vem do primeiro segmento da rota (klingo) e o método HTTP define a ação (read para GET, write para POST). Como o escopo klingo é compartilhado entre Relatórios, Despesas e Consumos, emita API Keys com o menor escopo necessário - preferencialmente klingo:read.
Endpoints
POST /klingo/relatorio/sync/
Dispara a chamada GET /relatorio na API da Klingo, persiste o resultado no banco e devolve o registro recém-criado (com colunas e linhas inline). Não é idempotente (escreve no banco e chama a API externa a cada requisição), por isso é POST; está sujeito a rate limit no bucket klingo_sync (10 requisições/min por IP).
Parâmetros
Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (KlingoRelatorioSyncInput): id (obrigatório, ID do relatório na Klingo) e parametros (opcional, string crua de parâmetros).
Request
{
"id": 20,
"parametros": "data_inicio=2026-06-01&data_fim=2026-06-30"
}Response 200 OK
{
"success": true,
"message": "Relatório Klingo sincronizado com sucesso",
"data": {
"id": 42,
"id_usuario_created": 7,
"id_relatorio_klingo": 20,
"titulo": "Faturamento por convênio",
"parametros_enviados": "data_inicio=2026-06-01&data_fim=2026-06-30",
"total_linhas": 128,
"klingo_status_code": 200,
"klingo_msg": "OK",
"executado_em": "2026-07-03T10:15:00-03:00",
"data_hora_criacao": "2026-07-03T10:15:00-03:00",
"colunas": [
{ "indice": 0, "nome": "convenio", "titulo": "Convênio", "tipo": "string" }
],
"linhas": [
{ "indice": 0, "col0": "Unimed", "col1": "12.450,00" }
],
"payload_bruto": {}
}
}Erros possíveis: 422 (regra de negócio da Klingo), 413 (payload excede o limite), 502 (token rejeitado, falha de transporte/parse ou 404 do gateway Klingo). Escopo: klingo:write
GET /klingo/relatorio/
Lista, de forma paginada, os relatórios persistidos do usuário autenticado, em ordem decrescente de executado_em. Sempre filtra por id_usuario_created = usuário logado (RLS por dono). Retorna KlingoRelatorioReadSemDados (mãe + colunas, sem linhas e sem payload_bruto); para o dataset completo, busque pelo GET /{relatorio_id}.
Parâmetros
| Parâmetro | Tipo | Local | Obrigatório | Descrição |
|---|---|---|---|---|
skip | int >= 0 | query | não | Offset para paginação. Default 0. |
limit | int 1..200 | query | não | Tamanho da página. Default 50. |
id_relatorio_klingo | int >= 1 | query | não | Filtra pelo ID do relatório na Klingo. |
executado_em_inicio | datetime | query | não | Filtra por executado_em >= valor (ISO 8601). |
executado_em_fim | datetime | query | não | Filtra por executado_em <= valor (ISO 8601). Hora 00:00:00 é expandida para o fim do dia. |
Request
Sem corpo de requisição.
Response 200 OK
{
"success": true,
"message": "Relatórios Klingo recuperados com sucesso",
"data": {
"items": [
{
"id": 42,
"id_usuario_created": 7,
"id_relatorio_klingo": 20,
"titulo": "Faturamento por convênio",
"total_linhas": 128,
"executado_em": "2026-07-03T10:15:00-03:00",
"data_hora_criacao": "2026-07-03T10:15:00-03:00",
"colunas": []
}
],
"total": 1
}
}Quando não há registros, retorna data: [] com a mensagem "Nenhum relatório Klingo encontrado.". Escopo: klingo:read
GET /klingo/relatorio/{relatorio_id}
Busca um registro persistido pelo ID interno (klingo_relatorios.id), validando o ownership (id_usuario_created = usuário logado). Retorna o dataset completo (KlingoRelatorioRead: mãe + colunas + linhas + payload_bruto), com eager load para evitar N+1 na serialização.
Parâmetros
| Parâmetro | Tipo | Local | Obrigatório | Descrição |
|---|---|---|---|---|
relatorio_id | int | path | sim | ID interno do relatório persistido (não é o ID da Klingo). |
Request
Sem corpo de requisição.
Response 200 OK
{
"success": true,
"message": "Relatório Klingo encontrado com sucesso",
"data": {
"id": 42,
"id_usuario_created": 7,
"id_relatorio_klingo": 20,
"titulo": "Faturamento por convênio",
"parametros_enviados": "data_inicio=2026-06-01&data_fim=2026-06-30",
"total_linhas": 128,
"klingo_status_code": 200,
"klingo_msg": "OK",
"executado_em": "2026-07-03T10:15:00-03:00",
"data_hora_criacao": "2026-07-03T10:15:00-03:00",
"colunas": [
{ "indice": 0, "nome": "convenio", "titulo": "Convênio", "tipo": "string" }
],
"linhas": [
{ "indice": 0, "col0": "Unimed", "col1": "12.450,00" }
],
"payload_bruto": {}
}
}Quando não encontrado (ou de outro dono), retorna 404 Not Found com detail: "Relatório Klingo não encontrado.". Escopo: klingo:read
Schemas
KlingoRelatorioSyncInput
| Campo | Tipo | Obrigatório | Observações |
|---|---|---|---|
id | int | sim | ID do relatório na Klingo (ex.: 20). Mínimo 1. |
parametros | str | não | String crua de parâmetros (?parametros=), formato definido pela Klingo. Default "", máx. 500 caracteres. |
KlingoRelatorioReadSemDados
Projeção usada na listagem paginada. Herda os campos-base; não inclui linhas nem payload_bruto.
| Campo | Tipo | Notas |
|---|---|---|
id | int | ID interno do registro persistido. |
id_usuario_created | int | Dono do relatório (usado no RLS). |
id_relatorio_klingo | int | ID do relatório na Klingo. |
titulo | str? | Título do relatório. |
parametros_enviados | str? | Parâmetros efetivamente enviados à Klingo. |
total_linhas | int? | Quantidade de linhas do dataset. |
inputs | Any? | Inputs associados à execução. |
klingo_status_code | int? | Status HTTP retornado pela Klingo. |
klingo_msg | str? | Mensagem retornada pela Klingo. |
executado_em | datetime | Momento da execução (fuso America/Sao_Paulo). |
data_hora_criacao | datetime | Momento da criação do registro (fuso America/Sao_Paulo). |
colunas | List[Coluna] | Definição das colunas (ver abaixo). Default []. |
KlingoRelatorioRead
Projeção completa, usada em POST /sync/ e GET /{relatorio_id}. Estende KlingoRelatorioReadSemDados acrescentando:
| Campo | Tipo | Notas |
|---|---|---|
payload_bruto | Any | Payload bruto retornado pela Klingo. Default null. |
linhas | List[Linha] | Linhas do dataset (ver abaixo). Default []. |
KlingoRelatorioColunaRead
| Campo | Tipo | Notas |
|---|---|---|
indice | int | Índice/posição da coluna. |
nome | str | Nome interno da coluna. |
titulo | str? | Rótulo exibido no cabeçalho. |
tipo | str? | Tipo do dado da coluna. |
formato | str? | Formato de exibição. |
align | str? | Alinhamento (left/right/etc.). |
definicao_bruta | Any | Definição bruta da coluna. |
KlingoRelatorioLinhaRead
| Campo | Tipo | Notas |
|---|---|---|
indice | int | Índice da linha no dataset. |
col0 … col9 | str? | Até 10 colunas achatadas para consulta. |
dados_linha_json | Any | Linha completa em JSON (todos os campos). |
Notas
- Toda resposta segue o envelope
{ success, message, data }(ou{ success: false, message, details }em erro). - Ordem de rotas (FastAPI). As rotas estáticas
POST /sync/eGET /são declaradas antes da rota dinâmicaGET /{relatorio_id}, para que o FastAPI não interpretesynccomo umrelatorio_id. - Os campos
executado_emedata_hora_criacaosão localizados no fusoAmerica/Sao_Paulona serialização. GET /{relatorio_id}usa o ID interno do registro persistido - diferente doid_relatorio_klingo(o ID do relatório na plataforma Klingo).- O escopo
klingoé compartilhado com Klingo: Despesas e Klingo: Consumos.