Órdenes y Tipos de Orden
Referencia rápida de orders create
Esquema autoritativo:
npx @koyweforest/cli orders create --schemaimprime el esquema JSON completo y actualizado para la solicitud de creación. Si el resumen de abajo alguna vez difiere de esa salida, el esquema del CLI es la fuente de verdad.
Endpoint (PAYIN / PAYOUT / BALANCE_TRANSFER / PAYMENT_LINK / INTER_MERCHANT_TRANSFER): POST /organizations/{orgId}/merchants/{merchantId}/orders
ONRAMP y OFFRAMP no se crean en este endpoint. Las operaciones cripto pasan por el endpoint deals (POST /organizations/{orgId}/merchants/{merchantId}/deals) porque un deal se puede pagar en una sola cuota o en varias parciales, y cada pago crea su propia orden. Ver las secciones ONRAMP y OFFRAMP más abajo, o usa npx @koyweforest/cli flow deal.
Campos requeridos:
type— siempre requerido.originCurrencySymbol,destinationCurrencySymbol— requeridos salvo que pasesquoteId(en cuyo caso omítelos junto conamountIn/amountOut; la cotización los aporta).
Enum de type (7 valores — ONRAMP y OFFRAMP se enrutan por /deals, el resto por /orders):
PAYIN · PAYOUT · BALANCE_TRANSFER · PAYMENT_LINK · INTER_MERCHANT_TRANSFER — vía /orders
ONRAMP · OFFRAMP — vía /deals (ver abajo)
Especificación de monto (mutuamente excluyentes — elige exactamente uno):
amountIn— monto en la moneda de origen.amountOut— monto en la moneda de destino.quoteId— ID de una cotización previa que fija el tipo de cambio. Cuando pasasquoteId, omiteoriginCurrencySymbol,destinationCurrencySymbol,amountInyamountOut— la cotización los provee.
Requisitos condicionales (para los tipos enrutados por /orders):
| Tipo de orden | También requerido |
|---|---|
PAYIN | paymentMethods (exactamente un elemento) |
PAYOUT | destinationAccountId |
BALANCE_TRANSFER | Policy activa con regla coincidente (ver Passkeys y Aprobaciones). Auto-asigna isMerchantSelfOrder=true si no se provee. |
PAYMENT_LINK | paymentMethods puede ser [] |
INTER_MERCHANT_TRANSFER | destinationMerchantId |
Para ONRAMP / OFFRAMP, ver las secciones de Deals — esos tipos requieren destinationAccountId y un network del enum de abajo.
Enum de network (ONRAMP/OFFRAMP, pasado en el deal):
ETHEREUM · POLYGON · SOLANA · TRON · BSC · BITCOIN · BASE · ALGORAND
Forma de paymentMethods:
[
{ "method": "KHIPU" }
][
{ "method": "PSE", "extra": { "bankAccount": { "name": "BANCOLOMBIA" } } }
]Policy y MFA: Las operaciones bloqueadas por policy devuelven POL00007 (428 Precondition Required) y la orden queda en ON_HOLD hasta aprobarse. Pasa --mfa-token <token> para confirmar en línea, o usa npx @koyweforest/cli flow order --wait para bloquear en polling.
Ver la referencia CLI para orders create, el Catálogo de Códigos de Error para todos los códigos OR* / BAA* / POL*, y la especificación completa de la API.
Las órdenes son las entidades de transacción centrales en Koywe Pagos. Cada tipo de orden sirve un propósito específico en tus operaciones de pago.
Resumen de Tipos de Orden
Koywe Pagos soporta siete tipos distintos de orden:
| Tipo | Propósito | Origen | Destino | Caso de Uso |
|---|---|---|---|---|
| PAYIN | Aceptar pagos de clientes | Externa (cliente) | Saldo virtual | Checkout e-commerce |
| PAYOUT | Pagar proveedores | Saldo virtual | Externa (banco proveedor) | Pagos a vendedores |
| BALANCE_TRANSFER | Cambio de divisa | Saldo virtual (moneda A) | Saldo virtual (moneda B) | Convertir COP a USD |
| ONRAMP | Comprar cripto | Saldo virtual (fiat) | Billetera cripto | Comprar USDC con COP |
| OFFRAMP | Vender cripto | Billetera cripto | Saldo virtual (fiat) | Vender BTC por COP |
| PAYMENT_LINK | Enlace de pago | Externa (cliente) | Saldo virtual | Pago de factura |
| INTER_MERCHANT_TRANSFER | Mover fondos entre comercios de la misma organización | Saldo virtual (comercio A) | Saldo virtual (comercio B) | Operaciones de tesorería dentro de una organización |
Ciclo de Vida del Estado de Orden
Todas las órdenes siguen una progresión de estado similar:
Descripciones de Estados:
| Estado | Descripción | Acciones Disponibles |
|---|---|---|
PENDING | Orden creada, esperando pago | Cancelar, Verificar estado |
ON_HOLD | En espera por verificación MFA o aprobación humana bajo una policy activa (POL00007 al crear). Ver Policy y MFA y Passkeys y Aprobaciones. | Aprobar / rechazar desde el dashboard, pasar --mfa-token, o hacer polling con npx @koyweforest/cli flow order --wait |
PROCESSING | Pago siendo procesado | Verificar estado |
PAID | Pago confirmado, liquidación en progreso | Verificar estado |
COMPLETED | Fondos entregados, orden completa | Ver detalles |
FAILED | Pago o liquidación falló | Reintentar, Contactar soporte |
CANCELLED | Orden cancelada (o aprobación rechazada) | Ver detalles |
EXPIRED | Ventana de pago expiró | Crear nueva orden |
PAYIN - Aceptar Pagos de Clientes
Acepta pagos de clientes en tu saldo virtual.
Cuándo Usar
- Checkout e-commerce
- Pagos de servicios
- Facturación de suscripciones
- Pagos de facturas
- Recolección de donaciones
Diagrama de Flujo
Campos Requeridos
{
"type": "PAYIN", // Tipo de orden
"originCurrencySymbol": "COP", // Moneda fiat
"destinationCurrencySymbol": "COP", // Misma que origen
"amountIn": 50000, // Monto a cobrar
"description": "Pago por Orden #12345", // Descripción visible para cliente
"paymentMethods": [ // Al menos un método de pago
{
"method": "PSE", // Código de método de pago
"extra": { "bankAccount": { "name": "BANCOLOMBIA" } } // Datos adicionales por método
}
],
"successUrl": "https://tusitio.com/exitoso", // Redirección después de éxito
"failedUrl": "https://tusitio.com/fallido" // Redirección después de fallo
}Campos Opcionales
{
"contactId": "cnt_abc123", // Vincular a contacto cliente
"externalId": "order-12345", // Tu referencia interna
"metadata": { "orderId": "12345" }, // Datos personalizados
"dueDate": "2025-11-14T23:59:59Z" // Fecha límite de pago
}Ejemplo
async function createPayinOrder(token, orgId, merchantId) {
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'PAYIN',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'COP',
amountIn: 50000,
description: 'Pago por Orden #12345',
externalId: `order-${Date.now()}`,
paymentMethods: [
{
method: 'PSE',
extra: { bankAccount: { name: 'BANCOLOMBIA' } }
}
],
successUrl: 'https://tusitio.com/exitoso',
failedUrl: 'https://tusitio.com/fallido'
},
{
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
}
const order = await createPayinOrder(token, orgId, merchantId);
console.log('URL de Pago:', order.paymentUrl);
// Redirige al cliente a order.paymentUrlGuía Completa de Integración PAYIN →
PAYOUT - Pagar Proveedores
Envía pagos desde tu saldo virtual a cuentas bancarias externas.
Cuándo Usar
- Pagos a vendedores
- Pagos a contratistas
- Reembolsos a clientes
- Comisiones de afiliados
- Liquidaciones con socios
Diagrama de Flujo
Campos Requeridos
{
"type": "PAYOUT", // Tipo de orden
"originCurrencySymbol": "COP", // Moneda fiat
"destinationCurrencySymbol": "COP", // Misma que origen
"amountIn": 100000, // Monto a enviar
"destinationAccountId": "ba_xyz789", // ID cuenta bancaria proveedor
"description": "Pago por Factura #456" // Descripción interna
}Campos Opcionales
{
"contactId": "cnt_provider123", // Vincular a contacto proveedor
"externalId": "invoice-456", // Tu referencia interna
"metadata": { "invoiceId": "456" } // Datos personalizados
}Ejemplo
async function createPayoutOrder(token, orgId, merchantId, contactId, bankAccountId) {
// 1. Verificar saldo primero
const balances = await getMerchantBalances(token, orgId, merchantId);
const copBalance = balances.find(b => b.currencySymbol === 'COP');
if (copBalance.availableBalance < 100000) {
throw new Error('Saldo insuficiente');
}
// 2. Crear orden de payout
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'PAYOUT',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'COP',
amountIn: 100000,
contactId: contactId,
destinationAccountId: bankAccountId,
description: 'Pago por Factura #456',
externalId: `invoice-456-${Date.now()}`
},
{
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
}
const payout = await createPayoutOrder(token, orgId, merchantId, 'cnt_provider', 'ba_xyz789');
console.log('Payout creado:', payout.id);Importante: Siempre verifica el saldo de tu cuenta virtual antes de crear órdenes PAYOUT. La orden fallará si tienes fondos insuficientes.
Guía Completa de Integración PAYOUT →
BALANCE_TRANSFER - Cambio de Divisa
Transfiere fondos entre diferentes cuentas virtuales de moneda (cambio de divisa instantáneo).
Cuándo Usar
- Convertir COP a USD para pagos internacionales
- Rebalancear tenencias de moneda
- Bloquear tasas de cambio
- Preparar fondos para pagos en moneda específica
Diagrama de Flujo
Campos Requeridos
{
"type": "BALANCE_TRANSFER", // Tipo de orden
"originCurrencySymbol": "COP", // Moneda origen
"destinationCurrencySymbol": "USD", // Moneda destino
"amountIn": 1000000 // Monto a convertir (1M COP)
}Ejemplo
async function transferCurrency(token, orgId, merchantId) {
// 1. Obtener cotización para tasa de cambio
const quote = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
{
type: 'BALANCE_TRANSFER',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'USD',
amountIn: 1000000
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
console.log('Tasa de cambio:', quote.data.exchangeRate);
console.log('Recibirás:', quote.data.amountOut, 'USD');
// 2. Crear orden de transferencia — pasar quoteId fija tasa y montos,
// así que omite originCurrencySymbol / destinationCurrencySymbol / amountIn / amountOut
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'BALANCE_TRANSFER',
quoteId: quote.data.id
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return response.data;
}
const transfer = await transferCurrency(token, orgId, merchantId);
console.log('Transferencia completada instantáneamente:', transfer.status); // "COMPLETED"Liquidación Instantánea: Las órdenes BALANCE_TRANSFER se completan instantáneamente. Sin esperar confirmaciones externas.
Guía Completa de Transferencias de Saldo →
ONRAMP - Comprar Criptomoneda
Convierte moneda fiat a criptomoneda.
Usa Endpoint de Deals: Las operaciones ONRAMP usan el endpoint /deals. Los deals pueden pagarse completa o parcialmente, y cada pago crea órdenes que ejecutan la compra de cripto.
Cuándo Usar
- Comprar cripto para tesorería
- Ofrecer compras de cripto a usuarios
- Cobertura con stablecoins
- Pagar proveedores nativos en cripto
Criptomonedas Soportadas
| Símbolo | Nombre | Redes |
|---|---|---|
| USDC | USD Coin | Ethereum, Polygon, BSC |
| USDT | Tether | Ethereum, Polygon, BSC |
| ETH | Ethereum | Ethereum |
| BTC | Bitcoin | Bitcoin |
| MATIC | Polygon | Polygon |
| BNB | BNB | BSC |
Campos Requeridos para Cotización
{
"type": "ONRAMP",
"originCurrencySymbol": "COP", // Moneda fiat
"destinationCurrencySymbol": "USDC", // Moneda cripto
"amountIn": 50000 // Monto fiat
}Campos Requeridos para Deal
{
"type": "ONRAMP",
"destinationAccountId": "wallet_abc123", // ID billetera cripto
"quoteId": "quote_xyz789" // ID cotización
}Simplificado: Los deals solo necesitan la cuenta de destino y el ID de cotización. Los montos y monedas vienen de la cotización.
Ejemplo
async function buyUSDC(token, orgId, merchantId, walletId) {
// 1. Obtener cotización
const quote = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
{
type: 'ONRAMP',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'USDC',
amountIn: 50000
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
console.log('Recibirás:', quote.data.amountOut, 'USDC');
console.log('Tasa de cambio:', quote.data.exchangeRate);
console.log('Comisión de red:', quote.data.networkFee);
// 2. Crear deal (¡no orden!)
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/deals`,
{
type: 'ONRAMP',
destinationAccountId: walletId,
quoteId: quote.data.id
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return response.data;
}
const deal = await buyUSDC(token, orgId, merchantId, 'wallet_abc123');
console.log('Deal ONRAMP creado:', deal.id);
console.log('El deal puede pagarse completa o parcialmente');Pagos Parciales: Los deals ONRAMP pueden pagarse en múltiples cuotas. Cada pago crea una orden que compra la cantidad proporcional de cripto. ¡Ideal para promedio de costo en dólares!
Saldo Requerido: Por defecto, se requiere saldo suficiente en tu cuenta virtual para cerrar un deal ONRAMP. Los deals se ejecutan automáticamente cuando se acreditan fondos a tu cuenta. Los comercios pre-aprobados pueden operar sin saldo inicial.
OFFRAMP - Vender Criptomoneda
Convierte criptomoneda a moneda fiat.
Usa Endpoint de Deals: Las operaciones OFFRAMP usan el endpoint /deals. A diferencia de ONRAMP, los deals OFFRAMP deben pagarse completamente (sin pagos parciales). El deal crea órdenes cuando está completamente financiado.
Cuándo Usar
- Vender tenencias de cripto
- Convertir pagos cripto a fiat
- Realizar ganancias cripto
- Preparar fiat para operaciones
Campos Requeridos para Cotización
{
"type": "OFFRAMP",
"originCurrencySymbol": "USDC", // Moneda cripto
"destinationCurrencySymbol": "COP", // Moneda fiat
"amountIn": 10 // Monto cripto (10 USDC)
}Campos Requeridos para Deal
{
"type": "OFFRAMP",
"destinationAccountId": "va_cop_12345", // ID cuenta virtual
"quoteId": "quote_xyz789" // ID cotización
}Solo Pago Completo: Los deals OFFRAMP deben financiarse completamente. No se soportan pagos parciales.
Ejemplo
async function sellUSDC(token, orgId, merchantId) {
// 1. Obtener cotización
const quote = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
{
type: 'OFFRAMP',
originCurrencySymbol: 'USDC',
destinationCurrencySymbol: 'COP',
amountIn: 10 // 10 USDC
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
console.log('Recibirás:', quote.data.amountOut, 'COP');
// 2. Crear deal (¡no orden!)
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/deals`,
{
type: 'OFFRAMP',
destinationAccountId: 'va_cop_12345', // Cuenta virtual para COP
quoteId: quote.data.id
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return response.data;
}
const deal = await sellUSDC(token, orgId, merchantId);
console.log('Deal OFFRAMP creado:', deal.id);
console.log('Dirección de depósito:', deal.cryptoDestinationWallet);
console.log('Envía el monto completo de cripto para completar');
// Los fondos se acreditarán a la cuenta virtual COP después de recibir el cripto.Financiamiento Completo: Después de crear el deal, debes enviar el monto completo de cripto a la dirección de depósito proporcionada. Una vez recibido, el deal crea órdenes y acredita tu cuenta virtual con fiat.
PAYMENT_LINK - Enlaces de Pago
Genera enlaces de pago compartibles con un flujo de checkout completo de marca Koywe - ¡sin necesidad de contacto o método de pago por adelantado!
¿Qué Hace Especial a PAYMENT_LINK?
El cliente ingresa su propia información en el checkout
El cliente selecciona su método de pago preferido
Hermoso checkout seguro alojado por Koywe
Envía vía email, WhatsApp, SMS o código QR
Cuándo Usar
- Checkout e-commerce: Colección de pagos simple sin integración compleja
- Pagos de facturas: Envía enlace de pago para facturas emitidas
- Email/WhatsApp: Comparte solicitudes de pago directamente
- Pagos con QR: Genera QR para pagos en persona
- Colecciones únicas: Solicitudes de pago rápidas sin almacenar datos del cliente
Cómo Funciona
Diferencias con PAYIN
| Característica | PAYIN | PAYMENT_LINK |
|---|---|---|
| Contacto | Opcional pero recomendado | No necesario - cliente ingresa datos |
| Método de Pago | Debe especificarse | Cliente selecciona de todos disponibles |
| UI de Checkout | Redirige a proveedor de pago | Flujo de checkout de marca Koywe |
| Recolección de Datos | Tú recolectas datos del cliente | Koywe recolecta datos del cliente |
| Mejor Para | Experiencia de checkout integrada | Solicitudes de pago independientes |
Campos Mínimos Requeridos
¡Eso es todo! Sin contacto, sin método de pago, sin detalles del cliente necesarios. Solo monto y descripción.
{
"type": "PAYMENT_LINK", // Tipo de orden
"originCurrencySymbol": "COP", // Moneda
"destinationCurrencySymbol": "COP", // Igual que origen
"amountIn": 75000, // Monto a cobrar
"description": "Factura #789" // Muestra al cliente
}Campos Opcionales
{
"dueDate": "2025-11-14T23:59:59Z", // Expiración del enlace
"externalId": "invoice-789", // Tu referencia
"successUrl": "https://tusite.com/exitoso", // Redireccionar después de pago
"failedUrl": "https://tusite.com/fallido" // Redireccionar en fallo
}Ejemplo Completo
// Ejemplo mínimo - ¡solo crear y compartir!
async function createPaymentLink(amount, description) {
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'PAYMENT_LINK',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'COP',
amountIn: amount,
description: description
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return response.data;
}
// Uso
const link = await createPaymentLink(75000, 'Factura #789 - Diseño Web');
console.log('Comparte este enlace:', link.paymentUrl);
// Enviar vía email, WhatsApp, SMS o generar código QR
await sendEmail(customerEmail, {
subject: 'Solicitud de Pago - Factura #789',
body: `Por favor paga aquí: ${link.paymentUrl}`
});// Ejemplo completo con todas las opciones
async function createPaymentLinkWithOptions(invoiceData) {
const dueDate = new Date();
dueDate.setHours(dueDate.getHours() + 24); // Expira en 24h
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'PAYMENT_LINK',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'COP',
amountIn: invoiceData.amount,
description: invoiceData.description,
externalId: invoiceData.invoiceNumber,
dueDate: dueDate.toISOString(),
successUrl: 'https://tusitio.com/pago/exitoso',
failedUrl: 'https://tusitio.com/pago/fallido'
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return response.data;
}
// Uso
const link = await createPaymentLinkWithOptions({
amount: 150000,
description: 'Suscripción Mensual - Noviembre 2025',
invoiceNumber: 'INV-2025-11-789'
});
console.log('Enlace de pago:', link.paymentUrl);def create_payment_link(amount, description):
response = requests.post(
f'https://api-sandbox.koywe.com/api/v1/organizations/{org_id}/merchants/{merchant_id}/orders',
json={
'type': 'PAYMENT_LINK',
'originCurrencySymbol': 'COP',
'destinationCurrencySymbol': 'COP',
'amountIn': amount,
'description': description
},
headers={'Authorization': f'Bearer {token}'}
)
return response.json()
# Uso
link = create_payment_link(75000, 'Factura #789 - Diseño Web')
print(f"Comparte este enlace: {link['paymentUrl']}")Respuesta:
{
"id": "ord_abc123",
"type": "PAYMENT_LINK",
"status": "PENDING",
"paymentUrl": "https://checkout.koywe.com/pay/ord_abc123",
"amountIn": 75000,
"originCurrencySymbol": "COP",
"description": "Factura #789 - Diseño Web",
"createdAt": "2025-11-13T15:00:00Z"
}Experiencia del Cliente: Cuando los clientes abren el enlace de pago, verán un checkout de marca Koywe donde pueden:
- Revisar detalles del pago
- Ingresar su información personal
- Seleccionar su método de pago preferido (PSE, PIX, Nequi, etc.)
- Completar el pago
Metadata de Orden e IDs Externos
ID Externo (Idempotencia)
Usa externalId para asegurar creación de orden idempotente:
{
"externalId": "order-12345-20251113" // Tu identificador único
}Beneficios:
- Seguro reintentar solicitudes fallidas
- Previene órdenes duplicadas
- Vincula a tus sistemas internos
Metadata
Almacena datos personalizados con órdenes:
{
"metadata": {
"orderId": "12345",
"customerId": "cust_67890",
"source": "mobile_app",
"campaign": "summer_sale"
}
}Casos de uso:
- Rastrear origen de orden
- Almacenar información de campaña
- Vincular a sistemas internos
- Campos de reportes personalizados
INTER_MERCHANT_TRANSFER - Mover Fondos Entre Comercios
Mueve fondos de saldo virtual de un comercio a otro dentro de la misma organización, en la misma moneda y sin tocar un banco externo. Útil para operaciones de tesorería, liquidación de comisiones y rebalanceo interno entre comercios que controlas.
Cuándo Usar
- Consolidar saldos entre tus propios comercios dentro de una organización
- Liquidar comisiones internas entre un comercio padre y uno hijo
- Rebalancear liquidez para que un comercio específico tenga fondos para un próximo payout
Diagrama de Flujo
Campos Requeridos
type—INTER_MERCHANT_TRANSFERdestinationMerchantId— Requerido. Comercio dentro de la misma organización. Transferencias entre organizaciones son rechazadas (IMT00002).originCurrencySymbol/destinationCurrencySymbol— deben ser la misma moneda (IMT00008; misma-moneda es comportamiento MVP).amountInoamountOut— uno de los dos (misma regla que los otros tipos de/orders).
Ejemplo — Crear Orden
const response = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${sourceMerchantId}/orders`,
{
type: 'INTER_MERCHANT_TRANSFER',
destinationMerchantId: 'mer_destination_abc',
originCurrencySymbol: 'USD',
destinationCurrencySymbol: 'USD',
amountIn: 1000,
description: 'Liquidación comisiones julio'
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
// En sandbox se completa instantáneamente como BALANCE_TRANSFER:
console.log(response.data.status); // "COMPLETED"Ejemplo — Respuesta
{
"id": "ord_imt_xyz789",
"type": "INTER_MERCHANT_TRANSFER",
"status": "COMPLETED",
"originMerchantId": "mer_source_123",
"destinationMerchantId": "mer_destination_abc",
"originCurrencySymbol": "USD",
"destinationCurrencySymbol": "USD",
"amountIn": 1000,
"amountOut": 1000,
"description": "Liquidación comisiones julio",
"createdAt": "2026-04-24T12:00:00Z",
"completedAt": "2026-04-24T12:00:01Z"
}Listado y Filtros
El enum del filtro orders list en la spec OpenAPI omite hoy INTER_MERCHANT_TRANSFER. A pesar de eso, el query param ?type=INTER_MERCHANT_TRANSFER sí filtra correctamente contra la API — es un gap de la spec, no del runtime.
# Vía CLI (el CLI refleja los 7 tipos correctamente):
npx @koyweforest/cli orders list --type INTER_MERCHANT_TRANSFER --format table
# Vía HTTP directo:
curl -H "Authorization: Bearer $TOKEN" \
"https://api-sandbox.koywe.com/api/v1/organizations/$ORG/merchants/$MERCHANT/orders?type=INTER_MERCHANT_TRANSFER"Errores Comunes
| Código | Causa | Fix |
|---|---|---|
IMT00001 | Comercio destino no encontrado | Verifica que destinationMerchantId exista |
IMT00002 | Comercio destino está en otra organización | Las transferencias se restringen a comercios de la misma org |
IMT00003 | Comercio origen y destino son el mismo | Usa BALANCE_TRANSFER para cambio de moneda en el mismo comercio |
IMT00004 | Comercio destino está deshabilitado | Habilítalo o elige otro destino |
IMT00005 | Saldo insuficiente en cuenta del comercio origen | Acredita la cuenta origen o reduce el monto |
IMT00007 | Falta destinationMerchantId | Campo requerido para INTER_MERCHANT_TRANSFER |
IMT00008 | Monedas origen y destino no coinciden | Solo misma moneda (MVP) |
Ver el Catálogo de Códigos de Error completo para cada código IMT*.