Importações: Open Finance

Importação, no siscontabil, das transações bancárias capturadas via Open Finance (TecnoSpeed) como lançamentos contábeis. Cada transação passa pelo mesmo motor da importação de OFX: primeiro as regras de ignorar, depois as regras de classificação (padrões do banco primeiro, regras do cliente/estrutura depois). A captura das transações é feita pelo domínio Open Finance (TecnoSpeed); aqui só se lê o que já foi capturado e se grava a importação.

Base path

/api/v1/importacoes/open-finance

A URL completa em produção é https://api.contabilidadealcance.com.br/api/v1/importacoes/open-finance.

Ordem de montagem

Este router é registrado antes do router de /importacoes. Lá existe /{importacao_id} (inteiro), que capturaria /open-finance/painel e responderia 422 se a ordem fosse a inversa.

Escopos

O router usa o mesmo guard das rotas de /importacoes (_SCOPE_DEP): escopo derivado do path mais o gate de senha provisória. O escopo é derivado do primeiro segmento depois de /api/v1/, então o recurso é importacoes (e não open_finance). Todas as rotas aceitam qualquer funcionário autenticado, inclusive por API Key - não há guard de perfil adicional.

EscopoOperações permitidas
importacoes:readGET /painel, GET /{id_cliente}/contas
importacoes:writePUT /{id_cliente}/contas/{conta_id}/mapeamento, POST /preview, POST /confirmar

POST /preview exige escopo de escrita

O POST /preview não grava nada, mas como o escopo é derivado do método HTTP, ele exige importacoes:write.

Regras de negócio

  • Só matriz. O id_cliente precisa ser uma matriz PJ (senão 422 "A importação Open Finance é feita pela matriz."). O escopo da importação é a matriz mais as filiais da mesma raiz de CNPJ, e a importação é sempre gravada na matriz: a transação de uma filial é lançada na matriz.
  • Conta arquivada fica fora da listagem, do mapeamento e da seleção (422 se pedida). As transações dela já importadas continuam valendo. Conta só inativa (pagador desativado ou desconectada) continua listada e importável.
  • Pendente = transação sem vínculo com uma importação. Toda transação processada por um lote (lançada, ignorada por regra ou com valor zerado) ganha vínculo e deixa de ser pendente. Excluir a importação pelo DELETE /importacoes/{importacao_id} libera as transações.
  • Mapeamento obrigatório. A conta precisa de um de-para para um banco do siscontabil (e, opcionalmente, uma estrutura) antes da prévia e da confirmação.
  • Período de no máximo 366 dias, com início não posterior ao fim (422).

Erros

StatusQuando
404Cliente inexistente, ou conta inexistente ou de outra raiz de CNPJ ("Conta não encontrada.").
409Transações já importadas por outra importação (corrida), ou outra violação de integridade ao gravar (banco, estrutura ou conta mudaram durante a operação).
422Cliente não é matriz, conta arquivada, conta sem mapeamento, banco/estrutura inválidos, nenhuma transação pendente no período, período inválido ou corpo inválido (campos desconhecidos também dão 422).

Endpoints

GET /importacoes/open-finance/painel

Uso do Open Finance por cliente: clientes com ao menos uma conta ativa, com a contagem de contas ativas e autorizadas, a última captura e as transações pendentes (das contas não arquivadas).

Parâmetros

Este endpoint não recebe parâmetros de rota ou query.

Request

Sem corpo de requisição.

Response 200 OK

{
  "status": "success",
  "message": "Painel Open Finance recuperado com sucesso",
  "data": [
    {
      "cliente_id": 487,
      "empresa": "Empresa Exemplo Ltda",
      "id_cliente_importacao": 487,
      "contas_ativas": 2,
      "contas_autorizadas": 1,
      "ultima_captura": "2026-10-15T06:05:00",
      "transacoes_pendentes": 34
    }
  ]
}

Escopo: importacoes:read

GET /importacoes/open-finance/{id_cliente}/contas

Contas Open Finance importáveis do cliente (matriz e filiais), inativas inclusive e sem as arquivadas. Cada conta vem com o mesmo formato do financeiro da TecnoSpeed, mais o mapeamento (ou null) e o resumo das transações pendentes.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
id_clienteintpathsimID do cliente (precisa ser matriz).

Request

Sem corpo de requisição.

Response 200 OK

