Skip to main content

APIs da Lerian


Esta seção responde a perguntas comuns sobre as APIs da Lerian.
Sim. O máximo padrão é 100 registros por página. Esse limite mantém o desempenho consistente e controla o volume de dados em cada requisição. Para aumentá-lo, defina a variável de ambiente MAX_PAGINATION_LIMIT na configuração do seu deploy. A API aceita páginas maiores depois que você reinicia a aplicação.Importante: uma página maior pode deixar o tempo de resposta mais lento, principalmente com bases de dados grandes. Teste em staging antes de mudar a produção.

Multi-tenancy e SaaS


Estas perguntas cobrem isolamento de dados, escopo de tenant e como funciona a multi-tenancy nos deploys da Lerian.
Sim. Cada tenant opera em um banco de dados separado. A plataforma resolve seu tenant a partir do JWT em cada requisição e o roteia para seu banco de dados isolado. Não há como acessar os dados de outro tenant pela API. Saiba mais sobre multi-tenancy.
Não. O token de acesso JWT que você recebe durante a autenticação carrega o contexto do seu tenant. A plataforma o resolve automaticamente. Você não precisa incluir um identificador de tenant em headers ou corpos de requisição.
Sim. Um tenant pode conter múltiplas Organizações. Cada Organização tem seus próprios Ledgers, contas e transações. A plataforma limita o escopo de todas elas ao seu tenant automaticamente.
Não. A superfície da API é idêntica: mesmos endpoints, mesmos payloads, mesmas respostas. O SaaS exige autenticação em cada requisição, e seu token limita o escopo de todas as operações ao seu tenant.

Midaz


Estas perguntas cobrem Organizações, Ledgers, Contas, Transações e outros temas do Midaz.

Organizações

Não. Cada Organização opera de forma independente e não se comunica com as outras.
Não. Cada licença vincula a uma Organização. Para operar com várias Organizações, adquira uma licença separada para cada uma. A mesma regra vale para os Plugins.
Sim. Uma Organização pode ter mais de um Plugin.
Sim. Uma Organização pode gerenciar vários Ledgers.
Você pode criar uma Organização Pai e uma Organização Filha. Cada Organização mantém seu próprio Ledger e opera de forma independente. As transações não podem mover valor diretamente entre ledgers. Você orquestra a transferência com estes passos:
1
No ledger de origem, crie uma transação da conta original (source) para a conta externa do ativo (distribute). Isso remove o valor do ledger de origem.
2
No ledger de destino, crie uma segunda transação. O source agora é a conta externa do ativo, e o destino é a conta que recebe (distribute).
Esse padrão move valor entre ledgers em Organizações diferentes.

Ledgers

Não. Ledgers não se comunicam diretamente. Transferências entre Ledgers exigem orquestração.
Você deve orquestrar o processo e mover o valor por meio de uma Conta Externa. Isso envolve dois passos:
1
Ledger A -> Conta Externa.
2
Conta Externa -> Ledger B.
Não. Um único Ledger pode aceitar vários Plugins. Por exemplo, um Ledger pode lidar com os Plugins Exchange e Pix ao mesmo tempo.

Ativos

Não. Cada Ativo vincula a uma única Conta. Cada Ativo também vincula a uma Conta Externa. O Midaz cria essa Conta Externa automaticamente quando você cria o Ativo.
O Midaz aceita vários tipos de Ativo:
  • currency: moedas fiduciárias tradicionais, como BRL, USD e EUR.
  • fiat: um tipo alternativo para moedas fiduciárias; assim como currency, o código do Ativo deve seguir a ISO 4217.
  • crypto: ativos digitais, como BTC, ETH e outras criptomoedas.
  • commodities: bens tangíveis, como ouro, soja e petróleo.
  • others: Ativos personalizados, incluindo pontos de fidelidade e títulos tokenizados.

Portfólios

Um Portfólio agrupa contas que pertencem à mesma entidade (CPF/CNPJ). Por exemplo, um CPF com dois valores diferentes de segment_id tem dois valores correspondentes de account_id. Você cria um Portfólio para esse CPF para vincular as duas contas em uma única estrutura.

Contas

