Ir al contenido

Colombia — Descripción general

Colombia (CO) soporta dos proveedores de pago, accesibles bajo el prefijo /v1/co/*:

  • Nequi — cobro por notificación push al celular, cobro con QR y dispersión a celulares Nequi.
  • Bre-B — sistema de pagos inmediatos interoperable de Colombia: cobro con QR, cobro por llave efímera, dispersión a llaves Bre-B y validación de llaves.

El proveedor se elige por la ruta: /v1/co/payin/... y /v1/co/payout/...Nequi; /v1/co/breb/...Bre-B.

La autenticación hacia nuestra API usa 4 headers firmados con ECDSA-SHA256 (secp256k1). Ver Firma ECDSA.

La API key debe crearse con region: "CO". Una key de CO solo firma paths /v1/co/*.

HeaderDescripción
x-client-idID de la API Key del cliente (región CO)
x-timestampISO 8601 actual (±5 min)
x-nonceString único por request
x-signatureFirma ECDSA-SHA256 en Base64
x-content-sha256SHA-256 del body en hex minúscula

Todas las respuestas viajan envueltas: { "success": true, "data": { … }, "requestId": "…" } en éxito, y { "success": false, "error": { "code", "message", "details" }, "requestId": "…" } en error. Los campos de negocio están dentro de data.

En los ejemplos de estas páginas se muestra solo el contenido de data. Ver Códigos HTTP y errores para el envoltorio completo y la tabla de error.code.

Todos los endpoints usan autenticación por firma. Montos siempre en pesos COP enteros.

MétodoPathDescripción
GET/v1/co/balanceBalance regional CO con desglose por proveedor
GET/v1/co/transactionsLista de transacciones (Nequi + Bre-B) para conciliación
MétodoPathDescripción
POST/v1/co/payin/pushCobro por notificación push
GET/v1/co/payin/push/{txId}Estado de un cobro push
POST/v1/co/payin/push/{txId}/cancelCancelar un cobro push pendiente
POST/v1/co/payin/qrCobro con código QR
GET/v1/co/payin/qr/{txId}Estado de un cobro QR
POST/v1/co/payout/disburseDispersión a celular Nequi
GET/v1/co/payout/{externalId}Estado de una dispersión
MétodoPathDescripción
POST/v1/co/breb/payin/qrCrear QR de cobro dinámico (con monto)
GET/v1/co/breb/payin/qr/{txId}Estado del cobro (alias: /v1/co/breb/payin/{txId})
GET/v1/co/breb/payin/qr/{txId}/detailDetalle del recurso QR en la red
POST/v1/co/breb/payin/qr/decodeDecodificar una cadena EMVCo de QR
DELETE/v1/co/breb/payin/qr/{txId}Cancelar/eliminar un QR
POST/v1/co/breb/payin/keyCrear cobro por llave efímera (sin QR)
GET/v1/co/breb/payin/key/{txId}Estado de un cobro por llave
DELETE/v1/co/breb/payin/key/{txId}Cancelar un cobro por llave
POST/v1/co/breb/validate-keyValidar una llave sin exponer PII
POST/v1/co/breb/payoutDispersión a una llave Bre-B
GET/v1/co/breb/payout/{externalId}Estado de una dispersión

En sandbox (configuración por defecto) el gateway simula el desenlace automáticamente: al crear la transacción, esta pasa a COMPLETED de inmediato, el balance se mueve igual que en producción y recibes el webhook correspondiente con el campo extra "sandbox": true. La respuesta del POST de creación sigue devolviendo el estado inicial (PENDING / PROCESSING).

AspectoNequiBre-B
Pay-InPush (al celular) + QRQR dinámico + cobro por llave efímera
Pay-OutDispersión por celularDispersión a una llave
LlavesID, PHONE, EMAIL, ALPHA, BCODE
Monto máximoSegún límites de tu cuentaSegún límites de tu cuenta
ReversosGestionados por Rivopay a solicitud (fuera de la API)No disponible
EstadoSignificado
PENDINGCreada, esperando aprobación / pago
PROCESSINGDispersión / reverso en curso
COMPLETEDFinalizada con éxito (terminal — mueve el balance)
FAILEDError definitivo (terminal)
CANCELLEDCancelada por ti (push cancelado, QR eliminado)
EXPIREDVenció sin pago (QR / push no aprobado a tiempo)

No dependemos del webhook del proveedor. Una transacción en vuelo se cierra por cualquiera de estas tres vías, la que ocurra primero:

  1. Webhook del proveedor — la vía normal.
  2. Tu GET de estado — si la transacción sigue abierta, la consulta pregunta al proveedor en vivo y, si detecta el desenlace, cierra la transacción, mueve el ledger y dispara tu webhook.
  3. Cron interno — revisa las transacciones en vuelo cada minuto y hace lo mismo.

Por eso tu webhook se dispara igual aunque el proveedor no nos notifique, y una escritura condicional garantiza que salga una sola vez por transacción.

CobroCuándo pasa a EXPIRED
Nequi pushA los 45 minutos por defecto, o a los expirationMinutes que pidas (1–60); lo cancelamos en Nequi y enviamos payin.expired
Nequi QRA los 45 minutos por defecto, o a los expirationMinutes que pidas (1–60)
Bre-B (QR y llave)A los 15 minutos, y se borran el QR y la llave efímera en la red