{
  "status": "success",
  "message": "Contas Open Finance recuperadas com sucesso",
  "data": [
    {
      "id": 7,
      "cliente_id": 487,
      "empresa": "Empresa Exemplo Ltda",
      "bank_code": "341",
      "banco_nome": "Banco Itaú",
      "agencia": "1234",
      "conta_mascarada": "****8765",
      "consentimento_status": "ativo",
      "ativo": true,
      "inativada_por": null,
      "removida_em": null,
      "saldo": "15230.45",
      "saldo_em": "2026-10-15T06:05:00",
      "mapeamento": {
        "id_cliente": 487,
        "conta_tecnospeed_id": 7,
        "id_banco": 12,
        "id_estrutura": null,
        "atualizado_em": "2026-10-15T10:30:00"
      },
      "pendentes": {
        "quantidade": 34,
        "data_inicio": "2026-10-01",
        "data_fim": "2026-10-14"
      }
    }
  ]
}

Escopo: importacoes:read

PUT /importacoes/open-finance/{id_cliente}/contas/{conta_id}/mapeamento

Cria ou atualiza o de-para da conta Open Finance para um banco do siscontabil (e, opcionalmente, uma estrutura). O id_cliente gravado é sempre a matriz. O banco precisa existir e estar ativo; a estrutura, se informada, precisa estar ativa e ser global ou da própria matriz (senão 422).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
id_clienteintpathsimID do cliente (precisa ser matriz).
conta_idintpathsimID da conta Open Finance.

Corpo MapeamentoBody (campos desconhecidos dão 422).

Request

{
  "id_banco": 12,
  "id_estrutura": null
}

Response 200 OK

{
  "status": "success",
  "message": "Conta mapeada",
  "data": {
    "id_cliente": 487,
    "conta_tecnospeed_id": 7,
    "id_banco": 12,
    "id_estrutura": null,
    "atualizado_em": "2026-10-15T10:30:00"
  }
}

Escopo: importacoes:write

POST /importacoes/open-finance/preview

Prévia da importação: mostra o que o confirmar gravaria para as transações pendentes da conta no período. Não grava nada. As transações vêm separadas em lançamentos com regra, sem regra (nasceriam regra_pendente), ignoradas por regra e com valor zerado.

Parâmetros

Sem parâmetros de rota ou query. Corpo PeriodoBody.

Request

{
  "id_cliente": 487,
  "conta_id": 7,
  "inicio": "2026-10-01",
  "fim": "2026-10-14"
}

Response 200 OK

{
  "status": "success",
  "message": "3 transações pendentes no período",
  "data": {
    "id_cliente": 487,
    "conta_id": 7,
    "id_banco": 12,
    "id_estrutura": null,
    "inicio": "2026-10-01",
    "fim": "2026-10-14",
    "total_pendentes": 3,
    "lancamentos": [
      {
        "transacao_id": 9001,
        "data": "2026-10-14",
        "historico": "PIX RECEBIDO CLIENTE EXEMPLO",
        "valor": "1500.00",
        "natureza": "C",
        "numero_documento": null,
        "id_conta_debito": 101,
        "id_conta_credito": 202,
        "regras_aplicadas": ["Recebimento PIX"],
        "status_previsto": "sucesso"
      }
    ],
    "sem_regra": [
      {
        "transacao_id": 9002,
        "data": "2026-10-13",
        "historico": "TED ENVIADA",
        "valor": "800.00",
        "natureza": "D",
        "numero_documento": null,
        "id_conta_debito": null,
        "id_conta_credito": 101,
        "regras_aplicadas": [],
        "status_previsto": "regra_pendente"
      }
    ],
    "ignoradas": [
      {
        "transacao_id": 9003,
        "data": "2026-10-12",
        "historico": "APLICACAO AUTOMATICA",
        "valor": "200.00",
        "natureza": "D",
        "regra_id": 5,
        "regra_nome": "Ignorar aplicação automática"
      }
    ],
    "qtd_valor_zero": 0
  }
}

Escopo: importacoes:write

POST /importacoes/open-finance/confirmar

Importa as transações pendentes da conta no período como lançamentos contábeis. Grava a importação (tipo open_finance, sempre na matriz), os lançamentos e os vínculos de todas as transações processadas numa única transação de banco. status_final é error quando nenhum lançamento é criado (todas ignoradas ou zeradas) e success nos outros casos. Sem transação pendente no período, 422; corrida com outra importação das mesmas transações, 409.

Parâmetros

Sem parâmetros de rota ou query. Corpo PeriodoBody (o mesmo do preview).

Request

{
  "id_cliente": 487,
  "conta_id": 7,
  "inicio": "2026-10-01",
  "fim": "2026-10-14"
}

Response 201 Created