Não. Cada Conta vincula a um único Ativo. Você não pode alterar esse vínculo.
Uma Conta Externa recebe fundos de fora do Ledger. Ela traz dinheiro para dentro do sistema.
O Midaz cria uma Conta Externa automaticamente quando você cria um Ativo. Essa Conta Externa dá suporte a todas as transações que entram e saem do Ledger.
Não. Cada conta (account_id) vincula a apenas um Segmento (segment_id).
Não. Você pode criar quantas Contas precisar. O Midaz não define limite para o número de Contas.
O processo de recarga de saldo funciona assim:
  1. Quando você cria um Ativo (por exemplo, BRL) no Ledger do Midaz, o Midaz também cria uma Conta Externa para esse Ativo.
  2. Essa Conta Externa espelha os saldos que a instituição mantém fora do Midaz. Esses saldos podem estar em uma conta PI, uma conta de liquidação, uma conta Reservas Bancárias ou uma conta bancária ou de pagamento tradicional.
  3. Para depositar fundos de fora do Ledger do Midaz em uma conta de usuário, siga estes passos:
    • Crie uma transação com a Conta Externa como origem e as contas de destino como destino.
    • O Midaz debita a Conta Externa pelo valor (que fica negativo) e credita as contas de destino pelos valores informados no payload da transação.

Transações

Uma Transação deve ter pelo menos duas Operações. Por exemplo, uma transferência de R$ 100 da Conta A para a Conta B tem duas operações:
  • Operação 1: debitar R$ 100 da Conta A.
  • Operação 2: creditar R$ 100 na Conta B.
A Lerian oferece aos clientes várias formas de acessar comprovantes de transação:
  1. Pelas APIs: recupere os dados da transação pelas APIs e gere um comprovante visual no formato que preferir.
  2. Com o Reporter: extraia os dados da transação e crie comprovantes visuais personalizados.
  3. Pelo Console: acesse os dados da transação diretamente no Console da Lerian.

Entidades

A Entidade (entity_id) aceita IDs externos. O Midaz não aplica nenhuma validação sobre esse campo. Você pode usar os IDs que já existem no seu banco de dados e integrá-los ao seu sistema.

Idempotência

O Midaz trata a requisição como nova toda vez. As novas tentativas podem então criar operações duplicadas.
Não. Limite o escopo de cada chave a uma única operação e endpoint.
O Midaz usa apenas o TTL da primeira requisição. Uma mudança posterior não tem efeito.
Sim. Para uma requisição concluída, o Midaz retorna o mesmo resultado armazenado da primeira requisição. Ele também define o header X-Idempotency-Replayed como true.
O TTL padrão é de 300 segundos (5 minutos). Envie o header X-TTL para definir um valor personalizado em segundos.

Contabilidade no Midaz

O Midaz permite espelhar o Plano de Contas oficial da sua organização na plataforma. Você configura dois recursos principais:
  • Tipos de Conta: crie as categorias lógicas do seu plano de contas, como Ativos, Passivos, Receitas e Despesas. Atribua-as às contas do seu ledger. Quando você habilita o recurso Tipos de Conta, o campo type na API de Contas se torna obrigatório e deve corresponder a um valor registrado.
  • Rotas Contábeis: use Rotas de Operação para validar cada perna de uma transação. Por exemplo, um débito deve vir de uma conta do tipo user_wallet. Use Rotas Contábeis (o recurso transactionRoute na API) para definir padrões completos de transação alinhados à sua lógica contábil.
Os Tipos de Conta e as Rotas Contábeis, juntos, aplicam suas regras contábeis no nível do ledger. O Midaz valida e categoriza cada transação de acordo com seu Plano de Contas. Você não grava as regras diretamente no código da sua lógica de negócio.

Plugins


