Ir al contenido

Webhooks (Bre-B)

Bre-B notifica los cambios de estado a nuestro gateway. Verificamos la firma, actualizamos la transacción y el balance, y enviamos el evento a tu webhookUrl configurada, con reintentos. Puedes configurar una URL específica para BREB o una única URL para toda la región CO.

FlujoSecuencia
Entrante (pay-in)receivedconfirmedsettled
Saliente (pay-out)confirmedsettled
Cualquierarejected termina el flujo

Mapeo a estado interno:

Evento Bre-BEstado interno
*.settledCOMPLETED (terminal, mueve el balance)
*.rejectedFAILED (terminal)
*.received / *.confirmedPROCESSING (informativo, no se reenvía)

El nombre del evento llega en el header X-Webhook-Event (no dentro del body).

EventoCuándo
payin.completedEl cobro QR fue liquidado (settled)
payin.failedEl cobro fue rechazado
payin.expiredEl QR venció sin pago (estado final EXPIRED)
payout.completedLa dispersión se liquidó
payout.failedLa dispersión fue rechazada

Payload de payin.completed / payin.failed / payout.completed / payout.failed:

{
"txId": "a1b2c3d4e5f64a7b8c9d0e1f2a3b4c5d",
"type": "PAYIN",
"status": "COMPLETED",
"amount": 50000,
"currency": "COP",
"feeCharged": 1500,
"netAmount": 48500,
"e2eId": "E2E-20260601-0001",
"updatedAt": "2026-06-01T10:05:00.000Z"
}
CampoDescripción
txIdID de la transacción (coincide con el de la creación)
typePAYIN o PAYOUT
statusCOMPLETED o FAILED
feeChargedFee cobrado en pesos COP (0 si falló)
netAmountMonto neto acreditado — solo en payin.completed
e2eIdIdentificador end-to-end de la red Bre-B

Payload de payin.expired:

{
"txId": "a1b2c3d4e5f64a7b8c9d0e1f2a3b4c5d",
"type": "PAYIN",
"status": "EXPIRED",
"amount": 50000,
"currency": "COP",
"failureReason": "Transaction expired without provider confirmation",
"expiredAt": "2026-06-01T10:15:00.000Z"
}

A diferencia de Nequi, los webhooks que Bre-B nos envía llegan firmados con HMAC-SHA256. Nuestro gateway verifica la firma del header contra el secret compartido con comparación de tiempo constante antes de procesar. Esto es interno — no cambia el formato del webhook que tú recibes.

En modo sandbox el desenlace se simula automáticamente al crear la transacción: recibes el webhook de inmediato con el campo extra "sandbox": true.