Saltar al contenido principal

Guía de integración de dispersiones BRE-B

Esta guía te lleva paso a paso por el proceso completo de integración de dispersiones a llaves BRE-B a través del API de Pagos a Terceros de Wompi. Al finalizar, tendrás un flujo funcional para enviar pagos usando llaves BRE-B.

¿Qué es BRE-B?

BRE-B (Brevete Electrónico Bancario) es un sistema de transferencias inmediatas que permite enviar pagos usando una llave única (email, teléfono, alias alfanumérico, documento de identidad o código de establecimiento) en lugar de los datos bancarios tradicionales. El beneficiario registra su llave en su entidad financiera, y los pagadores pueden enviar dinero usando solo esa llave.

Requisitos previos

Antes de comenzar la integración, asegúrate de tener:

  • Cuenta activa en Wompi con producto de Pagos a Terceros habilitado
  • Llaves de autenticación: x-api-key y user-principal-id (ver cómo obtenerlas)
  • URL de eventos (webhook) configurada en el dashboard (ver configuración)
  • Al menos una cuenta origen activa con saldo disponible
  • Generación de idempotency-key para cada solicitud de pago. Se usa para garantizar que el pago sea único y evitar duplicidad. Debe ser una llave que tenga de 1 a 64 caracteres, puede contener letras y números, el único caracter especial permitido dentro de la llave es el guion (-). Debe ser único y expira en 24 horas.

Paso 1: Previsualizar la llave BRE-B

Antes de ejecutar un pago, resuelve la llave BRE-B para obtener la información del titular. Esto permite confirmar al beneficiario con tu usuario y reducir pagos fallidos.

URL Base

Producción:

https://api.payouts.wompi.co/v2

Endpoint:

GET /breb/keys/resolve/{keyValue}?keyType={tipo}

Ejemplo:

GET https://api.payouts.wompi.co/v2/breb/keys/resolve/@JUANPEREZ?keyType=ALPHANUMERIC
x-api-key: TU_API_KEY
user-principal-id: TU_USER_PRINCIPAL_ID

Respuesta:

{
"status": 200,
"code": "OK",
"data": {
"holderName": "JUA*** PER*** GAR***",
"financialEntity": {
"name": "BANCOLOMBIA",
"code": "001"
},
"keyType": "ALPHANUMERIC",
"keyValue": "@JUA***"
}
}

Presenta los datos del titular a tu usuario para que confirme visualmente que es el beneficiario correcto.

📖 Ver documentación completa de previsualización


Paso 2: Confirmar con el usuario

Con la información obtenida en el paso anterior, muestra a tu usuario:

  • Nombre del titular (enmascarado): JUA*** PER*** GAR***
  • Entidad financiera: BANCOLOMBIA
  • Tipo de llave: ALPHANUMERIC

Solicita confirmación antes de proceder con el pago. Este paso es responsabilidad de tu aplicación y reduce significativamente los pagos a beneficiarios incorrectos.


Paso 3: Crear la dispersión

Una vez confirmado el beneficiario, crea la dispersión enviando la llave BRE-B en el campo key:

Endpoint:

POST /v2/payouts

Headers:

x-api-key: TU_API_KEY
user-principal-id: TU_USER_PRINCIPAL_ID
idempotency-key: payout-unique-key-001
Content-Type: application/json

Body:

{
"reference": "payout-breb-001",
"accountId": "84a339e8-c277-45bd-b652-50f0b689edf7",
"paymentType": "PROVIDERS",
"transactions": [
{
"amount": 150000,
"name": "Juan Perez",
"email": "juan@example.com",
"key": "@JUANPEREZ"
}
]
}

Respuesta exitosa (201):

{
"status": 201,
"code": "OK",
"message": "Solicitud ejecutada correctamente.",
"data": {
"payoutId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transactions": 1,
"success": 1,
"failed": 0
}
}

Guarda el payoutId para consultas posteriores.

📖 Ver documentación completa de creación de dispersión


Paso 4: Recibir el evento de resultado

Wompi enviará un evento a tu URL de webhook cuando la transacción cambie de estado. Los eventos relevantes son:

Evento transaction.updated

Se dispara cuando una transacción individual cambia de estado (aprobada o fallida):