Os Plugins estendem o Midaz com integração e orquestração de processos. Eles fornecem abstrações para que você possa focar no seu modelo de negócio, e não na lógica de sistemas fora do seu domínio. As perguntas abaixo cobrem como os plugins funcionam, como você faz o deploy deles e quais opções estão disponíveis.
Plugins são tecnologias que se integram ao ledger do Midaz. Eles simplificam a integração e a orquestração de processos. Eles fornecem abstrações para que os clientes possam focar no seu modelo de negócio. Os clientes não constroem nem gerenciam lógica de sistema fora do seu domínio.
Não. Os plugins operam apenas com o Midaz. Eles fornecem abstrações específicas e orquestram transações com base na estrutura do ledger.
Depois que você contrata um plugin, a Lerian o fornece e instala na sua infraestrutura (modelo on-premise), ao lado da sua instância do Midaz. As aplicações se conectam a cada plugin de acordo com sua função.
A Lerian oferece dois tipos de plugins, agrupados por origem:
  • Plugins Nativos: a Lerian desenvolve e integra esses plugins ao ledger do Midaz. A Lerian oferece suporte completo a eles.
  • Plugins de Marketplace: os parceiros da Lerian criam esses plugins para nichos de mercado específicos. A Lerian ajuda a integrá-los ao Midaz. Os parceiros os fornecem e dão suporte diretamente.

Fees Engine


Estas perguntas cobrem o Fees Engine. O Fees Engine é um recurso licenciado do Midaz que roda dentro do processo unificado do ledger.

Conceitos Gerais

O Fees Engine é parte do Midaz. Ele roda no processo do ledger do Midaz para calcular tarifas de transações financeiras. Configure e faça o deploy dele junto com o Midaz. Saiba mais na visão geral do Fees Engine. Ele funciona em três domínios principais:
  • Fee Packages (/v2/organizations/{organization_id}/ledgers/{ledger_id}/packages): define regras de cobrança por transação (tarifa fixa, percentual ou o que for maior).
  • Billing Packages (/v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages): define cobranças periódicas com base no volume de transações ou na manutenção de contas.
  • Cálculo e estimativa: o Ledger avalia as tarifas durante o fluxo da transação. Use POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/estimates para uma prévia específica de um pacote e POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing/calculate para cobrança periódica. O Midaz v4 não tem um endpoint de nível superior /v2/fees ou /v2/estimates.
O Fees Engine roda dentro do processo do ledger do Midaz. Quando um Fee Package configurado se aplica, o Midaz incorpora o cálculo da tarifa à transação. Ele usa casos de uso de consulta do ledger em vez de uma conexão HTTP externa com o Midaz.
Os endpoints de Fees têm escopo por organização, definido pelo ID da organização no caminho da URL /v2. A plataforma resolve o contexto do tenant a partir da requisição autenticada; envie o material de autorização exigido pela configuração do seu Access Manager.
O Fees Engine usa o MongoDB para armazenamento. As exclusões seguem o padrão de soft delete. O Fees Engine não remove os registros fisicamente. Ele os marca com deletedAt. Um registro excluído não aparece nas listagens, mas você ainda pode auditá-lo.
O Midaz v4 expõe o Fees dentro do Ledger unificado em /v2. As versões standalone anteriores do plugin-fees seguem sua própria matriz de compatibilidade legada e não fazem parte do modelo de deploy do v4.

Fee Packages

Um Fee Package (Package) é um conjunto de regras de cobrança sob um mesmo feeGroupLabel. Cada package vincula a uma Organização + Ledger e, opcionalmente, a um Segmento. Um package pode conter várias tarifas (objetos Fee), cada uma com sua própria lógica de cálculo. Saiba mais sobre Fee Packages.
Envie um POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/packages com o corpo a seguir. Veja a referência da API Create Package para todos os detalhes.
Sim. Defina o campo enable como false ao criar ou atualizar o package. O Fees Engine ignora um package desativado durante o cálculo de tarifas, mesmo quando o contexto da transação corresponde ao seu escopo.
O Fees Engine aplica o package apenas a transações cujo valor está dentro do intervalo [minimumAmount, maximumAmount]. Se o valor da transação estiver fora desse intervalo, o Fees Engine ignora o package.Exemplo: um package com minimumAmount: 100 e maximumAmount: 5000 cobra tarifas apenas em transações entre 100 e 5.000.
Se você não definir maximumAmount, o package pode se aplicar sem limite superior. Confira as regras de validação da sua versão.
Sim. Defina o campo transactionRoute no package. O Fees Engine passa a considerar o package apenas para transações com essa rota, como "PIX", "TED" ou "BOLETO".
São aliases de conta que o package isenta de tarifas. Se o remetente ou o destinatário de uma transação for uma conta em waivedAccounts, o Fees Engine não aplica as tarifas do package a ela.
Esse package não cobra nenhuma transação que venha dessas contas ou vá para elas.
Sim. Os endpoints de listagem (GET /v2/organizations/{organization_id}/ledgers/{ledger_id}/packages, GET /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages) aceitam os parâmetros de consulta limit e page para paginação.

