Saltar al contenido principal
Los webhooks son el mecanismo principal que usa el Plugin Pix Indirecto (BTG) para notificarte sobre eventos relacionados con Pix en tiempo real. Recibes callbacks asíncronos y orientados a eventos cuando ocurren cambios en las operaciones Pix: transferencias, devoluciones, reclamaciones de claves o eventos de MED.
Estos webhooks aplican solo al modelo Pix Indirecto vía BTG.Los webhooks de Pix Directo pueden variar según el modelo de conectividad. Una página aparte los documenta.

Requisitos previos


Antes de configurar los webhooks, confirma que tienes:
  • El Plugin Pix Indirecto configurado y en ejecución (consulta Cómo funciona la participación indirecta)
  • Un endpoint HTTPS listo para recibir solicitudes de webhook
  • Conocimiento básico del ciclo de vida de los eventos Pix y de los flujos de transacciones

Qué te dan los webhooks


Los webhooks no son opcionales en las operaciones de Pix Indirecto. Pix es un sistema asíncrono y multipartito. Una solicitud de API puede tener éxito antes de que la transacción llegue a su estado final. El sistema confirma ese estado después, tras la liquidación y la confirmación de la contraparte. Los webhooks permiten que tu sistema:
  • Sigue el estado autoritativo de las transacciones
  • Reacciona a devoluciones, reversiones y eventos de MED
  • Mantén la consistencia del ledger y la operativa
  • Reduzca el polling y la carga operativa

Tipos de eventos


Recibes eventos agrupados por flujo y entidad, alineados con los dominios de BACEN (Banco Central do Brasil). Cada evento refleja una transición de estado en el ecosistema Pix. Trata cada evento como la fuente de verdad.
Las dos entidades de MED 2.0 se comportan de forma distinta. El plugin emite FUNDS_RECOVERY después de actualizar su registro local. FUNDS_RECOVERY_EVENTS es de paso: lleva los eventos de ciclo de vida de BTG sin actualización en la base de datos. Consulta MED 2.0: Recuperación de fondos para el flujo completo.
DICT (Diretório de Identificadores de Contas Transacionais) es el directorio de BACEN que gestiona las claves Pix y las operaciones relacionadas, como reclamaciones, infracciones y devoluciones.

Configuración de webhooks


Para habilitar los webhooks, configura las URLs de destino y selecciona qué tipos de evento recibe tu sistema.

Variables de entorno


Puedes configurar los endpoints de webhook en el nivel de entidad, de flujo o global. Las otras entidades siguen el mismo patrón, por ejemplo WEBHOOK_DICT_FUNDS_RECOVERY_EVENTS_URL o WEBHOOK_SCHEDULE_CASHOUT_URL. Cada flujo también tiene una URL en el nivel de flujo para todas sus entidades, WEBHOOK_<FLOW>_URL. El plugin la usa cuando no existe una URL en el nivel de entidad, por ejemplo WEBHOOK_DICT_URL o WEBHOOK_TRANSFER_URL.
El plugin entrega solo los eventos de las entidades que configuras. Define al menos una variable WEBHOOK_<FLOW>_<ENTITY>_* por entidad que quieres recibir, por ejemplo WEBHOOK_DICT_CLAIM_URL o WEBHOOK_DICT_CLAIM_ENABLED=true. Una URL en el nivel de flujo o una URL predeterminada, por sí sola, no activa una entidad.

Prioridad de resolución de URL


Cuando configuras varias URLs, el plugin las resuelve en este orden:
  1. URL en el nivel de entidad Ejemplo: WEBHOOK_DICT_CLAIM_URL
  2. URL en el nivel de flujo Ejemplo: WEBHOOK_DICT_URL
  3. URL predeterminada WEBHOOK_DEFAULT_URL

Formato de la solicitud


Headers


Cada solicitud de webhook incluye headers estandarizados para la trazabilidad.

Estructura del cuerpo


El esquema del payload varía según el tipo de evento, pero siempre representa un cambio de estado.

Respuestas y comportamiento de reintento


Respuesta esperada


Tu endpoint debe devolver un estado HTTP 2xx para confirmar la entrega exitosa.

Estrategia de reintentos


El plugin reintenta automáticamente las entregas fallidas con backoff exponencial (multiplicador predeterminado 2): Valores predeterminados
  • Máximo de intentos: 10
  • Timeout por solicitud: 10 segundos (WEBHOOK_WORKER_TIMEOUT)
Después de que falla el último intento, el plugin mueve el evento a una dead-letter queue para el seguimiento operativo. Para listar los eventos fallidos y enviar uno de nuevo, usa GET /v1/webhooks/outbound y POST /v1/webhooks/outbound/{id}/retry.

Backoff personalizado