{
"event": "transaction.updated",
"data": {
"transaction": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"payoutId": "c57a05b0-646c-11f1-8436-6ca5ce550b83",
"amountInCents": 150000,
"status": "APPROVED",
"payee": {
"key": "@JUANPEREZ",
"name": "Juan Perez",
"email": "juan@example.com",
"keyType": "ALPHANUMERIC",
"legalId": "******7890",
"personType": "NATURAL",
"accountType": "AHORROS",
"legalIdType": "CC",
"accountNumber": "**4321",
"keyResolutionId": "d7ed17c1-757d-22f2-93c2-2cc1f5c52b2a",
"paymentMethodType": "SAVING_ACCOUNT"
},
"currency": "COP",
"appliedAt": "2026-06-15T10:05:30.000Z",
"createdAt": "2026-06-15T10:05:00.000Z"
}
},
"signature": {
"properties": [
"transaction.id",
"transaction.status",
"transaction.amountInCents"
],
"checksum": "b18bg9c2312f69599c6c170762ebb398f715dfc527705dde674d901326b6ac93"
},
"timestamp": 1781056530000,
"sentAt": "2026-06-15T10:05:30.500Z"
}

Evento payout.updated

Se dispara cuando el lote completo cambia de estado:

{
"event": "payout.updated",
"data": {
"payout": {
"id": "c57a05b0-646c-11f1-8436-6ca5ce550b83",
"reference": "payout-breb-001",
"amountInCents": 150000,
"paymentType": "PROVIDERS",
"status": "TOTAL_PAYMENT",
"totalTransactions": 1,
"currency": "COP",
"approvedAt": "2026-06-15T10:05:30.000Z",
"createdAt": "2026-06-15T10:05:00.000Z"
}
},
"signature": {
"properties": ["payout.id", "payout.status", "payout.amountInCents"],
"checksum": "639dc6bd2ac0104f090651c07773b6537f935623cf0ed04894f0687d4c9eebc7"
},
"timestamp": 1781056530000,
"sentAt": "2026-06-15T10:05:30.500Z"
}

Estados posibles de una transacción

EstadoDescripción
PENDINGTransacción creada, pendiente de procesamiento
PROCESSINGEn proceso de envío al banco
APPROVEDPago exitoso, el beneficiario recibió el dinero
FAILEDPago fallido (llave inválida, cuenta cerrada, etc.)
REJECTEDRechazada por validación antes de procesamiento

Estados posibles de un lote

EstadoDescripción
PENDINGLote creado, pendiente de procesamiento
TOTAL_PAYMENTTodas las transacciones fueron aprobadas
PARTIAL_PAYMENTAlgunas transacciones aprobadas y otras fallidas
REJECTEDLote rechazado (saldo insuficiente, límite alcanzado)

📖 Ver documentación completa de eventos BRE-B


Paso 5: Consultar estado (alternativa a eventos)

Si no puedes recibir eventos o como validación adicional, puedes consultar el estado:

Consultar lote:

GET /v2/payouts/{payoutId}

Consultar transacciones del lote:

GET /v2/payouts/{payoutId}/transactions

📖 Ver documentación de consultas


Checklist de go-live

Antes de pasar a producción, verifica:

  • Autenticación: Llaves de producción configuradas correctamente
  • Previsualización: Flujo de confirmación de beneficiario implementado
  • Idempotencia: Cada solicitud usa un idempotency-key único
  • Manejo de errores: Tu sistema captura y maneja todos los códigos de error (ver errores)
  • Webhook configurado: URL de producción configurada y recibiendo eventos
  • Montos en centavos: Verificado que los montos se envían correctamente en centavos
  • Pruebas en sandbox: Flujo completo probado exitosamente (ver sandbox)
  • Consulta de saldo: Verificando saldo antes de crear dispersiones

Errores comunes y soluciones

ProblemaCausa probableSolución
EXC_034 al previsualizarLa llave no existe o no está activaConfirmar con el beneficiario que su llave está registrada
EXC_033 al previsualizarFormato de llave incorrectoValidar formato contra la tabla de tipos
409 al crear dispersiónidempotency-key duplicadaGenerar una nueva llave única
EXC_008 al crear dispersiónSaldo insuficienteRecargar la cuenta origen o reducir el monto
Transacción queda en FAILEDLlave resuelta pero pago rechazado por el bancoVerificar con el beneficiario el estado de su cuenta
No llegan eventosURL de webhook no accesibleVerificar que la URL es pública, usa HTTPS y responde con 2xx

Recursos adicionales