Modelos de Cálculo

O campo applicationRule dentro de calculationModel define como o Fees Engine calcula a tarifa. Veja Modelos de Cálculo para todos os detalhes. Há três opções:
Use exatamente 1 cálculo do tipo flat:
Isso cobra um valor fixo de 5,00, independentemente do valor da transação.
Use exatamente 1 cálculo do tipo percentage:
Isso cobra 2,5% do valor de referência da transação.
O maxBetweenTypes exige 2 ou mais cálculos que combinem flat e percentage. O Fees Engine calcula os dois e aplica o maior resultado.Exemplo: tarifa mínima de 3,00 ou 1% do valor, o que for maior:
Para uma transação de 200: 1% = 2,00 vs. 3,00 fixo → cobra 3,00. Para uma transação de 500: 1% = 5,00 vs. 3,00 fixo → cobra 5,00.
Sim. Você pode incluir qualquer combinação de flat e percentage. O Fees Engine avalia todos e aplica o maior. Observe que flatFee e percentual exigem exatamente 1 cálculo. Apenas o maxBetweenTypes aceita 2 ou mais.

Campos Importantes

O referenceAmount define sobre qual valor o Fees Engine calcula a tarifa:
  • originalAmount: o valor original da transação, antes de qualquer tarifa.
  • afterFeesAmount: o valor da transação depois que as tarifas de prioridade mais alta se aplicam.
A tarifa com priority: 1 roda primeiro, então ela deve usar originalAmount. Não existem tarifas anteriores para considerar.
Quando isDeductibleFrom: true, o Fees Engine deduz a tarifa do valor que o remetente envia. O destinatário recebe o valor com desconto, e o remetente paga a mais para cobrir a cobrança.Quando false, o Fees Engine cobra a tarifa separadamente. O remetente envia o valor total, e o Fees Engine debita a tarifa à parte.Restrições:
  • isDeductibleFrom: true exige referenceAmount: originalAmount
  • Se o tipo for percentage: o valor não pode passar de 100
  • Se o tipo for flat: o valor não pode passar do minimumAmount do package
O priority define a ordem de execução das tarifas dentro de um package. O Fees Engine executa os valores menores primeiro.
  • priority: 1 → executada primeiro (deve usar originalAmount)
  • priority: 2 → executada depois, pode usar afterFeesAmount
Use prioridades para encadear tarifas. Por exemplo, rode uma tarifa administrativa sobre o valor original. Depois, rode uma tarifa de IOF sobre o valor após a tarifa administrativa.
É o alias da conta do ledger que recebe a receita da tarifa. Cada tarifa pode ter um creditAccount diferente. Isso ajuda quando tarifas diferentes pertencem a centros de custo diferentes.
Esses campos definem as rotas das pernas contábeis que a cobrança da tarifa gera. Eles são opcionais. Eles permitem rastrear a origem e o destino das movimentações de tarifa no ledger.

Billing Packages

Billing Packages são pacotes de cobrança periódica, independentes do cálculo de tarifa por transação. Veja Exemplos de Billing Package para casos de uso. Há dois tipos:
  • volume: cobra com base no número de transações em um período, com preços em camadas.
  • maintenance: cobra uma tarifa fixa por conta em um escopo definido.
Use o billing por volume para cobrar clientes pelo número de transações processadas. Esse é um modelo comum para plataformas de pagamento com preços baseados em volume. Você define faixas de preço que se aplicam conforme o volume cresce.
A última faixa deve ser sem limite (sem maxQuantity). Não pode haver lacunas nem sobreposições entre as faixas.
Use o billing de manutenção para cobrar uma tarifa periódica fixa por conta. Por exemplo, cobre uma tarifa mensal por conta ativa. Você especifica o escopo (segmentId, portfolioId ou aliases) e o valor da tarifa.
O accountTarget deve ter exatamente um dos três campos: segmentId, portfolioId ou aliases (máximo de 100 aliases).
As faixas definem o preço unitário por faixa conforme o volume aumenta. As regras são:
  1. Devem ser contíguas: sem lacunas entre as faixas (minQuantity da próxima = maxQuantity da anterior + 1).
  2. Não podem se sobrepor.
  3. A última faixa deve ser sem limite (sem maxQuantity).
