Versiones anteriores del plugin rechazaban las transferencias intra-PSP con el error
PIX-0406: Intra PSP Not Supported. Ese error fue eliminado — las transferencias y reembolsos intra-PSP ahora están totalmente soportados.Detección
El plugin marca una transferencia como intra-PSP cuando el ISPB de destino es igual a tu
PIX_ISPB configurado:
| Tipo de iniciación | Fuente del ISPB de destino |
|---|---|
KEY / QR_CODE | Respuesta de consulta DICT (account.participant) |
MANUAL | destination.ispb en el payload de la solicitud |
isIntraPSP: true:
isIntraPSP se propaga a las entidades Transfer, Cashout, Cashin y Refund para consulta y reconciliación.
Modelo de procesamiento
Las transferencias intra-PSP siguen el mismo enrutamiento de Midaz que las transferencias externas (a través de la cuenta de tránsito
@external), por lo que el comportamiento del libro mayor es idéntico. La única diferencia es que la liquidación ocurre de forma síncrona dentro del plugin en lugar de a través de webhooks de BTG.
Se crean dos transacciones de Midaz por transferencia:
- Cashout —
source → @external(pending: false) - Cashin —
@external → destination(pending: false)
CashinApprovalCommand y CashinSettlementCommand que los cash-ins externos, incluyendo la validación de alias de CRM, las verificaciones de saldo, la titularidad de la clave PIX, la finalización del cobro y el cálculo de tarifas.
Flujo
El cashout responde con
PROCESSING, exactamente como un cashout externo a la espera de BTG. El estado final (COMPLETED/FAILED) se entrega de forma asíncrona vía webhook saliente. El endpoint intra-PSP es totalmente idempotente, por lo que los reintentos del worker nunca duplican transacciones.Reporte regulatorio TRCK002
Cada transacción intra-PSP exitosa se reporta a BACEN a través del endpoint de abstracción TRCK002 de BTG, dentro del SLA regulatorio de P99 ≤ 300 segundos.
- El reporte TRCK002 es no bloqueante — una falla de reporte nunca revierte la transacción de Midaz ni la finalización de la transferencia. Los reportes fallidos se reintentan con backoff exponencial.
- BTG devuelve una entidad
PixInternalTransactionsReportcon unpactualIdy un estado inicial dePROCESSING. - Las actualizaciones de estado del reporte llegan vía un webhook CAMT025 (
PixInternalTransactionsReport) en el endpoint de eventos de BTG, transicionando el reporte aCONFIRMEDoERROR. - Como respaldo cuando se pierden webhooks, el estado del reporte se puede consultar por end-to-end ID o por identificación de devolución.
Reembolsos intra-PSP
Un reembolso (devolução) de una transferencia cuyo cash-in original fue intra-PSP también se procesa internamente:
- El plugin detecta intra-PSP cuando el cash-in original tiene
isIntraPSP = true. - Debita al solicitante del reembolso (
requester → @external), luego orquesta el cash-in del reembolso al remitente original a través del mismo patrón de cola + endpoint. - El reembolso se reporta a TRCK002 con un
returnIdentification. - Webhooks salientes:
refund.completed/refund.failedal solicitante ycashin.completedal remitente original.
Motivos de falla
Las fallas de validación de cash-in se entregan de forma asíncrona vía el webhook
cashout.failed. Motivos comunes de falla intra-PSP:
| Código | Descripción |
|---|---|
RECIPIENT_ACCOUNT_INVALID | Falló la validación de alias de CRM (cuenta no encontrada, cerrada, bloqueada) |
RECIPIENT_CANNOT_RECEIVE | Falló la validación de saldo del libro mayor |
PIX_KEY_OWNERSHIP_INVALID | La clave PIX no pertenece a la cuenta de destino |
COLLECTION_INVALID | Falló la validación del cobro de QR code dinámico |
INTERNAL_CREDIT_FAILED | Falló la transacción de crédito del libro mayor |
INTERNAL_DEBIT_REVERT_FAILED | Crítico — falló la reversión del débito; requiere reconciliación manual |
Próximos pasos
- Webhooks — Envoltorio de eventos, reintentos y enrutamiento
- Operaciones de reembolso — Reembolsos distribuidos y desbloqueo
- Configurar la integración — Configuración de ISPB y del worker
- Referencia de API — Documentación completa de la API

