Ir al contenido

Cobro con QR (Bre-B)

POST /v1/co/breb/payin/qr

Genera un código QR Bre-B para que el usuario pague desde cualquier app del ecosistema Bre-B. El estado final se confirma vía webhook.

Autenticación: firma ECDSA (x-client-id, x-timestamp, x-nonce, x-signature, x-content-sha256). País CO, moneda COP.

El gateway crea primero una llave ALPHA efímera exclusiva de ese QR y luego el QR en la red — no necesitas gestionar llaves para cobrar.

{
"channel": "ECOMM",
"amount": 100000,
"transactionPurpose": "00",
"qrCodeReference": "FACT12345",
"additionalInfo": { "invoice_number": "123", "store_label": "tienda-01" },
"vat": { "vat_type": "FIXED", "vat_value": "100.00", "vat_base_value": "100.00" },
"inc": { "inc_type": "FIXED", "inc_value": "10.00" },
"reference": "pedido-987"
}
CampoTipoRequeridoDescripción
amountnumberMonto en pesos COP enteros, > 0 y ≤ 11.500.000. Debe incluir ya TIP/INC/VAT
channelstringCanal de presentación del QR. Ver valores permitidos
transactionPurposestringCódigo de 2 dígitos (00 compras, 05 recaudo…). Default 00
qrCodeReferencestringReferencia que viaja en la red Bre-B: máx 17 alfanuméricos, sin la letra P. Se genera una si no la envías
additionalInfoobjectMetadatos passthrough (invoice_number, store_label…)
vat / inc / tipobjectInformativos, no se suman al monto. Si no vienen se envían en 0.00
referencestringTu referencia interna de conciliación (queda como txIdSource en Transacciones)

channel es obligatorio e indica desde qué punto de interacción se le presenta el QR al pagador. Es un ENUM cerrado: cualquier otro valor devuelve 400.

ValorNombreCuándo usarlo
IMManualEl cobro se genera a mano por un operador, sin un punto de venta automatizado (ej. un asesor que crea el QR en un back office)
POSPoint of SaleDatáfono o caja registradora física fija en un local
APPMobile AppEl QR se muestra dentro de tu app móvil
ECOMME-commerceCheckout web / tienda online
MPSMobile POSPunto de venta móvil: el vendedor cobra desde un dispositivo portátil en terreno (domicilios, ventas ambulantes)
CBCorresponsal BancarioCobro en un corresponsal bancario (tienda, droguería, punto aliado que opera transacciones financieras)
OFCOficinaCobro presencial en una oficina o sucursal del comercio
ATMATMCajero automático
{
"txId": "a1b2c3d4e5f6...",
"status": "PENDING",
"qrType": "DYNAMIC",
"channel": "ECOMM",
"qrCode": "00020101021226550015CO.COM.VISI.LLA...6304D0DF",
"qrImage": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...",
"qrCodeReference": "FACT12345",
"qrCodeId": "7aa184b7-c549-467b-917f-460b4224b459",
"keyId": "3f21c0aa-5d18-4e0b-9c77-1c2b9a55e401",
"keyValue": "@Xk9dPq2mLr7TzB4n",
"expiresAt": "2026-07-23T15:15:00.000Z",
"amount": 100000,
"currency": "COP",
"estimatedFees": {
"feeClient": 500,
"feeBase": 420,
"iva": 80,
"netAmount": 99500,
"currency": "COP"
}
}
CampoDescripción
txIdIdentificador interno para consultar y cancelar el cobro
qrCodeCadena EMVCo (para pintar el QR tú mismo con cualquier librería)
qrImageData URI completo del QR, listo para usar tal cual en un <img src>
qrCodeReferenceReferencia enviada a la red Bre-B
qrCodeIdID del recurso QR en Bre-B
keyId / keyValueLlave efímera detrás del QR (informativa; se borra al finalizar)
expiresAtExpiración del QR (15 minutos después de crearlo)
estimatedFeesAparece cuando la tarifa tiene desglose base/IVA
CódigoCausa
400amount ausente / ≤ 0 / no numérico; amount > 11.500.000; qrCodeReference inválida (>17, no alfanumérica o con P); o falta X-Idempotency-Key (IDEMPOTENCY_KEY_REQUIRED)
403Bre-B no habilitado para la cuenta, o producción no habilitada
409Onboarding incompleto — contacta con soporte
422Monto fuera de los límites min/max de tu tarifa, o Bre-B rechazó la creación (incluye providerStatus y detail)
502Bre-B no disponible — reintenta
503Cuenta suspendida temporalmente
  • Vigencia 15 minutos (expiresAt, expirationInSeconds: 900). Vencido sin pago → EXPIRED y se borran QR + llave en la red.
  • Estados: PENDINGPROCESSING (pago autorizado, en manos del banco) → COMPLETED | FAILED | EXPIRED.
  • El pago entrante se atribuye por qr_code_reference en la autorización síncrona; el monto debe coincidir exacto con amount o se rechaza — pero el cobro queda abierto para un nuevo intento y el rechazo se registra en lastRejection.
  • Al liquidar recibes el webhook payin.completed / payin.failed (HMAC-SHA256 en x-signature) — ver Webhooks.
