Bienvenido a Merchant
PaymentsWay Merchant es la plataforma completa para integrar cobros en tu negocio. Desde aquí puedes configurar tus métodos de pago, conectar tu tienda online y gestionar todas tus transacciones desde un solo lugar.
¿Qué puedes hacer en Merchant?
¿Por dónde empezar?
- Regístrate y obtén tus credenciales de acceso — ver Registro.
- Elige tu método de integración: plugin, widget, botón HTML o API REST — ver Modos de integración.
- Configura los métodos de pago que quieres ofrecer: tarjeta, PSE, efectivo o QR.
- Activa tu webhook para recibir confirmaciones en tiempo real — ver WebHook.
- Realiza una prueba de extremo a extremo con un monto mínimo antes de salir a producción.
¿Necesitas ayuda? Escribe a soporte@paymentsway.co — nuestro equipo responde en menos de 24 horas.
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
Un link de pago es una URL que puedes generar desde la consola de PaymentsWay o vía API y compartir por cualquier canal digital. El cliente hace clic, ingresa sus datos de pago y listo — sin que tengas que instalar nada en tu sitio web.
¿Cómo funciona?
Links masivos
Genera links para múltiples clientes a la vez cargando una plantilla de Excel. Ideal para facturación por lotes, cobros de cuotas o pagos periódicos a muchos clientes al mismo tiempo.
Link individual
Crea un link para un cliente específico con sus datos prellenados o genérico sin datos. Sobre cada link generado tienes tres acciones disponibles:
- Ver — Abre el checkout en el navegador para previsualizar.
- Copiar — Copia el link recortado al portapapeles.
- Compartir — Envía el link por SMS directamente 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 sea el cliente quien seleccione o ingrese el monto antes de pagar. Útil para donaciones, propinas o cobros variables.
Para generar links vía API consulta los endpoints Crear link con redirección y Crear link de pago.
Botón de Pago
El botón de pago es un formulario HTML que envías desde tu servidor hacia el checkout de PaymentsWay con los datos de la compra ya precargados. El cliente llega al checkout listo para pagar — tú controlas los datos, PaymentsWay gestiona el cobro.
¿Cómo funciona?
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
El botón de pago abierto es una variación del botón estándar donde el cliente elige cuánto pagar. Tú defines un rango de montos y él decide. Ideal para donaciones, recargas, propinas o cualquier cobro donde el precio no es fijo.
¿Cómo funciona?
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 es un checkout embebido que se abre directamente dentro de tu página — el cliente paga sin salir de tu sitio. A diferencia del botón de pago, no hay redirecciones: el formulario aparece sobre tu propio sitio como una capa flotante.
Widget vs Botón de Pago
| Característica | Widget | Botón de Pago |
|---|---|---|
| Redirección | No — se abre en tu página | Sí — va al portal PW |
| Instalación | CSS + JS + 3 líneas | Solo un formulario HTML |
| Experiencia | Checkout flotante | Página completa |
| Pagos recurrentes | ✓ Soportado | ✗ No disponible |
| Monto dinámico | ✓ updateAmount() | ✗ Fijo en el form |
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
Esta sección describe la experiencia que vive el cliente al usar el widget — desde que hace clic en "Pagar" hasta que recibe la confirmación, sin salir de tu sitio web en ningún momento.
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 de cobro embebibles con el branding de tu marca. Se insertan en cualquier página web como un iframe — el cliente paga sin salir de tu sitio y sin ver ninguna pantalla de PaymentsWay. Ideal para páginas de donación, suscripciones o cobros recurrentes con imagen propia.
¿Cuándo usar cartas vs widget?
| Característica | Carta de Pago | Widget |
|---|---|---|
| Branding propio | ✓ Total | ✗ Estilo PaymentsWay |
| Instalación | Un <embed> o link | CSS + JS + init |
| URL autorizada requerida | ✓ Sí | ✓ Sí |
| Monto dinámico por código | ✗ No | ✓ updateAmount() |
| Uso típico | Donaciones, landing pages | E-commerce, carrito |
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
WooCommerce es el plugin de comercio electrónico más usado del mundo, construido sobre WordPress. Con el plugin nativo de PaymentsWay puedes aceptar pagos con tarjeta y PSE en tu tienda en minutos — sin escribir una sola línea de código.
Flujo de instalación
Requisitos previos
Ten a mano las credenciales entregadas por PaymentsWay antes de empezar:
| Dato | Dónde encontrarlo |
|---|---|
| Merchant ID | Panel PaymentsWay → Mis Credenciales |
| Terminal ID | Panel PaymentsWay → Mis Credenciales |
| Form ID (ID Botón de Pago) | Panel PaymentsWay → Botones de Pago |
| API Key | Solicitar a soporte@paymentsway.co |
| URL de retorno | La URL de la página de tu tienda (ej: https://mitienda.com/tienda) |
Instalación paso a paso
⬇ Descargar PluginMonedas soportadas: COP, USD, EUR. Asegúrate de configurar la misma moneda en WooCommerce.
- Ve a WordPress → Plugins → Añadir nuevo → Subir plugin, selecciona el archivo
plugin-payments.zipy haz clic en Instalar ahora. - Una vez instalado haz clic en Activar plugin.
- Ve a WooCommerce → Ajustes → Pagos y activa el interruptor de PaymentsWay.
- Haz clic en Configurar e ingresa los datos de tu cuenta:
ID MERCHANT,ID TERMINAL,ID BOTÓN DE PAGOyAPIKEY. - En el campo URL de retorno pega la URL de la página principal de tu tienda.
- Haz clic en Guardar cambios.
Realiza una compra de prueba para confirmar que el checkout redirige al portal de PaymentsWay y regresa correctamente a tu tienda.
PrestaShop
PrestaShop es una plataforma de comercio electrónico de código abierto ampliamente usada en Colombia y Latinoamérica. El módulo nativo de PaymentsWay se instala directamente desde el panel de administración — sin modificar código ni plantillas.
Flujo de instalación
Requisitos previos
Credenciales necesarias, entregadas por el equipo de PaymentsWay:
| Dato | Dónde encontrarlo |
|---|---|
| merchant_id | Panel PaymentsWay → Mis Credenciales |
| terminal_id | Panel PaymentsWay → Mis Credenciales |
| form_id | Panel PaymentsWay → Botones de Pago |
| apikey | Solicitar a soporte@paymentsway.co |
Paso 1 — Instalación
⬇ Descargar Módulo- Ve a Módulos → Administrador de Módulos → Subir un módulo.
- Selecciona el archivo
pwmerchant.zipy espera que la instalación se complete.
Paso 2 — Configuración
- En el listado de módulos localiza PaymentsWay y haz clic en Configurar.
- Ingresa tus credenciales:
merchant_id,terminal_id,form_id,apikey. - Guarda los cambios.
Paso 3 — Preferencias de pago
- Ve a Pagos → Preferencias.
- Configura restricciones por moneda (COP, USD, EUR), grupos de clientes y países según tu operación.
- Guarda los cambios.
Realiza una compra de prueba para confirmar que el checkout funciona correctamente con PaymentsWay.
Magento
Magento (Adobe Commerce) es la plataforma de comercio electrónico empresarial preferida por negocios de mediano y gran tamaño. La extensión de PaymentsWay para Magento 2 se instala vía cPanel sin necesidad de Composer ni acceso por SSH.
Flujo de instalación
Requisitos previos
Credenciales necesarias, entregadas por el equipo de PaymentsWay:
| Dato | Dónde encontrarlo |
|---|---|
| Merchant ID | Panel PaymentsWay → Mis Credenciales |
| Terminal ID | Panel PaymentsWay → Mis Credenciales |
| Form ID | Panel PaymentsWay → Botones de Pago |
| API Key | Solicitar a soporte@paymentsway.co |
| Response URL | La URL de tu tienda donde Magento procesa la respuesta del pago |
Paso 1 — Instalación vía cPanel
⬇ Descargar Extensión- Accede a tu cPanel y abre el Administrador de archivos.
- Navega a la carpeta raíz de tu instalación de Magento y luego abre la carpeta
app/. - Sube el archivo
plugin-magento-paymentsway.zipy descomprímelo. Se creará la carpetacode/con la extensión.
Paso 2 — Configuración en el panel de Magento
- Accede al panel de administración de Magento.
- Ve a Stores → Configuration → Sales → Payments Way Configuration.
- Ingresa tus datos:
Terminal ID,Form ID,Merchant ID,API KeyyResponse URL. - Haz clic en Save Config.
- Ve a System → Cache Management y limpia el caché completo.
Realiza una compra de prueba para confirmar que el checkout redirige correctamente al portal de PaymentsWay y que la respuesta se procesa en tu tienda.
VTEX
VTEX es la plataforma de comercio digital líder en Latinoamérica, utilizada por grandes marcas y retailers para gestionar sus tiendas en línea con alto volumen de transacciones. Con el conector nativo de PaymentsWay puedes activar Visa, Mastercard y PSE en tu tienda VTEX en tres pasos simples — sin desarrollo, sin código, en menos de 15 minutos.
Flujo de integración
El diagrama muestra los tres pasos de configuración (que se hacen una sola vez) y el flujo de cada pago desde el checkout de VTEX hasta la confirmación:
Requisitos previos
Antes de iniciar ten a mano los siguientes datos — los entrega el equipo de PaymentsWay:
| Dato | Ejemplo | Dónde obtenerlo |
|---|---|---|
| Merchant ID | 65 | Panel PaymentsWay → Mis Credenciales |
| Terminal ID | 511 | Panel PaymentsWay → Mis Credenciales |
| Form ID | 602 | Panel PaymentsWay → Botones de Pago |
| API Key | N2Y5NGQy... | Solicitar a soporte@paymentsway.co |
Necesitas acceso de administrador a tu tienda VTEX con rol Owner o Finance.
Paso 1 — Generar App Key y App Token en VTEX
El App Key y App Token son las credenciales que permiten al conector de PaymentsWay comunicarse de forma segura con tu tienda VTEX. Se generan una sola vez.
Ruta: Ícono de usuario (arriba a la derecha) → Account Settings → API Keys
URL directa: https://{su-cuenta}.myvtex.com/admin/api-keys
- Inicia sesión en el admin de tu tienda VTEX:
https://{su-cuenta}.myvtex.com/admin - Haz clic en el avatar de usuario (esquina superior derecha) y selecciona "Account Settings".
- Haz clic en "API Keys" y luego en "+ New API Key" (o "Generate Key").
- Asigna el nombre
"PaymentsWay-Produccion"y el rol "Owner" (o mínimo "FinancePayments"). - Haz clic en "Generate". VTEX te mostrará el App Key y un link para obtener el App Token — copia ambos de inmediato.
El App Token se muestra una sola vez. Si cierras la pantalla sin copiarlo tendrás que generar uno nuevo. Guárdalo en un gestor de contraseñas.
El App Key tiene el formato: vtexappkey-{nombretienda}-XXXXXX
| Campo | Ejemplo |
|---|---|
| App Key | vtexappkey-mitienda-UCXFKW |
| App Token | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (cadena larga) |
Paso 2 — Crear el proveedor de pago PaymentsWay
Ruta: Store Settings → Payment → Providers
URL directa: https://{su-cuenta}.myvtex.com/admin/affiliations
- En el menú lateral ve a Store Settings → Payment → Providers.
- Haz clic en "New Provider", escribe "PaymentsWay" en el buscador y selecciónalo.
- Completa el formulario con los valores de la siguiente tabla.
- Haz clic en "Guardar". El proveedor aparecerá como "Production".
| Campo del formulario | Valor a ingresar |
|---|---|
| Nombre (Name) | PaymentsWay Prod (o el nombre que prefieras) |
| Ambiente (Mode) | Production |
| App Key | El App Key generado en el Paso 1 |
| App Token | El App Token generado en el Paso 1 |
| merchantId | Entregado por PaymentsWay. Ej: 65 |
| terminalId | Entregado por PaymentsWay. Ej: 511 |
| formId | Entregado por PaymentsWay. Ej: 602 |
| apiKey | Clave API de PaymentsWay (diferente al App Key de VTEX) |
| Workspace | master |
El campo apiKey es la clave de PaymentsWay, distinta al App Key de VTEX. Si la clave tiene espacios o saltos de línea, pégala sin ellos. Su longitud debe ser múltiplo de 4 — si no, añade = al final.
Paso 3 — Configurar métodos de pago
Repite este proceso una vez por cada método: Visa, Mastercard y PSE.
Ruta: Store Settings → Payment → Settings → pestaña "Payment Conditions"
URL directa: https://{su-cuenta}.myvtex.com/admin/pci-gateway#/rules
- Haz clic en el botón verde "+" para agregar una nueva condición.
- Busca y selecciona el método de pago: Visa.
- En el campo Provider selecciona "PaymentsWay".
- Asigna el nombre "PaymentsWay Visa".
- Cuotas: deja "En una cuota" o configura según tu necesidad.
- Haz clic en "Guardar". Repite para Mastercard y PSE.
PSE es un método de débito bancario exclusivo para Colombia. No requiere configuración de cuotas — siempre es un pago en una sola cuota. El cliente es redirigido al portal de su banco para completar el pago.
Al terminar la sección Payment Conditions debe mostrar:
| Método | Nombre | Estado |
|---|---|---|
| VISA | PaymentsWay Visa | ACTIVE |
| MASTERCARD | PaymentsWay Mastercard | ACTIVE |
| PSE | PaymentsWay PSE | ACTIVE |
Datos de referencia del conector
| Parámetro | Valor |
|---|---|
| Nombre del conector | PaymentsWay |
| Versión | 1.0.0 |
| Tipo de integración | VTEX Payment Provider (IO Connector) |
| Flujo de pago | Redirect — redirige al portal de PaymentsWay y regresa a la tienda |
| Ambiente de producción | https://merchant.paymentsway.co |
| Métodos soportados | Visa, Mastercard, PSE (débito bancario Colombia) |
| Moneda | COP (Peso Colombiano) |
| Reembolsos / Cancelaciones | Gestionados directamente en el portal de PaymentsWay |
Verificación final
Realiza una compra de prueba desde el checkout de tu tienda con un monto mínimo ($1.055 COP) para confirmar que el flujo redirige correctamente al portal de PaymentsWay y regresa a la tienda al completar la transacción.
Soporte
| Canal | Detalle |
|---|---|
| soporte@paymentsway.co | |
| Web | www.paymentsway.co |
| Teléfono | 601-7035887 · 315-5546305 |
| Dirección | Carrera 11A N° 93-52, oficina 503, Bogotá, Colombia |
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.
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.
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'); });
BReB — QR
BReB (Botón de Recaudo Bancario) es el estándar colombiano de pagos inmediatos QR impulsado por Banco de la República de Colombia. PaymentsWay lo implementa sobre la infraestructura de VePay / qrvbreb.vepay.com.co, cumpliendo el estándar QR. Permite recibir pagos desde cualquier app bancaria del ecosistema ACH.
Flujo completo 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. |
Ecosistema compatible
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 siguiendo el estándar QR. 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 QR. | 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 QR string (EMV) 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 — Transferencias BReB
Esta API permite hacer transferencias de dinero entre cuentas bancarias usando el sistema BReB de Integración 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.
Esta sección es independiente del QR. Mientras el QR usa la infraestructura de VePay, Integración BReB conecta directamente con el sistema ACH de transferencias interbancarias.
¿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}/visionamosLa URL base del entorno (producción / sandbox) es entregada por PaymentsWay al activar el servicio 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 en la red ACH. 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" : "Integración BReB",
"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" : "Integración BReB",
"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 la red ACH del destinatario. 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. |