Registro
Para usar PaymentsWay necesitas registrarte y obtener tus credenciales. El proceso toma entre 5 y 10 minutos dependiendo del tipo de cuenta.
Acceso a la consola
Una vez aprobado tu registro, accedes a la consola con las credenciales enviadas a tu correo:
Crear cuenta gratis →Tipo de registro
Selecciona el perfil que se ajusta a tu situación:
Modos de Integración
PaymentsWay ofrece tres modalidades de integración. Elige la que mejor se adapte a tu stack tecnológico y nivel de personalización requerido.
Widget de pagos
La integración más rápida. Con pocas líneas de código embeds el checkout directamente en tu página — el cliente paga sin salir de tu sitio.
Web Checkout
Un formulario HTML estándar que redirige al cliente al checkout seguro de PaymentsWay. Ideal si no quieres gestionar el flujo de pago en tu servidor.
Plugins para CMS
Si usas WooCommerce, PrestaShop o Magento, instala el plugin y configura tus credenciales. Sin código.
Botones de pago
Los botones de pago son la unidad central de configuración en PaymentsWay. Cada botón define el tipo de cobro, los métodos habilitados y el entorno (test o producción).
Crear un botón
- Ingresa a la consola con tu usuario y contraseña.
- Navega al módulo Botones de pago.
- Haz clic en Crear botón de pago y completa el formulario.
Tipos disponibles
Links de pago
Genera links de pago desde la consola o vía API y compártelos por cualquier canal: email, WhatsApp, SMS o redes sociales.
Links masivos
Genera links para múltiples clientes a la vez cargando una plantilla de Excel. Ideal para facturación por lotes o cobros periódicos.
Link individual
Crea un link para un cliente específico con sus datos prellenados o genérico sin datos. Dispones de tres acciones sobre el link generado:
- Ver — Abre el checkout en el navegador.
- Copiar — Copia el link recortado al portapapeles.
- Compartir — Envía por SMS al número del cliente.
Link con monto dinámico
En Links de pago express activa la opción "¿Va a ser un monto fijo? → No" para que el cliente seleccione el monto antes de pagar.
Botón de Pago
Un formulario HTML que redirige al cliente al checkout de PaymentsWay con los datos de la compra precargados.
Código base
<form method="Post" action="https://merchant.paymentsway.co/cartaspago/redirect"> <input name="merchant_id" type="hidden" value="0"> <input name="form_id" type="hidden" value="0"> <input name="terminal_id" type="hidden" value="0"> <input name="order_number" type="hidden" value="0"> <input name="amount" type="hidden" value="0"> <input name="currency" type="hidden" value="COP"> <input name="order_description" type="hidden" value="Test de compra"> <input name="client_email" type="hidden" value="user@example.com"> <input name="client_phone" type="hidden" value="3000000000"> <input name="client_firstname" type="hidden" value="Juan"> <input name="client_lastname" type="hidden" value="Pérez"> <input name="client_doctype" type="hidden" value="4"> <input name="client_numdoc" type="hidden" value="1234567890"> <input name="response_url" type="hidden" value="https://tu-sitio.com/respuesta"> <input name="Submit" type="submit" value="Pagar"> </form>
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| merchant_id | number | ID del comercio. Encuéntralo en Mis Credenciales. | Sí |
| form_id | number | ID del botón de pago. | Sí |
| terminal_id | number | ID de la terminal. | Sí |
| order_number | string | Referencia única de la venta. | Sí |
| amount | number | Monto total en la moneda indicada. | Sí |
| currency | string | COP, USD o EUR. | Sí |
| order_description | string | Descripción de la venta. | Sí |
| client_email | string | Correo electrónico del cliente. | Sí |
| client_phone | string | Número de celular del cliente. | Sí |
| client_firstname | string | Nombre del cliente. | Sí |
| client_lastname | string | Apellidos del cliente. | Sí |
| client_doctype | number | Tipo de documento: 1 Pasaporte · 4 CC · 5 CE · 6 NIT. | Sí |
| client_numdoc | string | Número de documento. | Sí |
| response_url | string | URL a la que redirige tras el pago. | No |
| checksum | string | Firma SHA-256 de seguridad. | No |
| additional_data | string | Datos adicionales que se retornan en el webhook. | No |
Botón de Pago Abierto
Permite que el cliente seleccione o ingrese el monto que desea pagar, dentro de un rango mínimo/máximo que defines tú.
Solo disponible en COP. El campo type_method debe ser siempre 2.
Código base
<form method="post" action="https://merchant.paymentsway.co/cartaspago/redirect"> <input name="type_method" type="hidden" value="2"> <input name="currency" type="hidden" value="COP"> <input name="amount_1" type="hidden" value="10000"> <input name="amount_2" type="hidden" value="20000"> <input name="amount_3" type="hidden" value="30000"> <input name="amount_4" type="hidden" value="40000"> <input name="min_amount" type="hidden" value="10000"> <input name="max_amount" type="hidden" value="40000"> <input name="Submit" type="submit" value="Pagar"> </form>
Implementación del Widget
El widget de PaymentsWay permite aceptar pagos directamente en tu sitio sin redirecciones. Solo necesitas incluir 3 bloques de código.
El orden de carga importa: primero el CSS, luego el JS, finalmente el script de inicialización.
1 — Hoja de estilos
<link rel="stylesheet" href="https://merchant.paymentsway.co/assetsWidget/css/index.css" />
2 — Script (final del body)
<script src="https://merchant.paymentsway.co/assetsWidget/js/index.js"></script>
3 — Inicializar
const checkout = new widgetCheckout({ merchant_id : 'tu-merchant-id', form_id : 'tu-form-id', terminal_id : 'tu-terminal-id', order_number : generateOrderNumber(7), amount : '50000', currency : 'COP', order_description: 'Compra en mi tienda', apikey : 'tu-api-key', ip : '0.0.0.0', }); // Actualizar monto dinámicamente checkout.updateAmount(75000);
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| merchant_id | string | ID del comercio desde la consola. | Sí |
| form_id | string | ID del botón de pago. | Sí |
| order_number | string | Identificador único de la orden. | Sí |
| amount | string | Monto a cobrar. | Sí |
| currency | string | COP, USD o EUR. | Sí |
| apikey | string | API Key de la consola. | Sí |
| redirect | string | URL de retorno al finalizar. | No |
| additionalData | object | Datos extra que retorna el webhook. | No |
Modo de Uso
Experiencia del cliente al interactuar con el widget de pagos.
Flujo de pago
- El cliente hace clic en el botón de pago generado por el widget.
- Selecciona el método: Tarjeta, PSE o Efectivo.
- Completa sus datos y confirma el pago.
- Recibe confirmación en pantalla y tu servidor recibe el webhook.
El widget soporta pagos recurrentes. El cliente elige el intervalo: Mensual, Trimestral, Semestral o Anual.
Cartas de Pago
Las cartas de pago son formularios embebibles con branding personalizado que puedes insertar en cualquier página web autorizada.
Solo las URLs autorizadas pueden insertar cartas de pago. Para habilitar tu dominio: tecnologia@paymentsway.co
Crear una carta
- Crea una terminal y ve al módulo Botones de pago.
- Selecciona Crear Botón de pago.
- Elige el tipo Carta de pago y completa el formulario.
Insertar la carta
Una vez creada, desde el listado haz clic en la carta para abrir el modal. Dispondrás de dos opciones:
- Copiar embebido — Código HTML listo para pegar en tu sitio.
- Copiar URL — Link directo a la carta de pago.
WooCommerce
Integra PaymentsWay en tu tienda WooCommerce en menos de 10 minutos sin tocar código.
⬇ Descargar PluginMonedas soportadas: COP, USD, EUR. Configura la misma moneda en WooCommerce.
Instalación
- Ve a WordPress → Plugins → Añadir nuevo → Subir plugin, selecciona el .zip e instala.
- Activa el plugin y ve a WooCommerce → Ajustes → Pagos.
- Activa PaymentsWay y haz clic en Configurar.
- Completa:
ID MERCHANT,ID TERMINAL,ID BOTÓN DE PAGO,APIKEY. - Copia la URL de tu página de tienda y pégala en el campo URL de retorno.
- Guarda los cambios.
PrestaShop
Módulo nativo de PaymentsWay para PrestaShop con configuración visual sin código.
⬇ Descargar PluginPaso 1 — Instalación
- Ve a Módulos → Administrador de Módulos → Subir un módulo.
- Selecciona el .zip y espera que la instalación se complete.
Paso 2 — Configuración
- Localiza PaymentsWay en el listado y haz clic en Configurar.
- Ingresa tus credenciales (merchant_id, terminal_id, form_id, apikey).
- Guarda los cambios.
Paso 3 — Preferencias
- Ve a Pagos → Preferencias.
- Configura restricciones por moneda, grupos y países según tu operación.
- Guarda los cambios.
Magento
Extensión de PaymentsWay para Magento 2 instalable vía cPanel o Composer.
⬇ Descargar PluginInstalación
- Accede a cPanel y abre el Administrador de archivos.
- Navega a la carpeta raíz de Magento y luego a
app/. - Sube el .zip y descomprímelo. Se creará la carpeta
code/.
Configuración
- Accede al panel de administración de Magento.
- Ve a Stores → Configuration → Sales → Payments Way Configuration.
- Agrega tus datos: terminal, formulario, merchant, apikey y response URL.
- Guarda y limpia el caché.
Crear link con redirección
Genera un link de pago desde tu backend. El cliente es redirigido automáticamente al checkout al acceder al link.
Envía tu Api_key en el header Authorization.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| merchant_id | string | Merchant ID. | Sí |
| form_id | string | Form ID. | Sí |
| terminal_id | string | Terminal ID. | Sí |
| order_number | string | Referencia única de la transacción. | Sí |
| amount | number | Monto de la transacción. | Sí |
| currency | string | COP, USD o EUR. | Sí |
| order_description | string | Descripción de la compra. | Sí |
| client_email | string | Email del cliente. | No |
| client_phone | string | Teléfono del cliente. | No |
| response_url | string | URL de retorno tras el pago. | No |
| additional_data | object | Datos extra que se retornan en el webhook. | No |
| checksum | string | Firma de seguridad SHA-256. | No |
Ejemplo de petición
const response = await fetch("https://merchant.paymentsway.co/link-de-pago/create", { method : 'POST', headers: { "Authorization": "TU_API_KEY", "Content-Type" : "application/json" }, body: JSON.stringify({ "merchant_id" : 7890, "form_id" : "", "terminal_id" : "", "order_number" : "ORD-456789", "amount" : 55000, "currency" : "COP", "order_description": "Compra de productos", "client_email" : "cliente@example.com", "response_url" : "https://example.com/gracias", }) }); const data = await response.json(); console.log(data);
Errores
{ "error": true, "data": "" }Crear link de pago
Genera un link de pago sin redirección automática. El cliente accede manualmente al link.
Los parámetros son idénticos al endpoint Crear link con redirección.
Checksum
El checksum garantiza la integridad de los datos enviados entre tu servidor y PaymentsWay. Se genera con SHA-256.
¿Cómo se genera?
Se concatenan los siguientes campos separados por ; y se aplica SHA-256:
"{idForm};{apikey};{idMerchant};{amount};{externalOrder}"Ejemplo
import { sha256 } from 'crypto-js'; const createChecksum = (idForm, idMerchant, apikey, amount, externalOrder) => sha256(`${idForm};${apikey};${idMerchant};${amount};${externalOrder}`) .toString(); // Uso: const checksum = createChecksum('123', '456', 'mi-api-key', '50000', 'ORD-001');
Obtener Tipos de Identificación
Retorna el catálogo completo de tipos de documento válidos en el sistema. Usa estos IDs en todos los endpoints que requieran identification_type o client_doctype.
Este endpoint solo está disponible para usuarios con certificación PCI y DSS.
Headers
Envía tu Api_key en el header Authorization.
Tipos disponibles
| ID | Descripción |
|---|---|
1 | Pasaporte |
4 | Cédula de ciudadanía |
5 | Cédula de extranjería |
6 | NIT |
Ejemplo de petición
const headers = new Headers(); headers.append("Authorization", "TU_API_KEY"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/ObtenerTiposIdentificacion", { method: 'GET', headers, redirect: 'follow' } ); const tipos = await res.json(); console.log(tipos);
Obtener Tipos de Estados
Retorna todos los estados de transacción disponibles en el sistema con sus IDs. Usa estos valores para interpretar el campo idstatus del webhook.
Solo disponible para usuarios con certificación PCI y DSS.
Estados del sistema
| ID | Nombre | Descripción |
|---|---|---|
1 | Creada | Transacción creada, pendiente de proceso. |
34 | Exitosa | Pago aprobado y acreditado. |
35 | Pendiente | En proceso de validación. |
36 | Fallida | Transacción rechazada por el banco o pasarela. |
38 | Cancelada | Transacción cancelada por el usuario o sistema. |
39 | Reembolsada | Pago devuelto al cliente. |
40 | Pendiente efectivo | Voucher generado, en espera de pago en punto físico. |
Ejemplo de petición
const headers = new Headers(); headers.append("Authorization", "TU_API_KEY"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/GetAllTransactionStatuses", { method: 'GET', headers, redirect: 'follow' } ); const estados = await res.json(); console.log(estados);
Crear Persona
Registra un cliente en el sistema de PaymentsWay. El ID retornado se usa para tokenizar tarjetas.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| firstname | string | Nombre. | Sí |
| lastname | string | Apellidos. | Sí |
| identification | string | Número de documento. | Sí |
| ididentificationtype | string | Tipo de identificación. | Sí |
| string | Correo electrónico. | Sí | |
| phone | string | Número de celular. | Sí |
| address | string | Dirección. | No |
| city | string | Ciudad. | No |
| zipcode | string | Código postal. | No |
const res = await fetch("https://serviceregister.paymentsway.co/ClientAPI/CrearPersona", { method : 'POST', headers: { "x-api-key": "TU_API_KEY", "Content-Type": "application/json" }, body : JSON.stringify({ firstname: "Juan", lastname: "Pérez", ididentificationtype: "4", identification: "10000000", email: "juan@email.com", phone: "3000000000" }) }); const { id } = await res.json(); // usa este id para tokenizar
Obtener Transacción
Consulta el estado y detalle completo de una transacción usando su referencia externa (order_number o external_order).
Solo disponible para usuarios con certificación PCI y DSS.
Headers
Envía tu Api_key en el header Authorization.
Query params
| Parámetro | Tipo | Descripción | Req. |
|---|---|---|---|
| external_order | string | La referencia externa única asignada por tu sistema al crear la transacción. | Sí |
Ejemplo de petición
const externalOrder = "ORD-456789"; const headers = new Headers(); headers.append("Authorization", "TU_API_KEY"); const res = await fetch( `https://serviceregister.paymentsway.co/ClientAPI/ObtenerTransaccionByExternalOrder?external_order=${externalOrder}`, { method: 'GET', headers, redirect: 'follow' } ); const transaccion = await res.json(); console.log(transaccion);
Obtener Persona Por Documento
Busca un cliente ya registrado en el sistema usando su número de documento. Útil para verificar si un usuario ya existe antes de crearlo.
Solo disponible para usuarios con certificación PCI y DSS.
Headers
Envía tu Api_key en el header x-api-key.
Cuerpo de la petición
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| nroDocumento | integer | Número de documento de identidad de la persona. | Sí |
{ "nroDocumento": 1012427594 }Ejemplo de petición
const headers = new Headers(); headers.append("x-api-key", "TU_API_KEY"); headers.append("Content-Type", "application/json"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/ObtenerPersonaPorDocumento", { method: 'POST', headers, body: JSON.stringify({ "nroDocumento": 1012427594 }), redirect: 'follow' } ); const persona = await res.json(); console.log(persona);
Crear Transacción Tarjeta de Crédito
Procesa un pago directo con tarjeta de crédito o débito. Requiere certificación PCI DSS. Usa los datos reales de la tarjeta del cliente para ejecutar el cobro.
Solo disponible para usuarios con certificación PCI y DSS. Maneja los datos de tarjeta únicamente bajo cumplimiento PCI.
Headers
Envía tu Api_key en el header x-api-key.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| amount | integer | Valor del pago. | Sí |
| firstname | string | Nombres del pagador. | Sí |
| lastname | string | Apellidos del pagador. | Sí |
| card_identification | string | Número de identificación del pagador. | Sí |
| identification_type | integer | Tipo de identificación del pagador. | Sí |
| card_holder | string | Nombre completo tal como aparece en la tarjeta. | Sí |
| card_pan | string | Número de la tarjeta sin espacios ni guiones. | Sí |
| card_expiry_year | string | Año de expiración. Ej: "26". | Sí |
| card_expiry_month | string | Mes de expiración. Ej: "06". | Sí |
| card_cvv | string | Código CVV/CVC de la tarjeta. | Sí |
| description | string | Descripción breve de la orden. | Sí |
| installments | integer | Número de cuotas. Enviar 1 para pago de contado. | Sí |
| external_order | string | Referencia única de la transacción en tu sistema. | Sí |
| dynamic_descriptor | string | Texto que aparece en el extracto del cliente. | Sí |
| terminal_id | integer | ID de la terminal. | Sí |
| form_id | integer | ID del formulario/botón de pago. | Sí |
| ip | string | Dirección IP del pagador. | Sí |
| autorizacionDatos | boolean | El pagador autoriza usar sus datos para tokenizar la tarjeta. | Sí |
| url_ok | string | URL de redirección si el pago es exitoso. | No |
| url_ko | string | URL de redirección si el pago falla. | No |
| additionalData | object | Datos adicionales que se retornan en el webhook. | No |
Cuerpo de ejemplo
{
"amount" : 300000,
"firstname" : "Pepito",
"lastname" : "Perez",
"card_identification": "1012345678",
"identification_type": 4,
"card_holder" : "PEPITO PEREZ PA",
"card_pan" : "4111111111111111",
"card_expiry_year" : "26",
"card_expiry_month": "06",
"card_cvv" : "123",
"url_ok" : "https://tu-sitio.com/pago-exitoso",
"url_ko" : "https://tu-sitio.com/pago-fallido",
"description" : "Compra en mi tienda",
"installments" : 1,
"external_order" : "trc231566",
"dynamic_descriptor": "Mi Tienda Online",
"terminal_id" : 34,
"form_id" : 34,
"ip" : "192.168.0.1",
"additionalData" : { "ref": "mi-referencia" },
"autorizacionDatos": true
}Ejemplo de petición
const headers = new Headers(); headers.append("x-api-key", "TU_API_KEY"); headers.append("Content-Type", "application/json"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/CrearTransaccionTC", { method: 'POST', headers, body: JSON.stringify(body), redirect: 'follow' } ); const resultado = await res.json(); // Si hay url_3ds, redirige para autenticación 3D Secure if (resultado.url_3ds) { window.location.href = resultado.url_3ds; }
Reversar Transacción
Anula una transacción aprobada y devuelve el cobro al cliente. El idTransaction es el identificador interno de PaymentsWay, retornado en la respuesta de Crear Transacción Tarjeta de Crédito.
Headers
Envía tu Api_key en el header Authorization.
Cuerpo de la petición
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| idTransaction | integer | Identificador interno de la transacción en PaymentsWay. | Sí |
{ "idTransaction": 1360 }Ejemplo de petición
const headers = new Headers(); headers.append("Authorization", "TU_API_KEY"); headers.append("Content-Type", "application/json"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/ReversarTransaccion", { method: 'POST', headers, body: JSON.stringify({ "idTransaction": 1360 }), redirect: 'follow' } ); const resultado = await res.json(); console.log(resultado);
Tokenizar Tarjetas
Permite tokenizar una tarjeta de crédito para cobros recurrentes sin que el cliente tenga que ingresarla nuevamente.
Flujo
- Crea una persona — obtienes un
idperson. - Llama a
TokenizarDatosPersonacon elidpersony datos de la tarjeta. - Recibes un token. Muestra el embed en tu página para que el cliente complete el proceso.
{
"documento" : "10000000",
"identification_type": 4,
"idperson" : 8,
"url" : "https://tu-sitio.com",
"form_id" : 368,
"amount" : "100",
"external_order" : "Test_02",
"ip" : "127.0.0.1",
"currencycode" : "COP",
"description" : "Descripción",
"installments" : 1
}Embed de tokenización
Tu URL debe estar autorizada. Escribe a tecnologia@paymentsway.co para activarla.
<embed id="embed" width="500px" height="320px"></embed> <script defer> const token = 'token-recibido'; document.getElementById('embed').src = `https://merchant.paymentsway.co/tokenizacion/?p=${token}`; </script>
Estados de transacción aprobada
Códigos de respuesta cuando una transacción es autorizada exitosamente.
| Código | Descripción |
|---|---|
00 | Aprobada |
08 | Aprobada — solicitar más información |
11 | Aprobada VIP |
76 | Aprobada (Privado) |
77 | Aprobada — pendiente identificación |
78 | Aprobada a ciegas |
79 | Aprobada — transacción administrativa |
80 | Aprobada por boletín de seguridad |
81 | Aprobada por el establecimiento |
Estados de transacción rechazada
Códigos de respuesta cuando una transacción es negada por el sistema o el banco emisor.
| Código | Descripción |
|---|---|
01 | Negada — comuníquese con su entidad |
03 | Negada — comercio inválido |
04 | Negada — retener tarjeta |
05 | Negada — tarjeta bloqueada o timeout |
09 | Negada — transacción duplicada |
12 | Negada — transacción inválida |
13 | Negada — monto inválido |
14 | Negada — estado de la tarjeta inválido |
38 | Negada — intentos de PIN excedidos |
41 | Negada — tarjeta robada o extraviada |
51 | Negada — fondos insuficientes |
54 | Negada — tarjeta vencida |
55 | Negada — PIN inválido |
57 | Negada — transacción no permitida |
61 | Negada — excede el monto máximo |
65 | Negada — límite de usos excedido |
68 | Negada — TIMEOUT |
91 | Negada — no es posible autorizar |
94 | Negada — transacción duplicada |
97 | Negada — número de documento inválido |
98 | Negada — CVV2 inválido |
TO | Negada — time out |
Obtener Listado de Bancos
Retorna el catálogo de bancos habilitados para transacciones PSE. Los campos CodigoBanco y NombreBanco retornados aquí se usan directamente en el endpoint Crear Transacción PSE.
Solo disponible para usuarios con certificación PCI y DSS.
Headers
Envía tu Api_key en el header Authorization.
Ejemplo de petición
const headers = new Headers(); headers.append("Authorization", "TU_API_KEY"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/ObtenerListadoBancos", { method: 'GET', headers, redirect: 'follow' } ); const bancos = await res.json(); console.log(bancos);
Ejemplo de respuesta
[
{ "CodigoBanco": "10512", "NombreBanco": "BANCO DAVIVIENDA" },
{ "CodigoBanco": "10007", "NombreBanco": "BANCOLOMBIA" },
{ "CodigoBanco": "10001", "NombreBanco": "BANCO DE BOGOTA" }
]Crear Transacción PSE
Inicia una transacción de débito bancario a través de PSE (Pagos Seguros en Línea). El cliente es redirigido al portal de su banco para autorizar el pago.
Solo disponible para usuarios con certificación PCI y DSS. Obtén primero el listado de bancos con ObtenerListadoBancos.
Headers
Envía tu Api_key en el header x-api-key.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| amount | integer | Valor del pago en pesos colombianos. | Sí |
| PersonType | string | "0" Persona Natural · "1" Persona Jurídica (en formato string). | Sí |
| identification_type | integer | Tipo de identificación del pagador (ver ObtenerTiposIdentificacion). | Sí |
| Documento | string | Número de identificación del pagador. | Sí |
| Correo | string | Email del pagador. | Sí |
| Nombres | string | Nombres del pagador. | Sí |
| Apellidos | string | Apellidos del pagador. | Sí |
| Celular | string | Número de celular del pagador. | Sí |
| Direccion | string | Dirección del pagador. | Sí |
| external_order | string | Identificador único de la transacción en tu sistema. | Sí |
| CodigoBanco | string | Código del banco (obtenido de ObtenerListadoBancos). | Sí |
| NombreBanco | string | Nombre del banco (obtenido de ObtenerListadoBancos). | Sí |
| entityurl | string | URL a la que redirige al cliente cuando el pago es exitoso. | Sí |
| terminal_id | integer | ID de la terminal. | Sí |
| form_id | integer | ID del formulario/botón de pago. | Sí |
| ip | string | Dirección IP del pagador. | Sí |
| additionalData | object | Datos adicionales que se retornan en el webhook. | No |
Cuerpo de ejemplo
{
"amount" : 30000,
"PersonType" : "0",
"identification_type": 4,
"Documento" : "1012345678",
"Correo" : "cliente@email.com",
"Nombres" : "Ana",
"Apellidos" : "Perez",
"Celular" : "3167225855",
"Direccion" : "Calle 32 # 74-31",
"external_order" : "ORD-PSE-001",
"CodigoBanco" : "10512",
"NombreBanco" : "BANCO DAVIVIENDA",
"entityurl" : "https://tu-sitio.com/pago-exitoso",
"terminal_id" : 34,
"form_id" : 34,
"ip" : "192.168.0.1",
"additionalData" : { "referencia": "mi-referencia" }
}Ejemplo de petición
const headers = new Headers(); headers.append("x-api-key", "TU_API_KEY"); headers.append("Content-Type", "application/json"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/CrearTransaccionPSE", { method: 'POST', headers, body: JSON.stringify(body), redirect: 'follow' } ); const resultado = await res.json(); // Redirige al cliente al portal PSE if (resultado.urlBanco) { window.location.href = resultado.urlBanco; }
Obtener Medios De Pago en Efectivo
Retorna el listado de métodos de pago en efectivo habilitados (Efecty, Baloto, etc.). El campo method retornado aquí se envía directamente en Crear Transacción Cash.
Solo disponible para usuarios con certificación PCI y DSS.
Headers
Envía tu Api_key en el header Authorization.
Ejemplo de petición
const headers = new Headers(); headers.append("Authorization", "TU_API_KEY"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/ObtenerMediosDePago", { method: 'GET', headers, redirect: 'follow' } ); const medios = await res.json(); console.log(medios);
Crear Transacción Cash
Genera un recibo de pago en efectivo para que el cliente cancele en un punto físico (Efecty, Baloto, Su Red, etc.). El cliente recibe un voucher con el código de pago.
Solo disponible para usuarios con certificación PCI y DSS. Obtén los métodos disponibles con ObtenerMediosDePago.
Headers
Envía tu Api_key en el header x-api-key.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| amount | integer | Valor del pago en pesos colombianos. | Sí |
| external_order | string | Referencia única de la transacción en tu sistema. | Sí |
| description | string | Descripción breve de la orden. | Sí |
| method | string | Método de pago en efectivo. Obtenido de ObtenerMediosDePago. Ej: efecty. | Sí |
| iva | integer | IVA del pago. Si no aplica enviar 0. | Sí |
| user_identification | string | Número de identificación del pagador. | Sí |
| identification_type | string | Tipo de identificación: CC, CE, NIT, DNI. | Sí |
| user_name | string | Nombre del pagador. | Sí |
| user_last_name | string | Apellido del pagador. | Sí |
| user_email | string | Email del pagador. | Sí |
| user_phone | string | Celular del pagador. | Sí |
| user_address | string | Dirección del pagador. | Sí |
| terminal_id | integer | ID de la terminal. | Sí |
| form_id | integer | ID del formulario/botón de pago. | Sí |
| ip | string | Dirección IP del pagador. | Sí |
| additionalData | object | Datos adicionales que se retornan en el webhook. | No |
Cuerpo de ejemplo
{
"amount" : 30000,
"external_order" : "ORD-CASH-001",
"description" : "Pago membresía mensual",
"method" : "efecty",
"iva" : 0,
"user_identification" : "1012345678",
"identification_type" : "CC",
"user_name" : "Andres",
"user_last_name" : "Camil",
"user_email" : "andres@example.com",
"user_phone" : "3227358312",
"user_address" : "Cra 8b 17 15",
"terminal_id" : 34,
"form_id" : 34,
"ip" : "192.168.0.1",
"additionalData" : { "ref": "valor" }
}Ejemplo de petición
const headers = new Headers(); headers.append("x-api-key", "TU_API_KEY"); headers.append("Content-Type", "application/json"); const res = await fetch( "https://serviceregister.paymentsway.co/ClientAPI/CrearTransaccionCash", { method: 'POST', headers, body: JSON.stringify(body), redirect: 'follow' } ); const resultado = await res.json(); // resultado.urlVoucher contiene el link al voucher de pago console.log(resultado);
WebHook
Recibe notificaciones en tiempo real sobre el resultado de cada transacción. PaymentsWay hace un HTTP POST a tu endpoint cuando una transacción cambia de estado.
Tu endpoint debe usar HTTPS (SSL). Las peticiones sin SSL serán rechazadas. Tu página de notificación no debe incluir código HTML — actualiza tus bases de datos y responde con el status correcto.
Estados y cómo responder
Responde con 200 únicamente cuando el estado es Exitosa (id 34). Para todos los demás estados responde 201.
| ID | Estado | Tu respuesta HTTP |
|---|---|---|
1 | Creada | 201 |
34 | Exitosa | 200 |
35 | Pendiente | 201 |
36 | Fallida | 201 |
38 | Cancelada | 201 |
39 | Reembolsada | 201 |
40 | Pendiente efectivo | 201 |
Campos del payload
| Campo | Tipo | Descripción | Método |
|---|---|---|---|
| id | number | Identificador interno único de la transacción en PaymentsWay. | Todos |
| amount | number | Valor cobrado al cliente. | Todos |
| externalorder | string | Referencia de la orden generada por tu sistema. | Todos |
| fullname | string | Nombre completo del cliente. | Todos |
| ip | string | Dirección IP del cliente durante la transacción. | Todos |
| additionaldata | JSON | Información adicional enviada al crear la transacción. | Todos |
| idstatus | object | Estado de la transacción: { id, nombre }. | Todos |
| idperson | object | Datos del cliente: { id, firstname, lastname, identification, email, phone }. | Todos |
| paymentmethod | object | Método de pago usado: { id, nombre }. | Todos |
| idmerchant | string | ID del comercio receptor del pago. | Todos |
| innerexception | object | Detalle del rechazo PSE: { codigo, causal }. Solo cuando el estado es NOT_AUTHORIZED en PSE. | PSE |
Ejemplo de payload — Transacción exitosa
{
"id" : "822",
"ammount" : 4000,
"externalorder" : "12001",
"ip" : "172.0.0.1",
"fullname" : "",
"additionaldata": null,
"idstatus" : { "id": 34, "nombre": "Exitosa" },
"idperson" : {
"id" : "60",
"firstname" : "Ejemplo nombre",
"lastname" : "Ejemplo apellido",
"identification": "1200345601",
"email" : "",
"phone" : ""
},
"paymentmethod": { "id": 2, "nombre": "PSE" },
"idmerchant" : "1"
}Ejemplo de payload — PSE rechazado (con innerexception)
Solo cuando el estado PSE es NOT_AUTHORIZED, el campo innerexception indica la causal detallada del rechazo bancario.
{
"id" : "id",
"amount" : 100,
"externalorder": "external",
"ip" : "127.0.0.1",
"fullname" : "",
"additionaldata": {},
"innerexception": { "codigo": "00001", "causal": "CUENTA NO EXISTE" },
"idstatus" : { "id": 36, "nombre": "Fallida" },
"idperson" : {
"id": "", "firstname": "", "lastname": "",
"identification": "", "email": "", "phone": ""
},
"paymentmethod": { "id": 2, "nombre": "PSE" },
"idmerchant" : ""
}Ejemplo de handler en Node.js
app.post('/webhook/paymentsway', async (req, res) => { const { id, externalorder, idstatus, idperson, amount } = req.body; if (idstatus?.id === 34) { // Transacción exitosa — actualiza tu base de datos await db.updateOrder(externalorder, { status: 'paid', amount }); return res.status(200).send('OK'); } // Cualquier otro estado return res.status(201).send('RECEIVED'); });
PayOuts
Servicio de dispersión de fondos. Permite enviar dinero a múltiples cuentas bancarias desde tu saldo en PaymentsWay.
Documentación
BReB — QR
BReB (Botón de Recaudo Bancario) es el estándar de pagos inmediatos mediante código QR, iniciativa del Banco de la República de Colombia. PaymentsWay lo implementa a través de la infraestructura de VePay. Permite recibir pagos desde cualquier app bancaria habilitada.
Flujo completo de pago con QR
El siguiente diagrama muestra los 5 pasos del ciclo de vida de un QR BReB, desde el login hasta la confirmación del pago:
URL Base y autenticación
https://qrvbreb.vepay.com.co
Todos los endpoints (excepto Login) requieren el header Authorization: Bearer {token} con el JWT obtenido en el paso 1.
Las credenciales de acceso (username y password) son proporcionadas por PaymentsWay. Contacta a tecnologia@paymentsway.co para habilitarlas.
Tipos de QR
| Tipo | Código | Descripción | Cuándo usarlo |
|---|---|---|---|
| Estático | 11 | Un solo QR permanente, sin monto fijo. | Punto de venta físico, vitrina, impreso. |
| Dinámico | 12 | QR por transacción con monto y referencia. | E-commerce, cobros específicos, facturas. |
01 — Login
Autentícate con las credenciales entregadas por PaymentsWay para obtener el JWT Bearer token que necesitas en todas las demás llamadas. El token expira en 1 hora.
Headers
| Header | Valor |
|---|---|
| Content-Type | application/json |
Cuerpo de la petición
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| username | string | Usuario proporcionado por PaymentsWay. | Sí |
| password | string | Contraseña proporcionada por PaymentsWay. | Sí |
{
// Username y Password que comparte Payments Way
"username": "",
"password": ""
}Ejemplo de petición
const res = await fetch('https://qrvbreb.vepay.com.co/api/auth/login', { method : 'POST', headers: { 'Content-Type': 'application/json' }, body : JSON.stringify({ username: 'TU_USUARIO', password: 'TU_PASSWORD' }) }); const { token } = await res.json(); // Guarda el token para usarlo en las demás llamadas localStorage.setItem('breb_token', token);
cURL
curl --location 'https://qrvbreb.vepay.com.co/api/auth/login' --header 'Content-Type: application/json' --data '{
"username": "",
"password": ""
}'02 — Generar QR
Genera un código QR dinámico o estático. Puedes crear QRs estáticos (11) para puntos de venta físicos o dinámicos (12) para cobros específicos con monto fijo.
Requiere el header Authorization: Bearer {token} obtenido en el paso Login.
QR Estático (11) vs QR Dinámico (12)
Headers
| Header | Valor | Req. |
|---|---|---|
| Authorization | Bearer {token} | Sí |
| Content-Type | application/json | Sí |
Parámetros del body
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| payloadFormatIndicator | string | Siempre "01". Versión del estándar. Siempre "01". | Sí |
| pointOfInitiationMethod | string | "11" = estático · "12" = dinámico. | Sí |
| merchantAccountInformation | object | Información de la cuenta del comercio. | Sí |
| .keytype | string | Tipo de llave: PHONE · NRIC · EMAIL · ALPHANUM · MERCHANTCODE | Sí |
| .key | string | Valor de la llave. Límites: PHONE=10, NRIC=15, ALPHANUM=50, MERCHANTCODE=20. | Sí |
| .merchantName | string | Nombre del comercio (visible en la app del pagador). | Sí |
| .merchantCity | string | Ciudad del comercio. | Sí |
| .postalCode | string | Código postal del comercio. | Sí |
| .merchantCategoryCode | string | Código MCC del comercio (4 dígitos). Ej: "0000" para genérico. | Sí |
| transaction | object | Datos de la transacción. | Sí |
| .value | string | Monto en COP con hasta 2 decimales. Para QR dinámico usar "0". | Sí |
| .currency | string | Código ISO 4217. Para COP usar "CO" (internamente mapea a 170). | Sí |
Cuerpo de ejemplo
{
// Siempre debe ser "01"
"payloadFormatIndicator": "01",
// 11 = estático, 12 = dinámico
"pointOfInitiationMethod": "12",
"merchantAccountInformation": {
// Tipo de llave: PHONE, NRIC, EMAIL, ALPHANUM, MERCHANTCODE
"keytype" : "PHONE",
// Número de celular registrado del comercio (10 dígitos)
"key" : "3001234567",
"merchantName" : "Mi Tienda Online",
"merchantCity" : "Bogota",
"postalCode" : "110111",
// Código MCC — 0000 para genérico
"merchantCategoryCode": "0000"
},
"transaction": {
// Monto con 2 decimales. QR dinámico: "0"
"value" : "5000.00",
// Para COP usar "CO" (ISO 4217: 170)
"currency": "CO"
}
}cURL
curl --location 'https://qrvbreb.vepay.com.co/api/qr/generate' --header 'Authorization: Bearer TU_JWT_TOKEN' --header 'Content-Type: application/json' --data '{
"payloadFormatIndicator": "01",
"pointOfInitiationMethod": "12",
"merchantAccountInformation": {
"keytype": "PHONE",
"key": "3001234567",
"merchantName": "Mi Tienda Online",
"merchantCity": "Bogota",
"postalCode": "110111",
"merchantCategoryCode": "0000"
},
"transaction": {
"value": "5000.00",
"currency": "CO"
}
}'Ejemplo JavaScript
const token = localStorage.getItem('breb_token'); // obtenido en Login const res = await fetch('https://qrvbreb.vepay.com.co/api/qr/generate', { method : 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type' : 'application/json' }, body: JSON.stringify({ payloadFormatIndicator : "01", pointOfInitiationMethod: "12", merchantAccountInformation: { keytype : "PHONE", key : "3001234567", merchantName : "Mi Tienda Online", merchantCity : "Bogota", postalCode : "110111", merchantCategoryCode: "0000" }, transaction: { value: "5000.00", currency: "CO" } }) }); const qrData = await res.json(); // qrData contiene el string del QR y/o imagen para mostrar al cliente console.log(qrData);
03 — Verificar Token
Verifica que un JWT token (generado en el paso Generar QR) sea válido y no haya expirado. Úsalo para validar el QR antes de mostrarlo al cliente o para confirmar que la sesión sigue activa.
Headers
| Header | Valor |
|---|---|
| Content-Type | application/json |
Cuerpo
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| token | string | El JWT token retornado en la respuesta de 02 — Generar QR. | Sí |
{
// Token generado en 02 - Generar QR
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}cURL
curl --location 'https://qrvbreb.vepay.com.co/api/auth/verify' --header 'Content-Type: application/json' --data '{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}'Ejemplo JavaScript
const res = await fetch('https://qrvbreb.vepay.com.co/api/auth/verify', { method : 'POST', headers: { 'Content-Type': 'application/json' }, body : JSON.stringify({ token: qrData.token }) }); const verification = await res.json(); console.log(verification); // { valid: true, ... }
Consulta
Consulta el estado y los detalles de un QR generado usando su id. Usa este endpoint para hacer polling y detectar cuándo el cliente ha completado el pago.
Headers
| Header | Valor | Req. |
|---|---|---|
| Authorization | Bearer {token} | Sí |
Path Parameter
| Parámetro | Tipo | Descripción |
|---|---|---|
| id | string | ID del QR obtenido en la respuesta de 02 — Generar QR. |
cURL
curl --location 'https://qrvbreb.vepay.com.co/api/qr/QR_ID_AQUI' --header 'Authorization: Bearer TU_JWT_TOKEN'
Ejemplo JavaScript — Polling
// Polling cada 3 segundos hasta confirmar el pago const pollQRStatus = (qrId, token) => { const interval = setInterval(async () => { const res = await fetch( `https://qrvbreb.vepay.com.co/api/qr/${qrId}`, { headers: { 'Authorization': `Bearer ${token}` } } ); const qr = await res.json(); if (qr.status === 'PAID' || qr.status === 'COMPLETED') { clearInterval(interval); console.log('✓ Pago confirmado', qr); // Actualiza tu UI y base de datos } if (qr.status === 'EXPIRED') { clearInterval(interval); console.log('QR expirado'); } }, 3000); }; pollQRStatus('QR_ID_AQUI', token);
Status — Actualizar Estado
Actualiza el estado de un QR existente. Se usa para marcar un QR como pagado después de recibirla confirmación del banco, o para invalidarlo manualmente.
Headers
| Header | Valor | Req. |
|---|---|---|
| Authorization | Bearer {token} | Sí |
| Content-Type | application/json | Sí |
Estados disponibles
| Estado | Descripción |
|---|---|
| PENDING | QR generado, esperando escaneo y pago. |
| PAID | Pago confirmado por el banco. |
| COMPLETED | Transacción completada y liquidada. |
| EXPIRED | QR venció sin ser utilizado. |
| CANCELLED | QR invalidado manualmente. |
Cuerpo de ejemplo
{
"status": "PAID"
}cURL
curl --location --request PATCH 'https://qrvbreb.vepay.com.co/api/qr/QR_ID_AQUI/status' --header 'Authorization: Bearer TU_JWT_TOKEN' --header 'Content-Type: application/json' --data '{ "status": "PAID" }'Ejemplo JavaScript
const res = await fetch( `https://qrvbreb.vepay.com.co/api/qr/${qrId}/status`, { method : 'PATCH', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type' : 'application/json' }, body: JSON.stringify({ status: 'PAID' }) } ); const result = await res.json(); console.log(result);
Integración BReB
Esta API permite hacer transferencias de dinero entre cuentas bancarias a través del sistema BReB. Piénsala como el "mesero" entre tu app y los bancos: tú le dices a quién le mandas la plata y cuánto, y él se encarga de hacer todo el proceso por detrás para que el dinero llegue.
¿Qué puedes hacer con este sistema?
Flujo completo de una transferencia
El siguiente diagrama muestra el orden en que se usan los endpoints para completar una transferencia desde cero:
URL Base
{BASE_URL}/brebLa URL base del entorno (producción / sandbox) es entregada por PaymentsWay al activar la Integración BReB. Contacta a tecnologia@paymentsway.co.
Consultar llave de cliente
Busca la llave (correo, celular o cédula) con la que un cliente está registrado en el sistema. Es como buscar un contacto en el celular — si existe, te muestra toda su información; si no existe, te avisa que no lo encontró.
¿Cuándo usarlo? Cuando quieres verificar si un cliente ya está registrado antes de enviarle una transferencia, o cuando necesitas los datos de la cuenta vinculada a una llave.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| channel | string | Por dónde se hace la operación. Como decirle al banco si vas en persona o por app. Ej: "REDESALIADAS", "MOVIL", "WEB". | Sí |
| sourceService | string | Servicio origen de la petición. Ej: "PEX". | Sí |
| user | string | Nombre del operador o usuario del sistema que hace la consulta. Ej: "jcano". | Sí |
| identification | string | Número de cédula del cliente a consultar. El mismo que te piden en cualquier banco. Ej: "1144134800". | Sí |
| typeIdentification | string | Tipo de documento. "CC" para cédula de ciudadanía. | Sí |
| ip | string | Dirección IP del dispositivo. Como la dirección de tu casa, pero para el celular o computador. Ej: "192.168.0.1". | Sí |
| purpose | string | Propósito de la consulta. Ej: "Source". | Sí |
| uuid | string | Identificador único de la sesión o dispositivo. Como el número de serie de un celular. Ej: "a1b2c3d4e5f67890". | Sí |
| mac | string | Dirección MAC del dispositivo. Un código único del hardware. Ej: "08:BD:01:00:00:00". | Sí |
| platform | string | Sistema operativo del dispositivo. Ej: "iOS", "Android". | Sí |
| trademark | string | Marca del dispositivo. Ej: "Apple", "Samsung". | Sí |
| geoLocation | string | Ubicación GPS del dispositivo. Como cuando Rappi te pide activar la ubicación. Ej: "4.710989,-74.072092". | No |
| simDeviceId | string | ID del SIM del dispositivo. Ej: "02ba0c1e". | No |
| simOperator | string | Operador de telefonía. Ej: "Movistar", "Claro". | No |
| serialDevice | string | Número serial del dispositivo. Ej: "01bb90c1d". | No |
| simCellNumber | string | Número de celular de la SIM. Ej: "3123456789". | No |
| simSerialNumber | string | Número serial de la SIM. Ej: "02ba0c1e". | No |
| userAgentString | string | Información del navegador o app. Se genera automáticamente. Ej: "Mozilla/5.0 (iPhone...)". | No |
| versionPlatform | string | Versión del sistema operativo. Ej: "13". | No |
| model | string | Modelo del dispositivo. Ej: "iPhone 15". | No |
Ejemplo de petición
{
"channel" : "REDESALIADAS",
"sourceService" : "PEX",
"user" : "jcano",
"identification" : "1144134800",
"typeIdentification": "CC",
"ip" : "192.168.0.1",
"purpose" : "Source",
"uuid" : "a1b2c3d4e5f67890",
"mac" : "08:BD:01:00:00:00",
"platform" : "iOS",
"trademark" : "Apple",
"model" : "iPhone 15",
"geoLocation" : "4.710989,-74.072092",
"versionPlatform" : "13"
}Respuestas
| Código | Descripción |
|---|---|
| 200 | Llave encontrada. Retorna los datos del titular y su cuenta vinculada. |
| 400 | Datos inválidos. Algún campo está mal escrito o le falta información. |
| 404 | Llave no encontrada. El cliente no tiene llave registrada en el sistema. |
Registrar llave de cliente
Crea una nueva llave para un cliente — puede ser su correo, celular o cédula — y la vincula a su cuenta bancaria. Es como inscribirse a Nequi por primera vez: das tu número de celular y lo atan a tu cuenta.
¿Cuándo usarlo? La primera vez que un cliente quiere recibir transferencias usando su correo, celular o cédula como identificador.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| channel | string | Canal de la operación. Ej: "MOVIL". | Sí |
| sourceService | string | Servicio origen. Ej: "MEX". | Sí |
| identification | string | Número de cédula del cliente. Ej: "80009330". | Sí |
| typeIdentification | string | Tipo de documento. "CC" para cédula. | Sí |
| numberAccount | string | Número de cuenta bancaria que se vincula a la llave. Ej: "862000034". | Sí |
| processKeyCustomer | string | Tipo de proceso. Para registrar nuevo usar "NEWR". | Sí |
| typeKeyCustomer | string | Tipo de llave: "E" = email, "P" = phone (celular), "NRIC" = cédula. | Sí |
| valueKeyCustomer | string | El valor de la llave — el correo, el celular o la cédula. Ej: "rolozadag@gmail.com". | Sí |
| typeAccount | string | Tipo de cuenta: "AH" = ahorros, "CC" = corriente. | Sí |
| subTypeAccount | string | Subtipo de cuenta. Ej: "DE" para depósito electrónico. | Sí |
| receptorNode | string | Nodo receptor de la red de pagos. Ej: "VIS". | Sí |
| sourceTypeAccountDescription | string | Descripción del tipo de cuenta. Ej: "Ahorros a la Vista". | Sí |
| businessName | string | Nombre del negocio o empresa. Ej: "Cliente Test Nuevo". | Sí |
| firstName | string | Primer nombre del cliente. Ej: "RENE". | Sí |
| surName | string | Primer apellido del cliente. Ej: "LOZADA". | Sí |
| secondSurName | string | Segundo apellido. Si no tiene, enviar "null". | No |
| user | string | Operador que realiza el registro. Ej: "rene". | Sí |
Ejemplo de petición
{
"channel" : "MOVIL",
"sourceService" : "MEX",
"identification" : "80009330",
"typeIdentification" : "CC",
"numberAccount" : "862000034",
"processKeyCustomer" : "NEWR",
"typeKeyCustomer" : "E",
"valueKeyCustomer" : "rolozadag@gmail.com",
"typeAccount" : "AH",
"subTypeAccount" : "DE",
"receptorNode" : "VIS",
"sourceTypeAccountDescription": "Ahorros a la Vista",
"businessName" : "Cliente Test Nuevo",
"firstName" : "RENE",
"surName" : "LOZADA",
"secondSurName" : "null",
"user" : "rene"
}Respuestas
| Código | Descripción |
|---|---|
| 201 | Llave creada exitosamente. El cliente ya puede recibir transferencias con su correo/celular/cédula. |
| 400 | Datos inválidos. Revisa los campos obligatorios. |
| 409 | La llave ya existe. Este correo o celular ya está registrado — no se puede duplicar. |
Actualizar llave de cliente
Modifica los datos de una llave que ya existe. Por ejemplo, si el cliente cambió de correo o quiere actualizar el nombre. Es como editar un contacto guardado en el celular.
Necesitas el idKeyCustomer (el ID único de la llave). Lo obtienes del resultado de Consultar llave.
Parámetros clave
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| idKeyCustomer | string | ID único de la llave a modificar. Es como el número de turno de esa llave. Ej: "416da151-51e9-4bd6-8c13-4f244f3648d9". | Sí |
| processKeyCustomer | string | Para actualizar usar "AMND". | Sí |
| typeKeyCustomer | string | Tipo de llave: "E" = email, "P" = celular, "NRIC" = cédula. | Sí |
| valueKeyCustomer | string | Nuevo valor de la llave. Ej: "rolozadag@gmail.com". | Sí |
| firstName / surName | string | Nombre actualizado del cliente. | Sí |
| identification / numberAccount | string | Cédula y número de cuenta del cliente. | Sí |
| channel / sourceService / user | string | Datos del canal y operador (igual que en los demás endpoints). | Sí |
Ejemplo de petición
{
"channel" : "MOVIL",
"processKeyCustomer" : "AMND",
"typeKeyCustomer" : "E",
"valueKeyCustomer" : "rolozadag@gmail.com",
"idKeyCustomer" : "416da151-51e9-4bd6-8c13-4f244f3648d9",
"receptorNode" : "VIS",
"sourceTypeAccountDescription": "Ahorros a la Vista",
"businessName" : "PaymentsWay",
"firstName" : "RENEE",
"surName" : "LOZADA",
"sourceService" : "MEX",
"identification" : "80009330",
"typeIdentification" : "CC",
"numberAccount" : "862000034",
"typeAccount" : "AH",
"subTypeAccount" : "DE",
"user" : "jcano"
}Respuestas
| Código | Descripción |
|---|---|
| 200 | Llave actualizada exitosamente. |
| 400 | Datos inválidos. |
| 404 | Llave no encontrada — el idKeyCustomer no existe. |
Eliminar llave de cliente
Desvincula y elimina la llave de un cliente. Después de esto, esa llave ya no se puede usar para recibir transferencias. Es como borrar un número de cuenta de tus favoritos en la app del banco.
Esta acción no se puede deshacer. Asegúrate de tener el idKeyCustomer correcto antes de ejecutarla.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| idKeyCustomer | string | ID único de la llave a eliminar. Ej: "1f66a569-5f23-4ba2-8f7a-53d4c77d2400". | Sí |
| processKeyCustomer | string | Para eliminar usar "DEAC". | Sí |
| typeKeyCustomer / valueKeyCustomer | string | Tipo y valor de la llave a eliminar. | Sí |
| identification / numberAccount | string | Cédula y cuenta del titular. | Sí |
| firstName / surName | string | Nombre del titular. | Sí |
| receptorNode / sourceService / channel / user / ip | string | Datos del canal y operador (igual al resto de endpoints). | Sí |
Ejemplo de petición
{
"channel" : "MOVIL",
"processKeyCustomer": "DEAC",
"typeKeyCustomer" : "E",
"valueKeyCustomer" : "rolozadag@gmail.com",
"idKeyCustomer" : "1f66a569-5f23-4ba2-8f7a-53d4c77d2400",
"receptorNode" : "VIS",
"sourceTypeAccountDescription": "Ahorros a la Vista",
"businessName" : "PaymentsWay",
"firstName" : "Brayan",
"surName" : "Marin",
"sourceService" : "MEX",
"identification" : "80009330",
"typeIdentification": "CC",
"numberAccount" : "862000034",
"typeAccount" : "AH",
"subTypeAccount" : "DE",
"ip" : "192.168.0.1",
"user" : "jcano"
}Respuestas
| Código | Descripción |
|---|---|
| 200 | Llave eliminada exitosamente. |
| 400 | Datos inválidos. |
| 404 | Llave no encontrada. |
Consultar destinatario (GetTarget)
Busca a quién le vas a enviar la plata usando su llave (correo, celular o cédula). Cuando envías la información del monto y cuenta origen, el sistema prepara la transacción y te devuelve un transactionId — guárdalo porque lo necesitas en el siguiente paso.
Si envías amount, sourceIdentification y sourceAccount junto con los datos del destinatario, este endpoint también prepara la transacción y retorna el transactionId listo para ejecutar.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| channel | string | Canal. Ej: "WEB". | Sí |
| sourceService | string | Servicio origen. Ej: "PEX". | Sí |
| entity | string | Código de la entidad bancaria del destinatario. Obligatorio y debe enviarse desde el frontend. Ej: "EB000001". | Sí |
| user | string | Operador. Ej: "jcano". | Sí |
| typeKeyCustomer | string | Tipo de llave del destinatario: "E" = email, "P" = celular, "NRIC" = cédula. | Sí |
| valueKeyCustomer | string | Valor de la llave del destinatario. Ej: "deison_ac@hotmail.com". | Sí |
| ip | string | IP del dispositivo. Ej: "192.168.0.1". | Sí |
| amount | string | Monto a transferir. Si se envía, también prepara la transacción. Ej: "1.02". | No* |
| sourceIdentification | string | Cédula de quien envía el dinero. Ej: "1051287968". | No* |
| sourceAccount | string | Número de cuenta de quien envía. Ej: "852000002". | No* |
| uuid / mac / trademark / model / platform / serialDevice / simDeviceId / simCellNumber / simOperator / simSerialNumber / versionPlatform / geoLocation / userAgentString | string | Datos del dispositivo (igual que en get-key). | No |
* Si envías uno de los tres (amount, sourceIdentification, sourceAccount), debes enviar los tres juntos.
Ejemplo de petición
{
"channel" : "WEB",
"sourceService" : "PEX",
"entity" : "EB000001",
"user" : "jcano",
"typeKeyCustomer" : "E",
"valueKeyCustomer" : "deison_ac@hotmail.com",
"ip" : "192.168.0.1",
"amount" : "1.02",
"sourceIdentification": "1051287968",
"sourceAccount" : "852000002",
"geoLocation" : "4.710989,-74.072092"
}Respuestas
| Código | Descripción |
|---|---|
| 200 | Destinatario encontrado. Si se envió monto, retorna transactionId para usar en el siguiente paso. |
| 400 | Datos inválidos. |
| 404 | Destinatario no encontrado — esa llave no existe en el sistema. |
Realizar Transferencia
Ejecuta la transferencia de dinero entre dos cuentas. Es el paso final donde el dinero realmente se mueve. Necesitas tener listo el targetResolutionId que obtuviste en Consultar destinatario.
El targetResolutionId es único por transacción y expira. Úsalo inmediatamente después de obtenerlo en get-target.
Parámetros — Origen (quien envía)
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| channel / sourceService / user / ip | string | Datos del canal y operador. | Sí |
| amount | string | Monto a transferir. Ej: "1000000". | Sí |
| reference | string | Descripción o referencia del pago. Ej: "Pago de referencia". | Sí |
| sourceIdentification | string | Cédula de quien envía. Ej: "11281434". | Sí |
| sourceTypeIdentification | string | Tipo de doc de quien envía. Ej: "CC". | Sí |
| sourceFirstName / sourceSurName | string | Nombre y apellido de quien envía. | Sí |
| sourceEntity | string | Código del banco de quien envía. Ej: "EB000001". | Sí |
| sourceNumberAccount | string | Número de cuenta de quien envía. Ej: "862000159". | Sí |
| sourceTypeAccount / sourceSubTypeAccount | string | Tipo y subtipo de cuenta origen. Ej: "AH", "DE". | Sí |
Parámetros — Destino (quien recibe)
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| targetResolutionId | string | ★ Clave. ID obtenido en get-target. Ej: "373988e9-490c-48d6-aa12-a06b92e184af". | Sí |
| targetValueKeyCustomer | string | Llave del destinatario. Ej: "80009330". | Sí |
| targetTypeKeyCustomer | string | Tipo de llave del destinatario. Ej: "NRIC". | Sí |
| targetEntity | string | Código del banco destino. Ej: "00000022". | Sí |
| targetNumberAccount | string | Número de cuenta destino. Ej: "862000034". | Sí |
| targetTypeAccount / targetSubTypeAccount | string | Tipo y subtipo de cuenta destino. | Sí |
| targetIdentification / targetTypeIdentification | string | Cédula y tipo de doc del destinatario. | Sí |
| targetFirstName / targetSurName | string | Nombre y apellido del destinatario. | Sí |
| targetNode | string | Nodo de destino en la red de pagos. Ej: "NODE001". | Sí |
| geoLocation / uuid / mac / trademark / model / platform / serialDevice / simDeviceId / simCellNumber / simOperator / simSerialNumber / versionPlatform / userAgentString | string | Datos del dispositivo para seguridad y auditoría. | No |
Ejemplo de petición
{
"channel" : "MOVIL",
"sourceService" : "MEX",
"user" : "jcano",
"ip" : "192.168.0.1",
"reference" : "Pago de referencia",
"amount" : "1000000",
"sourceIdentification" : "11281434",
"sourceTypeIdentification": "CC",
"sourceFirstName" : "DEISON ANDREI",
"sourceSurName" : "BUITRAGO",
"sourceEntity" : "EB000001",
"sourceNumberAccount" : "862000159",
"sourceTypeAccount" : "AH",
"sourceSubTypeAccount" : "DE",
"targetResolutionId" : "373988e9-490c-48d6-aa12-a06b92e184af",
"targetValueKeyCustomer": "80009330",
"targetTypeKeyCustomer": "NRIC",
"targetEntity" : "00000022",
"targetNumberAccount" : "862000034",
"targetTypeAccount" : "AH",
"targetSubTypeAccount" : "DE",
"targetNode" : "NODE001",
"targetIdentification" : "80009330",
"targetTypeIdentification": "CC",
"targetFirstName" : "RENE",
"targetSurName" : "LOZADA"
}Respuestas
| Código | Descripción |
|---|---|
| 200 | Transacción realizada. El dinero está en camino y recibirás un paymentId para seguimiento. |
| 400 | Datos inválidos. Revisa que todos los campos obligatorios estén correctos. |
| 404 | Cuenta o llave no encontrada. El targetResolutionId expiró o la cuenta no existe. |
| 500 | Error en la transacción. Problema interno — guarda el error y contacta soporte. |
Consultar pago específico
Verifica el estado de una transferencia que ya realizaste usando su paymentId. Es como rastrear un paquete de Rappi: le das el número de pedido y te dice en qué estado va.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| paymentId | string | ID único del pago, obtenido al hacer la transacción. Ej: "6bd54b39-c876-4295-9b58-c2735147ece8". | Sí |
| initialDate | string | Fecha de inicio de la búsqueda, formato YYYYMMDD. Ej: "20250804". | Sí |
| finalDate | string | Fecha fin de la búsqueda, formato YYYYMMDD. Ej: "20250804". | Sí |
| initialHour | string | Hora de inicio, formato HHmmss. Ej: "081700" = 8:17:00 AM. | Sí |
| finalHour | string | Hora fin, formato HHmmss. Ej: "235900" = 11:59 PM. | Sí |
{
"paymentId" : "6bd54b39-c876-4295-9b58-c2735147ece8",
"initialDate": "20250804",
"finalDate" : "20250804",
"initialHour": "081700",
"finalHour" : "235900"
}Respuestas
| Código | Descripción |
|---|---|
| 200 | Información del pago obtenida. Estado, monto, fecha y partes involucradas. |
| 400 | Datos inválidos. Verifica el formato de fechas y horas. |
| 404 | Pago no encontrado. El paymentId no existe o está fuera del rango de fechas. |
Historial de pagos de un cliente
Consulta todos los pagos que ha realizado un cliente en un rango de fechas y horas. Es como pedir el extracto bancario de los últimos días, pero filtrado por el sistema BReB.
Parámetros
| Campo | Tipo | Descripción | Req. |
|---|---|---|---|
| identification | string | Cédula del cliente cuyo historial quieres consultar. Ej: "1193127269". | Sí |
| typeIdentification | string | Tipo de documento. Ej: "CC". | Sí |
| initialDate / finalDate | string | Rango de fechas formato YYYYMMDD. Ej: "20250804". | Sí |
| initialHour / finalHour | string | Rango de horas formato HHmmss. Ej: "000000" / "235959". | Sí |
{
"identification" : "1193127269",
"typeIdentification": "CC",
"initialDate" : "20250804",
"finalDate" : "20250804",
"initialHour" : "000000",
"finalHour" : "235959"
}Respuestas
| Código | Descripción |
|---|---|
| 200 | Historial obtenido. Lista de todas las transferencias del cliente en ese período. |
| 400 | Datos inválidos. |
| 404 | No se encontraron pagos en ese rango de fechas para ese cliente. |
Reportes
El módulo de reportes permite generar, programar y enviar automáticamente informes de transacciones BReB. Ideal para conciliación contable, auditoría y control de movimientos.
Endpoints disponibles
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /reports/generate-and-send | Genera el reporte y lo envía automáticamente a los destinatarios configurados. |
| GET | /reports/generate | Genera el reporte sin enviarlo. |
| GET | /reports/transactions | Lista todas las transacciones disponibles para reportar. |
| GET | /reports/generate-by-schedule/{scheduleId} | Genera un reporte de un programa específico en un rango de fechas (startDate, endDate). |
| GET | /reports/schedules | Lista todos los programas de reportes configurados. |
| POST | /reports/schedules | Crea un nuevo programa de reporte. |
| GET | /reports/schedules/{id} | Consulta un programa de reporte específico por su ID. |
| PUT | /reports/schedules/{id} | Actualiza un programa de reporte existente. |
| DEL | /reports/schedules/{id} | Elimina un programa de reporte. |
| GET | /reports/recipients | Lista todos los destinatarios configurados para recibir reportes. |
| POST | /reports/recipients | Agrega un nuevo destinatario de reportes. |
| GET | /reports/recipients/{id} | Consulta un destinatario específico. |
| PUT | /reports/recipients/{id} | Actualiza un destinatario existente. |
| DEL | /reports/recipients/{id} | Elimina un destinatario. |
| GET | /reports/schedules/{scheduleId}/recipients | Lista todos los destinatarios de un programa de reporte específico. |
Los endpoints de reportes no requieren body por el momento — la configuración detallada de CreateReportScheduleDto y CreateReportRecipientDto se define en el contrato interno del proyecto. Contacta al equipo técnico de PaymentsWay para los schemas completos.
Flujo típico de reportes
- Crea los destinatarios que recibirán los reportes (
POST /reports/recipients). - Crea un programa de reporte con la frecuencia y configuración deseada (
POST /reports/schedules). - Vincula los destinatarios al programa generado.
- Genera el reporte manualmente cuando necesites (
GET /reports/generate-and-send) o espera la ejecución automática según el programa.