MétodoRutaUso
GET/v1/co/breb/payin/qr/{txId}Estado del cobro (consulta a la red y sincroniza)
GET/v1/co/breb/payin/{txId}Igual, ruta genérica
GET/v1/co/breb/payin/qr/{txId}/detailDetalle del QR en la red (cadena, imagen, estado)
POST/v1/co/breb/payin/qr/decodeDecodificar una cadena EMVCo escaneada
DELETE/v1/co/breb/payin/qr/{txId}Cancelar el QR (→ EXPIRED + borra QR y llave). 409 si ya está COMPLETED

GET /v1/co/breb/payin/qr/{txId} — alias: GET /v1/co/breb/payin/{txId}

{
"txId": "a1b2c3d4e5f6...",
"status": "COMPLETED",
"amount": 100000,
"currency": "COP",
"feeClient": 500,
"netAmount": 99500,
"createdAt": "2026-07-23T15:00:00.000Z",
"updatedAt": "2026-07-23T15:05:00.000Z"
}

Si alguien intentó pagar por un monto distinto al esperado, el pago se rechaza pero el cobro sigue abierto: la transacción continúa PENDING y el pagador puede reintentar con el valor correcto hasta que venza. La respuesta incluye el último rechazo:

{
"txId": "a1b2c3d4e5f6...",
"status": "PENDING",
"amount": 100000,
"currency": "COP",
"lastRejection": {
"reason": "AMOUNT_MISMATCH",
"amount": 90000,
"rejectedAt": "2026-07-23T15:07:11.000Z",
"retriable": true
}
}
CampoDescripción
reasonMotivo del rechazo (AMOUNT_MISMATCH)
amountMonto que intentó pagar el pagador
rejectedAtMomento del rechazo
retriabletrue → el cobro sigue vivo y admite un nuevo intento

GET /v1/co/breb/payin/qr/{txId}/detail

Consulta el recurso QR directamente en Bre-B (útil para re-obtener la imagen o verificar su estado en la red).

{
"txId": "a1b2c3d4e5f6...",
"qrCodeId": "7aa184b7-c549-467b-917f-460b4224b459",
"status": "ACTIVE",
"qrType": "DYNAMIC",
"channel": "ECOMM",
"qrCode": "00020101021226550015CO.COM.VISI.LLA...",
"qrImage": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...",
"qrCodeReference": "FACT12345",
"amount": 100000,
"createdAt": "2026-07-23T15:00:00.000Z"
}

POST /v1/co/breb/payin/qr/decode

Decodifica una cadena EMVCo de cualquier QR Bre-B y devuelve su información estructurada.

{ "qrCodeData": "0002010102122661..." }

Response 200 OK:

{
"type": "DYNAMIC",
"status": "ACTIVE",
"channel": "ECOMM",
"amount": { "value": "100000", "currency": "COP" },
"key": { "key_type": "ALPHA", "key_value": "@Xk9dPq2mLr7TzB4n" },
"merchant": { "name": "Tienda XYZ" },
"vat": { "vat_type": "FIXED", "vat_value": "100.00" },
"inc": { "inc_type": "FIXED", "inc_value": "10.00" },
"qrCodeReference": "FACT12345",
"additionalInfo": {}
}

DELETE /v1/co/breb/payin/qr/{txId}

Elimina el QR y su llave en la red, y marca la transacción como EXPIRED si seguía pendiente. Un QR ya pagado (COMPLETED) no se puede cancelar (409).

{ "txId": "a1b2c3d4e5f6...", "status": "CANCELLED" }