Puedes cambiar el multiplicador de backoff por entidad:

Protección con circuit breaker


Un circuit breaker protege la entrega de webhooks y evita fallas en cascada. Cuando el Plugin Pix detecta fallas repetidas de entrega (de forma predeterminada, 5 respuestas 5xx o errores de conexión consecutivos), pausa temporalmente las llamadas de webhook para ese flujo y esa entidad. Después de un período de espera configurable (30 segundos de forma predeterminada), el sistema reintenta el endpoint para verificar si se recuperó. Cuando el endpoint devuelve respuestas exitosas, el plugin reanuda la entrega normal automáticamente.
El circuit breaker funciona junto con los reintentos y el backoff exponencial.

Consultar y reintentar webhooks


El plugin guarda los webhooks que recibe de BTG (entrantes) y los webhooks que te envía (salientes). Usa estos endpoints para encontrar un webhook y procesarlo o enviarlo de nuevo:

Errores de transporte y eventos huérfanos


Cuando el plugin recibe una solicitud de devolución de MED, busca la transferencia original a lo largo de la cadena cash-in → cash-out. Si ninguna fuente local coincide, el plugin persiste la devolución como un registro huérfano para la auditabilidad ante BACEN. No descarta la devolución, por lo que el registro queda visible para la conciliación y el seguimiento. Si una consulta de fuente falla en la capa de transporte, el plugin omite esa fuente y continúa. Cuando ninguna fuente se resuelve, el plugin registra la devolución como huérfana. originalEndToEndId es la clave canónica para todas las consultas de devoluciones. El plugin resuelve las devoluciones con este campo en ambos sentidos, cash-in → devolución y cash-out → devolución. Indexa siempre las devoluciones por originalEndToEndId (el ID end-to-end de la transferencia original), no por una única ruta de consulta específica de un sentido.

Informes de transacciones internas (intra-PSP)


El plugin liquida internamente las transferencias intra-PSP (P2P). Nunca llegan a BTG para su liquidación, pero el plugin igual las informa a BACEN mediante la abstracción TRCK002. BTG confirma el estado del informe mediante un webhook CAMT025 que lleva la entidad PixInternalTransactionsReport. El plugin actualiza el estado del informe cuando el webhook de informe CAMT025 confirma o falla. Los webhooks salientes se disparan antes, cuando la transferencia intra-PSP se liquida: TRANSFER / CASHIN para el tramo de cash-in y TRANSFER / CASHOUT para el tramo de cash-out. Para el flujo interno completo, consulta Transferencias intra-PSP. Para listar los informes de transacciones, usa GET /v1/transaction-reports. Si el worker no envió un informe, envíalo con POST /v1/transaction-reports/{id}/submit. El plugin no cambia un informe que ya está en PROCESSING o CONFIRMED. El webhook CAMT025 entrega el resultado.

Informes de tiempos de transacción (TemposTransacoes)


El plugin calcula los percentiles de experiencia del pagador de TemposTransacoes de BACEN para un mes de referencia cerrado. Para iniciar el cálculo, envía POST /v1/statistics/tempos-transacoes/jobs con el referenceMonth en formato YYYY-MM. El job empieza en PENDING, pasa a RUNNING y termina en COMPLETED o FAILED. Un mes de referencia puede tener un job PENDING o RUNNING a la vez. Para leer el job de un mes, usa GET /v1/statistics/tempos-transacoes/jobs/{referenceMonth}. Cuando el estado es COMPLETED, el campo result trae los percentiles. El plugin también envía un webhook REPORT / TEMPOSTRANSACOES con el resultado cuando el job se completa.

Mejores prácticas


Ejemplos de eventos


Expande cada entrada para ver un payload de ejemplo de ese tipo de evento. Cada ejemplo muestra los campos principales. Un payload puede traer más.
Eventos de ciclo de vida de titularidad o portabilidad. Úsalos para seguir las disputas de claves Pix entre instituciones.
Eventos de señalización de disputas y de fraude alineados con las reglas de MED de BACEN.
Solicitudes de devolución y decisiones relacionadas con los casos de MED.
Cambios de estado de la entidad de recuperación de fondos. El plugin actualiza su registro local antes de enviar el evento.
Los eventos de ciclo de vida llegan como entityType: FUNDS_RECOVERY_EVENTS (de paso, sin actualización en la BD), con valores de payload.body.event como FUNDS_RECOVERY_ANALYSED y FUNDS_RECOVERY_COMPLETED.
Eventos de transferencias Pix entrantes y salientes.Cash-in (transferencia entrante):
Cash-out (transferencia saliente):
Eventos de liquidación de devoluciones de transacciones Pix.Cash-in de devolución (recibir una devolución):
Cash-out de devolución (enviar una devolución):

Próximos pasos