Ir al contenido

Webhooks (Nequi)

Nequi notifica los cambios de estado a nuestro gateway. Nosotros recibimos, persistimos, actualizamos la transacción y el balance, y enviamos el evento a tu webhookUrl configurada, con reintentos. Puedes configurar una URL distinta por proveedor (NEQUI / BREB) o una única URL para toda la región CO.

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

EventoCuándo
payin.completedEl cobro (push o QR) fue aprobado y liquidado
payin.failedEl cobro fue rechazado o falló
payin.expiredEl cobro venció sin pago
payout.completedLa dispersión se completó
payout.failedLa dispersión falló
payout.expiredLa dispersión venció sin confirmación del proveedor

payin.completed / payin.failed / payout.completed / payout.failed:

{
"txId": "3f9f0c2a8b414f0e9a1d2c3b4a5e6f70",
"type": "PAYIN",
"status": "COMPLETED",
"amount": 50000,
"currency": "COP",
"feeCharged": 1500,
"netAmount": 48500,
"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
amountMonto en pesos COP
feeChargedFee cobrado en pesos COP (0 si falló)
netAmountMonto neto acreditado — solo en payin.completed

payin.expired / payout.expired:

{
"txId": "9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f",
"type": "PAYIN",
"status": "FAILED",
"amount": 50000,
"currency": "COP",
"failureReason": "Cobro Nequi expirado sin pago",
"expiredAt": "2026-06-01T10:10:00.000Z"
}

En modo sandbox el gateway simula el desenlace automáticamente: al crear una transacción, esta pasa a COMPLETED y recibes el webhook de inmediato con un campo extra:

{ "txId": "...", "type": "PAYIN", "status": "COMPLETED", "amount": 50000, "currency": "COP", "feeCharged": 1500, "netAmount": 48500, "sandbox": true }