Transferencias de Saldo

Cambio de moneda entre cuentas virtuales

Transferencias de Saldo (Cambio de Moneda)

Transfiere fondos entre diferentes cuentas virtuales de moneda instantáneamente.

¿Qué es BALANCE_TRANSFER?

BALANCE_TRANSFER te permite convertir fondos de una moneda a otra dentro de tus cuentas virtuales - instantáneamente y sin transferencias bancarias externas.

Casos de uso:

  • Convertir COP a USD para pagos internacionales
  • Rebalancear tenencias de moneda
  • Fijar tasas de cambio favorables
  • Preparar fondos para payouts de moneda específica

Cómo Funciona

Proceso:

  1. Verificar saldo de moneda origen
  2. Obtener cotización de tasa de cambio
  3. Crear orden BALANCE_TRANSFER
  4. Fondos transferidos instantáneamente entre cuentas

Ejemplo Rápido

Node.js
1// Convertir 1,000,000 COP a USD
2
3// 1. Obtener cotización
4const quote = await axios.post(
5 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
6 {
7 type: 'BALANCE_TRANSFER',
8 originCurrencySymbol: 'COP',
9 destinationCurrencySymbol: 'USD',
10 amountIn: 1000000
11 },
12 { headers: { 'Authorization': `Bearer ${token}` } }
13);
14
15console.log('Tasa de cambio:', quote.data.exchangeRate); // ej., 4000 COP por USD
16console.log('Recibirás:', quote.data.amountOut, 'USD'); // ej., 248.75 USD
17console.log('Comisión:', quote.data.koyweFee, 'COP'); // ej., 5000 COP
18
19// 2. Crear orden de transferencia
20const order = await axios.post(
21 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
22 {
23 type: 'BALANCE_TRANSFER',
24 originCurrencySymbol: 'COP',
25 destinationCurrencySymbol: 'USD',
26 amountIn: 1000000,
27 quoteId: quote.data.id // Bloquear la tasa
28 },
29 { headers: { 'Authorization': `Bearer ${token}` } }
30);
31
32console.log('Transferencia completada:', order.data.status); // "COMPLETED"

Liquidación Instantánea: ¡Las órdenes BALANCE_TRANSFER se completan inmediatamente - sin esperar confirmaciones bancarias!


Integración Paso a Paso

Paso 1: Verificar Saldo Origen

Verificar Saldo
1const balances = await axios.get(
2 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/bank-accounts/balances`,
3 { headers: { 'Authorization': `Bearer ${token}` } }
4);
5
6const copBalance = balances.data.find(b => b.currencySymbol === 'COP');
7
8if (copBalance.availableBalance < 1000000) {
9 throw new Error('Saldo COP insuficiente');
10}

Paso 2: Obtener Cotización de Tasa de Cambio

Obtener Cotización
1const quote = await axios.post(
2 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
3 {
4 type: 'BALANCE_TRANSFER',
5 originCurrencySymbol: 'COP',
6 destinationCurrencySymbol: 'USD',
7 amountIn: 1000000
8 },
9 { headers: { 'Authorization': `Bearer ${token}` } }
10);
11
12// Mostrar tasa al usuario
13console.log(`Tasa: 1 USD = ${quote.data.exchangeRate} COP`);
14console.log(`Recibirás: ${quote.data.amountOut} USD`);
15console.log(`Comisión: ${quote.data.koyweFee} COP`);
16console.log(`Cotización expira en: ${quote.data.validFor} segundos`);

Paso 3: Crear Orden de Transferencia

Crear Transferencia
1const order = await axios.post(
2 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
3 {
4 type: 'BALANCE_TRANSFER',
5 originCurrencySymbol: 'COP',
6 destinationCurrencySymbol: 'USD',
7 amountIn: 1000000,
8 quoteId: quote.data.id, // Usar cotización para bloquear tasa
9 externalId: `transfer-${Date.now()}`,
10 description: 'Conversión COP a USD'
11 },
12 { headers: { 'Authorization': `Bearer ${token}` } }
13);
14
15console.log('Estado:', order.data.status); // "COMPLETED" (instantáneo)

Paso 4: Verificar Nuevos Saldos

Verificar Saldos
1const newBalances = await axios.get(
2 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/bank-accounts/balances`,
3 { headers: { 'Authorization': `Bearer ${token}` } }
4);
5
6const copBalance = newBalances.data.find(b => b.currencySymbol === 'COP');
7const usdBalance = newBalances.data.find(b => b.currencySymbol === 'USD');
8
9console.log('Saldo COP:', copBalance.availableBalance); // Disminuyó
10console.log('Saldo USD:', usdBalance.availableBalance); // Aumentó