Exemplo de faixas corretas:
É uma franquia gratuita. O Fees Engine não cobra um número fixo de transações antes de as faixas se aplicarem. Isso ajuda modelos de precificação com um volume mínimo incluído.Exemplo: freeQuota: 100 significa que o Fees Engine não cobra as primeiras 100 transações do período.
São faixas de desconto para o billing por volume. Elas reduzem o valor cobrado com base em critérios extras. Elas complementam a lógica das tiers principais.
Ele define como o Fees Engine conta as transações:
  • perRoute: conta as transações por rota (por exemplo, total de Pix aprovados).
  • perAccount: conta as transações por conta individual.

Cálculo e cobrança de tarifas

O Ledger avalia as tarifas no fluxo da transação quando um package correspondente se aplica. O Midaz v4 não tem um endpoint de nível superior /v2/fees ou /v2/estimates. O endpoint POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/estimates, escopado ao ledger, continua disponível para uma prévia específica de um package.
Configure os Fee Packages de transação em /v2/organizations/{organization_id}/ledgers/{ledger_id}/packages e os Billing Packages periódicos em /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages.
Chame POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing/calculate depois de configurar os Billing Packages. Isso processa as regras configuradas para esse Ledger.

Erros Comuns

A tarifa com priority: 1 deve ter referenceAmount: "originalAmount". Ela é a primeira tarifa a rodar, então não existem tarifas anteriores para basear o cálculo.Correção:
Tarifas com isDeductibleFrom: true apenas podem usar referenceAmount: "originalAmount". Atualize o campo:
Quando isDeductibleFrom: true e o tipo é flat, o valor da tarifa não pode passar do minimumAmount do package. Isso evita uma tarifa maior do que o valor mínimo da transação.Exemplo: se minimumAmount: 100, a tarifa fixa não pode passar de 100.
Esse erro ocorre quando isDeductibleFrom: true, o tipo é percentage e o valor é maior que 100. Uma tarifa percentual dedutível de 100% zeraria a transação. Valores acima de 100 são inválidos.
As faixas do billing por volume devem cobrir todos os intervalos sem lacunas. Confira se o minQuantity de cada faixa é exatamente maxQuantity + 1 da faixa anterior.
A última faixa do billing por volume deve ficar sem limite superior (sem maxQuantity). Isso mantém um preço para transações acima da faixa mais alta definida.
No billing de manutenção, o campo accountTarget aceita apenas um dos três valores. Não combine campos:
Sim. O campo aliases aceita no máximo 100 aliases por Billing Package de manutenção.
O applicationRule: "flatFee" aceita exatamente 1 cálculo, e ele deve ser do tipo flat. Não use percentage com flatFee.
Assim como o flatFee, o applicationRule: "percentual" aceita exatamente 1 cálculo do tipo percentage.
O maxBetweenTypes exige pelo menos 2 cálculos, porque precisa de valores para comparar. Informe pelo menos um flat e um percentage.
Checklist de diagnóstico (veja também Boas Práticas):
  • enable: o package está ativo (enable: true)?
  • ledgerId: o package está vinculado ao ledger correto?
  • minimumAmount / maximumAmount: o valor da transação está dentro do intervalo?
  • transactionRoute: se o package tem transactionRoute, a transação usa a mesma rota?
  • segmentId: se o package é escopado a um segmento, a conta pertence a ele?
  • waivedAccounts: a conta está listada como isenta?
O Fees Engine faz soft delete dos registros. Ele os marca com deletedAt e não os remove do banco de dados. A API não expõe endpoints de restauração por padrão. Entre em contato com a equipe da Lerian se precisar recuperar um registro excluído. Para a lista completa de códigos de erro, veja a referência de Códigos de Erro.