Versões anteriores do plugin rejeitavam transferências intra-PSP com o erro
PIX-0406: Intra PSP Not Supported. Esse erro foi removido — transferências e devoluções intra-PSP agora têm suporte completo.Detecção
O plugin marca uma transferência como intra-PSP quando o ISPB de destino é igual ao seu
PIX_ISPB configurado:
| Tipo de iniciação | Origem do ISPB de destino |
|---|---|
KEY / QR_CODE | Resposta da consulta ao DICT (account.participant) |
MANUAL | destination.ispb no payload da requisição |
isIntraPSP: true:
isIntraPSP é propagada para as entidades Transfer, Cashout, Cashin e Refund para consulta e conciliação.
Modelo de processamento
Transferências intra-PSP seguem o mesmo roteamento Midaz das transferências externas (por meio da conta de trânsito
@external), de modo que o comportamento do ledger é idêntico. A única diferença é que a liquidação ocorre de forma síncrona dentro do plugin, em vez de via webhooks do BTG.
Duas transações Midaz são criadas por transferência:
- Cashout —
source → @external(pending: false) - Cashin —
@external → destination(pending: false)
CashinApprovalCommand e CashinSettlementCommand dos cash-ins externos, incluindo validação de alias do CRM, verificações de saldo, propriedade da chave PIX, conclusão da cobrança e cálculo de tarifa.
Fluxo
O cashout responde com
PROCESSING, exatamente como um cashout externo aguardando o BTG. O status final (COMPLETED/FAILED) é entregue de forma assíncrona via webhook de saída. O endpoint intra-PSP é totalmente idempotente, então as retentativas do worker nunca duplicam transações.Reporte regulatório TRCK002
Toda transação intra-PSP bem-sucedida é reportada ao BACEN por meio do endpoint de abstração TRCK002 do BTG, dentro do SLA regulatório de P99 ≤ 300 segundos.
- O reporte TRCK002 é não bloqueante — uma falha de reporte nunca reverte a transação Midaz nem a conclusão da transferência. Reportes que falham são reprocessados com backoff exponencial.
- O BTG retorna uma entidade
PixInternalTransactionsReportcom umpactualIde um status inicialPROCESSING. - Atualizações de status do reporte chegam via webhook CAMT025 (
PixInternalTransactionsReport) no endpoint de eventos do BTG, transicionando o reporte paraCONFIRMEDouERROR. - Como fallback quando webhooks são perdidos, o status do reporte pode ser consultado por identificador end-to-end ou identificação de retorno.
Devoluções intra-PSP
Uma devolução para uma transferência cujo cash-in original foi intra-PSP também é processada internamente:
- O plugin detecta o caso intra-PSP quando o cashin original tem
isIntraPSP = true. - Ele debita o solicitante da devolução (
requester → @external), depois orquestra o cash-in da devolução ao remetente original por meio do mesmo padrão de fila + endpoint. - A devolução é reportada ao TRCK002 com um
returnIdentification. - Webhooks de saída:
refund.completed/refund.failedpara o solicitante ecashin.completedpara o remetente original.
Motivos de falha
Falhas de validação do cash-in são entregues de forma assíncrona via o webhook
cashout.failed. Motivos comuns de falha intra-PSP:
| Código | Descrição |
|---|---|
RECIPIENT_ACCOUNT_INVALID | Validação de alias do CRM falhou (conta não encontrada, encerrada, bloqueada) |
RECIPIENT_CANNOT_RECEIVE | Validação de saldo no ledger falhou |
PIX_KEY_OWNERSHIP_INVALID | A chave PIX não pertence à conta de destino |
COLLECTION_INVALID | Validação da cobrança de QR code dinâmico falhou |
INTERNAL_CREDIT_FAILED | Transação de crédito no ledger falhou |
INTERNAL_DEBIT_REVERT_FAILED | Crítico — reversão do débito falhou; requer conciliação manual |
Próximos passos
- Webhooks — Envelope de eventos, retentativas e roteamento
- Operações de devolução — Devoluções distribuídas e desbloqueio
- Configurando a integração — Configuração de ISPB e worker
- Referência da API — Documentação completa da API