{
  "status": "success",
  "message": "Importação Open Finance concluída: 2 lançamentos criados (status=success)",
  "data": {
    "importacao_id": 1520,
    "status_final": "success",
    "qtd_criados": 2,
    "qtd_ignorados": 1,
    "qtd_ignorados_valor_zero": 0,
    "qtd_transacoes_vinculadas": 3,
    "data_hora_conclusao": "2026-10-15T10:35:00"
  }
}

Escopo: importacoes:write

Schemas

MapeamentoBody

CampoTipoObrigatórioObservações
id_bancointsimBanco do siscontabil (> 0), ativo.
id_estruturaintnãoEstrutura (> 0), ativa, global ou da matriz.

MapeamentoRead

CampoTipoObservações
id_clienteintSempre a matriz.
conta_tecnospeed_idintID da conta Open Finance.
id_bancointBanco mapeado.
id_estruturaintPode ser null.
atualizado_emdatetimePode ser null.

ContaImportavel

Os campos de ContaFinanceiroResumo (veja Open Finance (TecnoSpeed)) - id, cliente_id, empresa, bank_code, banco_nome, agencia, conta_mascarada, consentimento_status, ativo, inativada_por, removida_em, saldo, saldo_em - mais:

CampoTipoObservações
mapeamentoMapeamentoReadnull quando a conta ainda não foi mapeada.
pendentesobjectquantidade, data_inicio e data_fim das transações sem vínculo.

PeriodoBody

Corpo de /preview e /confirmar. Campos desconhecidos dão 422.

CampoTipoObrigatórioObservações
id_clienteintsim> 0; precisa ser matriz.
conta_idintsim> 0; conta do escopo da matriz.
iniciodatesimInício do período.
fimdatesimFim do período (até 366 dias).

PreviewOpenFinance

CampoTipoObservações
id_clienteintCliente informado.
conta_idintConta informada.
id_bancointBanco do mapeamento.
id_estruturaintEstrutura do mapeamento. Pode ser null.
inicio, fimdatePeríodo.
total_pendentesintTransações pendentes no período.
lancamentoslist[LancamentoProposto]Casaram ao menos uma regra.
sem_regralist[LancamentoProposto]Nenhuma regra casou: nascem regra_pendente.
ignoradaslist[TransacaoIgnorada]Casaram uma regra de ignorar: não viram lançamento.
qtd_valor_zerointValor zerado (módulo menor que 0,005): não vira lançamento.

LancamentoProposto

CampoTipoObservações
transacao_idintTransação de origem.
datadateData.
historicostrHistórico do lançamento.
valordecimalString no JSON.
naturezastrC ou D.
numero_documentostrPode ser null.
id_conta_debitointPode ser null.
id_conta_creditointPode ser null.
regras_aplicadaslist[str]Nomes das regras que casaram, na ordem de avaliação. Vazio = sem regra.
status_previstostrsucesso (exige débito e crédito) ou regra_pendente.

TransacaoIgnorada

CampoTipoObservações
transacao_idintTransação de origem.
datadateData.
historicostrHistórico.
valordecimalString no JSON.
naturezastrC ou D.
regra_idintRegra de ignorar que casou.
regra_nomestrNome da regra.

ConfirmarOpenFinanceResponse

CampoTipoObservações
importacao_idintID da importação criada.
status_finalstrsuccess, partial ou error (hoje a rota só produz success e error).
qtd_criadosintLançamentos criados.
qtd_ignoradosintTransações ignoradas por regra.
qtd_ignorados_valor_zerointTransações com valor zerado.
qtd_transacoes_vinculadasintTodas as transações processadas (lançadas, ignoradas e zeradas).
data_hora_conclusaodatetimePode ser null.

PainelCliente

CampoTipoObservações
cliente_idintCliente dono das contas.
empresastrRazão social.
id_cliente_importacaointMatriz pela qual a importação é feita (o próprio cliente, se matriz; a matriz da mesma raiz, se filial e ela estiver cadastrada; senão null).
contas_ativasintContas ativas.
contas_autorizadasintContas ativas com consentimento ativo.
ultima_capturadatetimePode ser null.
transacoes_pendentesintTransações sem vínculo nas contas não arquivadas.

Notas

  • Excluir uma importação open_finance com lançamento já exportado para a Domínio exige confirmar_exportados=true no DELETE /importacoes/{importacao_id} (sem a flag, 409 importacao_com_exportados).
  • Uma conta com transações já lançadas por esta importação não pode ser expurgada no domínio TecnoSpeed (409).