Por que dois passos
Dividir um cash-out em iniciar e processar dá a você um ponto de verificação entre “quem é o recebedor?” e “envie o dinheiro”:
- Confirme o destino primeiro. A iniciação valida e resolve a conta do recebedor sem tocar em saldos. Uma chave Pix errada ou uma conta inválida falha aqui, antes de qualquer dinheiro se mover.
- Mostre ao pagador quem recebe o dinheiro. A resposta da iniciação retorna o titular resolvido da conta. Seu app pode mostrar o nome real e deixar o pagador confirmar antes.
- Mova os fundos apenas na confirmação. O plugin não debita nada até você processar a transferência. Se o pagador abandonar o fluxo, não há movimentação a desfazer.
Os dois passos são idempotentes. Você pode repeti-los sem criar transferências duplicadas. Veja Novas tentativas e idempotência.
Passo 1: iniciar (confirme o destino)
Iniciar uma transferência cria um registro de vida curta que valida e resolve o recebedor sem mover fundos. Como o plugin encontra o destino depende do que você tem no começo:
Para
KEY e QR_CODE, você nunca informa o destino. O plugin o resolve e o retorna na resposta, pronto para mostrar ao pagador para confirmação.
Requisição: escolha a aba do seu tipo de iniciação
type da conta são CACC (corrente), SVGS (poupança), TRAN (transacional) e OTHR (outra). endToEndId é opcional para todos os tipos. O plugin gera um quando você o omite.
Resposta
A resposta retorna oid da iniciação (usado como initiationId no passo 2) e o destination resolvido:
As iniciações expiram. A resposta inclui um timestamp
expiresAt. Processe a transferência antes que ela expire ou inicie de novo. Isso impede que um destino confirmado fique desatualizado entre a consulta e o pagamento.Passo 2: processar (mover o dinheiro)
O processamento executa o cash-out a partir da iniciação que você confirmou. Ele debita a conta de origem e depois roteia o pagamento ao BTG para liquidação com o BACEN. A liquidação com a rede Pix é assíncrona. A transferência volta como
PROCESSING enquanto o BTG liquida. O resultado final (concluído ou falho) chega depois por um webhook cashout. Monte seu fluxo para reagir a esse evento, não para esperar a resposta do processamento. Veja Webhooks.
Requisição
Passe oid da resposta de iniciação como initiationId, junto com o amount a transferir:
amount é obrigatório. Você também pode passar um description opcional (máximo de 140 caracteres) e metadata (atributos chave-valor customizados).
O header X-Purpose
Use o header X-Purpose opcional para declarar o motivo do cash-out. Ele assume TRANSFER como padrão quando é omitido:
QR codes de valor fixo: a iniciação pode ser um
QR_CODE cujo payload EMV carrega um valor fixo. Nesse caso, o amount que você envia ao processar deve ser igual ao valor codificado. Uma divergência é rejeitada antes de qualquer fundo se mover.Resposta
Quando o destino pertence à sua própria instituição, o dinheiro nunca sai para o BTG. Ele liquida internamente como uma transferência P2P. Veja Transferências intra-PSP.
Acompanhar uma transferência
Toda transferência segue o mesmo ciclo de vida. Ela começa em
PENDING/PROCESSING enquanto está em trânsito e depois chega a um COMPLETED, FAILED ou CANCELLED terminal. Para ver em que ponto uma transferência está, consulte uma delas pelo id. Você também pode listar transferências filtradas por status, tipo (cash-out ou cash-in) ou período.
status, type (CASHOUT/CASHIN), end_to_end e modified_after/modified_before, além da paginação page/limit/sort_order.
Como as transferências chegam ao Midaz
O plugin lança toda movimentação liquidada no Midaz como uma transação no ledger, com a perna externa contra a conta
@external/BRL. O Midaz registra o lançamento e os metadados de correlação, não os dados bancários completos da transferência. Agência, número da conta, tipo de conta e chave Pix da contraparte nunca chegam ao Midaz. A única exceção é a identidade do pagador no cash-in (sourceBank, sourceDocument, sourceName), gravada quando é conhecida. O detalhe completo da contraparte fica no registro de transferência do plugin.
Os metadados gravados na transação do Midaz dependem do fluxo:
O
code da transação no Midaz também carrega o endToEndId (ou a returnIdentification nas devoluções), então o identificador E2E fica visível direto no lançamento do ledger.
A correlação funciona nos dois sentidos:
- O plugin guarda os identificadores de transação e de operação do Midaz nos seus próprios registros de transferência e de devolução, e os usa para confirmar, cancelar ou reverter lançamentos.
- A transação do Midaz carrega chaves de correlação nos seus metadados: filtre por
metadata.endToEndIdpara cash-outs e cash-ins, ou pormetadata.originalEndToEndId/metadata.returnIdentificationpara devoluções. Ocodeda transação é o fallback comum. Ele carrega o ID E2E nas transferências e a identificação de devolução nas devoluções.
O
metadata customizado que você passa ao processar um cash-out é guardado com o registro de transferência do plugin e retornado pela API do próprio plugin. Ele não é copiado para a transação do Midaz. O plugin fixa as chaves de metadados do Midaz listadas acima.Quando uma transferência trava
Se a chamada de liquidação ao BTG der timeout antes de o BTG confirmar, uma transferência pode ficar em
PROCESSING com os fundos retidos. O plugin oferece uma operação de desbloqueio. O desbloqueio reconsulta a transferência no BTG e a leva ao estado final correto. Ele liquida a transferência se o BTG confirmar, ou libera a retenção se o BTG nunca a tiver recebido.
O desbloqueio não se aplica a transferências intra-PSP. Não há transação no BTG para reconsultar. Para o comportamento completo do desbloqueio e suas opções, veja Operações de devolução.
Próximos passos
- Transferências intra-PSP: Liquidação P2P interna
- QR Codes: Geração e decodificação de QR codes
- Operações de devolução: Devoluções e desbloqueio
- Webhooks: Tratamento de eventos de cash-out e cash-in
- Referência da API: Detalhes completos de requisição e resposta, headers e schemas de campos