Pares de Moneda Soportados

DesdeHaciaCaso de Uso
COPUSDPagos internacionales
BRLUSDTransacciones transfronterizas
MXNUSDTenencias en dólares estadounidenses
CLPUSDCobertura de moneda
USDCOPOperaciones en moneda local
USDBRLOperaciones brasileñas

Más común: Moneda local ↔ USD


Ejemplo Completo

Flujo Completo de Transferencia
1async function transferCurrency(fromCurrency, toCurrency, amount) {
2 try {
3 // 1. Autenticar
4 const authResponse = await axios.post(
5 'https://api-sandbox.koywe.com/api/v1/auth/sign-in',
6 { apiKey: process.env.KOYWE_API_KEY, secret: process.env.KOYWE_SECRET }
7 );
8 const token = authResponse.data.token;
9
10 // 2. Verificar saldo origen
11 const balances = await axios.get(
12 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/bank-accounts/balances`,
13 { headers: { 'Authorization': `Bearer ${token}` } }
14 );
15
16 const sourceBalance = balances.data.find(b => b.currencySymbol === fromCurrency);
17
18 if (!sourceBalance || sourceBalance.availableBalance < amount) {
19 throw new Error(`Saldo ${fromCurrency} insuficiente`);
20 }
21
22 console.log(`✓ Saldo suficiente: ${sourceBalance.availableBalance} ${fromCurrency}`);
23
24 // 3. Obtener cotización
25 const quoteResponse = await axios.post(
26 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
27 {
28 type: 'BALANCE_TRANSFER',
29 originCurrencySymbol: fromCurrency,
30 destinationCurrencySymbol: toCurrency,
31 amountIn: amount
32 },
33 { headers: { 'Authorization': `Bearer ${token}` } }
34 );
35
36 const quote = quoteResponse.data;
37 console.log(`✓ Cotización recibida`);
38 console.log(` Tasa: 1 ${toCurrency} = ${quote.exchangeRate} ${fromCurrency}`);
39 console.log(` Monto salida: ${quote.amountOut} ${toCurrency}`);
40 console.log(` Comisión: ${quote.koyweFee} ${fromCurrency}`);
41
42 // 4. Crear transferencia
43 const orderResponse = await axios.post(
44 `https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
45 {
46 type: 'BALANCE_TRANSFER',
47 originCurrencySymbol: fromCurrency,
48 destinationCurrencySymbol: toCurrency,
49 amountIn: amount,
50 quoteId: quote.id
51 },
52 { headers: { 'Authorization': `Bearer ${token}` } }
53 );
54
55 const order = orderResponse.data;
56 console.log(`✓ Transferencia completada instantáneamente`);
57 console.log(` ID de Orden: ${order.id}`);
58 console.log(` Estado: ${order.status}`);
59
60 return {
61 success: true,
62 orderId: order.id,
63 amountOut: quote.amountOut,
64 currency: toCurrency
65 };
66
67 } catch (error) {
68 console.error('Transferencia fallida:', error.response?.data || error.message);
69 throw error;
70 }
71}
72
73// Uso
74await transferCurrency('COP', 'USD', 1000000);

Próximos Pasos