O Balance Overdraft permite que um saldo seja debitado além dos fundos disponíveis sem deixar o saldo primário ficar negativo. O déficit é rastreado como OverdraftUsed, e o Midaz trata automaticamente o split da operação entre o saldo primário e um saldo companion interno. Quando créditos chegam, o reembolso é priorizado — o overdraft é quitado primeiro, e qualquer excedente vai para o Available. Esse mecanismo suporta linhas de crédito, BNPL, contas de liquidação, antecipação salarial e qualquer cenário onde posições negativas controladas são necessárias.Documentation Index
Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
Use this file to discover all available pages before exploring further.
Direção do saldo
Os saldos possuem um campo
direction que define como débitos e créditos afetam o saldo:
| Direção | Comportamento | Uso típico |
|---|---|---|
credit (padrão) | Débito diminui, crédito aumenta | Saldos tipo ativo — contas correntes, carteiras, reservas |
debit | Débito aumenta, crédito diminui | Saldos tipo passivo — empréstimos, rastreamento de overdraft, contas a pagar |
A direção é definida no momento da criação e é imutável. O saldo companion de overdraft (descrito abaixo) sempre usa
direction=debit.Configurações do saldo
O objeto
settings no saldo controla o comportamento de overdraft:
| Campo | Tipo | Descrição |
|---|---|---|
allowOverdraft | boolean | Habilita overdraft neste saldo |
overdraftLimitEnabled | boolean | Define se um limite é imposto |
overdraftLimit | string (decimal) | Valor máximo de overdraft. Obrigatório quando overdraftLimitEnabled é true. Deve ser maior que 0. |
Um campo
balanceScope também existe dentro de settings, mas é gerenciado pelo sistema — ele distingue saldos internos (como o companion de overdraft) de saldos transacionais. Você não define este campo diretamente.Modos de configuração
Sem overdraft (padrão)
O comportamento padrão. Qualquer débito que exceda o saldo disponível é rejeitado.Overdraft ilimitado
O saldo pode ficar negativo sem teto. Útil para contas de liquidação ou pool onde posições negativas são normais e reconciliadas externamente.Overdraft limitado
O saldo pode ficar negativo até um limite definido. O modo mais comum para produtos de crédito ao consumidor.Como o overdraft funciona
Split de operação
Quando uma transação de débito excede os fundos disponíveis, o Midaz automaticamente divide a operação:- O débito consome todo o Available restante, fixando-o em 0.
- O excedente é acumulado como OverdraftUsed no saldo primário.
- Uma operação companion é criada no saldo interno
"overdraft"(descrito abaixo), registrando o passivo como um débito de partida dobrada.
| Etapa | Available | OverdraftUsed | Descrição |
|---|---|---|---|
| Antes | 300 | 0 | Estado normal |
| Depois | 0 | 200 | 300 consumidos do Available, 200 acumulados como overdraft |
Se um limite está configurado, o Midaz valida que o OverdraftUsed resultante não excede o
overdraftLimit antes de processar. Se exceder, a transação é rejeitada com o erro 0167 - ErrOverdraftLimitExceeded.Reembolso automático (refund split)
Quando um crédito chega eOverdraftUsed > 0, o Midaz prioriza o reembolso:
- O crédito é aplicado ao OverdraftUsed primeiro, reduzindo a dívida.
- Qualquer valor remanescente após o OverdraftUsed atingir 0 vai para o Available.
- Uma operação companion no saldo
"overdraft"registra o reembolso.
| Etapa | Available | OverdraftUsed | Descrição |
|---|---|---|---|
| Antes | 0 | 200 | Overdraft ativo |
| Depois | 150 | 0 | 200 quitados, 150 vão para o Available |
Cancelamento de transação pendente com overdraft
Quando uma transaçãoPENDING que consumiu overdraft é cancelada, o Midaz mantém o saldo companion sincronizado com o primário:
- O cancelamento reverte o hold original e qualquer overdraft consumido durante a janela pending —
OverdraftUsedretorna ao valor anterior à transação pending. - Uma operação
CREDITcompanion no saldo"overdraft"reduz o passivo no valor exato que foi consumido, quitando-o. - Tanto o cancelamento primário quanto o crédito companion são aplicados no mesmo batch atômico, então o saldo primário e o companion nunca saem de sincronia — mesmo que o cancelamento chegue em uma rajada de alta vazão.
Position
Toda resposta de saldo inclui um bloco computado
position que fornece uma visão em tempo real do estado do saldo:
| Campo | Descrição |
|---|---|
available | Balance.Available menos OverdraftUsed. Pode ser negativo quando o overdraft está ativo. |
onHold | Espelha Balance.OnHold — fundos reservados por operações pendentes. |
overdraftLimitAvailable | Headroom restante de overdraft. "0" quando overdraft está desabilitado. Omitido quando ilimitado. Decimal positivo quando um limite está configurado. |
Saldo companion
Na primeira vez em que
allowOverdraft passa para true em um saldo — seja na criação, seja num update — o Midaz auto-provisiona um saldo companion sob a mesma conta para registrar o lado do passivo na partida dobrada. Ele é criado uma única vez por conta e reutilizado em cada draw e quitação de overdraft.
| Propriedade | Valor | Por quê |
|---|---|---|
key | "overdraft" | Chave reservada do sistema |
direction | debit | O companion rastreia um passivo — débitos o aumentam, créditos o reduzem |
scope | internal | Bloqueia operações diretas de usuários |
allowSending | true | Necessário para operações DEBIT no companion (consumo de overdraft) |
allowReceiving | true | Necessário para operações CREDIT no companion (quitação de overdraft) |
- Não pode ser criado, modificado ou excluído pela API pública.
- A chave
"overdraft"é reservada — tentar criar um saldo com esta chave retorna o erro0170 - ErrReservedBalanceKey. - Ele espelha o passivo como um registro de partida dobrada, garantindo que o ledger permaneça equilibrado.
O valor
scope: "internal" controla o acesso direto de usuários independentemente das flags de permissão acima — qualquer tentativa de operar diretamente neste saldo é rejeitada com o erro 0168 - ErrDirectOperationOnInternalBalance. O companion só se movimenta via enrichment de overdraft conduzido pelo sistema.Estado de overdraft nas operações
Toda operação expõe o estado de overdraft diretamente nos blocos
balance e balanceAfter. O campo overdraftUsed captura quanto de overdraft foi consumido antes e depois da operação — fornecendo uma trilha de auditoria completa sem precisar de uma consulta separada ao saldo.
Para operações que não tocam o overdraft, ambos os valores são "0".
Operações companion gerenciadas pelo sistema no saldo "overdraft" são expostas com type: "OVERDRAFT" (em maiúsculas). O campo direction carrega a semântica do ciclo de vida: "debit" para um draw, "credit" para um reembolso.
overdraftUsed antes/depois — ambas espelham a transição de overdraft do saldo primário, tornando o ciclo de vida visível a partir de qualquer um dos lados. A coluna interna snapshot (JSONB) na tabela operations armazena os mesmos valores para indexação e reconstrução histórica; ela não faz parte do JSON público e aparece em balance.overdraftUsed e balanceAfter.overdraftUsed. Contexto adicional gerado pelo sistema pode ser adicionado ao snapshot sem quebrar o contrato público.
Eventos de overdraft
O Midaz publica eventos de ciclo de vida no RabbitMQ quando o estado de overdraft muda. A publicação está habilitada por padrão — defina a flag como
"false" para desabilitar.
Tipos de evento
| Evento | Descrição |
|---|---|
overdraft.drawn | Overdraft foi consumido — OverdraftUsed aumentou |
overdraft.repaid | Overdraft foi parcialmente reembolsado — OverdraftUsed diminuiu mas permanece > 0 |
overdraft.cleared | Overdraft foi totalmente quitado — OverdraftUsed atingiu 0 |
Exemplo de payload do evento
Casos de uso
Cheque especial (overdraft de conta corrente)
Crédito clássico ao consumidor. O saldo da conta corrente pode ficar negativo até um limite pré-aprovado, com juros acumulados sobre o valor em aberto.Buy Now, Pay Later (BNPL)
Um provedor de BNPL emite um crédito de compra contra o saldo do cliente, criando uma posição de overdraft imediata que é quitada em parcelas.Antecipação salarial (Earned Wage Access)
Funcionários sacam contra rendimentos futuros. A posição de overdraft é liquidada quando os créditos de folha de pagamento chegam.Antecipação de recebíveis de marketplace
Vendedores recebem uma antecipação sobre recebíveis futuros. O overdraft é quitado automaticamente conforme as liquidações de vendas chegam.Contas de liquidação / Pool (modo ilimitado)
Contas de liquidação e pool rotineiramente ficam negativas durante o processamento intradiário. Overdraft ilimitado evita rejeições artificiais enquanto a posição é conciliada no fim do dia.Linhas de crédito rotativo (B2B)
Empresas sacam e quitam de uma facilidade de crédito rotativo. O limite de overdraft representa a linha de crédito total.Pré-financiamento de seguros
Seguradoras pré-financiam sinistros antes do fechamento dos ciclos de cobrança de prêmios. O overdraft cobre o gap entre pagamento e arrecadação.Programas de fidelidade (pontos antecipados)
Clientes resgatam pontos antes de acumulá-los. O overdraft rastreia o déficit de pontos, quitado conforme novos pontos são acumulados.Regras de proteção
O overdraft introduz diversas restrições de imutabilidade e acesso para manter a integridade do ledger:
- Direção é imutável. Uma vez definida na criação, a
directionde um saldo não pode ser alterada. - Saldos internos são somente leitura. O saldo companion
"overdraft"não pode ser criado, excluído ou atualizado pela API pública. Solicitações PATCH em saldos internos são rejeitadas com o erro0175. - Chaves reservadas. A chave
"overdraft"é reservada para o saldo companion gerenciado pelo sistema. - Desabilitar overdraft preserva a dívida pendente. Definir
allowOverdraft: falseenquantoOverdraftUsed > 0é permitido — a flag bloqueia novas saídas via overdraft, enquanto créditos recebidos continuam quitando a dívida existente até zerá-la. - Limite não pode cair abaixo do uso. Se
OverdraftUsed = 200, definiroverdraftLimit: "100"é rejeitado (erro0173) — quite o overdraft abaixo do novo teto primeiro, ou defina um limite maior. - Concorrência otimista. Atualizações de saldo usam controle de concorrência baseado em versão. Escritas obsoletas são rejeitadas com o erro
0174— tente novamente com a versão mais recente.
Próximos passos
- Conheça os Saldos — a base sobre a qual o overdraft é construído.
- Entenda as Operações para rastrear como os splits de overdraft aparecem no ledger.
- Configure o Event Publisher para consumir eventos de ciclo de vida do overdraft.
- Explore as Transações para a visão completa da contabilidade de partida dobrada no Midaz.

