Klingo: Despesas

Endpoints da WebApiAlcance para as despesas do sistema Klingo. Cada execução representa uma sincronização de um mês: a API dispara a chamada à Klingo (GET /despesas?mes=YYYY-MM), persiste o resultado (a execução-mãe e seus lançamentos individuais) e devolve o registro criado. Além do disparo, há listagem paginada das execuções do usuário autenticado e busca de uma execução específica por ID.

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 do recurso klingo

O escopo é derivado do 1º segmento da rota (klingo), não de despesas. Portanto os escopos são klingo:read e klingo:write - os mesmos usados por Klingo: Relatórios e Klingo: Consumos. Uma API Key com klingo:read / klingo:write alcança todos os subrecursos klingo/*. Emita chaves com esse escopo apenas quando o consumidor realmente precisar de todo o domínio Klingo.

Base path

/api/v1/klingo/despesas

Escopos necessários

  • klingo:read - listagem das execuções e busca por ID
  • klingo:write - sincronização (dispara a chamada à Klingo e persiste)

O recurso é o primeiro segmento da rota (klingo), compartilhado por todos os subrecursos do domínio Klingo (Despesas, Relatórios, Consumos). O método HTTP define a ação: read para GET, write para POST.

Endpoints

POST /klingo/despesas/sync/

Dispara GET /despesas?mes=YYYY-MM na Klingo, persiste o resultado (execução-mãe + lançamentos) e devolve o registro recém-criado, já com os lancamentos inline.

Rate limit

Bucket klingo_despesas_sync: 10 requisições/min. A infra atual aplica o limite por IP (migração para por-usuário planejada).

Parâmetros

Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (KlingoDespesaSyncInput): mes (obrigatório), no formato YYYY-MM (regex ^\d{4}-(0[1-9]\|1[0-2])$), ex.: 2026-05.

Request

{
  "mes": "2026-05"
}

Response 200 OK

{
  "success": true,
  "message": "Despesas Klingo sincronizadas com sucesso",
  "data": {
    "id": 42,
    "id_usuario_created": 7,
    "mes": "2026-05",
    "total_lancamentos": 128,
    "executado_em": "2026-05-31T09:12:00-03:00",
    "data_hora_criacao": "2026-05-31T09:12:00-03:00",
    "payload_bruto": {},
    "lancamentos": [
      {
        "id": 1001,
        "id_lancamento_klingo": 55012,
        "descricao": "Aluguel unidade centro",
        "emissao": "2026-05-05",
        "venc": "2026-05-10",
        "valor": "3500.00",
        "categoria_nome": "Despesas fixas",
        "data_hora_criacao": "2026-05-31T09:12:00-03:00"
      }
    ]
  }
}

O service mapeia ValueError para o status HTTP: 422 (regra de negócio), 502 (token rejeitado, falha de transporte/HTTP/parse ou 404 do gateway Klingo), 413 (payload da Klingo excede o limite) e 404 (registro não encontrado por RLS). Escopo: klingo:write

GET /klingo/despesas/

Lista, de forma paginada, as execuções persistidas do usuário autenticado, em ordem decrescente de executado_em. Sempre filtra por id_usuario_created = usuário logado. Retorna a projeção enxuta KlingoDespesaExecucaoReadSemDados - sem lancamentos e sem payload_bruto; use GET /{execucao_id} para o dataset completo.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
skipint >= 0querynãoOffset para paginação. Default 0.
limitint 1..200querynãoTamanho da página. Default 50.
messtrquerynãoFiltra por mês no formato YYYY-MM (regex ^\d{4}-(0[1-9]|1[0-2])$).
executado_em_iniciodatetimequerynãoFiltra por executado_em >= valor (ISO 8601).
executado_em_fimdatetimequerynãoFiltra 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": "Execucoes de despesas Klingo recuperadas com sucesso",
  "data": {
    "items": [
      {
        "id": 42,
        "id_usuario_created": 7,
        "mes": "2026-05",
        "total_lancamentos": 128,
        "executado_em": "2026-05-31T09:12:00-03:00",
        "data_hora_criacao": "2026-05-31T09:12:00-03:00"
      }
    ],
    "total": 1
  }
}

Quando não há registros, data é [] com a mensagem "Nenhuma execucao de despesas Klingo encontrada.". Escopo: klingo:read

GET /klingo/despesas/{execucao_id}

Busca uma execução persistida pelo ID interno (klingo_despesas_execucoes.id), validando ownership (RLS por id_usuario_created). Retorna KlingoDespesaExecucaoRead - mãe + lancamentos (com eager load para evitar N+1).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
execucao_idintpathsimID interno da execução persistida.

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Execucao de despesas Klingo encontrada com sucesso",
  "data": {
    "id": 42,
    "id_usuario_created": 7,
    "mes": "2026-05",
    "total_lancamentos": 128,
    "executado_em": "2026-05-31T09:12:00-03:00",
    "data_hora_criacao": "2026-05-31T09:12:00-03:00",
    "payload_bruto": {},
    "lancamentos": [
      {
        "id": 1001,
        "id_lancamento_klingo": 55012,
        "descricao": "Aluguel unidade centro",
        "emissao": "2026-05-05",
        "venc": "2026-05-10",
        "valor": "3500.00",
        "categoria_nome": "Despesas fixas",
        "data_hora_criacao": "2026-05-31T09:12:00-03:00"
      }
    ]
  }
}

Quando não encontrado (ou de outro usuário), retorna 404 Not Found. Escopo: klingo:read

Schemas

KlingoDespesaSyncInput

Body do POST /sync/. O período vai no body (write não idempotente), nunca na query string.

CampoTipoObrigatórioObservações
messtrsimFormato YYYY-MM, validado por regex. Ex.: 2026-05.

KlingoDespesaExecucaoReadSemDados

Projeção enxuta para a listagem paginada - sem lancamentos e sem payload_bruto.

CampoTipoNotas
idintIdentificador da execução.
id_usuario_createdintUsuário que criou a execução (base do RLS).
messtrMês sincronizado (YYYY-MM).
total_lancamentosint?Quantidade de lançamentos da execução.
executado_emdatetimeMomento da execução (America/Sao_Paulo).
data_hora_criacaodatetimeCriação do registro (America/Sao_Paulo).

KlingoDespesaExecucaoRead

Projeção completa (usada em POST /sync/ e GET /{id}). Estende a projeção enxuta com os campos pesados.

CampoTipoNotas
(todos acima)-Mesmos campos de KlingoDespesaExecucaoReadSemDados.
payload_brutoAnyPayload bruto retornado pela Klingo. Default null.
lancamentosList[KlingoDespesaLancamentoRead]Lançamentos individuais da execução. Default [].

KlingoDespesaList

Página de execuções devolvida por GET /klingo/despesas/.

CampoTipoNotas
itemsList[KlingoDespesaExecucaoReadSemDados]Execuções da página (projeção enxuta).
totalintTotal absoluto de execuções (sem paginação).

KlingoDespesaLancamentoRead

Lançamento individual persistido em klingo_despesas_lancamentos (aparece dentro de lancamentos).

CampoTipoNotas
idintIdentificador interno do lançamento.
id_lancamento_klingoint?ID do lançamento na Klingo.
id_unidade_operacaoint?Unidade de operação.
id_centro_custoint?Centro de custo.
id_fornecedorint?Fornecedor.
id_categoriaint?Categoria.
emissaodate?Data de emissão.
vencdate?Data de vencimento.
docstr?Documento.
descricaostr?Descrição do lançamento.
messtr?Mês de referência.
valor_brutoDecimal?Valor bruto.
valor_adiantadoDecimal?Valor adiantado.
valorDecimal?Valor final.
categoria_nomestr?Nome da categoria.
categoria_naturezastr?Natureza da categoria.
centro_nomestr?Nome do centro de custo.
unidade_nomestr?Nome da unidade.
unidade_siglastr?Sigla da unidade.
fornecedor_nome_fantasiastr?Nome fantasia do fornecedor.
fornecedor_cpf_cnpjstr?CPF/CNPJ do fornecedor.
payload_bruto_lancamentoAnyPayload bruto do lançamento vindo da Klingo.
data_hora_criacaodatetimeCriação do registro (America/Sao_Paulo).

Notas

Armadilha de roteamento FastAPI

As rotas estáticas POST /sync/ e GET / são declaradas antes da rota dinâmica GET /{execucao_id}, para que o FastAPI não interprete sync como um execucao_id. Ao chamar a sincronização, use a barra final: /klingo/despesas/sync/.

  • Toda resposta segue o envelope { success, message, data } (ou { success: false, message, details } em erro).
  • A listagem (GET /) devolve a projeção enxuta (sem lancamentos nem payload_bruto) por questão de volume e segurança; busque pelo GET /{id} quando precisar do dataset completo.
  • Todo acesso é restrito ao usuário autenticado (id_usuario_created): a listagem filtra e a busca por ID valida ownership (RLS), retornando 404 para execuções de outros usuários.
  • Datas/horas são normalizadas para o fuso America/Sao_Paulo na serialização.
  • Recurso compartilha os escopos klingo:read / klingo:write com Klingo: Relatórios e Klingo: Consumos.