Cuentas Virtuales
Las Cuentas Virtuales son cuentas de saldo multi-moneda que mantienen tus fondos dentro del sistema Koywe, permitiendo operaciones de pago sin problemas sin cuentas bancarias tradicionales.
¿Qué son las Cuentas Virtuales?
Una Cuenta Virtual es una cuenta de saldo en una moneda específica, similar a una cuenta bancaria pero existente dentro de la plataforma Koywe.
Características Clave
- Una por moneda por comercio: Cada comercio tiene una cuenta virtual para cada moneda con la que trabaja
- Creadas automáticamente: Generadas cuando creas un comercio
- Saldos en tiempo real: Actualizaciones instantáneas cuando ocurren transacciones
- Sin cuenta bancaria necesaria: Mantén fondos sin abrir múltiples cuentas bancarias
- Usadas para todas las operaciones: Origen y destino para PAYINs, PAYOUTs y transferencias
Cómo Funcionan las Cuentas Virtuales
Las cuentas virtuales sirven como:
- Cuentas receptoras para pagos de clientes (PAYIN)
- Cuentas de almacenamiento para fondos en múltiples monedas
- Cuentas de origen para pagos a proveedores (PAYOUT)
- Endpoints de transferencia para cambios de moneda (BALANCE_TRANSFER)
- Fuente de financiamiento para compras de cripto (ONRAMP)
- Destino para ventas de cripto (OFFRAMP)
Tipos de Saldo
Cada cuenta virtual rastrea tres tipos de saldos:
1. Saldo Disponible
La cantidad inmediatamente disponible para usar.
{
"availableBalance": 1000000, // 1,000,000 COP disponible
"currencySymbol": "COP"
}Puede usarse para:
- Crear órdenes PAYOUT
- BALANCE_TRANSFER a otras monedas
- Compras cripto ONRAMP
2. Saldo Pendiente
Fondos que están siendo procesados pero aún no están disponibles.
{
"pendingBalance": 50000, // 50,000 COP pendiente
"currencySymbol": "COP"
}Ejemplos:
- Pago de cliente siendo confirmado (PAYIN en estado PROCESSING)
- Venta de cripto siendo liquidada (OFFRAMP en PROCESSING)
3. Saldo Reservado
Fondos temporalmente bloqueados para operaciones en curso.
{
"reservedBalance": 25000, // 25,000 COP reservado
"currencySymbol": "COP"
}Ejemplos:
- Orden PAYOUT en progreso
- BALANCE_TRANSFER siendo ejecutado
Verificar Saldos
Obtener Todos los Saldos de un Comercio
async function getMerchantBalances(token, orgId, merchantId) {
const response = await axios.get(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/accounts/balances`,
{
headers: { 'Authorization': `Bearer ${token}` }
}
);
return response.data;
}
// Uso
const balances = await getMerchantBalances(token, orgId, merchantId);
balances.forEach(balance => {
console.log(`${balance.currencySymbol}: ${balance.availableBalance} disponible`);
});def get_merchant_balances(token, org_id, merchant_id):
response = requests.get(
f'https://api-sandbox.koywe.com/api/v1/organizations/{org_id}/merchants/{merchant_id}/accounts/balances',
headers={'Authorization': f'Bearer {token}'}
)
return response.json()
# Uso
balances = get_merchant_balances(token, org_id, merchant_id)
for balance in balances:
print(f"{balance['currencySymbol']}: {balance['availableBalance']} disponible")curl -X GET 'https://api-sandbox.koywe.com/api/v1/organizations/TU_ORG_ID/merchants/TU_MERCHANT_ID/accounts/balances' \
-H 'Authorization: Bearer TU_TOKEN'Respuesta:
[
{
"id": "va_cop_12345",
"currencySymbol": "COP",
"availableBalance": 1000000,
"pendingBalance": 50000,
"reservedBalance": 25000,
"totalBalance": 1075000,
"merchantId": "mrc_xyz789"
},
{
"id": "va_usd_67890",
"currencySymbol": "USD",
"availableBalance": 500,
"pendingBalance": 0,
"reservedBalance": 0,
"totalBalance": 500,
"merchantId": "mrc_xyz789"
}
]Operaciones de Saldo
Acreditación (Agregar Fondos)
Los fondos se acreditan automáticamente a las cuentas virtuales a través de:
- Órdenes PAYIN (pagos de clientes)
// Cliente paga 50,000 COP
// Cuenta Virtual COP: +50,000- Órdenes OFFRAMP (vender cripto)
// Vender 10 USDC por COP
// Cuenta Virtual COP: +8,000 (tasa ejemplo)Débito (Retirar Fondos)
Los fondos se debitan automáticamente de las cuentas virtuales a través de:
- Órdenes PAYOUT (pagos a proveedores)
// Pagar proveedor 100,000 COP
// Cuenta Virtual COP: -100,000- Órdenes BALANCE_TRANSFER (cambio de moneda)
// Convertir 1,000,000 COP a USD
// Cuenta Virtual COP: -1,000,000
// Cuenta Virtual USD: +1,250 (tasa ejemplo)- Órdenes ONRAMP (comprar cripto)
// Comprar 10 USDC con COP
// Cuenta Virtual COP: -8,000 (tasa ejemplo)Validación de Saldo
Antes de Crear Órdenes PAYOUT
Siempre verifica el saldo disponible antes de crear un PAYOUT:
async function safeCreatePayout(token, orgId, merchantId, payoutAmount, currency) {
// 1. Obtener saldo actual
const balance = await getBalanceForCurrency(token, orgId, merchantId, currency);
// 2. Validar fondos suficientes
if (balance.availableBalance < payoutAmount) {
throw new Error(
`Saldo insuficiente: ${balance.availableBalance} ${currency} disponible, ` +
`${payoutAmount} ${currency} requerido`
);
}
// 3. Crear orden de payout
const order = await createPayoutOrder(token, orgId, merchantId, {
amount: payoutAmount,
currency: currency,
// ... otros campos
});
return order;
}
// Uso
try {
const payout = await safeCreatePayout(token, orgId, merchantId, 100000, 'COP');
console.log('Payout creado:', payout.id);
} catch (error) {
console.error('Error:', error.message);
}Liquidación de Fondos y Tenencias a Largo Plazo
Liquidación Automática: Los fondos mantenidos en cuentas virtuales no pueden permanecer indefinidamente. Después de cierto número de días, los saldos se liquidan automáticamente a la cuenta bancaria registrada de tu comercio.
Comportamiento de Liquidación
Las cuentas virtuales están diseñadas para operaciones de pago activas, no para almacenamiento de fondos a largo plazo:
Qué sucede durante la liquidación:
- Los fondos se transfieren a tu cuenta bancaria registrada del comercio
- El saldo de la cuenta virtual vuelve a cero
- Recibes una notificación sobre la liquidación
- El historial de transacciones se mantiene para reconciliación
Alternativa: Tenencias en Dólares Digitales (USDC)
Mantén Fondos a Largo Plazo: En lugar de esperar la liquidación automática, puedes convertir tu saldo fiat a USDC (dólares digitales) y mantener fondos en billeteras cripto integradas indefinidamente.
Beneficios de Tenencias en USDC:
- ✅ Sin liquidación automática - mantén fondos el tiempo que necesites
- ✅ Valor estable - vinculado 1:1 al Dólar Estadounidense
- ✅ Liquidez instantánea - convierte de vuelta a fiat en cualquier momento
- ✅ Menores tarifas - transferencias basadas en blockchain
- ✅ Acceso global - usa a través de fronteras
Convertir Fiat a USDC
async function convertToUSDC(token, orgId, merchantId, amount, currency) {
// 1. Obtener cotización para ONRAMP (fiat a cripto)
const quote = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
{
type: 'ONRAMP',
originCurrencySymbol: currency,
destinationCurrencySymbol: 'USDC',
amountIn: amount
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
console.log(`Convirtiendo ${amount} ${currency} → ${quote.data.amountOut} USDC`);
// 2. Crear orden ONRAMP
const order = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'ONRAMP',
originCurrencySymbol: currency,
destinationCurrencySymbol: 'USDC',
amountIn: amount,
quoteId: quote.data.id,
cryptoWalletId: 'wallet_abc123' // Tu billetera integrada
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return order.data;
}
// Uso: Convertir saldo COP a USDC
const usdcOrder = await convertToUSDC(token, orgId, merchantId, 1000000, 'COP');
console.log('Fondos ahora mantenidos como USDC en billetera:', usdcOrder.cryptoWalletId);def convert_to_usdc(token, org_id, merchant_id, amount, currency):
# Obtener cotización
quote_response = requests.post(
f'https://api-sandbox.koywe.com/api/v1/organizations/{org_id}/merchants/{merchant_id}/quotes',
json={
'type': 'ONRAMP',
'originCurrencySymbol': currency,
'destinationCurrencySymbol': 'USDC',
'amountIn': amount
},
headers={'Authorization': f'Bearer {token}'}
)
quote = quote_response.json()
print(f"Convirtiendo {amount} {currency} → {quote['amountOut']} USDC")
# Crear orden ONRAMP
order_response = requests.post(
f'https://api-sandbox.koywe.com/api/v1/organizations/{org_id}/merchants/{merchant_id}/orders',
json={
'type': 'ONRAMP',
'originCurrencySymbol': currency,
'destinationCurrencySymbol': 'USDC',
'amountIn': amount,
'quoteId': quote['id'],
'cryptoWalletId': 'wallet_abc123'
},
headers={'Authorization': f'Bearer {token}'}
)
return order_response.json()
# Uso
usdc_order = convert_to_usdc(token, org_id, merchant_id, 1000000, 'COP')
print(f"Fondos ahora mantenidos como USDC en billetera: {usdc_order['cryptoWalletId']}")Convertir USDC de Vuelta a Fiat
Cuando necesites los fondos de vuelta en fiat:
async function convertUSDCToFiat(token, orgId, merchantId, usdcAmount, targetCurrency) {
// 1. Obtener cotización para OFFRAMP (cripto a fiat)
const quote = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
{
type: 'OFFRAMP',
originCurrencySymbol: 'USDC',
destinationCurrencySymbol: targetCurrency,
amountIn: usdcAmount
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
// 2. Crear orden OFFRAMP
const order = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'OFFRAMP',
originCurrencySymbol: 'USDC',
destinationCurrencySymbol: targetCurrency,
amountIn: usdcAmount,
quoteId: quote.data.id,
cryptoWalletId: 'wallet_abc123'
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return order.data;
}
// Uso: Convertir USDC de vuelta a COP
const copOrder = await convertUSDCToFiat(token, orgId, merchantId, 250, 'COP');
console.log('USDC convertido de vuelta a COP en cuenta virtual');Estrategia Recomendada:
- Mantén fondos operacionales en cuentas virtuales para operaciones diarias de PAYIN/PAYOUT
- Convierte saldos excedentes a USDC para tenencias a largo plazo
- Convierte USDC de vuelta a fiat cuando necesites hacer grandes pagos o retiros
Árbol de Decisión de Gestión de Fondos
Más información sobre ONRAMP (Comprar Cripto) →
Más información sobre OFFRAMP (Vender Cripto) →
Gestión Multi-Moneda
Monedas Soportadas
Las cuentas virtuales se crean automáticamente para:
| Moneda | Símbolo | Región |
|---|---|---|
| Peso Colombiano | COP | Colombia |
| Real Brasileño | BRL | Brasil |
| Peso Mexicano | MXN | México |
| Peso Chileno | CLP | Chile |
| Peso Argentino | ARS | Argentina |
| Sol Peruano | PEN | Perú |
| Dólar Estadounidense | USD | Internacional |
| Euro | EUR | Internacional |
Cambio de Moneda vía BALANCE_TRANSFER
Transfiere fondos entre monedas instantáneamente:
async function transferBetweenCurrencies(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: 'BALANCE_TRANSFER',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'USD',
amountIn: 1000000 // 1,000,000 COP
},
{ 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
const order = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'BALANCE_TRANSFER',
originCurrencySymbol: 'COP',
destinationCurrencySymbol: 'USD',
amountIn: 1000000,
quoteId: quote.data.id
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
return order.data;
}Aprende más sobre BALANCE_TRANSFER →
Mejores Prácticas
Gestión de Saldo
Haz:
- Verifica saldos antes de crear órdenes PAYOUT
- Monitorea saldos pendientes para pagos entrantes
- Configura alertas para saldos bajos
- Reconcilia regularmente con tu sistema contable
No hagas:
- Asumir disponibilidad instantánea de fondos PAYIN (verifica el estado)
- Crear órdenes PAYOUT que excedan el saldo disponible
- Ignorar saldos reservados en tus cálculos
Estrategia de Moneda
Operaciones Multi-Moneda: Mantén saldos en las monedas en las que operas con más frecuencia para minimizar comisiones de conversión y exposición a tasas de cambio.
Estrategia ejemplo:
- Operas principalmente en Colombia → Mantén la mayoría de fondos en COP
- Pagas proveedores internacionales → Mantén algo de saldo USD
- Ventas ocasionales en Brasil → Convierte BRL a COP según sea necesario
Escenarios Comunes
Escenario 1: Flujo de Pago de Cliente
1. Cliente inicia pago: 50,000 COP
2. Orden PAYIN creada: Estado PENDING
3. Cuenta Virtual COP: pendiente +50,000
4. Cliente completa pago
5. Estado de orden: PAID
6. Cuenta Virtual COP: disponible +50,000
7. Tu aplicación recibe webhook: order.completedEscenario 2: Flujo de Pago a Proveedor
1. Verificar Cuenta Virtual USD: 500 disponible
2. Crear PAYOUT: 100 USD al proveedor
3. Cuenta Virtual USD: reservado +100, disponible -100
4. Transferencia bancaria iniciada
5. Banco confirma transferencia
6. Estado de orden: COMPLETED
7. Cuenta Virtual USD: reservado -100 (ahora solo 400 total)Escenario 3: Cambio de Moneda
1. Cuenta Virtual COP: 1,000,000 disponible
2. Cuenta Virtual USD: 0 disponible
3. Crear BALANCE_TRANSFER: 1,000,000 COP → USD
4. Tasa de cambio: 4,000 COP por USD
5. Cuenta Virtual COP: -1,000,000
6. Cuenta Virtual USD: +250
7. Orden se completa instantáneamente