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).

El tipo de evento viaja en el header X-Webhook-Event, no en el 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
payin.reversedUn cobro completado fue reversado
payout.completedLa dispersión se completó
payout.failedLa dispersión falló
payout.expiredLa dispersión venció sin confirmación del proveedor
payout.reversedUna dispersión fue reversada

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

POST /tu-webhook HTTP/1.1
Content-Type: application/json
X-Webhook-Event: payin.completed
X-Webhook-Timestamp: 2026-06-01T10:05:00.000Z
X-Webhook-Signature: sha256=...
{
"txId": "3f9f0c2a8b414f0e9a1d2c3b4a5e6f70",
"reference": "orden-8842",
"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)
referenceEl valor que enviaste al crear la transacción, o null si no enviaste ninguno
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",
"reference": null,
"type": "PAYIN",
"status": "EXPIRED",
"amount": 50000,
"currency": "COP",
"failureReason": "Cobro Nequi expirado sin pago",
"expiredAt": "2026-06-01T10:45:00.000Z"
}

Los webhooks que te enviamos van firmados con HMAC-SHA256 usando la Clave que registraste para NEQUI. Verifica X-Webhook-Signature con tu Clave antes de confiar en el payload. Ver Verificación de firma.

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": "...", "reference": "orden-8842", "type": "PAYIN", "status": "COMPLETED", "amount": 50000, "currency": "COP", "feeCharged": 1500, "netAmount": 48500, "sandbox": true }