Esta documentación es el punto de partida para desarrolladores y clientes que quieran crear su primer cobro e integrarse con los servicios de Akua. Está diseñada para ser un recurso paso a paso, claro y siempre actualizado.
Esta documentación evoluciona junto con el producto. Las sugerencias de mejora son bienvenidas.
¿Qué vas a encontrar acá?
Un conjunto de guías organizadas que cubren desde los primeros pasos de integración hasta configuraciones avanzadas, con el objetivo de que cualquier equipo pueda entender, implementar y mantener su integración con Akua de forma autónoma.
Principios de esta documentación
Principio
Descripción
Lenguaje unificado
Terminología estandarizada para facilitar la comunicación entre equipos técnicos y de negocio
Consistencia
Formato y estructura coherentes en todos los documentos
Centralización
Todo en un solo lugar, con búsqueda eficiente
Actualización continua
Procesos de revisión que mantienen la información precisa y vigente
Soporte a decisiones
Información confiable como base para implementaciones y definiciones técnicas
¿Te resultó útil?
Solución Flexible para el Procesamiento de Pagos
Akua es una plataforma de procesamiento de pagos que se adapta a los requisitos de cada negocio. Puede operar como procesador y adquirente completo o como solo procesador, según la estructura del cliente.
Modelos operativos
Akua como Procesador y Adquirente
Akua opera bajo su propia licencia de adquirencia con Visa y Mastercard. Pasarelas de pago, facilitadores y orquestadores integran pagos de comerciantes directamente con las redes de tarjetas sin depender de adquirentes locales. Akua asume la responsabilidad total del flujo de pago.
Akua como Solo Procesador
Akua provee la infraestructura y el soporte técnico a otro adquirente que mantiene la relación de licencia con las redes de tarjetas. Akua maneja la tecnología y la logística sin interacción directa con comerciantes ni licencias propias de red.
Comparación
Aspecto
Procesador y Adquirente
Solo Procesador
Rol
Posee licencias con las redes de tarjetas
Provee servicios tecnológicos a otro adquirente
Funciones
Gestiona conexiones de comerciantes, transacciones, riesgo y disputas
Suministra infraestructura de autorización y liquidación
Clientes
Grandes comerciantes, pasarelas, facilitadores de pago
Adquirentes que necesitan delegar el procesamiento técnico
Los ciclos de transacción y el flujo de información son consistentes en ambos modelos.
¿Te resultó útil?
Tipos de clientes
¿Qué tipo de clientes pueden integrarse con Akua?
Akua ofrece un proceso adaptable para diferentes tipos de clientes. La plataforma reconoce que las necesidades varían según el perfil del integrado, por lo que proporciona experiencias personalizadas y eficientes.
Adquirente
Instituciones financieras que procesan pagos de tarjetas o soluciones de pago electrónico:
Adquiriente Financiero: Regulados por entidades gubernamentales
Adquiriente No Vigilado: Operan bajo un modelo flexible
Proceso de Integración:
Adquiriente Financiero:
Presentación de licencias y certificaciones regulatorias
Sincronización directa con sistemas de pago diario
Adquiriente No Vigilado:
Validación contractual y revisión de políticas internas
Pruebas intensivas para garantizar estabilidad
Facilitadores de pago | PayFacs
Empresas intermediarias entre comerciantes y adquirientes que permiten la aceptación de pagos electrónicos. Akua actúa como adquiriente en estos casos.
Proceso de Integración:
Validación regulatoria: Licencias para operar como facilitador, información sobre sub-merchants gestionados
Configuración técnica: Acceso a API para registrar sub-merchants, implementación de herramientas de split payments
Soporte avanzado: Resolución continua de disputas y contracargos
Pasarelas de pago | Gateways
Proveedores de infraestructura que conectan comerciantes con adquirientes.
Proceso de Integración:
Validación: Cumplimiento con normativas internacionales (PCI DSS)
Configuración técnica: Sincronización de flujos transaccionales, configuración de redundancia
Reportes: Dashboards para monitoreo en tiempo real
Billeteras | Wallets | SDWOs
Plataformas que permiten almacenar dinero digitalmente y realizar pagos seguros, operando con modelos "stored value" u "open loop".
Proceso de Integración:
Carga de documentación: Licencias como billetera electrónica, certificaciones de cumplimiento (PCI DSS si aplica)
Configuración técnica: Acceso a API para gestión de transacciones y saldo, implementación de Webhooks para notificaciones
Pruebas: Escenarios simulados (carga y retiro de saldo)
Comercios | Merchants
Negocios que aceptan pagos electrónicos, desde pequeñas tiendas hasta grandes cadenas retail.
Proceso de Integración:
Registro: Documentos de identidad empresarial, validación de cuenta bancaria
Configuración técnica: Integración con POS o sistema e-commerce, configuración de tasas y límites
Pruebas: Tutoriales para dashboard y gestión de reportes
Conclusión
El proceso de integración de Akua busca ser flexible y adaptarse a necesidades específicas de cada cliente, con enfoque en experiencia del usuario y cumplimiento normativo para implementación segura y eficiente.
¿Te resultó útil?
CONCEPTOS CLAVES
3
Clientes, Organizaciones, Agregadores & Comercios
Esta sección describe las entidades del ecosistema Akua, sus relaciones y cómo se estructuran jerárquicamente.
Jerarquía de cuentas
Las cuentas en Akua se organizan en cuatro niveles:
Cliente
└── Organización
└── Agregador
└── Merchant
Clientes
Representan a las empresas u organizaciones que utilizan las soluciones de adquirencia financiera de Akua para gestionar pagos. Pueden ser desde pequeñas operaciones hasta grandes organizaciones que buscan simplificar sus procesos de cobro.
Organizaciones
Ofrecen una forma lógica de agrupar y estructurar los agregadores y comercios dentro de un cliente. Cada cliente recibe una organización "default" al registrarse, pero puede crear múltiples organizaciones según su modelo de negocio.
Agregadores
El Agregador es la entidad que contiene el payfacID — el identificador que lo acredita como facilitador de pagos ante las redes. Todos los merchants que procesan transacciones deben pertenecer a un agregador.
Atributo
Descripción
payfac_id
Identificador del facilitador de pagos ante las redes (Visa, Mastercard, etc.)
Merchants asociados
Todos los comercios que procesan bajo ese agregador
Comercios
Los merchants pertenecen a un agregador y son quienes reciben los pagos electrónicos de los consumidores mediante tarjetas de crédito, débito u otros métodos digitales. Un Comercio es una unidad principal de procesamiento. Puede representar una marca, razón social o una línea de negocio específica. Ejemplo: Tienda A, Tienda B
Cada comercio puede tener:
Subcomercios
Sucursales o puntos de venta
Terminales
Subcomercios
Un Subcomercio representa una división más específica dentro de un comercio. Ideal para casos como franquicias, unidades independientes o regiones. Ejemplo: Tienda A - Franquicia Córdoba
Cada subcomercio puede tener:
Puntos de venta
Terminales
¿Te resultó útil?
Venta Presente
Entidades POS y Terminales
La gestión de Puntos de Venta y terminales representa un proceso clave para asegurar que las transacciones ocurran de manera eficiente y segura. Esta sección describe las relaciones entre POS y terminales y los procedimientos de integración.
¿Qué es un Point of Sale?
Un Point of Sale (POS) es una representación de ubicación física o digital donde ocurren las transacciones. El POS incluye:
Detalles completos de dirección
Nombre de sucursal o tienda
Coordenadas geográficas
Capacidad máxima de terminales asignables
¿Qué es un Terminal?
Un terminal es un dispositivo físico que procesa pagos electrónicos en un POS, que incluye:
Modelo y número de serie
Métodos de pago soportados (VISA, Mastercard, QR)
Estado operacional (Activo/Inactivo)
Venta Presente con POS
Para transacciones desde terminales POS, la jerarquía sigue: Organization > Merchant > POS > Terminal.
Adherir un Point y un Terminal
La asociación de terminales requiere primero crear un POS. El POS funciona como el punto de referencia que organiza las transacciones.
Por qué esta relación importa:
Organización: Gestión de terminales por POS específico
Trazabilidad: Seguimiento de transacciones hasta el POS de origen
Escalabilidad: Fácil adición de terminales en múltiples ubicaciones
Paso 1: Crear un Point of Sale (POS)
Datos requeridos:
Nombre del punto de venta
Dirección completa (calle, número, ciudad, país, código postal)
Coordenadas opcionales (latitud/longitud)
{"name":"Sucursal Palermo","address":{"street":"Av. Santa Fe","number":"3250","city":"Buenos Aires","state":"CABA","country":"Argentina","zip_code":"1425","coordinates":{"latitude":-34.5886,"longitude":-58.4061}},"merchant_id":"mer-12345","max_active_pos":10}
Las tarjetas son instrumentos que representan de forma virtual una tarjeta física. Al registrar una nueva tarjeta, el sistema genera automáticamente un identificador único con el prefijo ins- seguido de 20 caracteres alfanuméricos.
Atributos principales
Atributo
Descripción
ID
Identificador único del instrumento (ins-xxxxxxxxxxxxxxxxxxxx)
Fingerprint
Hash que identifica la tarjeta física sin exponer datos sensibles
Payment Method
Tipo de instrumento, marca y categoría de la tarjeta
Status
Estado operacional: ACTIVE / INACTIVE
Validation
Estado de validación: VALID / PENDING
Detalle de atributos
ID
Se genera automáticamente al crear la tarjeta. Identifica al instrumento de forma exclusiva en el sistema.
ins-a1b2c3d4e5f6g7h8i9j0
Fingerprint
Valor alfanumérico generado a partir de los datos de la tarjeta. Permite identificar la tarjeta física subyacente sin exponer información sensible, incluso cuando existen múltiples instrumentos asociados a una misma cuenta.
El fingerprint nunca expone datos privados fuera de un entorno seguro (PCI).
Payment Method
Describe el tipo de instrumento con un formato compuesto de tres partes:
TIPO_INSTRUMENTO_MARCA_TIPO_TARJETA
Ejemplo:
Parte
Valor
Tipo de instrumento
CARD
Marca
MASTERCARD
Tipo de tarjeta
CREDIT
Resultado
CARD_MASTERCARD_CREDIT
Status y Validation
Atributo
Valor
Significado
Status
ACTIVE
La tarjeta está habilitada para transacciones
Status
INACTIVE
La tarjeta no está disponible
Validation
VALID
La tarjeta pasó el proceso de validación
Validation
PENDING
La tarjeta aún no fue validada
Datos del número de tarjeta
El número completo (PAN) nunca se expone fuera de un entorno PCI. Solo se pueden visualizar partes no sensibles:
Campo
Descripción
BIN
Primeros 6 u 8 dígitos — identifican a la entidad emisora
Últimos 4 dígitos
Se usan para identificar la tarjeta en ciertas operaciones
CVV
Válido por 3 minutos desde su generación o última transacción exitosa. Nunca se muestra fuera de un entorno PCI
¿Te resultó útil?
INTEGRACIONES
1
Akua es una plataforma de Adquirencia como Servicio (AaaS). Esta guía cubre todo lo que necesitás saber para integrarte: desde el acuerdo inicial hasta la autenticación y los entornos de desarrollo.
Tiempo estimado de kickoff a producción: ~14 días.
Pasos de integración
1. Firma del contrato y Kickoff
Se formaliza el acuerdo con Akua y se coordina una reunión de Kickoff para alinear equipos, expectativas y definir el alcance del proyecto. Es el punto de partida para una integración ordenada y ágil.
2. Acceso al Dashboard
El equipo de Akua enviará un correo de invitación con un link para registrarte como administrador en el Dashboard de Autogestión.
Una vez dentro:
Ingresá tu Company ID (generalmente tu dominio) para acceder
Iniciá sesión con el usuario y contraseña que hayas creado
Gestioná usuarios y asigná roles según el área:
Rol
Descripción
Administrador
Acceso total a configuración y usuarios
Developer
Acceso a API Keys y herramientas técnicas
Finanzas
Acceso a reportes y conciliación
Fraude
Monitoreo y gestión de alertas
Operaciones
Gestión operativa del día a día
3. API Keys y Autenticación
Las credenciales se generan desde el Dashboard en Developers > API Keys.
Credenciales a generar:
Client ID
Client Secret
Permisos (scopes) según la integración
Flujo de autenticación:
Envía tus credenciales al endpoint /oauth/token para obtener un JWT token
Usa ese token como Bearer Token en el header de cada request
El token tiene duración de 24 horas — será necesaria una lógica de refresh
4. Entornos disponibles
Entorno
URL Base
Sandbox
Pruebas y desarrollo (datos simulados, sin impacto contable)
Producción
Operaciones reales
La migración a producción se realiza una vez validado el checklist de homologación, que cubre:
Base técnica (JWT, API Keys, Webhooks)
E-commerce (Autorizaciones, Capturas, Reembolsos)
Tarjeta Presente (si aplica)
⏱️ Timeout recomendado: 40 segundos
El tiempo de timeout recomendado es de 40 segundos para requests de pagos.
Los tiempos de respuesta de Akua son sólidos: p95 de 3 segundos y p99 de 8 segundos. El timeout de 40 segundos no refleja la latencia de Akua, sino el margen necesario para cubrir casos borde en la red de franquicia. Timeouts más ajustados generan rechazos innecesarios que pueden escalar a contracargos.
🔁 Idempotency-Key
Es necesario incluir el header Idempotency-Key en todos los requests para manejar reintentos de forma segura y evitar transacciones duplicadas.
Herramientas y soporte
Recurso
Descripción
Postman Collections
Colecciones listas para testear la API
MCP (Módulo de Integración Rápida)
Herramienta para acelerar el time-to-market
Tarjetas de prueba
Números que simulan aprobaciones y rechazos reales
Documentación online
100% accesible, siempre actualizada
Sandbox gratuito
Disponible desde el día uno, sin costo
Soporte disponible 24/7:
Autogestión vía documentación y Help Center
Agente de IA (FIN)
Agentes humanos
Escalación interna para casos críticos
¿Te resultó útil?
SEGURIDAD
3
¿Qué es PCI DSS?
PCI DSS (Payment Card Industry Data Security Standards) es el conjunto de requisitos de seguridad establecidos por el PCI Security Standards Council para organizaciones que manejan datos de tarjetas de pago. Su cumplimiento es exigido por Visa, Mastercard, Discover y American Express.
Cualquier entidad que almacene, procese o transmita datos de tarjetas de crédito puede estar sujeta a estos requisitos.
Akua está certificado como Proveedor de Servicios Nivel 1 en cumplimiento con PCI DSS.
Niveles de cumplimiento
Los niveles se definen según el volumen anual de transacciones:
Nivel
Volumen de transacciones
Nivel 1
Más de 6 millones en todos los canales
Nivel 2
Entre 1 y 6 millones en todos los canales
Nivel 3
Entre 20.000 y 1 millón en línea
Nivel 4
Menos de 20.000 en línea, o hasta 1 millón en todos los canales
Validación — Cuestionarios SAQ
Los comerciantes de niveles 2 a 4 validan su cumplimiento mediante Cuestionarios de Auto-Evaluación (SAQ). El tipo aplicable depende del modelo de integración:
Tipo
Aplica a
A
Comerciantes que externalizan completamente las funciones de pago a proveedores validados
A-EP
E-commerce que externaliza pagos sin almacenar datos del tarjetahabiente
B
Comerciantes que usan solo máquinas de impresión o terminales independientes
B-IP
Comerciantes con terminales conectadas por IP aprobadas por PTS
C-VT
Comerciantes con terminales virtuales basadas en internet
C
Comerciantes con aplicaciones de pago conectadas a internet
P2PE
Comerciantes con terminales dentro de soluciones P2PE validadas
D
Todos los demás comerciantes y proveedores de servicios
Akua pre-llena la información del SAQ basándose en los detalles de integración del comerciante y monitorea el cumplimiento de forma continua, notificando ante cambios o incidencias.
¿Te resultó útil?
Seguridad y Cumplimiento
Akua cuenta con certificación PCI DSS Nivel 1 — el nivel de seguridad más estricto disponible en el ecosistema de pagos.
La documentación de Attestation of Compliance (AoC) está disponible bajo solicitud en trust.akua.la.
Prácticas de seguridad
Práctica
Descripción
HTTPS / TLS
Todas las APIs y el Dashboard operan sobre HTTPS. Las conexiones HTTP no cifradas son rechazadas. TLS protege los datos en tránsito, incluyendo datos de tarjeta e información personal (PII).
Cifrado de datos
La información sensible nunca se expone en texto plano. Los datos del cliente se cifran con algoritmos criptográficos avanzados. Las llaves de cifrado son accesibles únicamente para personal autorizado de Akua.
Tokenización
Los números de tarjeta se reemplazan por tokens cifrados no sensibles. Todos los datos de tarjetas se almacenan en un vault certificado PCI DSS.
Evaluaciones y auditorías
Actividad
Frecuencia
Detalle
Evaluación independiente (QSA)
Anual
Realizada por Evaluadores de Seguridad Calificados
Escaneo de vulnerabilidades
Regular
Por Proveedores de Escaneo Aprobados (ASV)
Pruebas de penetración
Regular
Éticas, con remediación documentada de hallazgos
¿Te resultó útil?
Dual Encryption — Datos de Tarjeta
Descripción general
Akua permite enviar datos sensibles de tarjeta encriptados usando RSA-OAEP-256. Esto permite a los integradores encriptar los campos de tarjeta del lado del cliente antes de enviarlos en una solicitud de autorización, de forma que el PAN y el CVV nunca viajen en texto plano.
El merchant solo necesita trabajar con RSA. El proceso es directo: cada campo sensible se cifra de forma independiente con la clave pública RSA del cliente y el resultado en Base64 se envía en el campo encrypted_* correspondiente.
Nota sobre la arquitectura interna: Internamente, el servicio de encriptación también utiliza AES-256-GCM, pero exclusivamente para proteger las claves privadas RSA en reposo (en base de datos). Esto es completamente transparente para el integrador y no forma parte del flujo de encriptación del request.
¿Cómo funciona?
El objeto card en una solicitud de autorización acepta cinco campos en texto plano o en forma encriptada. Las variantes encriptadas usan el prefijo encrypted_:
Campo original
Equivalente encriptado
number
encrypted_number
expiration_month
encrypted_expiration_month
expiration_year
encrypted_expiration_year
holder_name
encrypted_holder_name
cvv
encrypted_cvv
Los campos se pueden combinar — por ejemplo, se puede enviar encrypted_number junto con expiration_month en texto plano.
Regla de precedencia: Si se envía un campo en texto plano y su equivalente encrypted_* al mismo tiempo, el campo en texto plano tiene prioridad. Para evitar confusión, se recomienda enviar solo uno de los dos por campo.
Los endpoints de gestión de claves viven en la MISMA base que el resto de la API del comercio (la que ya se usa para /oauth/token, /v1/instruments, /v1/users, etc.):
Ambiente
URL base
Sandbox
https://sandbox.akua.la
Producción
https://api.akua.la
Gestión de claves
El flujo de integración requiere dos pasos: primero obtener la clave pública activa (creándola si aún no existe), luego usarla para encriptar los campos de tarjeta.
Ambos endpoints se autentican con el mismo Bearer token client_credentials que ya se usa para el resto de la API. No hace falta enviar el header client-id — el servicio resuelve el cliente a partir del JWT.
Paso 1 — Crear o rotar el par de claves
Antes de poder encriptar, el cliente debe generar su par de claves RSA en el sistema. Este paso se realiza una sola vez (o cada vez que se quiera rotar la clave).
⚠️ Este endpoint reemplaza la clave activa si ya existe una — no llamarlo en cada arranque de tu app. Hacé GET primero y solo POST si no hay clave.
{"client_id":"cli-d6g4fk97st004b10ai70","kid":"key_d965l7hg7c83rpt50pag","algorithm":"RSA-OAEP-256","key_size":2048,"status":"active","public_key":"-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----\n","valid_from":"2026-07-07T01:47:11.151315844Z","valid_until":"2027-07-07T01:47:11.151315844Z","created_at":"2026-07-07T01:47:11.151315844Z","updated_at":"2026-07-07T01:47:11.151315844Z"}
Paso 2 — Obtener la clave pública activa
Una vez creada, se obtiene la clave pública para encriptar los campos de tarjeta. Este endpoint devuelve la clave existente sin rotarla.
El string Base64 resultante se coloca en el campo encrypted_* correspondiente del objeto card.
Repetir este proceso para cada campo que se desee encriptar (number, expiration_month, expiration_year, holder_name, cvv).
Rotación de claves
Las claves se rotan anualmente.
Solo se permite una clave activa por cliente a la vez — llamar a POST /v1/encryption/keys reemplaza la clave activa existente.
Los integradores deben siempre obtener la clave activa desde GET /v1/encryption/keys antes de encriptar, para asegurarse de usar la clave vigente.
¿Te resultó útil?
PAGOS CON TARJETA
29
¿Te resultó útil?
Transacciones CIT / MIT — Guía de Integración
Endpoint: POST /v1/payments/authorizations
Las redes de tarjetas (Visa, Mastercard) exigen identificar quién inicia cada transacción y qué tipo de cobro es. Akua resuelve esto con dos campos en el request de autorización: initiator y order_type.
Conceptos clave
CIT (Customer Initiated Transaction): el tarjetahabiente está presente (física o digitalmente) y autoriza el cobro de forma activa. Ejemplos: una compra en un e-commerce, el primer pago de una suscripción, guardar una tarjeta para uso futuro.
MIT (Merchant Initiated Transaction): el comercio cobra sin presencia del cliente, basándose en un acuerdo previo que el cliente autorizó en una CIT. Ejemplos: el cobro mensual de una suscripción, un cargo por no-show en un hotel, un reintento de cobro.
La regla fundamental es: toda MIT debe vincularse a la CIT que le dio origen. Esto se hace enviando parent_transaction_data con los identificadores de red que Akua devuelve en la respuesta de la CIT original.
Los campos
initiator
Valor
Significa
customer
El tarjetahabiente inicia y autoriza el pago (CIT)
merchant
El comercio inicia el cobro sin presencia del tarjetahabiente (MIT)
order_type
Este campo le dice a la red de tarjetas qué tipo de cobro se está haciendo. Dependiendo del valor, puede usarse como CIT, como MIT, o como ambos en distintos momentos del flujo.
Valores que aplican como CIT y como MIT:
Valor
Como CIT (Initial)
Como MIT (Subsequent)
recurring
Alta inicial de la suscripción
Cobros periódicos posteriores
installment
Primera cuota del plan
Cuotas siguientes
standing_order
Autorización inicial del débito automático
Cobros por monto variable
unscheduled
Guardado de la credencial
Cobros futuros no programados
deferred
Autorización inicial
Cobro posterior
delayed
Autorización inicial del servicio (ej: check-in de hotel)
Cuando se usan como CIT, estos valores actúan como CIT-Initial: la credencial se almacena (card-on-file) y se activa la tokenización y el Account Updater (ABU) para mantener los datos de la tarjeta vigentes.
Valores solo CIT:
Valor
Descripción
purchase
Compra puntual. La credencial no se guarda para cobros futuros. No se activa tokenización ni ABU
purchase es el único tipo CIT que no funciona como CIT-Initial. Es una transacción aislada sin relación con cobros posteriores.
Valores solo MIT:
Valor
Descripción
no_show
Cargo por no presentación a una reserva (penalidad según política del comercio)
resubmission
Reenvío de una transacción previamente rechazada (solo cuando la respuesta del emisor no prohíbe reintentar)
Flujo completo: CIT → MIT
El patrón siempre es el mismo, sin importar el order_type:
Se hace una CIT (el cliente autoriza)
En la respuesta, Akua devuelve network_data dentro de la transacción, con los identificadores de la red
El comercio guarda esos identificadores
Cuando toca cobrar sin el cliente, se envía una MIT incluyendo parent_transaction_data con esos identificadores
Paso 1 — CIT inicial
El cliente autoriza el primer cobro. En este ejemplo, es una suscripción (recurring):
POST /v1/payments/authorizations
{"intent":"authorization","entry_mode":"not-present","order_type":"recurring","initiator":"customer","capture":{"mode":"AUTOMATIC"},"merchant_id":"mer-xxxxxxxxxx","amount":{"value":29900,"currency":"COP"},"instrument":{"type":"CARD","card":{"number":"53830400xxxx0002","cvv":"917","expiration_month":"12","expiration_year":"30","holder_name":"Juan Rodriguez"}},"customer_data":{"billing_address":{"street":"Calle 26","number":"45A-60","city":"Bogotá","state":"Cundinamarca","zip_code":"110911","country":"COL"}}}
Respuesta de la CIT (extracto relevante)
La respuesta incluye los datos de red dentro de transaction.network_data. Lo importante es guardar estos valores para usarlos en las MIT posteriores:
Importante: guardar el payment_id o transaction.id devuelto. Estos se usan para construir parent_transaction_data en las MIT posteriores. Adicionalmente, dependiendo de la red, la respuesta puede incluir campos específicos como mastercard_economic_tlid o visa_initial_transaction_identifier dentro de network_data.
Paso 2 — MIT posterior
Cuando llega el momento de cobrar sin presencia del cliente, se envía la misma autorización pero con initiator: "merchant" y parent_transaction_data para vincularla a la CIT original.
Con datos de Mastercard:
POST /v1/payments/authorizations
{"intent":"authorization","entry_mode":"not-present","order_type":"recurring","initiator":"merchant","capture":{"mode":"AUTOMATIC"},"merchant_id":"mer-xxxxxxxxxx","amount":{"value":29900,"currency":"COP"},"instrument":{"id":"ins-xxxxxxxxxx"},"parent_transaction_data":{"network_data":{"mastercard_economic_tlid":"AABB1234CCDD5678EEFF01"}}}
Con datos de Visa:
POST /v1/payments/authorizations
{"intent":"authorization","entry_mode":"not-present","order_type":"recurring","initiator":"merchant","capture":{"mode":"AUTOMATIC"},"merchant_id":"mer-xxxxxxxxxx","amount":{"value":29900,"currency":"COP"},"instrument":{"id":"ins-xxxxxxxxxx"},"parent_transaction_data":{"network_data":{"visa_initial_transaction_identifier":"012345678901234"}}}
Notas sobre las MIT:
Se usa instrument.id (el instrumento almacenado), no los datos crudos de la tarjeta. El CVV no se almacena ni se reenvía.
No se envía customer_data — el cliente no está presente.
parent_transaction_data.network_data lleva el identificador de red correspondiente a la marca de la tarjeta.
Vinculación por red (parent_transaction_data)
El campo que se envía dentro de parent_transaction_data.network_data depende de la red de la tarjeta:
Red
Campo
Formato
Mastercard
mastercard_economic_tlid
Alfanumérico, máximo 22 caracteres
Visa
visa_initial_transaction_identifier
Numérico, exactamente 15 dígitos
Estos valores los devuelve Akua en la respuesta de la CIT aprobada. El comercio debe almacenarlos y enviarlos sin modificar en cada MIT posterior de la misma serie.
Opcionalmente, parent_transaction_data también acepta first_payment_id y first_transaction_id para vincular usando los identificadores internos de Akua en lugar de (o además de) los de red.
Ejemplos por caso de uso
En todos los ejemplos de MIT se omiten los campos que no cambian respecto al flujo general (la estructura completa se mostró arriba). Solo se muestran los campos relevantes para cada caso.
Suscripción — recurring
Caso: streaming, SaaS, membresías. Monto fijo, frecuencia fija.
Caso: hotel, transporte, servicios donde pueden surgir cargos adicionales después del servicio principal. La CIT es la autorización al inicio del servicio (ej: check-in), y las MIT son los cargos adicionales posteriores (ej: minibar, peajes, daños).
La autorización es el primer paso en el proceso de pago, donde se presentan los detalles de la tarjeta de crédito del tarjetahabiente al comercio para el pago. El comerciante envía la transacción al banco adquirente, que reenvía la solicitud al emisor de la tarjeta para su autorización a través de la red.
El proceso de un pago incluye tres etapas principales, que se traducen de la siguiente manera:
Autorización:
Es el primer paso del proceso, en el cual:
El titular de la tarjeta proporciona los detalles de pago al comerciante.
El banco adquirente (el banco del comerciante) envía la solicitud a través de la red de tarjetas al banco emisor (el banco del titular de la tarjeta).
El banco emisor verifica la validez de la tarjeta, los fondos disponibles y la seguridad de la transacción, y responde aprobando o rechazando la operación.
Si se aprueba, se genera un código de autorización y se reserva temporalmente el monto en la cuenta del titular, pero aún no se transfiere al comerciante.
Compensación
En esta etapa:
Los detalles de la transacción aprobada se procesan y se preparan para la liquidación.
El adquirente y la red de tarjetas realizan una reconciliación de la transacción con el emisor para confirmar montos y aplicar cualquier ajuste (como tasas o conversiones de moneda).
Esta etapa asegura que todos los participantes en la transacción estén alineados con la información registrada.
No implica transferencia de dinero aún, pero garantiza que los datos sean precisos para la siguiente etapa.
Liquidación:
Finalmente:
Los fondos reservados en la autorización se transfieren del banco emisor al banco adquirente, pasando por la red de tarjetas.
El banco adquirente acredita el monto al comerciante, menos las comisiones aplicables (como la tasa de descuento).
En este punto, la transacción se completa y el comerciante recibe su pago.
Roles y Responsabilidades
Rol
Responsabilidad
CLIENTE
Inicia la transacción realizando un pago.
COMERCIANTE
Recibe el pago del cliente y actúa como intermediario entre el cliente y Akua.
Akua
Conecta a los comerciantes con las redes de tarjetas y bancos emisores. Valida y procesa las solicitudes de autorización del comerciante.
REDES DE TARJETAS
Facilitan la comunicación entre Akua y el banco emisor.
BANCO EMISOR
Decide si la transacción es aprobada o rechazada.
El camino de una transacción
El cliente realiza el pago: Usa su tarjeta (física o digital) para realizar una compra en un negocio (tienda física o en línea).
El comerciante envía la solicitud: Compartimos los detalles esenciales del pago con el banco del cliente (emisor) para su evaluación.
El emisor responde: Aprueba o rechaza la solicitud en función de la validez de la tarjeta, los fondos disponibles y las políticas de seguridad.
¿Qué sucede cuando el banco responde?
APROBACIÓN
Código de Autorización:
Un número único que confirma la transacción.
Aprobaciones Parciales:
En algunos casos, el emisor puede aprobar solo una parte del monto (esto se aplica particularmente a ciertos tipos de comerciantes).
RECHAZO
La tarjeta puede ser rechazada por razones como:
Fondos insuficientes.
Información incorrecta.
Sospecha de fraude.
En casos especiales, si el emisor sospecha fraude, puede ser necesaria una verificación manual (llamada por teléfono).
Flujo de autorización en un pago y sus estados
Flujo
Estado
Descripción del estado
Estado Inicial
CREATED
Este es el primer estado del flujo. Indica que el proceso ha sido creado, pero no se ha tomado ninguna acción aún.
Estado intermedio
PENDING
Una vez creado, el proceso pasa al estado pendiente, esperando una acción o procesamiento adicional.
Estado final
SUCCEEDED
El proceso fue aprobado exitosamente.
REJECTED
Indica que el proceso fue rechazado.
CANCELED
Indica que el proceso fue cancelado por alguna razón.
📘 Cualquier estado puede llevar finalmente a un ERROR. Esto sugiere que puede ocurrir una falla en cualquier etapa del proceso.
¿Te resultó útil?
Pre-autorización
Descripción
Más allá de la autorización estándar, la pre-autorización permite a los comerciantes reservar un monto estimado de pago sin hacerlo final. Este proceso se usa comúnmente en industrias de hospitalidad y alquiler de vehículos donde los montos finales de transacción pueden fluctuar.
Durante la pre-autorización:
Una suma se retiene en la cuenta del titular de la tarjeta como garantía
Se pueden hacer ajustes posteriormente—aumentando o disminuyendo el monto reservado
Si el monto final es menor, la diferencia se libera automáticamente
Si es mayor, el comerciante debe solicitar autorización adicional
Flujo de los estados de una Preautorización
Casos de Uso
La pre-autorización proporciona flexibilidad y seguridad tanto para comerciantes como para clientes, asegurando que los fondos estén disponibles para bienes o servicios entregados.
Escenarios comunes incluyen:
Hoteles: cubriendo costos de habitación más extras potenciales
Alquiler de autos: cubriendo tarifas de alquiler y posibles cargos por daños
Aerolíneas: garantizando pago mientras se procesa la emisión de boletos
E-commerce: asegurando pago antes de confirmar disponibilidad de producto
Requisitos Clave
La pre-autorización debe liquidarse dentro de 30 días
En pre-autorizaciones, sólo se acepta modo de captura MANUAL
Las transacciones deben vincularse usando el Trace ID (DE 48, subelemento 63) para asociación precisa con el emisor
¿Te resultó útil?
Autorización Parcial
Descripción
Un proceso que ocurre cuando el monto total de una transacción no puede ser aprobado debido a fondos insuficientes o crédito limitado. En lugar de rechazar la transacción completamente, el banco emisor aprueba un monto parcial, permitiendo al titular de la tarjeta usar un método de pago adicional para el saldo restante.
Puntos Clave
El proceso asegura que los titulares de tarjetas puedan completar compras incluso con fondos disponibles limitados. El sistema de pago del comerciante debe soportar autorización parcial para manejar estas transacciones correctamente. El saldo restante puede pagarse usando otra tarjeta, efectivo o método de pago alternativo.
Casos de Uso
Este enfoque resulta especialmente valioso para tarjetas prepago o cuando los clientes combinan múltiples métodos de pago. Ofrece flexibilidad tanto a comerciantes como a clientes, previniendo rechazos de transacción innecesarios.
Flujo del Proceso
Solicitud Inicial: El comerciante envía el monto total de la transacción para aprobación
Respuesta del Emisor: El banco aprueba el monto parcial y envía respuesta de autorización con la suma aprobada
Notificación del Terminal: Muestra el saldo restante; solicita método de pago alternativo
Completar o Reversar: Ya sea un mensaje de advice (0120) confirma la aprobación parcial, o un mensaje de reversa (0400) explica la cancelación
Escenarios de Ejemplo
El titular de tarjeta intenta un pago de $100 con $75 disponibles; recibe aprobación de $75 con $25 pendientes
El titular de tarjeta paga $50 coincidiendo con el saldo disponible; no se solicitan fondos adicionales
La continuación envía advice confirmando aprobación; la cancelación envía reversa explicando la razón
Requisitos Clave
Campo DE 6: Muestra el monto aprobado disponible para compra
Notificación al Comerciante: El adquirente debe notificar al comerciante si la aprobación parcial iguala el monto solicitado para prevenir cargos adicionales
¿Te resultó útil?
Compensación
¿Qué es la compensación?
El clearing es el precursor del settlement (liquidación). Ambas partes involucradas (Adquirente y Emisor) comparten y acuerdan los detalles de la transacción. Normalmente, cuando el proceso de clearing de una transacción se completa, el emisor actualiza el saldo del titular de la tarjeta (los fondos aún no se han transferido). En caso de desacuerdo, puede ocurrir un contracargo (chargeback).
Resumen del proceso de clearing
El proceso de clearing implica coordinar datos de pago, validación y liquidación entre los comerciantes, Akua y las redes de tarjetas. Esto asegura una reconciliación eficiente y pagos precisos.
Pasos del proceso:
Inicio: Un cliente (a través de un trabajo programado - cron job) inicia una solicitud para activar el proceso de captura basado en el ID de pago. El proceso puede activarse automáticamente (captura instantánea) o programarse.
Validación del pago: El orquestador recupera los detalles del pago desde la API de pagos y verifica la elegibilidad del pago para ser capturado.
Notificación: El orquestador utiliza SNS (Simple Notification Service) para notificar a otros servicios sobre el proceso de clearing.
Preparación del servicio de clearing: Los datos de la transacción se envían al servicio de clearing para su procesamiento. Los metadatos necesarios se almacenan en la base de datos.
Creación del archivo: El servicio de clearing compila un archivo de clearing basado en las transacciones pendientes y los ciclos de compensación.
Almacenamiento del archivo: El archivo de clearing se guarda en S3 para propósitos de auditoría y luego se envía a las redes de tarjetas.
¿Te resultó útil?
Captura de un Pago
La captura conecta la autorización con el clearing y la liquidación. Una vez que un pago es autorizado, la captura confirma que la transacción está lista para ser enviada a las redes de tarjetas, reconciliada y liquidada al comerciante.
Solo los pagos con estado AUTHORIZED pueden ser capturados.
Modos de captura
Modo
Descripción
MANUAL
La captura debe iniciarse explícitamente por el comerciante
AUTOMATIC
El sistema captura la transacción sin intervención manual
Flujo de captura
Estado
Descripción
AUTHORIZED
La autorización fue exitosa. Según el modo configurado, la captura se inicia de forma manual o automática.
CAPTURE IN PROGRESS
El proceso de clearing comenzó. Si falla, el pago pasa a REJECTED.
CAPTURE PRESENTED
El archivo de clearing fue enviado a las redes de tarjetas. Si se confirma, avanza a CAPTURADO. Si no, pasa a REJECTED.
CAPTURED
La captura fue confirmada exitosamente. El pago queda listo para liquidación.
REJECTED
Ocurrió una falla en el clearing o en la confirmación de captura.
¿Te resultó útil?
Modos de Captura
Akua soporta tres modos de captura según las necesidades del negocio: AUTOMATIC, SCHEDULED y MANUAL.
Comparación de modos
Modo
¿Cuándo se presenta?
Requiere intervención
MANUAL
Solo cuando el comerciante envía una solicitud explícita
Sí
AUTOMATIC
En la próxima presentación de Akua (~30 min)
No
AUTOMATIC + hora en merchant
En la primera presentación de Akua luego de la hora configurada
No
AUTOMATIC + capture_after
En la primera presentación de Akua luego del datetime especificado
No
AUTOMATIC + ambos
capture_after toma precedencia sobre la hora del merchant
No
Importante: una vez que Akua presenta un pago a la red, no es posible cancelarlo, aunque el ciclo de compensación aún no haya corrido. Comercios con alto índice de cancelaciones deben considerar MANUAL o configurar una hora de captura adecuada.
Captura Manual — MANUAL
La captura se activa solo cuando el comerciante envía una solicitud explícita. La transacción permanece en estado AUTHORIZED hasta ese momento.
{"capture":{"mode":"MANUAL"}}
Si no se envía la petición de captura en aproximadamente 7 días, la autorización expira automáticamente. O 30 días para preautorizaciones.
Casos de uso: compras de alto valor que requieren validación, negocios con alto índice de cancelaciones, modelos que verifican entrega del producto antes de cobrar.
Captura Automática — AUTOMATIC
Akua presenta el pago en la próxima ronda (~30 min después de la autorización). No requiere ninguna acción del comerciante.
{"capture":{"mode":"AUTOMATIC"}}
Casos de uso: e-commerce con pagos instantáneos, suscripciones y cargos recurrentes, tiendas con alto volumen de transacciones.
Captura Automática con hora configurada en el merchant
El merchant puede tener una hora diaria de captura configurada en su perfil. En ese caso, Akua solo presenta los pagos en la primera ronda posterior a esa hora.
Ejemplo: hora configurada = 21:00. Si Akua presenta a las 21:30, esos pagos recién se incluyen en esa ronda. Los pagos autorizados antes de las 21:00 esperan hasta ese momento para ser elegibles.
{"capture":{"mode":"AUTOMATIC"}}
La hora se configura a nivel de merchant desde el Dashboard. No requiere cambios en el request de pago.
Casos de uso: comercios que necesitan agrupar capturas en un horario fijo diario, modelos de negocio con cierre de caja a hora determinada.
Captura Automática con capture_after
Permite especificar un datetime exacto a partir del cual el pago es elegible para ser presentado. Akua lo incluye en la primera ronda posterior a ese momento.
El campo acepta timezone explícito — la Z indica UTC. Podés especificar cualquier zona horaria usando el offset correspondiente (ej: 2026-02-27T21:00:00-05:00 para Colombia).
Casos de uso: pagos que deben capturarse en una fecha futura específica, reservas donde el cobro se efectúa el día del servicio.
Combinación: hora en merchant + capture_after
Si el merchant tiene una hora de captura configurada y el pago incluye capture_after, el campo de la transacción toma precedencia. El datetime enviado en el request es más específico que la configuración general del merchant.
En este caso, aunque el merchant tenga configuradas las 21:00, el pago no será elegible hasta las 22:00 UTC.
¿Te resultó útil?
Liquidación
¿Cómo funciona la liquidación?
Es el paso final en el que los fondos se transfieren del banco del tarjetahabiente (emisor) al banco del comerciante (adquirente). Las redes de tarjetas facilitan esta transferencia de fondos entre emisor y adquirente, contabilizando las tarifas aplicables. El adquirente entonces acredita la cuenta del comerciante con el monto de la transacción menos las tarifas.
Diferencias entre Clearing y Settlement
Clearing
Esta fase involucra el intercambio de datos de transacción. Las transacciones se mueven del adquirente al emisor para el registro en la cuenta del tarjetahabiente. Los mensajes de clearing contienen datos, pero no involucran el intercambio o transferencia de fondos.
Settlement
Ocurriendo después del clearing, esta fase consiste en las transferencias reales de fondos. Los fondos representan el valor monetario de las transacciones procesadas y se intercambian entre clientes según la posición neta calculada por Mastercard.
¿Te resultó útil?
Cashouts
¿Qué es un Cashout?
Un cashout representa el proceso mediante el cual un usuario recibe los fondos acumulados en su cuenta, transfiriéndolos a su método de pago predeterminado. Este mecanismo permite a los clientes obtener pagos de manera rápida y con total transparencia.
Características Clave:
Opera a través de procesamiento automatizado y periódico para asegurar liquidez del usuario
Proporciona desgloses detallados de montos y descuentos aplicados antes de la transferencia
Ofrece seguimiento en dashboard para el estado de cada cashout
Facilita la gestión financiera del usuario con visibilidad y control completos
Acciones del Cliente
Configurar Método de Pago Predeterminado
Los clientes deben establecer un método de pago predeterminado para recibir fondos de Akua, validado y gestionado a través del dashboard por usuarios autorizados.
Visibilidad del Estado del Cashout
Los usuarios pueden ver cashouts con estados PENDING, PROCESSING y PAID en el dashboard. Detalles adicionales incluyendo recibos de pago y comentarios permanecen accesibles para personal autorizado, junto con información de transacciones asociadas.
Pasos de Gestión
Revisar detalles del cashout
Validar información sobre montos, descuentos y pagos asociados
Subir comprobante de pago
Descarga de Recibo de Pago
Los clientes pueden acceder y ver el comprobante de cada transferencia vinculada a un cashout.
Este flujo de trabajo asegura transparencia y control, permitiendo a los clientes gestionar sus fondos eficientemente.
¿Te resultó útil?
Diferencias
Las devoluciones agrupan todos los procesos para interrumpir, revertir o reembolsar un pago. Dependiendo del estado en que se encuentre el pago, aplica una u otra modalidad.
Cancelación vs. Reembolso
Cancelación
Reembolso
¿Cuándo aplica?
Antes de la captura o liquidación
Después de la captura o liquidación
Estados válidos
CREATED, AUTHORIZED
CAPTURED, SETTLED
¿Se debita al cliente?
No — el monto nunca se cobra
Sí — se devuelve el monto ya cobrado
Vía de devolución
Se libera la reserva
Misma fuente de pago utilizada
Cancelación
Detiene el pago antes de que sea capturado. El monto reservado se libera y nunca se debita al cliente. Es útil para gestionar errores o solicitudes de anulación en etapas tempranas del flujo.
Solo disponible en pagos con estado CREATED o AUTHORIZED.
Reembolso (Refund)
Cuando el pago ya fue capturado o liquidado, no es posible cancelarlo. El reembolso devuelve el monto al cliente a través de la misma fuente de pago.
Estado del reembolso
Descripción
IN PROCESS
El reembolso fue iniciado y está siendo procesado
PRESENTED
El reembolso fue enviado a las redes de tarjetas
COMPLETED
El monto fue acreditado exitosamente al cliente
¿Te resultó útil?
Cancelación
Descripción
La cancelación de pagos permite detener el procesamiento de una transacción antes de que alcance las etapas de captura y liquidación. Esta acción está restringida a fases específicas del flujo de pago y debe cumplir con las políticas de autorización y captura.
¿Cuándo Puede Cancelarse un Pago?
Los pagos pueden cancelarse durante estas etapas:
Created: El pago existe pero no ha pasado por autorización
Authorized: El pago está aprobado pero aún no capturado
Estados del Proceso de Cancelación
El flujo de cancelación incluye estas etapas:
Estado Created
El pago está pendiente de autorización
Cancelación directa posible antes de que comience la autorización
Transición: Created → Cancelled
Estado Pending Authorization
El pago espera aprobación de autorización
Cancelación permitida antes de que inicie la captura
Transición: Pending authorization → Cancelled
Estado Authorized
El pago está aprobado y listo para captura
Cancelación disponible antes de que comience la captura
Transición: Authorized → Cancelled
Estado Cancelled
Cancelación exitosa desde estados anteriores
Marcado como "Cancelled"
No ocurre procesamiento de captura o liquidación
Relación Cancelación vs. Reembolso
Una vez que un pago alcanza captura o liquidación, la cancelación se vuelve imposible. En este punto, debe iniciarse un proceso de reembolso en su lugar.
Escenarios clave:
Pagos autorizados pero no capturados pueden cancelarse
Pagos capturados o liquidados requieren procesamiento de reembolso
Errores Comunes de Cancelación
Falla/Rechazo
Causas:
El estado del pago no permite cancelación
Restricciones del procesador de pagos
Soluciones:
Verificar el estado del pago antes de intentar cancelación
Contactar soporte técnico para fallas recurrentes
¿Te resultó útil?
Reembolso
Descripción
El proceso de reembolso permite la reversión de pagos previamente capturados. Esta documentación describe las etapas, estados involucrados y posibles transiciones en el flujo de reembolso.
Estados Iniciales para un Reembolso
Un reembolso puede iniciarse desde cualquiera de estos estados de pago:
Captured: El pago ha sido capturado.
Settled: El pago ha sido liquidado.
¿Cuándo Puedo Procesar un Reembolso?
Los reembolsos solo pueden ejecutarse si el estado del pago es válido y cumple con las políticas definidas por la plataforma.
Estados del Proceso de Reembolso
El flujo de reembolso incluye estos estados clave:
REFUND IN PROCESS / PRESENTED
Indica que el reembolso ha sido solicitado y está siendo procesado
Se genera un registro de transacción para seguimiento
REFUND COMPLETED
Muestra procesamiento exitoso del reembolso
La transacción asociada se marca como reembolsada
En algunos casos, el pago regresa a estado Settled una vez liquidado
REFUND FAILED / REJECTED
Indica reembolso incompleto debido a errores técnicos, fondos insuficientes o restricciones de la plataforma
El estado del pago permanece sin cambios
NO UPDATE
Usado cuando la confirmación del resultado del reembolso no está disponible
Relaciones de Estado
Los reembolsos interactúan con estados clave del flujo de pago:
Captured → Reembolso en Proceso: El reembolso inicia después de la captura del pago
Settled → Reembolso Completado: Un reembolso exitoso puede devolver el pago a estado Settled
Errores Comunes y Soluciones
Reembolso Fallido
Causa: Restricciones de fondos o fallas técnicas
Solución: Verificar con el procesador de pagos o reenviar solicitud
Sin Actualización
Causa: Falla de comunicación con sistema externo
Solución: Escalar a soporte técnico
Mejores Prácticas
Verificar el estado del pago antes de iniciar el reembolso
Mantener registros de todas las transacciones asociadas al reembolso
Implementar validaciones que prevengan reembolsos en estados inválidos
¿Te resultó útil?
Contracargos
¿Cómo se administran los Contracargos?
En Akua, el objetivo es ofrecer un mecanismo fácil y sencillo tanto para clientes como para operadores. Los clientes acceden a información detallada sobre cada chargeback, pueden cargar evidencias y realizar seguimientos del estado. Los operadores de Akua monitorean y gestionan el ciclo de vida de los chargebacks, actualizando su estado y comunicándose con clientes.
¿Cómo gestionar los contracargos en dashboard?
Acceso a la Sección de Chargebacks
Para gestionar un chargeback, ingresa a la sección Chargebacks dentro del módulo Risk en el dashboard de Akua. Desde allí, podrás visualizar y administrar todos los casos abiertos.
Visualización de Chargebacks
Cada chargeback registrado incluye:
Campo
Descripción
Chargeback ID
Identificador único del chargeback
Amount
Monto asociado (USD, BRL, ARS, etc.)
Payment ID
Identificador de la transacción original
Due Date
Fecha límite para responder
Reason
Motivo del chargeback
Status
Estado actual
Detalle del Chargeback
Al seleccionar un chargeback específico, accederás a:
Información básica: ID, fecha de notificación, motivo, estado
Historial del caso: Registro cronológico de cambios y evidencias
Nota: Los tiempos dependen de plazos establecidos por la entidad adquirente y red de pagos.
Manejo de estados en un chargeback
Estado
Descripción
Responsable
PENDING
Contracargo solicitado pero no procesado
Cliente
UNDER_REVIEW
Siendo revisado, en espera de información
Cliente
ACCEPTED
Chargeback aceptado, reembolso aprobado
Cliente
DISMISSED_BY_ISSUER
Rechazado por red o banco
Akua
EVIDENCE_UPLOADED
Evidencia cargada para disputa
Cliente
REPRESENTED
Enviado a red de tarjeta para revisión
Akua
AWAITING_ARBITRATION
Escalado a arbitraje
Akua
ARBITRATION_WON
Decisión favorable al merchant
Akua
ARBITRATION_LOST
Decisión desfavorable al merchant
Akua
CLOSED
Finalizado, sin nuevas acciones
Cliente
INFO_REQUESTED
Se solicita más información al cliente
Cliente
¿Te resultó útil?
Resumen: guía de Integración
Endpoint: POST /v1/payments/authorizations
Esta guía cubre los distintos escenarios de autorización que soporta la API. Todos los ejemplos usan entry_mode: "not-present" (e-commerce / tarjeta no presente).
Campos base
Toda autorización requiere como mínimo estos campos:
Campo
Tipo
Descripción
intent
string
Intención del pago. Valores: authorization (cobro normal), account-status (verificación sin monto)
entry_mode
string
Modo de ingreso. Para e-commerce: not-present
order_type
string
Tipo de orden CIT/MIT. Para compras puntuales: purchase
initiator
string
Quién inicia la transacción: customer (CIT) o merchant (MIT)
capture.mode
string
Modo de captura. AUTOMATIC captura inmediatamente, MANUAL requiere captura posterior
merchant_id
string
Identificador del comercio (formato mer-...)
amount
object
Monto con value (numérico) y currency (ISO 4217, ej: COP, USD)
instrument
object
Instrumento de pago (ver variantes abajo)
¿Te resultó útil?
0. Verificación de cuenta (account-status)
Transacción de monto cero para verificar que una tarjeta es válida y está activa, sin generar un cobro. Se usa intent: "account-status" y no se envía amount ni capture.
Casos de uso típicos: validar tarjeta antes de guardarla en bóveda, confirmar que la tarjeta sigue activa antes de un cobro recurrente, o verificar datos del titular.
¿Te resultó útil?
1. Pago con PAN directo
El caso más simple: se envían los datos crudos de la tarjeta.
customer_data.billing_address es opcional pero recomendado: mejora la tasa de aprobación y alimenta los modelos antifraude.
¿Te resultó útil?
2. Pago con impuestos (transaction_compliance)
Para jurisdicciones que requieren reportar impuestos en la transacción, se agrega el objeto transaction_compliance con un array de taxes. Hay tres formas de declararlo según la información disponible en el comercio.
Caso 1: IVA por porcentaje
El sistema asume que amount.value ya incluye el IVA y calcula la base gravable automáticamente.
Para un monto de 1000 COP, la respuesta descompondría: base gravable = 800, IVA = 200.
Caso 3: IVA por porcentaje con base gravable explícita
Cuando solo una parte del monto total es gravable (por ejemplo, el envío o servicios exentos no aplican IVA), el comercio declara la base gravable en taxable_amount. El porcentaje se aplica únicamente sobre ese valor.
La respuesta aplicaría el 19% solo sobre 84034: IVA = 15966.46. El remanente (100000 - 84034 - 15966.46) se trata como porción no gravable.
Nota: El campo percentage siempre debe enviarse como string. Los casos 1 y 3 son mutuamente excluyentes con el caso 2: no se debe combinar percentage con valor mayor a "0" junto a tax_amount.
¿Te resultó útil?
3. Pago con datos antifraude
Enviar datos adicionales del comprador mejora la evaluación de riesgo. Todos los campos dentro de customer_data son opcionales, pero entre más datos se envíen, mejor será la evaluación.
Campos antifraude disponibles: email, phone_number, device_fingerprint, ip_address, latitude, longitude, delivery_address. Enviar delivery_address cuando la dirección de entrega difiere de la de facturación permite detectar patrones de fraude.
¿Te resultó útil?
4. Pago con 3D Secure
Cuando el comercio ejecuta autenticación 3DS antes del cobro, se incluyen los campos eci y three_ds con los datos resultantes de la autenticación.
Número de cuotas. Debe ser un valor soportado por el emisor
installments.type
Tipo de financiamiento: issuer-financed (banco emisor financia), merchant-financed (comercio financia), acquirer-financed (adquirente financia), average-payment (pago promedio)
Nota: el campo type es recomendado. Si no se especifica, el comportamiento depende de la configuración del adquirente. Además, la cantidad de cuotas debe ser un valor válido según la red y el emisor (valores comunes: 2, 3, 6, 12, 18, 24, 36).
¿Te resultó útil?
6. Pago con instrumento (tokenizado)
Si previamente se almacenó un instrumento en la bóveda de Akua, basta enviar su id sin necesidad de los datos de tarjeta.
Token de red emitido por la marca (reemplaza al PAN)
network_token.cryptogram
Criptograma de validación del token
network_token.provider
Proveedor de la billetera (apple-pay, google-pay, samsung-pay, remote-commerce)
network_token.device_type
Tipo de dispositivo (phone, computer)
network_token.url
URL del comercio asociada al token
¿Te resultó útil?
Merchant Advice Codes (MAC)
Qué son
Los Merchant Advice Codes — o "MAC", también llamados "advice codes" o "códigos de aviso al comercio" — son un mecanismo definido por las redes de tarjetas (Mastercard, Visa, etc.) para que el banco emisor le comunique al comercio por qué rechazó una transacción y qué hacer con ese rechazo.
A diferencia del response_code de la red (que es un código duro: "00 aprobada", "05 no honorar", "51 fondos insuficientes"), el MAC va más allá: te dice si tiene sentido reintentar la transacción, si tenés que actualizar primero los datos de la tarjeta, si necesitás autenticación adicional, o si el rechazo es definitivo y no hay que volver a intentarlo. Sin esta información, un comercio puede reintentar una transacción rechazada miles de veces, lo cual aumenta sus tasas de fraude/disputas con la red, le cuesta dinero por cada reintento y puede llevar a sanciones de la marca.
En la respuesta de Akua, el MAC aparece dentro de transaction.network_data y solo cuando el rechazo viene acompañado de un advice code por parte del emisor. No todos los rechazos traen MAC: algunos errores técnicos (timeouts de red, fallas de Akua) responden sin merchant advice porque la transacción ni siquiera llegó al emisor.
Tres campos, uno solo importa para automatizar
Akua expone tres campos relacionados al MAC:
"network_data":{"merchant_advice_code":"41","merchant_advice_description":"New account information available","merchant_advice_action":"DO_NOT_RETRY"}
merchant_advice_code: el código numérico de 2 caracteres definido por la red (01, 02, 03, 04, 21, 24, 40, 41, 42, 43...). Es el dato crudo que reporta el emisor.
merchant_advice_description: la descripción legible del código, en inglés. Útil para mostrar al usuario interno o loguear.
merchant_advice_action: la acción que Akua te recomienda tomar, derivada del código. Esto es lo que tu integración debería usar para decidir el flujo automáticamente.
Solo merchant_advice_action es enum cerrado — los otros dos son strings libres que pasan tal cual los entrega la red. Eso significa que si tu lógica depende del código exacto, tenés que estar preparado para valores nuevos que la red puede agregar sin previo aviso. Si en cambio te basás en la action, tu código sigue funcionando aunque aparezcan códigos nuevos.
Las cuatro acciones posibles
merchant_advice_action es un enum con cuatro valores. Cada uno te dice exactamente qué hacer:
RETRY
El emisor rechazó la transacción por una causa transitoria (saturación temporal, problema de comunicación, etc.). Reintentar más tarde tiene buenas chances de aprobar.
Recomendación de uso: aplicar un backoff (por ejemplo esperar 10–30 minutos antes del siguiente intento) y reintentar máximo 1 o 2 veces con los mismos datos. Sin backoff, la red puede penalizarte por reintento agresivo.
UPDATE_AND_RETRY
El instrumento de pago tiene un problema que el cliente debe resolver antes de que la transacción pueda aprobarse. Típicamente es: tarjeta vencida, número incorrecto, cuenta cambiada de banco, o que el emisor ya emitió una tarjeta nueva con otros datos.
Recomendación de uso: pedirle al cliente que actualice los datos de la tarjeta (o que use otra). No reintentar con los mismos datos — el emisor te va a seguir rechazando. Si tenés Account Updater habilitado con la red, este es el momento de invocarlo antes de reintentar.
AUTHENTICATE_AND_RETRY
El emisor rechazó la autorización porque el riesgo del fraude le pareció alto, pero te está sugiriendo que si la próxima vez la mandás con autenticación 3D Secure, probablemente la apruebe.
Recomendación de uso: redirigir al cliente al flujo 3DS (típicamente "Smart 3DS" o el flujo de autenticación que tenga el comercio configurado), obtener el CAVV/cryptogram y reintentar la transacción incluyendo los datos de autenticación. Sin la autenticación, el emisor va a volver a rechazar.
DO_NOT_RETRY
El rechazo es definitivo. La cuenta está cerrada, la tarjeta cancelada, hubo fraude confirmado, o el cliente pidió no aceptar más cobros del comercio. Reintentar sin importar qué hagas va a fallar y, peor, te puede generar penalizaciones.
Recomendación de uso: marcar la transacción como permanentemente rechazada en tu sistema, no incluir ese instrumento en reintentos automáticos, no incluir esa cuenta en cobros recurrentes futuros (esto último es especialmente importante para suscripciones — la red sanciona a comercios que siguen cobrando contra cuentas con MAC=DO_NOT_RETRY).
Tabla de códigos comunes
Esta es una referencia de los MAC más frecuentes que se ven en la red Mastercard. No es exhaustiva — la lista se actualiza con cada release de la marca y puede haber códigos específicos de Visa u otras redes que entreguen los emisores. Para el listado oficial completo de Mastercard, consultar el manual Customer Interface Specification (CIS) capítulo de Authorization Responses.
merchant_advice_code
merchant_advice_description típica
merchant_advice_action que devuelve Akua
01
New account information available
UPDATE_AND_RETRY
02
Try again later
RETRY
03
Do not try again
DO_NOT_RETRY
04
Token requirements not fulfilled
UPDATE_AND_RETRY
21
Recurring payment cancellation service
DO_NOT_RETRY
24
Retry after 1 hour
RETRY
40
Consumer non-reloadable prepaid card
DO_NOT_RETRY
41
Consumer single-use virtual card number
DO_NOT_RETRY
42
Strong consumer authentication required
AUTHENTICATE_AND_RETRY
43
Trusted Merchant exemption used previously
AUTHENTICATE_AND_RETRY
79
Lifecycle
(varía por contexto)
82
Merchant suspect fraud
DO_NOT_RETRY
83
Recurring payment cancelled
DO_NOT_RETRY
Cuando Akua mapea el código a la action, prima el merchant_advice_action que devolvemos sobre cualquier interpretación que hagas del código numérico — porque ese mapeo lo mantiene actualizado el equipo a medida que cambian las reglas de las redes.
Combinación con response_code
El MAC siempre va acompañado de un response_code de la red. La combinación da más contexto: el response_code te dice por qué fue rechazada (la causa nominal), el MAC te dice qué hacer. Algunos ejemplos:
response_code
Significado
MAC frecuente
Lectura combinada
05
Do not honor
03 (DO_NOT_RETRY)
El emisor rechazó por riesgo y pide no reintentar.
05
Do not honor
02 (RETRY)
Mismo rechazo nominal pero el emisor cree que puede aprobar más tarde.
51
Insufficient funds
02 (RETRY)
El cliente puede tener fondos en otro momento.
54
Expired card
01 (UPDATE_AND_RETRY)
Hay info de cuenta nueva disponible — invocar Account Updater.
62
Restricted card
03 (DO_NOT_RETRY)
Rechazo definitivo, no reintentar.
65
Soft decline (fraud risk)
42 (AUTHENTICATE_AND_RETRY)
Mandar por 3DS y reintentar.
Notar que el mismo response_code puede venir con MACs distintos según la decisión del emisor en cada caso particular. Por eso conviene siempre mirar el MAC, no solo el response code.
Casos donde NO viene MAC
El campo merchant_advice_code puede estar ausente en varios escenarios:
Transacciones aprobadas: si transaction.status es APPROVED, no hay MAC porque no hay rechazo que aconsejar.
Errores de Akua antes de la red: validaciones que fallan en el middleware (formato inválido, instrumento bloqueado en Akua, cliente sin habilitar el método de pago) responden sin MAC porque la transacción nunca llegó al emisor. En estos casos decision_source suele ser INTERNAL.
Errores de sistema en la red: timeouts o fallas de comunicación responden con response_code96 (System error) y típicamente sin MAC, porque el emisor nunca evaluó la transacción. La acción razonable acá es RETRY.
Emisores antiguos: algunos emisores no implementan MAC todavía y rechazan solo con response_code. En esos casos el integrador tiene que tomar la decisión basándose solo en el código de respuesta.
Tu integración debería tratar la ausencia del campo como "no hay info adicional, decidí con el response_code solo".
Cómo usarlo en tu integración
Pseudocódigo recomendado:
respuesta = autorizar_pago(...)
if respuesta.transaction.status == "APPROVED":
confirmar_compra()
elif respuesta.transaction.status == "REJECTED":
advice = respuesta.transaction.network_data.merchant_advice_action
if advice == "RETRY":
encolar_reintento(esperar_minutos=15, max_intentos=2)
elif advice == "UPDATE_AND_RETRY":
invocar_account_updater_o_pedir_nueva_tarjeta_al_cliente()
elif advice == "AUTHENTICATE_AND_RETRY":
redirigir_a_3ds()
elif advice == "DO_NOT_RETRY":
marcar_instrumento_como_no_reusable()
notificar_al_cliente("la tarjeta fue rechazada, contactá a tu banco")
else:
# No vino advice — decidir basado en response_code o defaultear a no-reintentar
loggear_para_revision_manual()
Tres reglas duras que conviene respetar siempre:
DO_NOT_RETRY significa no reintentar nunca, ni manualmente ni con Account Updater. La red lo audita y los reintentos contra cuentas marcadas así pueden generar fees o sanciones.
RETRY no significa "reintentá inmediatamente". Esperá al menos 10 minutos. Reintentos sin backoff disparan alertas de fraude en la red.
AUTHENTICATE_AND_RETRY requiere 3DS real, no se reemplaza con un retry simple. El emisor está pidiendo el step-up de autenticación.
¿Te resultó útil?
Transacciones de Tránsito (MTT) — Resumen
Las transacciones de tránsito son un tipo especial de pago sin contacto (contactless) diseñado para sistemas de transporte público: buses, metro, trenes, tranvías, peajes y más. Se diferencian de las transacciones retail convencionales en tres aspectos fundamentales:
La tarifa puede no ser conocida al momento del tap. En muchos sistemas de transporte, el monto final depende de la distancia recorrida o del tiempo de uso, por lo que se calcula después del viaje.
La autorización puede ser diferida. El pasajero debe poder abordar sin esperar una respuesta online del emisor.
No se requiere verificación del titular (CVM). No se pide PIN ni firma — el pasajero simplemente acerca su tarjeta al lector.
Todas las transacciones de tránsito cursadas por POS usan el endpoint de tarjeta presente (/pos/...) y requieren entry_mode: "contactless". El comercio debe estar registrado con un MCC de tránsito: 4111 (transporte local/suburbano), 4112 (trenes de pasajeros) o 4131 (líneas de bus).
Importante — todo lo /pos/ es tarjeta presente. Cada autorización por POS se envía exactamente como una venta card-present: con terminal_id y un instrument que incluye los datos de la lectura física de la tarjeta (track2_data y, para chip/contactless, los emv_data.tags). No se envía el PAN en claro vía instrument.card.number como en e-commerce. Si falta el track2_data, el endpoint responde 500 — "Failed to process track2 data". La única excepción es la Recuperación de deuda, que es card-not-present (e-commerce) y usa instrument.id.
Headers requeridos en todas las llamadas. Cada request (autorización, ajuste, captura, etc.) debe enviar: Authorization: Bearer {access_token}, Content-Type: application/json y un Idempotency-Key único por request (UUIDv4 recomendado). Probar sin estos headers puede romper la llamada. El Idempotency-Key garantiza at-most-once: reintentar con la misma clave y mismo body devuelve la respuesta original; con body distinto devuelve 409 CONFLICT.
Modelos de transacción
Dependiendo de si la tarifa es conocida o no al momento del tap, y de la situación particular, existen distintos modelos:
#
Modelo
Descripción
Tarifa conocida al tap
1
Retail-Like
Una autorización por viaje, tarifa fija
Sí
2
Agrupación (PAYG)
Ciclo de pre-autorización + ajuste/captura final con monto acumulado
No
3
Recuperación de deuda
Cobro de tarifa pendiente cuando la autorización original fue denegada
N/A
4
ATC Counter Update
Sincronización del contador de transacciones de la tarjeta (solo Mastercard)
N/A
Mapa de campos por caso de uso
Estas tablas muestran de un vistazo qué endpoint y qué campos se usan en cada caso de uso. Se leen de izquierda a derecha como un flujo progresivo: del caso más simple (Retail-Like) al más especial (Recuperación de deuda).
Mastercard
Campo
Retail-Like
PAYG — Fase 1 (intradía)
PAYG — Fase 2: Ajuste
PAYG — Fase 2: Captura
Recuperación de deuda
Endpoint
/pos/payments/authorizations
/pos/payments/authorizations
/pos/payments/{id}/adjust
/pos/payments/{id}/captures
/payments/authorizations
intent
authorization
pre-authorization
—
—
authorization
order_type
purchase
purchase
—
—
resubmission
entry_mode
contactless
contactless
—
—
not-present
instrument
track2_data + emv_data
track2_data + emv_data
—
—
instrument.id
amount
Monto de 1 tarifa
Monto nominal (1-3 viajes)
—
—
Monto de la deuda
value
—
—
Monto total del ciclo
—
—
amount.value
—
—
—
Monto total del ciclo
—
initiator
—
—
—
—
merchant
Visa
Campo
Retail-Like
PAYG — Fase 1 (intradía)
PAYG — Fase 2: Autorización
PAYG — Fase 2: Captura
Recuperación de deuda
Endpoint
/pos/payments/authorizations
/pos/payments/authorizations
/pos/payments/authorizations
/pos/payments/{id}/captures
/payments/authorizations
intent
authorization
account-status
authorization
—
authorization
order_type
purchase
purchase
deferred
—
resubmission
entry_mode
contactless
contactless
contactless
—
not-present
instrument
track2_data + emv_data
track2_data + emv_data
instrument.id
—
instrument.id
amount
Monto de 1 tarifa
Cero (0)
Monto total del ciclo
—
Monto de la deuda
value
—
—
—
—
—
amount.value
—
—
—
Monto total del ciclo
—
initiator
—
—
merchant
—
merchant
Fase 2 — Ajuste vs. Captura: para finalizar el período PAYG hay dos opciones. El ajuste (/adjust) genera una nueva autorización por la diferencia usando amount.value (string); puede fallar si no hay fondos, pero permite montos sin límite. La captura (/captures) confirma el cobro sin nueva autorización usando amount.value (número); no falla, pero solo permite hasta un 20% por encima de la pre-autorización original. Ver la guía de Agrupación PAYG para el detalle completo.
Diferencias clave entre redes
Mastercard y Visa siguen el mismo concepto general pero difieren en la implementación:
En Agrupación PAYG, Mastercard usa una pre-autorización con monto nominal en la Fase 1 y un adjust en la Fase 2. Visa hace un account-status (monto cero) en la Fase 1 y una autorización diferida (deferred) como MIT en la Fase 2.
El ATC Counter Update es exclusivo de Mastercard. Visa no define un mecanismo equivalente, aunque los emisores Visa deben tolerar contadores fuera de secuencia sin declinar.
En Recuperación de deuda, ambas redes usan el mismo enfoque: una autorización con order_type: "resubmission" vía el endpoint de e-commerce (no POS), ya que la tarjeta no está presente en ese momento.
Guías detalladas
Para el paso a paso de cada modelo con ejemplos de request completos, consultar las guías específicas:
Retail-Like — Pago con tarifa conocida al momento del tap
Agrupación PAYG — Ciclo Pay-As-You-Go para tarifas desconocidas
Recuperación de Deuda — Cobro de tarifas pendientes
ATC Counter Update — Sincronización del contador de transacciones (Mastercard)
¿Te resultó útil?
Retail-Like (Tarifa Conocida)
Modelo para cuando la tarifa es conocida al momento del tap. Se procesa una autorización por viaje, igual que una compra retail convencional pero con las particularidades de tránsito: contactless, sin CVM, y con MCC de transporte.
Endpoint: POST /pos/payments/authorizations
Recordatorio card-present: al ser un endpoint /pos/, el request va como una venta con tarjeta presente. Es obligatorio enviar terminal_id, amount, intent y un instrument con track2_data (y los emv_data.tags de la lectura contactless). No se envía el PAN en claro.
Cuándo usar
Sistemas de transporte donde el pasajero paga una tarifa fija por viaje. Ejemplos: bus urbano con tarifa plana, metro con tarifa única por estación de origen, peaje con tarifa fija.
Flujo
El flujo es simple — un solo paso:
El pasajero acerca su tarjeta al lector contactless
La terminal arma el track2_data + emv_data y el sistema envía una autorización por el monto exacto de la tarifa
Se recibe la respuesta (aprobada o denegada)
Si se aprueba, el pasajero viaja. Si se deniega, la tarjeta entra en la deny list del operador
Mastercard
POST /pos/payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"id":"ride-7f3a9c01","intent":"authorization","order_type":"purchase","entry_mode":"contactless","capture":{"mode":"AUTOMATIC"},"terminal_id":"trm-d49abonq5g3h7p5qnpbb","amount":{"value":2950,"currency":"COP"},"instrument":{"emv_data":{"sequence_number":0,"tags":[{"tag":"82","length":"2","value":"1980"},{"tag":"84","length":"7","value":"a0000000041010"},{"tag":"95","length":"5","value":"0000048001"},{"tag":"9A","length":"3","value":"260626"},{"tag":"9C","length":"1","value":"00"},{"tag":"5F2A","length":"2","value":"0170"},{"tag":"9F02","length":"6","value":"000000002950"},{"tag":"9F03","length":"6","value":"000000000000"},{"tag":"9F1A","length":"2","value":"0170"},{"tag":"9F10","length":"18","value":"0210a040032400000000ffffffffffffffff"},{"tag":"9F26","length":"8","value":"5e746608800d2b55"},{"tag":"9F27","length":"1","value":"80"},{"tag":"9F33","length":"3","value":"004088"},{"tag":"9F34","length":"3","value":"1f0302"},{"tag":"9F36","length":"2","value":"01e5"},{"tag":"9F37","length":"4","value":"20c1bd34"}]},"track2_data":{"data":"5383040000000002D30122011000000000000","encrypted":false}}}
Notas sobre Mastercard:
intent: "authorization" con capture.mode: "AUTOMATIC" — autorización + captura en tiempo real (venta directa).
instrument.emv_data.tags lleva los tags de la lectura contactless (AID Mastercard a0000000041010 en el tag 84). El 9F34 (CVM Results) refleja "No CVM" porque tránsito no pide PIN ni firma.
track2_data.encrypted indica si la pista viaja cifrada. Si va cifrada, se acompaña del ksn de la llave; si el cliente la envía en claro (false), Akua la ofusca internamente.
No se envía CVV ni pin_block — las terminales de tránsito no los solicitan.
El MCC del comercio (resuelto por terminal_id) debe ser 4111, 4112 o 4131.
Visa
El request tiene la misma estructura que Mastercard; Akua resuelve la red por el BIN de la tarjeta. Solo cambian los datos propios de la tarjeta y el AID (tag 84 = a0000000031010 para Visa).
POST /pos/payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"id":"ride-7f3a9c02","intent":"authorization","order_type":"purchase","entry_mode":"contactless","capture":{"mode":"AUTOMATIC"},"terminal_id":"trm-d49abonq5g3h7p5qnpbb","amount":{"value":2950,"currency":"COP"},"instrument":{"emv_data":{"sequence_number":0,"tags":[{"tag":"82","length":"2","value":"1980"},{"tag":"84","length":"7","value":"a0000000031010"},{"tag":"95","length":"5","value":"0000048001"},{"tag":"9A","length":"3","value":"260626"},{"tag":"9C","length":"1","value":"00"},{"tag":"5F2A","length":"2","value":"0170"},{"tag":"9F02","length":"6","value":"000000002950"},{"tag":"9F03","length":"6","value":"000000000000"},{"tag":"9F1A","length":"2","value":"0170"},{"tag":"9F10","length":"7","value":"06010a03a00000"},{"tag":"9F26","length":"8","value":"a1b2c3d4e5f60718"},{"tag":"9F27","length":"1","value":"80"},{"tag":"9F33","length":"3","value":"e0f8c8"},{"tag":"9F34","length":"3","value":"1f0302"},{"tag":"9F36","length":"2","value":"00c7"},{"tag":"9F37","length":"4","value":"8e2f1a44"}]},"track2_data":{"data":"4761120000000148D30122011000000000000","encrypted":false}}}
Respuesta esperada
La respuesta sigue la estructura estándar de autorización POS (HTTP 201):
{"terminal":{"id":"trm-d49abonq5g3h7p5qnpbb","batch_id":"2500011"},"payment_id":"pay-dggb2i4h3gkiv2a3adf7","transaction":{"id":"trx-d54i8900icdm50jdldvj","type":"AUTHORIZATION","amount":"2950","status":"APPROVED","issuer_data":{"emv_tags":[{"tag":"91","length":"0A","value":"625A65E467ABB0470012"}]},"network_data":{"approval_code":"772886","response_code":"00","response_code_description":"Approved or completed successfully","financial_network_code":"MCC","system_trace_audit_number":"621157"},"status_detail":"SUCCESS"},"instrument_id":"ins-hj4i86u64q0ma1v5phh6","response_code":"00","response_code_description":"Approved or completed successfully"}
El issuer_data.emv_tags devuelve los tags de respuesta del emisor (p. ej. 91 — Issuer Authentication Data) que la terminal debe entregar al chip para completar la transacción.
Si la transacción es denegada, el operador de transporte debe agregar la tarjeta a su deny list local para evitar que se use en viajes posteriores hasta que se resuelva la deuda (ver guía de Recuperación de Deuda).
¿Te resultó útil?
Agrupación PAYG (Pay-As-You-Go)
Modelo para cuando la tarifa no es conocida al momento del tap. El monto final se calcula después, una vez que el pasajero finaliza su viaje o su período de uso. El operador agrupa los viajes del período y envía una autorización final con el monto total acumulado.
Este modelo tiene dos fases: una al inicio del viaje (intradía) y otra al finalizar el período de agrupación.
Recordatorio card-present: la Fase 1 (primer tap) es tarjeta presente, por lo que el instrument lleva track2_data + emv_data y terminal_id. La Fase 2 de Visa (autorización diferida) y los ajustes/capturas operan sobre el pago ya creado, así que usan instrument.id o el payment_id, sin volver a leer la tarjeta.
Cuándo usar
Sistemas de transporte donde la tarifa depende de la distancia, el tiempo o la cantidad de viajes. Ejemplos: metro con tarifas por zonas, tren con tarifa por distancia, sistemas con tope diario (fare capping).
Flujo general
Fase 1 — Primer tap (intradía)
↓
El pasajero viaja durante el día (puede hacer múltiples taps)
↓
Fase 2 — Finalizar período (el back-office calcula el total)
↓
Se cobra el monto acumulado real
El operador asume el First Ride Risk: el pasajero viaja antes de que se confirme si la tarjeta es válida y tiene fondos. Si la autorización inicial es denegada, la tarjeta va a la deny list y la deuda se intenta recuperar posteriormente.
Fase 1 — Intradía (primer tap del período)
Mastercard — Pre-autorización
Se envía una pre-autorización con un monto nominal (equivalente a 1-3 viajes típicos). Esto reserva fondos iniciales y valida la tarjeta. Es card-present: lleva track2_data + emv_data.
POST /pos/payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"id":"payg-mc-7f3a9c10","intent":"pre-authorization","order_type":"purchase","entry_mode":"contactless","capture":{"mode":"MANUAL"},"terminal_id":"trm-d49abonq5g3h7p5qnpbb","amount":{"value":8850,"currency":"COP"},"instrument":{"emv_data":{"sequence_number":0,"tags":[{"tag":"82","length":"2","value":"1980"},{"tag":"84","length":"7","value":"a0000000041010"},{"tag":"95","length":"5","value":"0000048001"},{"tag":"9A","length":"3","value":"260626"},{"tag":"9C","length":"1","value":"00"},{"tag":"5F2A","length":"2","value":"0170"},{"tag":"9F02","length":"6","value":"000000008850"},{"tag":"9F03","length":"6","value":"000000000000"},{"tag":"9F1A","length":"2","value":"0170"},{"tag":"9F10","length":"18","value":"0210a040032400000000ffffffffffffffff"},{"tag":"9F26","length":"8","value":"5e746608800d2b55"},{"tag":"9F27","length":"1","value":"80"},{"tag":"9F33","length":"3","value":"004088"},{"tag":"9F34","length":"3","value":"1f0302"},{"tag":"9F36","length":"2","value":"01e5"},{"tag":"9F37","length":"4","value":"20c1bd34"}]},"track2_data":{"data":"5383040000000002D30122011000000000000","encrypted":false}}}
El monto de la pre-autorización es un estimado nominal — no es el cobro final. Típicamente se usa el valor de 1 a 3 viajes como referencia. El capture.mode: "MANUAL" deja el pago pre-autorizado para finalizarlo en la Fase 2.
Importante: guardar el payment_id de la respuesta. Se necesita para la Fase 2 (adjust o capture).
Visa — Account Status (verificación de monto cero)
Visa usa un enfoque distinto: en lugar de pre-autorizar un monto, se envía una verificación de cuenta con monto cero. Esto valida que la tarjeta exista y esté activa sin reservar fondos. Sigue siendo card-present (la tarjeta está físicamente en el lector), por lo que también lleva track2_data + emv_data.
POST /pos/payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"id":"payg-visa-7f3a9c11","intent":"account-status","order_type":"purchase","entry_mode":"contactless","terminal_id":"trm-d49abonq5g3h7p5qnpbb","amount":{"value":0,"currency":"COP"},"instrument":{"emv_data":{"sequence_number":0,"tags":[{"tag":"82","length":"2","value":"1980"},{"tag":"84","length":"7","value":"a0000000031010"},{"tag":"95","length":"5","value":"0000008000"},{"tag":"9A","length":"3","value":"260626"},{"tag":"9C","length":"1","value":"00"},{"tag":"5F2A","length":"2","value":"0170"},{"tag":"9F02","length":"6","value":"000000000000"},{"tag":"9F03","length":"6","value":"000000000000"},{"tag":"9F1A","length":"2","value":"0170"},{"tag":"9F10","length":"7","value":"06010a03a00000"},{"tag":"9F26","length":"8","value":"a1b2c3d4e5f60718"},{"tag":"9F27","length":"1","value":"80"},{"tag":"9F33","length":"3","value":"e0f8c8"},{"tag":"9F34","length":"3","value":"1f0302"},{"tag":"9F36","length":"2","value":"00c7"},{"tag":"9F37","length":"4","value":"8e2f1a44"}]},"track2_data":{"data":"4761120000000148D30122011000000000000","encrypted":false}}}
El amount.value es 0: es una verificación de estatus de cuenta, no un cobro. No se envía capture (no hay fondos que capturar). Guardar el instrument_id de la respuesta — se usa en la Fase 2 para la autorización diferida.
Fase 2 — Finalizar período (cobro del monto acumulado)
Una vez que el back-office del operador calcula el monto total del período de viaje, hay dos opciones para cobrar el monto real: ajuste (adjust) o captura (capture). Cada una tiene ventajas y limitaciones distintas.
Opción A: Ajuste (/pos/payments/{id}/adjust)
El ajuste genera una nueva autorización por la diferencia entre el monto pre-autorizado y el monto real. Es la opción más flexible porque permite cobrar cualquier monto, sin importar cuánto exceda la pre-autorización original. Sin embargo, al ser una nueva autorización, puede ser denegada si el tarjetahabiente no tiene fondos suficientes.
Mastercard — Adjust
Se ajusta la pre-autorización original al monto real acumulado, referenciando el payment_id de la Fase 1. El cuerpo usa amount.value (string) y currency.
POST /pos/payments/{id}/adjust
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"amount":{"value":"17700","currency":"COP"}}
Donde {id} es el payment_id obtenido en la Fase 1. El value es el monto total real del ciclo de viajes y va como string. Este valor puede ser mayor o menor que la pre-autorización original — en tránsito está permitido que el monto final supere la pre-autorización.
Visa — Autorización diferida (deferred)
Visa usa una nueva autorización completa con order_type: "deferred" e initiator: "merchant", ya que el cobro se hace sin presencia del pasajero. Por eso usa instrument.id (el instrumento almacenado en la Fase 1) y no lleva track2_data ni emv_data.
POST /pos/payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"id":"payg-visa-final-7f3a9c12","intent":"authorization","order_type":"deferred","entry_mode":"contactless","initiator":"merchant","capture":{"mode":"AUTOMATIC"},"terminal_id":"trm-d49abonq5g3h7p5qnpbb","amount":{"value":17700,"currency":"COP"},"instrument":{"id":"ins-cuq7trf79diafopu1rog"}}
Se usa instrument.id (el instrumento devuelto por el account-status) porque la tarjeta no está presente. El initiator: "merchant" indica que es una transacción MIT vinculada al account-status original.
Opción B: Captura (/pos/payments/{id}/captures)
La captura confirma el cobro directamente sobre la pre-autorización original, sin generar una nueva autorización. Esto significa que no puede ser denegada — el cobro se ejecuta siempre. La limitación es que el monto de la captura no puede exceder el 120% del monto pre-autorizado original (es decir, hasta un 20% por encima).
Mastercard y Visa — Capture
El request es el mismo para ambas redes. A diferencia del ajuste, la captura usa amount.value (número) y currency:
POST /pos/payments/{id}/captures
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"amount":{"value":10200,"currency":"COP"}}
Donde {id} es el payment_id obtenido en la Fase 1. El amount.value es el monto total real del ciclo. Si el monto real es igual al pre-autorizado, se puede enviar la captura sin amount (captura por el monto completo pre-autorizado).
Regla del 20%: si la pre-autorización fue por $8,850 COP, la captura permite cobrar hasta $10,620 COP (8,850 × 1.20). Si el monto real del ciclo supera ese límite, se debe usar el ajuste en lugar de la captura.
¿Cuándo usar cada opción?
Criterio
Ajuste (adjust)
Captura (capture)
Campo de monto
amount.value (string)
amount.value (número)
Monto real vs. pre-autorización
Sin límite — puede ser cualquier monto
Hasta 120% del monto pre-autorizado
¿Puede fallar?
Sí — es una nueva autorización
No — confirma el cobro sin nueva autorización
Caso de uso ideal
El monto real excede significativamente la pre-autorización
El monto real es cercano a la pre-autorización
Si no se hace nada
—
Auto-captura a los 2 días por el monto original
Recomendación: usar captura cuando el monto acumulado esté dentro del 120% de la pre-autorización original (caso más común en viajes diarios). Usar ajuste cuando el monto real exceda ese umbral (viajes atípicos, acumulaciones de varios días).
Resumen del flujo por red
Fase
Mastercard
Visa
1 — Primer tap
Pre-autorización con monto nominal (card-present)
Account-status con monto cero (card-present)
Endpoint Fase 1
POST /pos/payments/authorizations
POST /pos/payments/authorizations
2A — Ajuste
Adjust al monto real (value)
Autorización diferida (deferred) con monto real
Endpoint Fase 2A
POST /pos/payments/{id}/adjust
POST /pos/payments/authorizations
2B — Captura
Captura por monto real (value, ≤120% pre-auth)
Captura por monto real (value, ≤120% pre-auth)
Endpoint Fase 2B
POST /pos/payments/{id}/captures
POST /pos/payments/{id}/captures
Plazo máximo
14 días calendario desde el primer tap
Según las reglas de Visa Urban Mobility
Auto-captura
2 días si no se envía ajuste ni captura
2 días si no se envía ajuste ni captura
Escenario completo: ejemplo de un día de viajes
Un pasajero toma el metro a las 7:00 AM (tarifa por zona, desconocida al tap), hace dos transbordos, y termina su último viaje a las 8:30 PM. El operador agrupa los viajes del día.
7:00 AM — Primer tap (Fase 1)
Mastercard: pre-autorización por $8,850 COP (3 viajes nominales)
Visa: account-status por $0
Durante el día
El pasajero viaja normalmente. Los taps intermedios se registran localmente en el sistema del operador, no generan autorizaciones adicionales.
11:00 PM — Cierre del día (Fase 2)
El back-office calcula: 5 viajes × $2,950 = $14,750 COP (con fare capping aplicado)
Opción A — Ajuste (monto real $14,750 excede el 120% de $8,850 = $10,620):
Mastercard: adjust con value: "14750" sobre la pre-autorización original
Visa: autorización diferida por $14,750
Opción B — Captura (solo si el monto real estuviera dentro del 120%):
Si el monto acumulado fuera $10,200 (dentro de $10,620), se podría usar captura con value: 10200 sobre la pre-autorización original — sin riesgo de denegación
En este ejemplo, como $14,750 supera el 120% de la pre-autorización ($10,620), el operador debe usar el ajuste.
¿Te resultó útil?
Recuperación de Deuda
Proceso para cobrar tarifas pendientes cuando una autorización de tránsito fue denegada y la tarjeta está en la deny list del operador. Aplica tanto para autorizaciones denegadas en Retail-Like como en Agrupación PAYG.
Endpoint: POST /payments/authorizations (e-commerce, no POS)
Card-not-present (excepción al patrón /pos/): este es el único modelo MTT que no es card-present. La tarjeta no está en el lector al momento del cobro, por lo que se usa el endpoint de e-commerce y el instrumento se referencia con instrument.id (la credencial almacenada en la bóveda de Akua). No se envía track2_data, emv_data, CVV ni terminal_id.
Cuándo usar
Cuando un pasajero acumuló deuda de tránsito porque su tarjeta fue denegada en uno o más viajes. El operador necesita recuperar ese monto. Esto puede ocurrir por fondos insuficientes, tarjeta expirada, o cualquier otro motivo de denegación.
Flujo
Una autorización de tránsito es denegada (ya sea Retail-Like o PAYG)
El operador agrega la tarjeta a la deny list — el pasajero no puede volver a usar esa tarjeta en el sistema de tránsito
El operador intenta la recuperación de deuda periódicamente (automático diario, o cuando el pasajero se presenta en un punto de atención)
Si la recuperación es aprobada, el operador debe remover la tarjeta de la deny list para permitir su uso nuevamente
Canales de recuperación típicos: cobro automático periódico (batch diario), tap en terminal atendido, o pago del pasajero vía call center / portal web.
Diferencias clave vs. autorización de tránsito normal
La recuperación de deuda se envía por el endpoint de e-commerce (no POS), porque la tarjeta no está físicamente presente al momento del cobro. Esto cambia varios campos importantes:
Campo
Valor en tránsito normal (POS)
Valor en recuperación de deuda (e-commerce)
Endpoint
/pos/payments/authorizations
/payments/authorizations
entry_mode
contactless
not-present
order_type
purchase
resubmission
initiator
(no se envía)
merchant
instrument
track2_data + emv_data
instrument.id
Mastercard
POST /payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"intent":"authorization","order_type":"resubmission","entry_mode":"not-present","initiator":"merchant","capture":{"mode":"AUTOMATIC"},"merchant_id":"mer-csuvatde7f1jb0qgqjvg","amount":{"value":14750,"currency":"COP"},"instrument":{"id":"ins-cuq7trf79diafopu1rog"},"parent_transaction_data":{"network_data":{"mastercard_economic_tlid":"AABB1234CCDD5678EEFF01"}}}
Visa
POST /payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"intent":"authorization","order_type":"resubmission","entry_mode":"not-present","initiator":"merchant","capture":{"mode":"AUTOMATIC"},"merchant_id":"mer-csuvatde7f1jb0qgqjvg","amount":{"value":14750,"currency":"COP"},"instrument":{"id":"ins-cuq7trf79diafopu1rog"},"parent_transaction_data":{"network_data":{"visa_initial_transaction_identifier":"012345678901234"}}}
Notas importantes
Sobre la deny list: al aprobarse la recuperación de deuda, el operador debe remover la tarjeta de la deny list lo antes posible para que el pasajero pueda volver a usar el servicio de transporte.
Sobre resubmission: este order_type indica a la red que es un reintento de una transacción previamente denegada. Solo es válido como MIT (initiator: "merchant"). El parent_transaction_data vincula este cobro con la transacción original que generó la deuda.
Sobre el instrumento: se usa instrument.id (el instrumento almacenado en la bóveda de Akua) ya que la tarjeta no está presente al momento del cobro. No se envía CVV ni datos crudos de la tarjeta (track2_data / emv_data).
¿Te resultó útil?
ATC Counter Update (soon...)
Mecanismo para sincronizar el Application Transaction Counter (ATC) de una tarjeta con el emisor. Aplica solo para Mastercard — Visa no define un mecanismo equivalente.
Endpoint: POST /pos/payments/authorizations
Recordatorio card-present: aunque es una transacción de monto cero, va por el endpoint /pos/ como tarjeta presente: lleva terminal_id e instrument con track2_data + emv_data. El tag clave es el 9F36 (Application Transaction Counter), que es justamente el contador que se quiere sincronizar.
Cuándo usar
Cuando una tarjeta se usa múltiples veces en el sistema de tránsito sin pasar por autorización online (por ejemplo, viajes offline aprobados por la terminal), el contador ATC de la tarjeta avanza localmente pero el emisor no lo ve. Esto puede causar que el emisor decline transacciones futuras por "secuencia fuera de orden".
El ATC Counter Update envía una transacción de monto cero para informar al emisor del valor actual del contador, evitando denegaciones innecesarias.
Mastercard
POST /pos/payments/authorizations
Authorization: Bearer {access_token}
Content-Type: application/json
Idempotency-Key:{uuid-v4-único-por-request}{"id":"atc-sync-7f3a9c20","intent":"atc-update","entry_mode":"contactless","terminal_id":"trm-d49abonq5g3h7p5qnpbb","amount":{"value":0,"currency":"COP"},"instrument":{"emv_data":{"sequence_number":0,"tags":[{"tag":"82","length":"2","value":"1980"},{"tag":"84","length":"7","value":"a0000000041010"},{"tag":"95","length":"5","value":"0000008000"},{"tag":"9A","length":"3","value":"260626"},{"tag":"9C","length":"1","value":"00"},{"tag":"5F2A","length":"2","value":"0170"},{"tag":"9F02","length":"6","value":"000000000000"},{"tag":"9F1A","length":"2","value":"0170"},{"tag":"9F10","length":"18","value":"0210a040032400000000ffffffffffffffff"},{"tag":"9F26","length":"8","value":"5e746608800d2b55"},{"tag":"9F27","length":"1","value":"80"},{"tag":"9F36","length":"2","value":"01f4"},{"tag":"9F37","length":"4","value":"20c1bd34"}]},"track2_data":{"data":"5383040000000002D30122011000000000000","encrypted":false}}}
Es una transacción de monto cero (amount.value: 0). El intent: "atc-update" le indica a Akua que el propósito es exclusivamente sincronizar el contador, no realizar un cobro. El valor actual del contador viaja en el tag 9F36 de los emv_data.
Visa
Visa no define un mensaje ATC Update explícito en su framework de Urban Mobility. Sin embargo, los emisores Visa deben estar preparados para recibir contadores ATC fuera de secuencia y no declinar transacciones únicamente por ese motivo.
¿Te resultó útil?
LINKS
2
Link de Pago
Los links de pago permiten cobrar sin necesidad de construir un flujo de checkout propio. Se genera un link con la información del cobro, se comparte con el cliente (por email, SMS, WhatsApp o embebido en la app), y el cliente completa el pago desde la interfaz de Akua.
Crear un link de pago
Endpoint: POST /v1/links
En su forma más simple, solo se necesita el monto, la moneda y una descripción:
POST /v1/links
{"type":"payment","expires_in":3600,"data":{"amount":{"value":99.99,"currency":"USD"},"description":"Orden #12345","redirect_url":"https://mi-tienda.com/gracias","cancel_url":"https://mi-tienda.com/carrito"}}
El campo url es el link de checkout que se comparte con el cliente. Cuando el pago se completa, los campos payment_id y transaction_id dentro de data se populan con los identificadores de la transacción.
expires_in define la vigencia del link en segundos (rango: 60 a 86400). Si no se envía, el valor por defecto es 12 horas.
Opcionalmente se pueden enviar merchant_id y merchant_name dentro de data para asociar el cobro a un comercio específico y mostrar su nombre en el checkout.
Monto fijo vs. monto libre
El campo amount.type controla si el monto es definido por el comercio o por el cliente.
Monto fijo (por defecto): el comercio define el monto total a cobrar. Si aplica impuestos, el value debe incluirlos — el desglose se reporta en transaction_compliance (ver siguiente sección).
Monto libre: el cliente ingresa el monto a pagar. Se pueden definir límites opcionales con min_amount y max_amount. No se debe enviar value y no se permite transaction_compliance.
Ideal para donaciones, pagos parciales o montos variables.
Impuestos (transaction_compliance)
Para links de monto fijo se puede incluir el desglose de impuestos en data.transaction_compliance. El amount.value debe ser el total a cobrar incluyendo impuestos; transaction_compliance reporta cómo se compone ese total para fines regulatorios.
Por porcentaje:
"data":{"amount":{"type":"fixed","value":119000,"currency":"COP"},"description":"Producto con IVA","transaction_compliance":{"taxes":[{"code":"IVA","percentage":19}]}}
En este ejemplo se cobran $119.000 COP (base de $100.000 + 19% de IVA).
Cada impuesto se define por percentageotax_amount, no ambos. transaction_compliance no se permite en links de monto libre.
Items (detalle de productos)
Se puede incluir un desglose de productos o servicios que el cliente verá en el checkout:
{"type":"payment","data":{"amount":{"value":249.98,"currency":"USD"},"description":"Compra en tienda online","items":[{"name":"Widget Pro","description":"Widget premium","quantity":2,"amount":99.99,"image_url":"https://mi-tienda.com/widget-pro.jpg"},{"name":"Envío","quantity":1,"amount":50.00}],"redirect_url":"https://mi-tienda.com/gracias","cancel_url":"https://mi-tienda.com/carrito"}}
Se requiere al menos description o items (o ambos). Cada item tiene name, quantity y amount (precio unitario). La description y la image_url del item son opcionales.
Métodos de pago disponibles
Por defecto, el checkout muestra todos los métodos habilitados para el comercio. Para restringir qué métodos se ofrecen, se usa available_payment_methods:
Todos los valores deben pertenecer a la tabla anterior.
No se permiten duplicados.
El orden del array define el orden de despliegue en el checkout.
Si el array está vacío o no se envía, se muestran todos los métodos habilitados para el comercio.
Links reutilizables (multi-use)
Por defecto, un link de pago es de un solo uso — se desactiva después del primer pago. Para crear un link reutilizable:
{"type":"payment","multi_use":true,"max_uses":100,"expires_in":86400,"data":{"amount":{"value":50.00,"currency":"USD"},"description":"Entrada a evento"}}
multi_use: true permite que el link sea utilizado múltiples veces. max_uses define un límite opcional de usos — si no se envía, el link no tiene límite (solo expira por tiempo).
La respuesta incluye use_count para hacer tracking de cuántas veces se ha usado el link. Cuando use_count alcanza max_uses, el status cambia a used y el link no acepta más pagos.
Webhook
Para recibir una notificación automática cuando se completa un pago, se configura un webhook en metadata:
Si se proporcionó api_key, se envía en el header Api-Key para verificación. notification_trigger es opcional y permite identificar el evento que dispara la notificación.
Precarga de datos del cliente
Se puede precargar información del cliente con el objeto customer en data para que llegue al checkout con los campos ya completos:
Si es true, el checkout exige autenticación 3D Secure antes de autorizar el pago. Solo se envía cuando se quiere activar; omitir para no usar 3DS
allow_installments
Si es true, el cliente puede pagar en cuotas. Por defecto el cobro es de una sola vez
additional_fields
Lista de campos obligatorios que se piden al cliente en el formulario. Valores soportados: country, city, zip_code, address
Ciclo de vida del link
Estado
Descripción
created
Link recién creado, listo para compartir
opened
El cliente accedió al link al menos una vez
used
El pago se completó exitosamente (o se alcanzó max_uses)
expired
El link venció sin completar el pago
Para links reutilizables (multi_use: true), el estado se mantiene en opened mientras el link esté activo y haya sido accedido. Cambia a used cuando se alcanza el max_uses (si se definió), y a expired cuando vence — lo que ocurra primero.
Se puede consultar el estado de un link en cualquier momento con GET /v1/links/{id}.
Errores comunes
Código
Error
Causa
400
Client ID header is required
Falta el header Client-Id
400
Invalid request body
El body no es un JSON válido
400
max_uses can only be specified when multi_use is true
Se envió max_uses sin habilitar multi_use
400
multi_use is only supported for payment links
Se intentó multi-use en un tipo de link que no lo soporta
400
custom amount links cannot specify value
Se envió value en un link de monto libre
400
custom amount links cannot specify tax
Se envió transaction_compliance en un link de monto libre
400
min_amount must be greater than zero
min_amount debe ser positivo
400
max_amount must be greater than zero
max_amount debe ser positivo
400
min_amount must be less than max_amount
El mínimo debe ser menor al máximo
400
min_amount and max_amount can only be specified for custom amount links
Se enviaron límites en un link de monto fijo
400
invalid payment method identifier
Se envió un método no soportado en available_payment_methods
400
duplicate payment method identifier
Hay valores repetidos en available_payment_methods
403
Unauthorized access
No tiene permisos para este recurso
404
Link not found
El link no existe
409
Link has already been used
Se intentó usar un link de un solo uso que ya fue utilizado, o se alcanzó max_uses en un multi-use
410
Link has expired
El link venció
¿Te resultó útil?
Link de Enrolamiento de Tarjeta
El link de enrolamiento permite recolectar y almacenar tarjetas de pago de forma segura, sin que el comercio maneje datos sensibles. Al completar el registro, Akua genera un instrument_id que se puede usar para cobros futuros vía la API de pagos.
El formulario de enrolamiento se puede embeber en un iframe y personalizar visualmente para que se integre con la identidad del comercio.
Crear un link de enrolamiento
Endpoint: POST /v1/links
El request mínimo solo necesita el type:
POST /v1/links
{"type":"card_enrollment","expires_in":3600}
El campo url es la dirección del formulario de registro. Es lo que se comparte con el cliente o se embebe en un iframe.
expires_in define cuánto tiempo estará activo el link, en segundos. Si no se envía, el valor por defecto es 12 horas. Rango permitido: 60 a 86400 segundos.
Configurar webhook
Para recibir una notificación cuando la tarjeta se registra, se configura un webhook en el campo data:
Cuando el cliente completa el registro, Akua envía un POST a la URL configurada con el siguiente payload:
{"instrument_id":"ins-xxxxxxxxxx"}
Si se proporcionó api_key, se incluye en el header Api-Key del request para que el servidor receptor pueda verificar la autenticidad de la notificación.
El instrument_id es el identificador de la tarjeta almacenada en la bóveda de Akua. Con este ID se pueden realizar cobros futuros usando la API de pagos (autorizaciones, suscripciones, etc.) sin necesidad de solicitar los datos de la tarjeta nuevamente.
Embeber en un iframe
El link se puede integrar directamente en cualquier página web mediante un iframe:
El formulario de enrolamiento se puede personalizar a través del objeto styleConfig en metadata. Esto es especialmente útil cuando se embebe en un iframe y se quiere que el formulario se vea como parte del sitio del comercio.
{"type":"card_enrollment","expires_in":86400,"data":{"webhook":"https://mi-dominio.com/webhook","api_key":"mi-api-key-secreta"},"metadata":{"styleConfig":{"visibility":{"header":false,"footer":false},"text":{"headerTitle":"Registra tu tarjeta","buttonText":"Guardar tarjeta","successMessage":"¡Tarjeta guardada!"},"colors":{"primary":"#007bff","background":"#f5f5f5","text":"#333333"},"layout":{"formMaxWidth":"500px","alignment":"center","padding":"md"}}}}
Las opciones disponibles son:
visibility — controla qué secciones se muestran: header, footer, labels, alerts. Todas son true por defecto.
text — textos personalizados: headerTitle, cardFormSubtitle, footerText, buttonText, successMessage, errorMessage.
colors — colores del formulario: background, formBackground, primary (botones), text, success, error. Acepta cualquier valor CSS válido.
layout — configuración del layout: formWidth, formMaxWidth, padding (sm, md, lg), alignment (left, center, right).
styles — CSS personalizado por sección: container, form, header, footer, button, alert. Cada propiedad acepta un objeto con propiedades CSS en formato camelCase.
Ciclo de vida del link
El link de enrolamiento pasa por los siguientes estados:
Estado
Descripción
created
Link recién creado, listo para compartir o embeber
opened
El cliente abrió el formulario
used
La tarjeta se registró exitosamente
Si el link expira antes de ser usado, retorna 410 Gone al intentar acceder. Se puede consultar el estado actual del link en cualquier momento con GET /v1/links/{id}.
¿Te resultó útil?
3DS
9
Browser Flow — 3D Secure 2.0
3DS2 es un protocolo de autenticación que agrega una capa de seguridad a las transacciones con tarjeta en línea. Permite al banco emisor verificar la identidad del titular durante el proceso de compra, reduciendo el fraude y protegiendo tanto al comerciante como al consumidor.
El flujo Browser es el proceso que se ejecuta cuando el cliente realiza una compra desde un navegador web.
¿Qué permite el flujo 3DS Browser?
Capacidad
Descripción
Verificación de soporte
Confirma si la tarjeta soporta 3DS y qué versión
Device fingerprinting
Recolecta información del dispositivo del usuario
Autenticación frictionless
Autentica sin interacción del usuario cuando es posible
Autenticación con challenge
Solicita OTP, biometría u otro factor cuando es necesario
Pasos del flujo
Paso
Acción
1. Checkout
El usuario completa el formulario de pago en el sitio
2. Version Request
Se verifica si la tarjeta soporta 3DS y se obtiene la versión disponible
3. Method Request(opcional)
Se recolecta información del dispositivo (device fingerprinting)
4. Authenticate Request
Se solicita autenticación 3DS al emisor
5. Resultado de autenticación
El emisor responde con uno de tres resultados (ver tabla)
6. Challenge Request
Si se requiere challenge, se presenta al usuario (OTP, biometría, etc.)
7. Result Request
Se obtiene el resultado final tras el challenge
8. Autorizar pago
Se usa el authentication_value (CAVV) para autorizar la transacción
Resultados de autenticación
Resultado
Código
Acción a seguir
Success
Y
Autenticación frictionless exitosa → proceder a autorización
Challenge
C
Se requiere interacción del usuario → continuar con Challenge Request
Failed
N / U / R
Autenticación fallida o rechazada → no autorizar
¿Te resultó útil?
Recolección de Información del Navegador
Antes de iniciar el flujo 3DS, es necesario recolectar datos del navegador del usuario. Esta información se envía en el campo browser_data del Authenticate Request.
Función GetBrowserData()
La librería JavaScript de Akua recolecta estos datos automáticamente:
Requeridos cuando device_channel = "02" (Browser).
Campo
Tipo
Requerido
Descripción
Ejemplo
accept_header
string
✅
Header Accept HTTP
"text/html,application/xml"
javascript_enabled
boolean
✅
Si JavaScript está habilitado
true
language
string
✅
Idioma del navegador
"es-UY"
user_agent
string
✅
User agent del navegador
"Mozilla/5.0..."
ip_address
string
—
IP del cliente — no obligatorio pero recomendado para la evaluación de riesgo
"192.168.1.100"
color_depth
string
—
Profundidad de color de pantalla
"24"
screen_height
string
—
Alto de pantalla en píxeles
"1080"
screen_width
string
—
Ancho de pantalla en píxeles
"1920"
java_enabled
boolean
—
Si Java está habilitado
false
tz
number
—
Zona horaria (offset en minutos)
180
Ejemplo de objeto browserData
{"accept_header":"text/html,application/xhtml+xml,application/xml","javascript_enabled":true,"language":"es-UY","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36","ip_address":"192.168.1.100","color_depth":"24","screen_height":"1080","screen_width":"1920","java_enabled":false,"tz":180}
¿Te resultó útil?
Method Request — 3DS
El Method Request recolecta información adicional del navegador en un iframe oculto para mejorar la evaluación de riesgo del emisor y aumentar la probabilidad de autenticación frictionless (sin challenge).
Este paso solo se realiza si el Version Response incluye un threeds_method_url. Si el campo está vacío o ausente, se omite.
No autorizar la transacción. Informar al usuario que la autenticación falló.
Incertidumbre — U, D, I
Requieren una decisión de negocio según la política de riesgo del comerciante.
¿Te resultó útil?
Challenge — 3DS
El Challenge permite al emisor verificar la identidad del titular cuando la autenticación frictionless no es suficiente. Se activa cuando el Authenticate Request retorna trans_status: "C".
Casos de uso: OTP vía SMS, aprobación en app del banco, biometría u otros factores adicionales para transacciones de alto riesgo.
Tras recibir la notificación, el backend debe avisar al frontend que el challenge se completó. Usar window.postMessage() para comunicación segura entre iframes:
Desde la página de notificación (dentro del iframe):
A diferencia del Method Request, no debe establecer un timeout para el Challenge. El usuario puede tomar el tiempo que necesite para completar la autenticación. El emisor puede tener su propio timeout, pero desde su lado debe esperar la notificación sin interrumpir el flujo.
¿Te resultó útil?
Result Request — 3DS
Obtiene el resultado final de la autenticación después de completado el Challenge. Requiere el threeds_server_trans_id generado en el Authenticate Response.
Si el usuario cancela o el ACS interrumpe el challenge, este campo indica la razón:
Código
Descripción
01
El tarjetahabiente canceló
02
Transacción reservada (cardholder reserved)
03
Transacción rechazada por el ACS
04
ACS reconoció al tarjetahabiente del Directory Server
05
Timeout en el ACS
06
Error en el ACS
07
Desconocido
¿Te resultó útil?
Tarjetas de Prueba — 3DS Sandbox
Usá estas tarjetas en el ambiente sandbox para simular diferentes escenarios de autenticación 3DS. Todas son válidas con cualquier fecha de expiración futura (MMYY, ej: 1226) y cualquier CVV de 3 dígitos.
Estas tarjetas solo funcionan en sandbox. No usarlas en producción.
Tarjetas disponibles
Frictionless (sin challenge)
PAN
Red
trans_status
Escenario
4242424242424242
Visa
Y
Frictionless exitoso
5555555555554444
Mastercard
Y
Frictionless exitoso
4111111111111111
Visa
A
Attempted — sin Method URL
5424180011113336
Mastercard
A
Attempted
4264281511112228
Visa
N
Autenticación fallida
5424180000000171
Mastercard
N
Autenticación fallida
5405001111111165
Mastercard
U
Autenticación no disponible
5405001111111116
Mastercard
R
Autenticación rechazada
Con Challenge
PAN
Red
Resultado final
Escenario
4000020000000000
Visa
Y
Challenge exitoso
4005562231212123
Visa
Y
Challenge exitoso — sin Method URL
4761369980320253
Visa
Y
Challenge mandatorio
4000000000000341
Visa
Y
Challenge out-of-band
5200000000001104
Mastercard
Y
Challenge mandatorio
4005571701111111
Visa
A
Challenge con resultado Attempted
4055011111111111
Visa
N
Challenge fallido
5427660064241339
Mastercard
N
Challenge fallido
Errores y casos especiales
PAN
Red
Escenario
4264281500003339
Visa
Error en Directory Server
4264281500001119
Visa
Error en 3DS Server
5424180011110001
Mastercard
3DS2 no soportado
Notas para testing
Aspecto
Detalle
Fecha de expiración
Cualquier fecha futura en formato MMYY (ej: 1226)
CVV
Cualquier valor de 3 dígitos (ej: 123)
Código de challenge
Ingresar 1234 cuando el challenge lo solicite
Monto
No afecta el comportamiento — usar cualquier monto válido
Estado A (Attempted): cuando lo recibas, tu sistema debe decidir si acepta el riesgo y autoriza la transacción. Es una decisión de negocio configurable según el apetito de riesgo del comerciante.
Tarjetas de error: útiles para probar el manejo de excepciones y la resiliencia de la integración ante fallos del sistema.
¿Te resultó útil?
Apéndice
Referencia completa de todos los valores y enumeraciones usados en el flujo 3DS.
A. trans_status — Estado de autenticación
Código
Estado
Descripción
Y
Authenticated Successfully
El tarjetahabiente fue autenticado exitosamente
N
Not Authenticated
La autenticación falló o fue declinada
U
Could Not Be Performed
No pudo realizarse por problemas técnicos
A
Attempts Processing Performed
Se intentó pero el tarjetahabiente no está enrollado o el banco no soporta 3DS
C
Challenge Required
Se requiere autenticación adicional
D
Decoupled Authentication Confirmed
Se confirmó autenticación desacoplada
R
Authentication Rejected
Rechazada por el emisor
I
Information Only
Solo información, sin autenticación
B. device_channel — Canal del dispositivo
Código
Canal
Descripción
01
App-based
Aplicación móvil nativa usando SDK
02
Browser
Navegador web (desktop o móvil)
03
3DS Requestor Initiated
Iniciado por el comercio sin participación del tarjetahabiente
C. message_category — Categoría del mensaje
Código
Categoría
Descripción
01
Payment Authentication (PA)
Autenticación para una transacción de pago
02
Non-Payment Authentication (NPA)
Autenticación sin pago (agregar tarjeta, validación)
D. threeds_requestor_authentication_ind — Propósito de la autenticación
Código
Indicador
Descripción
01
Payment transaction
Pago de bienes o servicios
02
Recurring transaction
Primera transacción de una serie recurrente
03
Installment transaction
Primera transacción de una serie de cuotas
04
Add card
Agregar tarjeta sin transacción
05
Maintain card
Mantener información de tarjeta
06
Verify cardholder
Verificación de cuenta de tarjeta
07
Billing agreement
Acuerdo de facturación
E. acct_type — Tipo de cuenta
Código
Tipo
Descripción
01
Not applicable
No aplica
02
Credit
Crédito
03
Debit
Débito
F. trans_type — Tipo de transacción
Código
Tipo
Descripción
01
Goods / Service Purchase
Compra de bienes o servicios
03
Check Acceptance
Aceptación de cheque
10
Account Funding
Financiamiento de cuenta
11
Quasi-Cash Transaction
Transacción cuasi-efectivo
28
Prepaid Activation and Load
Activación y carga de prepago
G. ship_indicator — Indicador de envío
Código
Descripción
01
Envío a dirección de facturación del tarjetahabiente
02
Envío a otra dirección verificada
03
Envío a dirección diferente a la de facturación
04
Recoger en tienda
05
Bienes digitales (sin envío físico)
06
Tickets de viaje o eventos
07
Otro
H. delivery_time_frame — Marco de tiempo de entrega
Código
Descripción
01
Entrega electrónica
02
Envío el mismo día
03
Envío nocturno
04
Envío de dos días o más
I. pre_order_purchase_ind — Indicador de pre-orden
Código
Descripción
01
Mercancía disponible
02
Disponibilidad futura (pre-orden)
J. reorder_items_ind — Indicador de re-orden
Código
Descripción
01
Primera vez ordenando
02
Re-ordenado (ya comprado antes)
K. threeds_req_auth_method — Método de autenticación
Código
Método
Descripción
01
No authentication
Sin autenticación (invitado)
02
Login to merchant account
Login con credenciales
03
Federated ID
ID federado (SSO)
04
Issuer credentials
Credenciales del emisor
05
Third-party authentication
Autenticación de terceros
06
FIDO authenticator
Autenticador FIDO
07
FIDO authenticator (signed)
FIDO con firma de garantía
08
SRC Assurance Data
Datos de garantía SRC
L. threeds_req_prior_auth_method — Método de autenticación previa
Código
Método
Descripción
01
Frictionless
Autenticación sin fricción
02
Challenge
Challenge (ACS)
03
AVS verified
Verificado por AVS
04
Other issuer methods
Otros métodos del emisor
M. Códigos ECI — Electronic Commerce Indicator
Visa
ECI
Descripción
05
Authenticated (VERes y CAVV)
06
Attempts (VERes sin CAVV)
07
Transacción sin 3DS
Mastercard
ECI
Descripción
02
Authenticated (UCAF o CAVV)
01
Merchant only (SSL)
00
Attempts
N. threeds_requestor_challenge_ind — Preferencia de challenge
Código
Descripción
01
Sin preferencia
02
No se solicita challenge
03
Se solicita challenge (preferencia del requestor)
04
Se solicita challenge (mandato — ej: PSD2)
05
No se solicita (análisis de riesgo ya realizado)
06
No se solicita (solo intercambio de datos)
07
No se solicita (autenticación fuerte ya realizada)
08
No se solicita (usar exención de whitelist si aplica)
09
Se solicita (solicitar aviso de whitelist si aplica)
90
Habilitar scoring de Cartes Bancaires (solo Cartes Bancaires)
O. trans_status_reason — Razón del estado
Código
Descripción
01
Autenticación de la tarjeta fallida
02
Dispositivo desconocido
03
Dispositivo no soportado
04
Se excedió el límite de frecuencia de autenticación
05
Tarjeta vencida
06
Número de tarjeta inválido
07
Transacción inválida
08
No existe registro de la tarjeta
09
Falla de seguridad
10
Tarjeta robada
11
Fraude sospechado
12
Transacción no permitida para el titular
13
Titular no enrolado en el servicio
14
Timeout en el ACS
15
Baja confianza
16
Confianza media
17
Alta confianza
18
Confianza muy alta
19
Se excedió el máximo de challenges del ACS
20
Transacción NPA no soportada
21
Transacción 3RI no soportada
22
Problema técnico del ACS
23
Autenticación desacoplada requerida pero no solicitada
24
Se excedió el tiempo máximo para autenticación desacoplada
25
Tiempo insuficiente para autenticación desacoplada
26
Autenticación intentada pero no completada por el titular
P. authentication_type — Tipo de autenticación
Código
Tipo
Descripción
01
Static
Contraseña o código de acceso
02
Dynamic
OTP (contraseña de un solo uso)
03
Out-of-band
App móvil del banco emisor
04
Decoupled
Autenticación desacoplada
Q. whitelist_status — Estado de whitelist
Código
Descripción
Y
El comercio es confiable para el titular
N
El comercio aún no ha sido marcado como confiable
E
No elegible según lo determinado por el emisor
P
Pendiente de confirmación por parte del titular
R
El titular rechazó la solicitud
U
Desconocido o no aplica
R. whitelist_status_source — Fuente del estado de whitelist
Código
Sistema
Descripción
01
3DS Server
Servidor 3DS
02
DS
Directory Server
03
ACS
Access Control Server
S. challenge_cancel — Razón de cancelación del challenge
Código
Descripción
01
El titular seleccionó "Cancelar"
02
El requestor 3DS canceló la autenticación
03
Transacción abandonada
04
Timeout en el ACS
05
ACS timeout — la primera CReq no fue recibida
06
Error en la transacción
07
Desconocido
T. Códigos SDK y ACS UI
sdk_interface — Tipo de interfaz del SDK
Código
Tipo
Descripción
01
Native
Interfaz nativa
02
HTML
Interfaz HTML
03
Both
Ambas
sdk_ui_type — Tipos de UI soportados por el dispositivo
Código
Tipo
Descripción
01
Text
Campo de texto
02
Single Select
Selección única
03
Multi Select
Selección múltiple
04
OOB
Out-of-Band
05
HTML Other
HTML otro (solo para UI HTML)
acs_interface — Interfaz que el ACS usará para el challenge
Código
Tipo
01
Nativa
02
HTML
acs_ui_template — Plantilla de UI del ACS
Código
Tipo
Descripción
01
Text
Campo de texto
02
Single Select
Desplegable
03
Multi Select
Checkbox
04
OOB
App del banco emisor
05
HTML Other
HTML otro
U. error_component — Componente donde ocurrió el error
Código
Componente
S
3DS Server
D
Directory Server
A
ACS
C
Tarjeta
V. Formatos de fecha y hora
Campo
Formato
Ejemplo
Descripción
card_expiry_date
MMYY
1226
Diciembre 2026
purchase_date
YYYYMMDDHHmmss
20260129153045
29 Enero 2026, 15:30:45
recurring_expiry
YYYYMMDD
20261231
31 Diciembre 2026
pre_order_date
YYYYMMDD
20260615
15 Junio 2026
threeds_req_auth_timestamp
YYYYMMDDHHmmss
20260129153045
29 Enero 2026, 15:30:45
threeds_req_prior_auth_timestamp
YYYYMMDDHHmm
202601291530
29 Enero 2026, 15:30
W. Códigos de país — ISO 3166-1 numérico
Código
País
032
Argentina
076
Brasil
152
Chile
170
Colombia
484
México
604
Perú
858
Uruguay
862
Venezuela
840
Estados Unidos
X. Códigos de moneda — ISO 4217
Código
Moneda
Exponente
032
ARS — Peso Argentino
2
986
BRL — Real Brasileño
2
152
CLP — Peso Chileno
0
170
COP — Peso Colombiano
2
840
USD — Dólar Estadounidense
2
978
EUR — Euro
2
484
MXN — Peso Mexicano
2
604
PEN — Sol Peruano
2
858
UYU — Peso Uruguayo
2
Exponente: indica el número de decimales. Exponente 2 → $100.00 se envía como "10000". Exponente 0 → $100 se envía como "100".
Y. Errores HTTP comunes
Código
Error
Causa
Solución
400
Bad Request
Request mal formado o campos faltantes
Verificar estructura del JSON y campos requeridos
400
browser_data is required
Falta browser_data en flujo browser
Incluir browser_data completo cuando device_channel = "02"
400
accept_header is required
Falta accept_header en browser_data
Incluir el header Accept del navegador
400
javascript_enabled is required
Falta javascript_enabled
Incluir como booleano (true/false)
400
language is required
Falta language en browser_data
Incluir el idioma del navegador
400
user_agent is required
Falta user_agent en browser_data
Incluir el user agent del navegador
400
threeds_comp_ind is required
Falta en flujo browser
Enviar "Y" o "N"
400
purchase_currency is required
Falta en pago
Código ISO 4217 numérico de 3 dígitos
400
purchase_amount is required
Falta en pago
Ej: "10000" para $100.00
400
purchase_date is required
Falta en pago
Formato YYYYMMDDHHmmss
400
purchase_exponent is required
Falta en pago
Ej: "2" para centavos
401
Unauthorized
Credenciales inválidas
Verificar Client ID y API key
403
Forbidden
Permisos insuficientes
Contactar a Akua para verificar permisos
404
Not Found
Recurso no encontrado
Verificar el endpoint y los IDs enviados
422
Unprocessable Entity
Validación de campos fallida
Revisar valores y formatos de los campos
500
Internal Server Error
Error del servidor
Contactar soporte de Akua
¿Te resultó útil?
SUSCRIPCIONES
1
Planes de Suscripción
Propósito
Pantalla para administrar las plantillas de facturación que después se aplican a las suscripciones. Un plan define el tipo de orden (recurrente, orden permanente o no programado), la periodicidad, el monto, los reintentos ante fallo de cobro y los días de prueba gratuita.
Es el punto de partida del módulo: las suscripciones se crean a partir de un plan (o, opcionalmente, de forma independiente). Cada plan también puede emitir links de management para sus suscriptores.
Estadísticas (cards superiores)
Total Plans — cantidad de planes disponibles.
Active Subscribers — suscripciones activas en este momento.
Total MRR — ingreso recurrente mensual del módulo.
Avg Revenue / Plan — MRR dividido por la cantidad de planes.
Tabla de planes
Columnas: Plan Name, Order Type, Periodicity, Amount, Free Trial, Max Retries, Status, Subscribers.
Acciones por fila:
Generate management link — abre un drawer para emitir un link de gestión a un suscriptor del plan. Sólo se habilita si el plan tiene suscriptores; si no, queda deshabilitado en gris.
Ojo (vista detalle) — abre la pantalla de detalle del plan (/subscriptions/plans/{id}).
Tacho rojo — abre el modal de confirmación de eliminación.
Acciones del header
Generate Link — atajo a la creación de un link multi-plan (mismo flujo que la pestaña Links).
+ Create Plan — abre el modal de creación.
Crear plan
Click en + Create Plan abre el modal:
Campos
Campo
Tipo
Notas
Plan Name *
texto
Obligatorio. Placeholder e.g. Pro Monthly.
Description
textarea
Opcional.
Order Type *
select
Recurring, Standing Order, Unscheduled.
Periodicity
select
Weekly, Bi-Weekly, Monthly, Quarterly, Semi-Annual, Annual. No aplica a Unscheduled.
Amount *
número
Obligatorio. Acepta decimales.
Currency
select
Limitada a las monedas habilitadas en la organización (en sandbox: COP).
Free Trial
toggle
Al activar, aparece Free Trial Days (entero, mínimo 0).
Max Retries
número
Default 3. Cantidad de reintentos automáticos ante fallo de cobro.
Retry Periodicity
select
Daily, Every 3 Days, Weekly.
Tipos de orden disponibles
Recurring — mismo monto, misma periodicidad (ej. Netflix).
Standing Order — monto variable, misma periodicidad (ej. servicios públicos).
Unscheduled — cobros bajo demanda, sin agenda fija (ej. Uber, Rappi).
Validaciones visibles
Los campos con asterisco rojo (Plan Name, Order Type, Amount) son obligatorios.
El botón Save queda habilitado cuando se completan los obligatorios.
Ver detalle del plan
Click en el ícono de ojo de la fila.
Bloques:
Plan Information — nombre, descripción, order type, periodicity, amount, free trial, max retries, status, fecha de creación.
Active Subscribers — contador.
Avg Duration — duración promedio de las suscripciones del plan.
Subscribers — tabla con Merchant, Instrument, Status, Start Date, Amount. Si no hay suscriptores: estado vacío "No subscribers".
Generar management link desde un plan
Click en Generate management link en la fila (sólo planes con suscriptores).
Campos:
Plan Information — preview del plan (read-only).
Badge violeta MANAGE SUBSCRIPTION indicando el tipo de link.
Subscription * — selector entre las suscripciones del plan.
Payment Link Expiration — número + unidad (Days, Hours, etc.).
Botones Cancel / Generate Link.
El link generado permite al suscriptor actualizar tarjeta o cancelar la suscripción desde una página whitelabel.
Estados visibles
ACTIVE (badge verde) — único estado observado para planes en sandbox. Los planes no se cancelan: se eliminan.
¿Te resultó útil?
ALTERNATIVE PAYMENT METHODS (APMS))
5
Pagos instantáneos en Colombia
Akua admite cuatro rails de pago instantáneo para Colombia: Bre-B, Nequi, Daviplata y PSE. Los cuatro se inician a través del mismo endpoint — POST /api/v1/payments/intents — y el rail se determina mediante el campo rail.id en el cuerpo de la solicitud.
Visión general
Rail
Tipo
Mecanismo
Paso de confirmación
Caso de uso típico
BRE_B
BANK_TRANSFER
Escaneo de QR o alias desde cualquier app bancaria
No
Presencial, e-commerce, alta interoperabilidad
NEQUI
WALLET
Notificación push a la app de Nequi
No
E-commerce, usuarios de Nequi
DAVIPLATA
WALLET
OTP enviado por SMS
Sí
E-commerce, sin necesidad de app
PSE
BANK_TRANSFER
Redirección al portal de internet banking
No
Montos altos, B2B, preferencia por débito bancario directo
Ciclo de vida de la solicitud
Todos los intentos pasan por el mismo puente asíncrono-a-síncrono:
Tu servidor llama a POST /api/v1/payments/intents.
Akua valida la solicitud, se suscribe a un canal interno de resultado y publica un evento de comando al procesador de pagos.
El procesador ejecuta la lógica específica del rail y publica el resultado de vuelta.
Akua responde de forma síncrona con una respuesta HTTP 201 que contiene el estado inicial de la transacción.
El resultado final (aprobado, rechazado, fallido) se entrega de forma asíncrona mediante webhook.
Nunca uses la respuesta inicial 201 para confirmar un pedido. Solo el webhook (o una llamada de consulta) transporta el estado final autoritativo.
Idempotencia
Todas las solicitudes de intento pasan por un bloqueo distribuido respaldado por Redis con un TTL configurable (~40 segundos). La idempotencia se controla mediante el header Idempotency-Key: enviar una solicitud con la misma clave mientras una anterior sigue en curso devuelve HTTP 409.
Usa el campo id con tu referencia interna del pedido para poder rastrear la transacción y evitar cargos duplicados desde tu plataforma.
Autenticación
Todas las solicitudes requieren tus credenciales de API en los headers de la solicitud. Contacta a tu ejecutivo de cuenta de Akua para obtener tu Client-Id y tu API key.
Registro de pago creado; el procesamiento aún no ha iniciado
PENDING_CUSTOMER
Esperando acción del cliente (Daviplata: ingreso del OTP; otros rails: esperando la aprobación del cliente)
PENDING_PROVIDER
Esperando a que el proveedor complete el procesamiento (p. ej. redirección al portal bancario en curso)
AUTHORIZED
Pago aprobado; fondos confirmados
REJECTED
Pago rechazado de forma definitiva
FAILED
Error técnico durante el procesamiento
Bre-B
Bre-B es el sistema nacional de pagos instantáneos de Colombia, operado por el Banco de la República. Es interoperable: el cliente puede pagar desde cualquier entidad financiera conectada. Los pagos se liquidan de inmediato a través del sistema CUD y son irrevocables.
Cómo funciona
Tu servidor crea un intento de pago con rail.id: "BRE_B".
Akua responde de inmediato con un código QR, un alias y una llave alfanumérica.
El cliente escanea el QR o ingresa manualmente la llave (alias) desde cualquier app bancaria y autoriza la transferencia.
Akua envía un webhook cuando el pago se confirma.
Sin redirección, sin paso de confirmación separado.
Muestra al cliente rail.qr.image y/o rail.payment_link. rail.alias es un código corto que el cliente puede escribir manualmente si no puede escanear el QR.
Webhooks
Evento
Significado
Acción recomendada
payment.purchase.pending
QR generado; el cliente aún no ha pagado
Mostrar una pantalla de espera con el QR y el alias
payment.purchase.succeeded
El cliente completó el pago
Confirmar el pedido y liberar el producto o servicio
payment.purchase.rejected
Pago rechazado o QR expirado sin pago
Notificar al cliente; ofrecer un método de pago alternativo
payment.purchase.failed
Error técnico
Registrar el error; contactar a soporte si persiste
Límites y reglas
Parámetro
Valor
Moneda
COP únicamente
Monto mínimo
1.000 COP
Monto máximo
Sin límite de red; aplican los límites del banco del pagador
Vigencia del intento (QR / enlace de pago)
15 minutos
Disponibilidad
24/7/365 incluyendo festivos
Liquidación
En tiempo real (CUD)
Acreditación en Akua
T+1
Contracargos
No aplican — los pagos Bre-B son irrevocables
Captura separada
No aplica — los fondos se mueven al momento del pago
Errores comunes
Error
Causa probable
Resolución
amount must be greater than zero
amount.value es 0 o negativo
Asegúrate de que amount.value > 0
rail.type inválido
Se envió un tipo de rail incorrecto
Debe ser BANK_TRANSFER para Bre-B
merchant_id no encontrado
El ID de comercio no existe o está inactivo
Verifica el merchant_id en tu panel de Akua
Webhook no recibido
La URL de callback no está configurada o no devuelve HTTP 200
Asegúrate de que tu endpoint responde en menos de 5 segundos
Nequi
Nequi es la billetera digital de Bancolombia, con aproximadamente 18 millones de usuarios en Colombia. Akua usa el flujo de cobro push: tu plataforma inicia el cobro, el cliente recibe una notificación push en la app de Nequi y aprueba o rechaza con su PIN.
Cómo funciona
Tu servidor crea un intento de pago con rail.id: "NEQUI" y el número de celular del cliente.
Nequi envía una notificación push al dispositivo del cliente.
El cliente abre la app, revisa el cobro y aprueba o rechaza.
Akua envía un webhook con el resultado final.
El cliente tiene 45 minutos para responder. Si no lo hace, el intento expira y Akua envía un webhook payment.purchase.rejected.
Tu referencia interna del pedido. Máx. 255 caracteres.
amount.value
decimal
Sí
Monto del cobro en COP. Debe ser mayor a cero.
amount.currency
string
Sí
Debe ser COP.
description
string
No
Descripción del pago visible para el cliente. Máx. 255 caracteres.
merchant_id
string
Sí
Tu ID de comercio en Akua.
rail.id
string
Sí
Debe ser NEQUI.
rail.type
string
Sí
Debe ser WALLET.
customer_data.phone_number
string
Sí
Número de celular colombiano registrado en Nequi. Acepta 3001234567 o +573001234567. Los caracteres no numéricos (excepto un + inicial) se eliminan automáticamente.
IN_PROGRESS significa que la solicitud de cobro se envió correctamente a Nequi y el cliente ya recibió (o recibirá pronto) la notificación. No significa que el pago fue aprobado.
Webhooks
Evento
Significado
Acción recomendada
payment.purchase.pending
Notificación enviada; el cliente aún no responde
Mostrar una pantalla de "esperando aprobación"
payment.purchase.succeeded
El cliente aprobó; fondos debitados
Confirmar el pedido y liberar el producto o servicio
payment.purchase.rejected
El cliente rechazó, o el intento expiró (TTL de 45 min)
Notificar al cliente; ofrecer alternativa
payment.purchase.failed
Error del proveedor o técnico
Registrar; no reintentar sin verificar el estado del intento
Límites y reglas
Parámetro
Valor
Moneda
COP únicamente
Límite por transacción
~12.000.000 COP (definido por Bancolombia)
Límite mensual del pagador
~7.000.000 COP (definido por Bancolombia)
TTL del intento
45 minutos
Disponibilidad
24/7
Acreditación en Akua
T+1
Contracargos
No aplican — los pagos Nequi son irrevocables una vez aprobados
Reenvío de notificación
No es posible; una notificación por intento
Reintento de un intento expirado
No es posible; crear un nuevo intento
Errores comunes
Error
Causa probable
Resolución
phone_number is required when rail.id is NEQUI
No se envió customer_data.phone_number
Incluir el número de celular del cliente
Número no registrado en Nequi
No hay cuenta Nequi activa para ese número
Ofrecer un método de pago alternativo
Notificación no recibida
Notificaciones push desactivadas o dispositivo sin conexión
Indicar al cliente que habilite las notificaciones de Nequi
Fondos insuficientes
El saldo de Nequi es menor al monto solicitado
El cliente debe recargar o usar otro método
Cuenta bloqueada
Bancolombia suspendió la cuenta
El intento falla en la creación; ofrecer una alternativa
Intento expirado (TTL)
El cliente no respondió en 45 minutos
Crear un nuevo intento si el cliente desea reintentar
Daviplata
Daviplata es la billetera digital de Davivienda. Funciona completamente por SMS — sin necesidad de app. Akua usa un flujo de dos pasos con OTP: tu plataforma crea el intento (lo que dispara un SMS al cliente) y luego confirma el OTP que el cliente ingresa en tu checkout.
Cómo funciona
Tu servidor crea un intento de pago con rail.id: "DAVIPLATA" y el número de celular del cliente.
Davivienda valida que el número corresponde a una cuenta Daviplata activa.
Si es válido, Daviplata envía un OTP por SMS al celular del cliente. El SMS incluye el nombre del comercio, el monto y el código de confirmación.
El cliente ingresa el OTP en tu checkout.
Tu servidor llama a POST /api/v1/payments/intents/{payment_id}/confirm con el OTP.
Akua valida el OTP y, si es correcto, ejecuta el débito de forma atómica.
Akua envía un webhook con el resultado final.
El OTP es válido durante 15 minutos. Si expira, crea un nuevo intento — no hay mecanismo de reenvío.
Paso 1 — Crear un intento
POST /api/v1/payments/intents
Cuerpo de la solicitud
{"id":"order-12345","amount":{"value":75000,"currency":"COP"},"description":"Online store purchase","merchant_id":"mer-xxxxxxxxxxxxxxxxxxxx","rail":{"id":"DAVIPLATA","type":"WALLET"},"customer_data":{"phone_number":"3001234567","document":"1234567890","document_type":"CC"}}
Campos de la solicitud
Campo
Tipo
Requerido
Descripción
id
string
No
Tu referencia interna del pedido. Máx. 255 caracteres.
amount.value
decimal
Sí
Monto del cobro en COP. Debe ser mayor a cero. Máximo: 3.000.000 COP por transacción.
amount.currency
string
Sí
Debe ser COP.
description
string
No
Concepto del pago que aparece en el SMS. Máx. 255 caracteres.
merchant_id
string
Sí
Tu ID de comercio en Akua.
rail.id
string
Sí
Debe ser DAVIPLATA.
rail.type
string
Sí
Debe ser WALLET.
customer_data.phone_number
string
Sí
Número de celular colombiano registrado en Daviplata. Acepta 3001234567 o +573001234567. Los caracteres no numéricos (excepto un + inicial) se eliminan automáticamente.
customer_data.document
string
No
Número de documento del cliente. Recomendado para aumentar la tasa de aprobación.
El HTTP 200 indica que Akua recibió y procesó la solicitud de confirmación — no garantiza que el pago fue aprobado. El resultado final llega por webhook.
Webhooks
Evento
Significado
Acción recomendada
payment.purchase.confirm.processed
OTP validado; débito ejecutado con éxito
Confirmar el pedido y liberar el producto o servicio
payment.purchase.confirm.rejected
Pago rechazado de forma definitiva por el proveedor (cuenta bloqueada, fondos insuficientes, etc.)
Notificar al cliente; ofrecer alternativa — este intento no puede reintentarse
payment.purchase.confirm.failed.retryable
OTP incorrecto; el intento sigue activo (PENDING_CUSTOMER)
Mostrar un mensaje de "OTP incorrecto"; permitir que el cliente vuelva a ingresar el código y llame de nuevo a confirm con el mismo payment_id
payment.purchase.succeeded
El pago alcanzó el estado AUTHORIZED (se emite junto con confirm.processed)
Usar como señal adicional de autorización si se necesita
payment.purchase.failed
Error técnico durante el procesamiento
Registrar el error; contactar a soporte si persiste
Límites y reglas
Parámetro
Valor
Moneda
COP únicamente
Límite por transacción
3.000.000 COP
Límites diarios/mensuales
Definidos por Davivienda según regulación (SFC)
Validez del OTP
15 minutos
Disponibilidad
24/7
Acreditación en Akua
T+1
Ejecución
Atómica: se debita el monto completo o nada
Contracargos
No aplican — los pagos Daviplata son irrevocables
Reenvío del OTP
No es posible; crear un nuevo intento
Errores comunes
Escenario
Causa
Resolución
Número no registrado en Daviplata
No hay cuenta Daviplata activa para ese teléfono
Error devuelto en la creación del intento; ofrecer una alternativa
OTP incorrecto (confirm.failed.retryable)
El cliente ingresó el código equivocado
Mostrar el error; permitir reingreso con el mismo payment_id
OTP expirado (15 min)
El cliente no ingresó el OTP a tiempo
Crear un nuevo intento
Fondos insuficientes
El saldo de Daviplata es menor al monto solicitado
El cliente debe recargar o usar otro método
Cuenta bloqueada
Davivienda restringió la cuenta
Error en la creación del intento; ofrecer una alternativa
Monto excede el límite
Monto > 3.000.000 COP
Reducir el monto o usar un método de pago diferente
PSE
PSE (Pagos Seguros en Línea) es la red interbancaria de pagos en línea de Colombia, operada por ACH Colombia. El cliente es redirigido al portal de internet banking de su propio banco, se autentica y autoriza el débito directamente. Tu plataforma nunca maneja credenciales bancarias.
Cómo funciona
Muestra una lista de bancos disponibles obtenida dinámicamente desde la API de Akua. El cliente selecciona su banco.
Tu servidor crea un intento de pago con rail.id: "PSE", el bank_id seleccionado y una return_url.
Akua responde con un rail.payment_link — redirige al cliente a esta URL de inmediato.
El cliente se autentica en su banco y autoriza el pago.
El banco redirige de vuelta a tu return_url. Esto no confirma la aprobación.
Verifica el estado final mediante webhook o una llamada de consulta antes de confirmar el pedido.
Paso 1 - Obtener los bancos disponibles
Antes de crear un intento, obtén la lista de bancos disponibles desde la API de Akua para mostrarla al cliente. Obtén siempre esta lista dinámicamente en tiempo de ejecución — no la codifiques de forma fija. La disponibilidad de los bancos cambia con el tiempo.
GET /api/banks?country=COL&rail_id=PSE
Ambos parámetros de query son obligatorios: country=COL y rail_id=PSE.
Usa el id de la entidad seleccionada como customer_data.bank_id al crear el intento. Obtén esta lista en tiempo de ejecución cada vez; la disponibilidad de bancos cambia con el tiempo.
Redirige al cliente a rail.payment_link de inmediato. Esta URL tiene un tiempo de expiración definido por el banco — no la almacenes para uso posterior.
Estados del pago
Estado
Significado
Acción recomendada
IN_PROGRESS / PENDING
El cliente está en el portal bancario o no ha iniciado
Mostrar una pantalla de "procesando"
APPROVED
El banco autorizó el débito; fondos en tránsito
Confirmar el pedido
REJECTED
El banco rechazó la autorización
Notificar al cliente; ofrecer reintentar o alternativa
PENDING_PROVIDER
La transacción llegó al banco pero el resultado aún no está resuelto
Hacer polling cada 15–30 segundos hasta un estado terminal
FAILED
Error técnico
Registrar el error; no reintentar sin verificar el estado actual
Importante: El retorno del cliente a tu return_url no es una confirmación de aprobación. Verifica siempre el estado del pago vía webhook o API antes de confirmar el pedido.
Webhooks
Evento
Significado
Acción recomendada
payment.purchase.pending
Intento creado; el cliente está siendo redirigido al banco
Mostrar una pantalla de "procesando" mientras el cliente completa el paso bancario
payment.purchase.succeeded
El banco aprobó el débito
Confirmar el pedido
payment.purchase.rejected
El banco rechazó la transacción
Notificar al cliente; ofrecer una alternativa
payment.purchase.failed
Error técnico
Registrar; contactar a soporte si persiste
Límites y reglas
Parámetro
Valor
Moneda
COP únicamente
Monto mínimo
Sin mínimo de red; los comercios pueden definir el suyo
Monto máximo
Sin límite de red; aplican los límites del banco del pagador
Vigencia del intento (enlace de pago)
21 minutos
Bancos disponibles
Más de 30 bancos y cooperativas financieras colombianas
Pagos recurrentes
No soportados — cada pago requiere autenticación activa del cliente
Acreditación en Akua
T+1
Contracargos
No aplican — PSE es una transferencia bancaria autorizada explícitamente
Devoluciones
Sin reversión nativa; procesar como una transferencia bancaria separada (desembolso)
Polling
Obligatorio — la return_url por sí sola no es un mecanismo de confirmación confiable
Errores comunes
Error
Causa
Resolución
bank_id is required when rail.id is PSE
No se envió customer_data.bank_id
Incluir el banco seleccionado por el cliente
return_url inválida
La URL no es pública o no es accesible
Asegúrate de que la URL sea pública, válida y devuelva HTTP 200
PENDING_PROVIDER persistente
Demora de ACH Colombia o del banco
Hacer polling con una espera máxima (p. ej. 30 minutos); marcar como fallido si no se resuelve
El cliente abandona el portal bancario
El cliente cierra la pestaña o la sesión expira
El estado puede quedar PENDING o REJECTED; esperar el webhook o hacer polling
Webhook no recibido
Tu URL de callback no está activa o expiró
Implementar un job de reconciliación que consulte periódicamente los estados de pago abiertos
Referencia de webhooks
Los cuatro rails de pago entregan los resultados finales como eventos webhook. Tu endpoint debe devolver HTTP 200 en menos de 5 segundos.
Intento creado y despachado al rail; esperando acción del cliente (PENDING_CUSTOMER)
payment.purchase.pending.provider
PSE
Intento despachado; esperando a que el proveedor (portal bancario) complete el procesamiento (PENDING_PROVIDER)
payment.purchase.succeeded
Bre-B, Nequi, PSE, Daviplata
Pago aprobado; fondos confirmados
payment.purchase.rejected
Bre-B, Nequi, PSE
Pago rechazado o intento expirado
payment.purchase.failed
Todos
Error técnico durante el procesamiento
payment.purchase.confirm.processed
Daviplata
OTP confirmado y débito ejecutado
payment.purchase.confirm.rejected
Daviplata
OTP rechazado de forma definitiva (problema de cuenta, etc.)
payment.purchase.confirm.failed.retryable
Daviplata
OTP incorrecto; el intento sigue activo y es reintentable
Confiabilidad de los webhooks
Los webhooks se entregan al menos una vez. Para manejar posibles duplicados, haz que tu handler de webhooks sea idempotente — usa el campo id como clave de deduplicación.
Si no se recibe un webhook:
Para Bre-B, Nequi, PSE: implementa un job de polling que consulte los intentos abiertos a intervalos regulares.
Para Daviplata: la respuesta del endpoint de confirmación es síncrona — si devuelve 200, la solicitud de confirmación fue procesada y el webhook llegará después.
Formato de respuesta de error
Los errores de validación y las fallas de solicitud devuelven un cuerpo de error estructurado:
{"code":"INVALID_REQUEST","type":"VALIDATION","message":"phone_number is required when rail.id is NEQUI","processor_code":"30","processor_message":"Format error"}
Estado HTTP
Significado
201
Intento creado; con el estado inicial de la transacción
200
Solicitud de confirmación recibida (solo Daviplata)
400
Error de validación — revisa el campo message
409
Solicitud duplicada en curso (bloqueo de idempotencia activo)
423
Ya hay una operación en curso para este pago (conflicto de concurrencia)
500
Error interno
Devoluciones
Ninguno de los rails de pago instantáneo de Colombia admite reversiones nativas. Las devoluciones deben procesarse como desembolsos bancarios separados. Contacta a tu ejecutivo de cuenta de Akua para habilitar los desembolsos en tu integración.
Pruebas en Sandbox
El entorno sandbox simula el flujo completo de pago sin conectarse a redes de proveedores reales.
Activar el mock
Envía un monto cuyo valor entero termine en 00. Ejemplos: 35000, 75000, 100000, 1200. El sistema detecta este sufijo automáticamente y activa el mock para el canal seleccionado.
Cualquier otro monto envía la solicitud al proveedor real en staging. En el entorno sandbox no hay proveedores reales, por lo que los montos sin mock generalmente agotarán el tiempo de espera.
Comportamiento por método
Método
Comportamiento del mock
Bre-B
Devuelve una imagen QR y un payment_link. Dispara el webhook payment.purchase.succeeded automáticamente en segundos.
Nequi
Simula la aprobación de una notificación push. Dispara el webhook payment.purchase.succeeded automáticamente en segundos.
Daviplata (paso 1)
Simula el envío del OTP. Devuelve 202 IN_PROGRESS. Espera la llamada de confirmación.
Daviplata (paso 2)
Acepta cualquier valor de OTP. Dispara el webhook payment.purchase.succeeded automáticamente en segundos.
PSE
Devuelve un payment_link de sandbox. Dispara el webhook payment.purchase.succeeded automáticamente — no se necesita redirección al portal.
¿Te resultó útil?
PSE en Akua: pagos directos desde cuenta bancaria
Acepta pagos con PSE (Pagos Seguros en Línea) a través de Akua. El cliente es redirigido a su propio banco, se autentica, y autoriza el débito directamente desde su cuenta bancaria.
Antes de empezar
URL base:https://sandbox.akua.la (pruebas) o https://api.akua.la (producción).
Autenticación: OAuth 2.0 client-credentials. Obtén un token con POST /oauth/token y envíalo como Authorization: Bearer <access_token> en cada llamada. Ver la guía maestra Pagos instantáneos en Colombia → Autenticación.
Redirección obligatoria: PSE lleva al cliente al portal de su banco; siempre debes enviar un return_url.
¿Qué es PSE?
PSE (Pagos Seguros en Línea) es la red de pagos interbancarios en línea de Colombia, operada por ACH Colombia — un consorcio propiedad de los principales bancos del país. Es el método de pago dominante para transacciones electrónicas directas desde cuentas bancarias en Colombia, presente en más de 30 entidades financieras, incluyendo Bancolombia, Davivienda, BBVA Colombia, Banco de Bogotá y Scotiabank Colpatria, entre otras.
A diferencia de las billeteras digitales o las tarjetas, PSE no pertenece a un emisor único: es infraestructura compartida del sistema financiero colombiano. Esto le da una cobertura institucional sin igual y un nivel de confianza consolidado entre los usuarios colombianos.
El mecanismo central de PSE es una redirección bancaria: el cliente es enviado desde tu checkout al portal de internet banking de su propio banco, donde se autentica y autoriza el débito directamente. Tu plataforma nunca accede a las credenciales bancarias del cliente.
PSE es particularmente adecuado para pagos de monto mediano y alto, pagos B2B, servicios públicos, seguros y cualquier contexto donde el cliente prefiera pagar directamente desde su cuenta bancaria.
¿Cómo funciona un pago con PSE en Akua?
Paso 1 — El cliente selecciona su banco
En tu checkout, el cliente elige PSE como método de pago y selecciona su banco de la lista. Esta lista debe obtenerse dinámicamente desde la API de Akua (GET /api/banks?country=COL&rail_id=PSE) para garantizar que solo se muestren las entidades actualmente disponibles. No codifiques la lista de bancos en tu integración — puede cambiar.
Paso 2 — Crear el intento de pago
Tu plataforma llama a POST /api/v1/payments/intents con el banco seleccionado, los datos del cliente y la URL de retorno (return_url). Akua crea el intento y devuelve un payment_link — la URL de redirección al portal bancario del cliente.
Paso 3 — Redirigir al cliente al banco
Tu checkout redirige el navegador del cliente a la URL recibida en rail.payment_link. El cliente entra al portal de internet banking de su banco, donde el banco controla completamente la experiencia de autenticación (usuario, contraseña, token, biometría, etc.).
Tu plataforma no tiene visibilidad de lo que ocurre dentro del portal bancario. El banco puede solicitar pasos de autenticación adicionales según sus propias políticas de seguridad.
Paso 4 — El cliente autoriza el pago en su banco
Dentro del portal bancario, el cliente ve los detalles de la transacción (comercio, monto, referencia) y confirma el débito. El banco procesa la autorización y redirige al cliente de vuelta a tu return_url.
Si el cliente abandona el portal bancario (cierra la pestaña, cierra sesión, se acaba el tiempo de la sesión bancaria), la transacción puede quedar en estado IN_PROGRESS con status_detailPENDING o pasar a DECLINED, según si el banco registró alguna acción antes del abandono.
Paso 5 — Retorno al checkout y verificación de estado
La redirección de vuelta a tu return_urlno confirma que el pago fue aprobado. Solo indica que el cliente completó (o abandonó) el paso bancario. Inmediatamente al recibir al cliente de vuelta, tu plataforma debe consultar el estado del pago para obtener el resultado definitivo.
Si el estado es APPROVED, el pedido puede confirmarse. Si es DECLINED, el cliente debe ser notificado. Si el status_detail es PENDING o PENDING_VALIDATION, es necesario implementar un mecanismo de sondeo (polling) hasta recibir un estado terminal.
Paso 6 — Confirmación vía webhook
Akua también envía un webhook cuando el pago es confirmado. Usa el webhook como el mecanismo principal de notificación, pero no dependas de él exclusivamente — implementa igualmente el polling para los estados no terminales.
Obtener la lista de bancos
Antes de crear el intento, obtén la lista de bancos disponibles para mostrarla al cliente.
GET /api/banks?country=COL&rail_id=PSE
Ambos parámetros de query son obligatorios: country=COL y rail_id=PSE.
Usa el id de la entidad seleccionada como customer_data.bank_id al crear el intento. Obtén esta lista en tiempo de ejecución cada vez; la disponibilidad de bancos cambia con el tiempo.
Cómo crear un pago con PSE
Endpoint
POST /api/v1/payments/intents
Cuerpo de la solicitud
{"id":"orden-12345","amount":{"value":200000,"currency":"COP"},"description":"Pago de factura #2025-1001","merchant_id":"mer-xxxxxxxxxxxxxxxxxxxx","rail":{"id":"PSE","type":"BANK_TRANSFER"},"return_url":"https://mitienda.com/pagos/resultado","customer_data":{"bank_id":"1007","document":"1234567890","document_type":"CC","first_name":"Juan","last_name":"Pérez","email":"juan@ejemplo.com"}}
Campo
Tipo
Requerido
Descripción
id
string
No
Tu identificador interno del pedido. Máx. 255 caracteres.
amount.value
decimal
Sí
Monto del pago en COP. Debe ser mayor a cero.
amount.currency
string
Sí
Debe ser COP. PSE no procesa monedas extranjeras.
description
string
No
Descripción del pago. Aparece en el comprobante del cliente. Máx. 255 caracteres.
merchant_id
string
Sí
ID del comercio en Akua.
rail.id
string
Sí
Debe ser PSE.
rail.type
string
Sí
Debe ser BANK_TRANSFER.
return_url
string
Sí
URL a la que el banco redirige al cliente tras completar el paso bancario. Debe ser una URL pública y válida.
customer_data.bank_id
string
Sí
ID de la entidad bancaria seleccionada por el cliente. Obtén esta lista desde GET /api/banks?country=COL&rail_id=PSE.
customer_data.document
string
Sí
Número de documento del pagador.
customer_data.document_type
string
Sí
Tipo de documento. Valores válidos: CC, CE, NIT, PASSPORT.
customer_data.first_name
string
Sí
Nombre(s) del pagador.
customer_data.last_name
string
Sí
Apellido(s) del pagador.
customer_data.email
string
Sí
Correo electrónico del pagador. ACH Colombia envía el comprobante a esta dirección.
Debes redirigir inmediatamente al cliente a la URL indicada en rail.payment_link. Esta URL tiene un tiempo de expiración definido por el banco — no la almacenes para uso posterior.
Estados del pago
status / status_detail
Significado
Acción recomendada
IN_PROGRESS / PENDING
El cliente aún está en el portal bancario o no ha iniciado el proceso
Espera; muestra un mensaje de "procesando" en tu checkout
IN_PROGRESS / PENDING_PROVIDER
El intento fue despachado y el proveedor (portal bancario) está procesando
Muestra "procesando"; espera el webhook
APPROVED / SUCCESS
El banco autorizó el débito; los fondos están en tránsito
Confirmar el pedido y liberar el producto o servicio
DECLINED
El banco rechazó la autorización (fondos insuficientes, credenciales incorrectas, cliente canceló)
Notificar al cliente; ofrecer reintentar con otro banco o método de pago
IN_PROGRESS / PENDING_VALIDATION
La transacción llegó al banco pero el resultado aún no está resuelto
Implementar polling cada 15–30 segundos hasta obtener un estado terminal
FAILED
Error técnico en el flujo
Registrar el error; no reintentar sin verificar el estado actual
Importante: La redirección del cliente de vuelta a tu return_url no es una garantía de aprobación. Siempre consulta el estado del pago vía API o espera el webhook antes de confirmar el pedido.
Webhooks
Evento
Significado
Acción recomendada
payment.purchase.pending
El intento fue creado; el cliente está siendo redirigido al banco
Mostrar pantalla de "procesando" mientras el cliente completa el paso bancario
payment.purchase.pending.provider
El intento fue despachado; el proveedor (portal bancario) está completando el procesamiento
Mantener pantalla de "procesando"; esperar el resultado
payment.purchase.succeeded
El banco aprobó el débito; los fondos están en tránsito
Sin mínimo a nivel de red; los comercios pueden definir uno propio
Monto máximo
Sin límite de red; aplican límites del banco del pagador para su portal de internet banking
Entidades disponibles
Más de 30 bancos y cooperativas financieras colombianas
Credenciales almacenadas
No aplica. PSE es completamente basado en sesión; no hay tokenización ni cobros recurrentes
Acreditación en Akua
T+1
Contracargos
No aplican. PSE es una transferencia bancaria autorizada explícitamente por el usuario
Devoluciones
No hay reversión nativa. Las devoluciones se procesan como transferencias bancarias separadas (desembolsos)
Polling obligatorio
Sí. Las integraciones que dependen solo del return_url tendrán confirmaciones poco confiables
Moneda extranjera
No soportada
Nota: PSE no soporta pagos recurrentes ni suscripciones. Cada cobro requiere que el cliente complete un nuevo proceso de autenticación en su banco.
Errores frecuentes y cómo resolverlos
Escenario
Causa
Solución
bank_id is required when rail.id is PSE
No se envió customer_data.bank_id
Incluir el banco seleccionado por el cliente en la solicitud
return_url inválida
La URL no es válida o no es accesible públicamente
Verificar que la URL sea pública, válida y devuelva HTTP 200
Estado PENDING_VALIDATION persistente
Demora de ACH Colombia o del banco en resolver la transacción
Implementar polling con espera máxima (ej. 30 minutos); registrar como fallido si no se resuelve
Cliente abandona el banco
El cliente cierra la pestaña o la sesión bancaria expira
El estado puede quedar PENDING o DECLINED; espera el webhook o haz polling
Banco incorrecto seleccionado
El cliente eligió un banco donde no tiene cuenta activa
La autenticación falla en el portal bancario; el resultado será DECLINED
Webhook no recibido
Tu URL de callback no está activa o no responde en tiempo
Implementar un job de reconciliación que consulte estados abiertos periódicamente
Credenciales bancarias incorrectas
El cliente falla la autenticación en su banco
El banco devuelve DECLINED; notificar al cliente para que reintente con las credenciales correctas
Cliente sin internet banking habilitado
El cliente tiene cuenta bancaria pero no tiene acceso configurado al portal de su banco
Informar al cliente; ofrecer método de pago alternativo
Pruebas en sandbox
Prueba PSE de punta a punta en https://sandbox.akua.la antes de producción. Casos mínimos recomendados: pago aprobado, pago rechazado por el banco, abandono del portal bancario y PENDING_VALIDATION persistente.
Por confirmar con tu ejecutivo de cuenta: los bancos de prueba y el mecanismo para forzar cada desenlace en sandbox se entregan junto con tus credenciales. (Pendiente de estandarizar en el ambiente unificado.)
Preguntas frecuentes
¿Tengo que mostrar todos los bancos disponibles en el checkout?
Debes obtener la lista de entidades activas desde GET /api/banks?country=COL&rail_id=PSE en tiempo de ejecución para garantizar que solo muestras los bancos actualmente disponibles. No codifiques la lista de bancos en tu integración — puede cambiar.
¿El cliente puede pagar con PSE sin tener internet banking habilitado?
No. PSE requiere que el cliente tenga activo el acceso al portal de internet banking de su banco. Si no lo tiene, la autenticación fallará.
¿Puedo usar PSE para pagos recurrentes?
No. PSE no soporta almacenamiento de credenciales ni cobros automáticos. Cada pago requiere la participación activa del cliente en una nueva sesión bancaria.
¿Qué pasa si el webhook no llega?
Implementa un job de reconciliación que consulte el estado de los pagos en estado IN_PROGRESS o con status_detailPENDING_VALIDATION al menos una vez al día. No dependas exclusivamente del webhook para confirmar pedidos.
¿Puedo hacer devoluciones con PSE?
PSE no tiene mecanismo de reversión nativo. Las devoluciones se procesan como desembolsos (transferencias bancarias) separados. Consulta el artículo sobre devoluciones en Akua para más detalle.
Artículos relacionados: Pagos instantáneos en Colombia (guía maestra) · Ciclo de vida de un pago en Akua · Bre-B en Akua · Nequi en Akua · Daviplata en Akua · Webhooks y notificaciones
¿Te resultó útil?
Bre-B en Akua: pagos instantáneos interoperables
Acepta pagos en tiempo real a través de Bre-B, el sistema de pagos instantáneos de Colombia, directamente desde la API de Akua.
¿Qué es Bre-B?
Bre-B es el sistema de pagos instantáneos e interoperables de Colombia, creado y operado por el Banco de la República. Funciona de manera similar a PIX en Brasil o UPI en India: una infraestructura nacional que permite transferencias de dinero en tiempo real entre cualquier entidad financiera del país, sin importar cuál sea el banco del pagador o del receptor.
Bre-B opera a través de una red de nodos interconectados (entre ellos Transfiya, Entrecuentas y Visionamos) y utiliza el sistema CUD del Banco de la República para la liquidación final. Cada transacción se liquida de forma individual e inmediata — no hay lotes ni compensación al final del día.
El sistema comenzó a operar en septiembre de 2025 y está disponible 24 horas al día, 7 días a la semana, los 365 días del año, incluyendo fines de semana y festivos.
Conceptos clave
Concepto
Descripción
Llave (Key)
Alias digital registrado en el directorio centralizado de Bre-B. Puede ser un número de cédula, número de celular, correo electrónico o un código alfanumérico. Cada llave apunta a una cuenta bancaria específica.
QR Bre-B
Código QR que el cliente escanea para iniciar el pago. Contiene la información de la llave del comercio. Akua lo genera automáticamente al crear el intento de pago.
Alias
Código corto (p.ej. @COMERCIO7X) que el cliente puede usar para pagar manualmente si no puede escanear el QR.
Liquidación
El movimiento real de fondos, que ocurre en tiempo real a través del CUD. Una vez liquidada, la transacción es irrevocable.
Irrevocabilidad
A diferencia de los pagos con tarjeta, las transacciones Bre-B no tienen contracargos. Una vez que el cliente paga, el pago es definitivo.
¿Cómo funciona un pago con Bre-B en Akua?
El flujo completo ocurre en dos etapas: tu plataforma crea el intento de pago, y el cliente lo ejecuta desde su aplicación bancaria escaneando el QR o usando el alias.
Paso 1 — Crear el intento de pago
Tu plataforma llama a POST /api/v1/payments/intents con los datos del pago y el rail BRE_B. Akua responde de inmediato con un código QR y un alias que debes mostrar al cliente en el checkout.
Paso 2 — El cliente escanea y paga
El cliente abre su aplicación bancaria, escanea el QR o ingresa el alias, confirma el monto y autoriza el pago. El pago se ejecuta en tiempo real directamente desde su cuenta bancaria.
Paso 3 — Confirmación vía webhook
En cuanto el pago es confirmado, Akua envía un webhook a tu URL de callback con el estado final del pago. Tu plataforma debe escuchar este evento para confirmar la transacción y liberar el pedido.
Importante: Bre-B no tiene un paso de captura separado. A diferencia de los pagos con tarjeta, el dinero se mueve en el momento en que el cliente paga. No uses el flujo de autorización/captura para este método.
Cómo crear un pago con Bre-B
Endpoint
POST /api/v1/payments/intents
Cuerpo de la solicitud
{"id":"orden-12345","amount":{"value":150000,"currency":"COP"},"description":"Compra en tienda online","merchant_id":"mer-xxxxxxxxxxxxxxxxxxxx","rail":{"id":"BRE_B","type":"BANK_TRANSFER"}}
Campo
Tipo
Requerido
Descripción
id
string
No
Tu identificador interno del pedido. Si no se envía, Akua genera uno automáticamente. Máx. 255 caracteres.
amount.value
decimal
Sí
Monto del pago. Debe ser mayor a cero. Mínimo: 1.000 COP.
Debes mostrar al cliente tanto el QR (rail.qr.image) como el alias (rail.alias). El cliente puede usar cualquiera de los dos para completar el pago. Mostrar ambas opciones es requerido para cumplir con la experiencia de usuario de Bre-B.
Webhooks
Akua envía un webhook a tu URL de callback cuando el estado del pago cambia. Debes implementar el manejo de estos eventos para confirmar o rechazar pedidos en tu plataforma.
Evento
Significado
Acción recomendada
payment.purchase.processed
El cliente completó el pago exitosamente
Confirmar el pedido y liberar el producto o servicio
payment.purchase.rejected
El pago fue rechazado o el cliente canceló
Notificar al cliente y ofrecer un método alternativo
payment.purchase.failed
Error del proveedor o falla técnica
Registrar el error y contactar a soporte si persiste
No confirmes pedidos basándote únicamente en la respuesta del POST /api/v1/payments/intents. La respuesta inicial solo indica que el QR fue generado. El webhook es la única señal confiable de que el pago fue completado.
Reglas y límites
Parámetro
Valor
Moneda
COP únicamente
Monto mínimo
1.000 COP
Monto máximo
Sin límite a nivel de red; aplican límites del banco del pagador
Disponibilidad
24/7/365, incluyendo festivos
Tiempo de liquidación
Inmediato (real-time gross settlement vía CUD)
Acreditación en Akua
T+1
Reversiones / contracargos
No aplican. Los pagos Bre-B son irrevocables una vez liquidados
Captura separada
No aplica. El dinero se mueve en el momento del pago
Errores frecuentes
Error
Causa probable
Cómo resolverlo
amount must be greater than zero
El valor enviado es 0 o negativo
Verifica que amount.value sea mayor a cero
amount.currency inválida
El código de moneda no es ISO 4217
Usa COP para pagos en Colombia
rail.type inválido
El tipo de rail no corresponde
Para Bre-B debe ser BANK_TRANSFER
merchant_id no encontrado
El ID del comercio no existe o no está activo
Verifica el merchant_id en tu configuración de Akua
Webhook no recibido
Tu URL de callback no está configurada o no responde
Asegúrate de que tu endpoint responde con HTTP 200 en menos de 5 segundos
Preguntas frecuentes
¿El cliente necesita tener una cuenta en un banco específico?
No. Bre-B es interoperable: el cliente puede pagar desde cualquier entidad financiera colombiana que esté conectada al sistema, sin importar cuál sea su banco.
¿Qué pasa si el cliente no paga el QR?
El intento de pago queda en estado IN_PROGRESS hasta que el cliente pague o expire el tiempo definido por el proveedor. Si el QR expira sin pago, recibirás un webhook con estado payment.purchase.rejected.
¿Se pueden hacer devoluciones?
Las transacciones Bre-B son irrevocables por diseño del sistema. Las devoluciones deben procesarse como transferencias bancarias separadas. Consulta el artículo sobre devoluciones en Akua para más detalle.
¿Te resultó útil?
Nequi en Akua: cobro push a billetera digital
Acepta pagos con Nequi directamente desde la API de Akua. El cliente recibe una notificación push en su app y aprueba el cobro con su PIN, sin redirecciones ni datos de tarjeta.
¿Qué es Nequi?
Nequi es la billetera digital de Bancolombia, con aproximadamente 18 millones de usuarios en Colombia. Es uno de los métodos de pago digitales con mayor penetración en el país.
El flujo que Akua implementa se conoce en el mercado como cobro push o pago push: tu plataforma es quien inicia el cobro, y el cliente simplemente aprueba o rechaza desde la app de Nequi. No hay redirección a páginas externas ni necesidad de ingresar datos bancarios en el checkout.
Nequi es ideal para flujos de pago donde el cliente ya proporcionó su número de celular registrado en Nequi y quieres ofrecerle una experiencia de aprobación rápida y sin fricción.
¿Cómo funciona un pago con Nequi en Akua?
Paso 1 — Crear el intento de pago
Tu plataforma llama a POST /api/v1/payments/intents con el número de celular del cliente y el rail NEQUI. Akua envía la solicitud de cobro a Bancolombia, que la registra en su sistema y empieza el contador de tiempo de espera.
Paso 2 — El cliente recibe la notificación
Nequi envía una notificación push al celular del cliente. La notificación muestra el nombre del comercio, el monto solicitado en COP y un botón para abrir la app.
Nota: Nequi envía una sola notificación por intento de pago. Si el cliente no tiene habilitadas las notificaciones de la app, no la recibirá. Si su dispositivo está sin conexión, la notificación llegará cuando se reconecte — pero el contador de tiempo sigue corriendo.
Paso 3 — El cliente aprueba o rechaza en la app
El cliente abre Nequi, ve los detalles del cobro (comercio, monto, referencia) y decide:
Aprobar: selecciona la fuente de fondos (saldo disponible) y confirma con su PIN. El débito se ejecuta en tiempo real.
Rechazar: descarta la solicitud. El intento pasa a estado REJECTED de inmediato.
Paso 4 — Confirmación vía webhook
Akua envía un webhook a tu URL de callback con el resultado final. Tu plataforma debe escuchar este evento para confirmar o cancelar el pedido.
Paso 5 — Tiempo de espera (TTL)
El cliente tiene 45 minutos para responder desde que se crea el intento. Si no hay respuesta en ese tiempo, el intento expira y recibirás un webhook con estado payment.purchase.rejected.
Cómo crear un pago con Nequi
Endpoint
POST /api/v1/payments/intents
Cuerpo de la solicitud
{"id":"orden-12345","amount":{"value":50000,"currency":"COP"},"description":"Compra en tienda online","merchant_id":"mer-xxxxxxxxxxxxxxxxxxxx","rail":{"id":"NEQUI","type":"WALLET"},"customer_data":{"phone_number":"3001234567"}}
Campo
Tipo
Requerido
Descripción
id
string
No
Tu identificador interno del pedido. Si no se envía, Akua genera uno automáticamente. Máx. 255 caracteres.
amount.value
decimal
Sí
Monto del cobro en COP. Debe ser mayor a cero.
amount.currency
string
Sí
Debe ser COP. Nequi no procesa monedas extranjeras.
description
string
No
Descripción del pago visible para el cliente. Máx. 255 caracteres.
merchant_id
string
Sí
ID del comercio en Akua.
rail.id
string
Sí
Debe ser NEQUI.
rail.type
string
Sí
Debe ser WALLET.
customer_data.phone_number
string
Sí
Número de celular colombiano registrado en Nequi. Formato: 10 dígitos sin prefijo de país (p.ej. 3001234567).
El estado IN_PROGRESS indica que la solicitud de cobro fue enviada correctamente a Nequi y el cliente ya recibió (o recibirá) la notificación. No implica que el pago fue aprobado. El resultado definitivo llega por webhook.
Webhooks
Evento
Significado
Acción recomendada
payment.purchase.processed
El cliente aprobó el cobro; el débito fue ejecutado en su billetera
Confirmar el pedido y liberar el producto o servicio
payment.purchase.rejected
El cliente rechazó la solicitud, o el intento expiró sin respuesta
Notificar al cliente y ofrecer un método de pago alternativo
payment.purchase.failed
Error del proveedor o falla técnica en el procesamiento
Registrar el error; no reintentar sin verificar el estado del intento
~7.000.000 COP (límite estándar de Bancolombia para cuentas Nequi)
Límite por transacción
~12.000.000 COP
TTL del intento
45 minutos
Disponibilidad
24/7
Acreditación en Akua
T+1
Contracargos
No aplican. Los pagos Nequi son irreversibles una vez aprobados
Captura separada
No aplica. El débito ocurre en el momento de la aprobación
Reintento del mismo intento
No es posible. Un intento expirado o rechazado es terminal; debes crear uno nuevo
Reenvío de notificación
No es posible. Nequi envía una sola notificación por intento
Nota sobre límites del pagador: Los límites de transacción y mensuales son definidos por Bancolombia a nivel de cuenta de usuario, no por Akua. Los clientes con cuenta completa verificada pueden tener límites más altos. Si un pago es rechazado por límite excedido, el cliente debe usar otro método de pago o contactar a Nequi.
Errores frecuentes y cómo resolverlos
Escenario
Causa
Solución
phone_number is required when rail.id is NEQUI
No se envió el campo customer_data.phone_number
Incluir el número de celular del cliente en la solicitud
Número no registrado en Nequi
El celular no tiene una cuenta Nequi activa
Validar antes del checkout que el número esté registrado; ofrecer método alternativo
Notificación no recibida
Notificaciones desactivadas o dispositivo sin conexión
Indicar al cliente en el checkout que tenga habilitadas las notificaciones de Nequi
Fondos insuficientes
El saldo disponible en Nequi es menor al monto solicitado
El intento llega a estado REJECTED; notificar al cliente para que recargue su saldo o use otro método
Cuenta bloqueada o restringida
Bancolombia ha suspendido la cuenta del usuario
El intento falla en creación; ofrecer método de pago alternativo
Intento expirado (TTL vencido)
El cliente no respondió en 45 minutos
El webhook llega con estado payment.purchase.rejected; crear un nuevo intento si el cliente quiere reintentar
Límite de transacción excedido
El monto supera el tope por transacción del usuario
Informar al cliente; no es posible procesar el monto con Nequi
Preguntas frecuentes
¿El cliente necesita tener la app de Nequi instalada?
Sí. El flujo de cobro push requiere que el cliente tenga la app de Nequi instalada en su dispositivo con notificaciones habilitadas.
¿Qué pasa si el cliente rechaza el cobro?
El intento pasa a estado terminal REJECTED de inmediato. No es posible retomar el mismo intento; debes crear uno nuevo si el cliente desea intentar de nuevo.
¿Puedo hacer devoluciones?
Los cobros Nequi no tienen un mecanismo de devolución nativo dentro del rail. Las devoluciones deben procesarse como transferencias bancarias separadas. Consulta el artículo sobre devoluciones en Akua para más detalle.
¿Qué pasa si creo dos intentos para el mismo cliente al mismo tiempo?
Cada intento es independiente. El cliente recibirá dos notificaciones. Usa el campo id con tu referencia interna y controla la idempotencia desde tu plataforma para evitar cargos duplicados.
¿Te resultó útil?
Daviplata en Akua: cobro con OTP por SMS
Acepta pagos con Daviplata a través de Akua. El cliente recibe un código de un solo uso por SMS y lo ingresa en tu checkout para autorizar el débito, sin necesidad de instalar ninguna app.
¿Qué es Daviplata?
Daviplata es la billetera digital de Davivienda. A diferencia de otros métodos de pago digitales, funciona únicamente por SMS: no requiere que el cliente tenga la app instalada, ni acceso a internet en su dispositivo. Esto lo hace accesible para un segmento amplio de usuarios.
El flujo que Akua implementa es el de cobro push con OTP: tu plataforma inicia el cobro, Daviplata envía un código de un solo uso (OTP) al celular del cliente por SMS, y el cliente lo ingresa en el checkout para confirmar el pago. El débito se ejecuta inmediatamente al validar el OTP.
Este método es especialmente efectivo para transacciones de bajo a mediano monto y contextos donde reducir la fricción del cliente importa, sin sacrificar la confirmación explícita del pago.
¿Cómo funciona un pago con Daviplata en Akua?
El flujo es de dos pasos: primero creas el intento de pago (lo que dispara el SMS), y luego confirmas el OTP que el cliente recibió.
Paso 1 — Crear el intento de pago
Tu plataforma llama a POST /api/v1/payments/intents con el número de celular del cliente y el rail DAVIPLATA. Davivienda valida que el número corresponde a una cuenta Daviplata activa. Si la validación falla, el intento se rechaza de inmediato y no se envía ningún SMS.
Paso 2 — El cliente recibe el OTP por SMS
Si la validación es exitosa, Daviplata envía un SMS al celular del cliente con el OTP. El mensaje incluye el nombre del comercio, el monto y el código de confirmación. No se requiere app ni internet en el dispositivo del cliente.
Tiempo de validez del OTP: El OTP es válido durante 15 minutos desde que se envía. Si el cliente no lo usa en ese tiempo, el intento completo expira y deberás crear uno nuevo.
Paso 3 — El cliente ingresa el OTP en tu checkout
Tu checkout debe mostrar un campo para que el cliente ingrese el OTP que recibió por SMS. Esta interacción ocurre completamente dentro de tu interfaz — Akua no tiene visibilidad de este paso hasta que envíes el OTP en el siguiente.
Paso 4 — Confirmar el OTP
Tu backend llama a POST /api/v1/payments/intents/{payment_id}/confirm con el OTP que el cliente ingresó. Akua lo reenvía al procesador, que valida el código y ejecuta el débito de forma atómica. Si el OTP es correcto y está dentro del tiempo de validez, el pago se completa en ese momento.
Paso 5 — Confirmación vía webhook
Akua envía un webhook con el resultado de la confirmación. Recibirás payment.purchase.confirm.processed si el pago fue exitoso, payment.purchase.confirm.rejected si el OTP fue rechazado de forma definitiva o la cuenta fue rechazada por el proveedor, o payment.purchase.confirm.failed.retryable si el OTP ingresado fue incorrecto pero el intento sigue activo y puede reintentarse.
Paso 1: Crear el intento de pago
Endpoint
POST /api/v1/payments/intents
Cuerpo de la solicitud
{"id":"orden-12345","amount":{"value":75000,"currency":"COP"},"description":"Compra en tienda online","merchant_id":"mer-xxxxxxxxxxxxxxxxxxxx","rail":{"id":"DAVIPLATA","type":"WALLET"},"customer_data":{"phone_number":"3001234567","document":"1234567890","document_type":"CC"}}
Campo
Tipo
Requerido
Descripción
id
string
No
Tu identificador interno del pedido. Máx. 255 caracteres.
amount.value
decimal
Sí
Monto del cobro. Debe ser mayor a cero. Máximo: 3.000.000 COP por transacción.
amount.currency
string
Sí
Debe ser COP. Daviplata no procesa monedas extranjeras.
description
string
No
Concepto del pago. Aparece en el SMS enviado al cliente. Máx. 255 caracteres.
merchant_id
string
Sí
ID del comercio en Akua.
rail.id
string
Sí
Debe ser DAVIPLATA.
rail.type
string
Sí
Debe ser WALLET.
customer_data.phone_number
string
Sí
Número de celular colombiano registrado en Daviplata. Acepta 3001234567 o +573001234567. Los caracteres no numéricos (excepto + al inicio) se eliminan automáticamente.
customer_data.document
string
No
Número de documento del titular de la cuenta Daviplata. Recomendado para aumentar la tasa de aprobación.
Importante: La respuesta HTTP 200 del endpoint de confirmación indica que la solicitud fue recibida y procesada por Akua, pero no garantiza que el pago fue aprobado. El resultado definitivo llega por webhook.
Webhooks
Evento
Significado
Acción recomendada
payment.purchase.confirm.processed
El OTP fue validado y el débito fue ejecutado exitosamente
Confirmar el pedido y liberar el producto o servicio
payment.purchase.confirm.rejected
El pago fue rechazado de forma definitiva por el proveedor (cuenta bloqueada, fondos insuficientes, etc.)
Informar al cliente del error; ofrecer método alternativo — no es posible reintentar con el mismo payment_id
payment.purchase.confirm.failed.retryable
El OTP ingresado fue incorrecto; el intento sigue activo en estado PENDING_CUSTOMER
Mostrar un mensaje de OTP incorrecto al cliente; permitirle ingresar el código nuevamente llamando otra vez al endpoint de confirmación con el mismo payment_id
payment.purchase.succeeded
El pago alcanzó estado AUTORIZADO. Se emite automáticamente justo después de payment.purchase.confirm.processed cuando el débito es exitoso
Puedes usarlo como señal adicional de autorización; no es necesario esperar a este evento para confirmar el pedido si ya recibiste confirm.processed
Aplican límites diarios y mensuales definidos por Davivienda según regulación de depósitos de bajo monto (SFC)
TTL del intento y del OTP
15 minutos (comparten el mismo tiempo de expiración)
Disponibilidad
24/7
Acreditación en Akua
T+1
Ejecución
Atómica. Se débita el monto completo o no se débita nada. No hay capturas parciales
Contracargos
No aplican. Los pagos Daviplata son irreversibles una vez confirmados
Reenvío de OTP
No es posible reenviar el OTP del mismo intento. Si expira, debes crear un nuevo intento
Moneda extranjera
No soportada
Errores frecuentes y cómo resolverlos
Escenario
Causa
Solución
Número no registrado en Daviplata
El celular no tiene una cuenta Daviplata activa
Error devuelto en la creación del intento; ofrecer método alternativo
OTP incorrecto
El cliente ingresó el código equivocado
Akua devuelve el evento payment.purchase.confirm.failed.retryable; el pago queda en PENDING_CUSTOMER con el bloqueo liberado. Muestra el error al cliente y permítele volver a llamar al endpoint de confirmación con el mismo payment_id — no es necesario crear un nuevo intento
OTP expirado (15 min)
El cliente no ingresó el OTP antes de que venciera el tiempo
Notificar al cliente; crear un nuevo intento si desea reintentar
Fondos insuficientes
El saldo de Daviplata es menor al monto solicitado
El pago falla en la confirmación; notificar al cliente para que recargue su saldo
Cuenta bloqueada o suspendida
Davivienda ha restringido la cuenta del usuario
Error en la creación; no se envía SMS; ofrecer método alternativo
Monto supera el límite por transacción
El monto excede 3.000.000 COP
Reducir el monto o usar un método de pago diferente
SMS no entregado
Falla en el operador de telecomunicaciones o número con formato incorrecto
Verificar el formato del número (10 dígitos, sin +57); reintentar con un nuevo intento
Intento duplicado
Se crearon dos intentos para el mismo usuario en poco tiempo
Cada intento genera un SMS independiente; implementa idempotencia con el campo id
Preguntas frecuentes
¿El cliente necesita tener la app de Daviplata instalada?
No. El flujo funciona completamente por SMS. El cliente solo necesita un celular con cobertura de red.
¿Puedo reenviar el OTP si el cliente no lo recibió?
No es posible reenviar el OTP de un intento existente. Si el cliente no recibió el SMS (por falla del operador, número incorrecto, etc.), debes crear un nuevo intento.
¿Qué pasa si el cliente ingresa el OTP después de que expiró?
La confirmación será rechazada. El intento completo queda en estado terminal y deberás crear uno nuevo.
¿Puedo hacer devoluciones?
Los pagos Daviplata no tienen un mecanismo de devolución nativo. Las devoluciones deben procesarse como transferencias bancarias separadas. Consulta el artículo sobre devoluciones en Akua para más detalle.
¿Te resultó útil?
NANO Y MICRO MERCHANTS
3
Comercios Nano y Micro: criterios de elegibilidad
Algunos comercios pequeños acceden a tarifas de intercambio reducidas cuando se clasifican como Nano Comercio o Micro Comercio. Los criterios dependen de la franquicia: Visa maneja dos categorías (Nano y Micro) y Mastercard solo una (Micro). A continuación se explican los requisitos de cada una.
Visa
Visa clasifica al comercio según su volumen de transacciones Visa, sin importar el rubro o la actividad del negocio.
El punto de partida es el volumen mensual promedio, es decir, el volumen anual estimado de transacciones Visa dividido entre 12. Ese promedio mensual se compara contra los topes vigentes:
Categoría
Volumen mensual promedio (2026)
Nano
hasta COP 11.417.532
Micro
hasta COP 50.383.788
Regular
por encima de COP 50.383.788
Si el promedio mensual supera el tope de Micro, el comercio se clasifica como Regular y no accede a tarifa reducida. Los topes se actualizan una vez al año, así que conviene confirmar los valores vigentes en cada periodo.
Tarifas resultantes (Visa)
Categoría
Débito
Prepago
Crédito
Nano
0.30%
0.30%
0.60%
Micro
0.70%
0.70%
1.00%
Mastercard
Mastercard solo ofrece la categoría de Micro Comercio. Para acceder a la tarifa reducida, el comercio debe cumplir las dos condiciones siguientes:
Estar registrado con identificación personal (Cédula de Ciudadanía o de Extranjería, y documentos equivalentes para población migrante), no con NIT. Un comercio registrado con NIT no califica como micro comercio.
Tener un volumen anual de transacciones Mastercard de hasta COP 130.000.000.
Adicionalmente, la actividad del comercio (MCC) no debe estar dentro de la lista de rubros excluidos, como aerolíneas, hoteles, universidades, estaciones de servicio, telecomunicaciones y entidades de gobierno. Las transacciones Maestro no participan del programa.
Tarifas resultantes (Mastercard Micro Comercio)
Producto
Tarifa
Débito y Prepago, Consumer
0.60%
Débito y Prepago, Commercial
0.65%
Crédito Standard y Gold
1.15%
Crédito Platinum
1.19%
Crédito Black
1.24%
Crédito Commercial
1.29%
En resumen
Visa evalúa solo el volumen y ofrece dos niveles: Nano y Micro.
Mastercard combina el tipo de identificación (Cédula) y el volumen anual, y ofrece un solo nivel: Micro.
En ambos casos, superar los topes de volumen lleva al comercio a la categoría Regular, con tarifa estándar.
¿Te resultó útil?
Comercio Micro en Brasil (Mastercard)
En Brasil, Mastercard ofrece una tarifa de intercambio reducida a los comercios pequeños a través de la categoría de Micro Comercio (Microestabelecimento Comercial). A diferencia de otros países, Brasil maneja una sola categoría (Micro, sin Nano) y la tarifa reducida aplica únicamente a pagos sin cuotas.
Criterios de elegibilidad
Para acceder a la tarifa reducida como Micro Comercio, el comercio debe cumplir lo siguiente:
Estar registrado con CPF (identificación de persona física), no con CNPJ.
Tener un volumen anual de transacciones Mastercard dentro del umbral que Mastercard define para micro comercios.
La transacción debe ser un pago sin cuotas, es decir, en un solo pago. Los pagos en cuotas no acceden a la tarifa de micro comercio.
El umbral de volumen lo administra y verifica Mastercard, por lo que la calificación por volumen la determina la franquicia.
Tarifas resultantes
Producto
Tarifa
Máximo por transacción
Débito Mastercard
0.25%
BRL 0.30
Prepago
0.30%
BRL 0.30
En resumen
Brasil tiene una sola categoría reducida: Micro Comercio (no hay Nano).
El comercio debe estar registrado con CPF, no con CNPJ.
La tarifa reducida aplica solo a pagos sin cuotas.
El cumplimiento del volumen anual lo verifica Mastercard.
¿Te resultó útil?
Comercios Micro y Nano en Perú (Mastercard)
En Perú, Mastercard ofrece tarifas de intercambio reducidas a los comercios pequeños a través de dos categorías: Micro Comercio y Nano Comercio. La clasificación depende del volumen anual de transacciones Mastercard del comercio y, en el caso de Nano, también del canal por el que recibe los pagos.
Criterios de elegibilidad
Como requisito general, el comercio debe estar identificado con un documento tributario válido: Cédula o RUC.
Además, debe cumplir el umbral de volumen de su categoría y, en el caso de Nano, recibir los pagos por el canal correspondiente:
Categoría
Volumen anual de transacciones Mastercard
Canal
Nano
hasta PEN 9.600
Solo QR o Tap on Phone (el celular del comercio funciona como terminal)
Micro
hasta PEN 90.000
Presencial (con tarjeta) o no presencial (en línea)
Puntos clave:
Nano es la categoría de menor volumen y solo aplica cuando el pago se recibe por QR o por Tap on Phone. Si un comercio con volumen de nivel Nano recibe el pago por otro canal, esa transacción no entra como Nano.
Micro cubre los pagos presenciales y no presenciales hasta el umbral de PEN 90.000 al año.
Un comercio cuyo volumen supere PEN 90.000 al año se clasifica como Regular y no accede a tarifa reducida.
Tarifas resultantes
Débito Mastercard:
Categoría
Standard y Gold
Platinum, World y Commercial
Micro
0.85%
0.90%
Nano
0.15%
0.15%
Prepago:
Categoría
Tarifa
Micro
1.40%
Nano
0.15%
Crédito:
Categoría
Standard
Gold
Platinum
Black y Commercial
Micro
1.20%
1.25%
1.40%
1.65%
Nano
0.90%
0.90%
1.00%
1.00%
En resumen
La clasificación depende del volumen anual de transacciones Mastercard del comercio.
Nano exige volumen muy bajo y solo aplica a pagos por QR o Tap on Phone.
Micro aplica a pagos presenciales y en línea hasta PEN 90.000 al año.
Superar el umbral de Micro lleva al comercio a la categoría Regular, con tarifa estándar.