Balance Transfers (Currency Exchange)
Transfer funds between different currency virtual accounts instantly.
What is BALANCE_TRANSFER?
BALANCE_TRANSFER allows you to convert funds from one currency to another within your virtual accounts - instantly and without external bank transfers.
Use cases:
- Convert COP to USD for international payments
- Rebalance currency holdings
- Lock in favorable exchange rates
- Prepare funds for specific currency payouts
How It Works
Process:
- Check source currency balance
- Get exchange rate quote
- Create BALANCE_TRANSFER order
- Funds instantly transferred between accounts
Quick Example
// Convert 1,000,000 COP to USD
// 1. Get quote
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('Exchange rate:', quote.data.exchangeRate); // e.g., 4000 COP per USD
console.log('Will receive:', quote.data.amountOut, 'USD'); // e.g., 248.75 USD
console.log('Fee:', quote.data.koyweFee, 'COP'); // e.g., 5000 COP
// 2. Create transfer order
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 // Lock the rate
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
console.log('Transfer completed:', order.data.status); // "COMPLETED"Instant Settlement: BALANCE_TRANSFER orders complete immediately - no waiting for bank confirmations!
Step-by-Step Integration
Step 1: Check Source Balance
const balances = await axios.get(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/accounts/balances`,
{ headers: { 'Authorization': `Bearer ${token}` } }
);
const copBalance = balances.data.find(b => b.currencySymbol === 'COP');
if (copBalance.availableBalance < 1000000) {
throw new Error('Insufficient COP balance');
}Step 2: Get Exchange Rate Quote
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}` } }
);
// Show rate to user
console.log(`Rate: 1 USD = ${quote.data.exchangeRate} COP`);
console.log(`You'll receive: ${quote.data.amountOut} USD`);
console.log(`Fee: ${quote.data.koyweFee} COP`);
console.log(`Quote expires in: ${quote.data.validFor} seconds`);Step 3: Create Transfer Order
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, // Use quote to lock rate
externalId: `transfer-${Date.now()}`,
description: 'COP to USD conversion'
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
console.log('Status:', order.data.status); // "COMPLETED" (instant)Step 4: Verify New Balances
const newBalances = await axios.get(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/accounts/balances`,
{ headers: { 'Authorization': `Bearer ${token}` } }
);
const copBalance = newBalances.data.find(b => b.currencySymbol === 'COP');
const usdBalance = newBalances.data.find(b => b.currencySymbol === 'USD');
console.log('COP balance:', copBalance.availableBalance); // Decreased
console.log('USD balance:', usdBalance.availableBalance); // IncreasedSupported Currency Pairs
| From | To | Use Case |
|---|---|---|
| COP | USD | International payments |
| BRL | USD | Cross-border transactions |
| MXN | USD | US dollar holdings |
| CLP | USD | Currency hedging |
| USD | COP | Local currency operations |
| USD | BRL | Brazilian operations |
Most common: Local currency ↔ USD
Complete Example
async function transferCurrency(fromCurrency, toCurrency, amount) {
try {
// 1. Authenticate
const authResponse = await axios.post(
'https://api-sandbox.koywe.com/api/v1/auth/sign-in',
{ apiKey: process.env.KOYWE_API_KEY, secret: process.env.KOYWE_SECRET }
);
const token = authResponse.data.token;
// 2. Check source balance
const balances = await axios.get(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/accounts/balances`,
{ headers: { 'Authorization': `Bearer ${token}` } }
);
const sourceBalance = balances.data.find(b => b.currencySymbol === fromCurrency);
if (!sourceBalance || sourceBalance.availableBalance < amount) {
throw new Error(`Insufficient ${fromCurrency} balance`);
}
console.log(`✓ Sufficient balance: ${sourceBalance.availableBalance} ${fromCurrency}`);
// 3. Get quote
const quoteResponse = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/quotes`,
{
type: 'BALANCE_TRANSFER',
originCurrencySymbol: fromCurrency,
destinationCurrencySymbol: toCurrency,
amountIn: amount
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
const quote = quoteResponse.data;
console.log(`✓ Quote received`);
console.log(` Rate: 1 ${toCurrency} = ${quote.exchangeRate} ${fromCurrency}`);
console.log(` Amount out: ${quote.amountOut} ${toCurrency}`);
console.log(` Fee: ${quote.koyweFee} ${fromCurrency}`);
// 4. Create transfer
const orderResponse = await axios.post(
`https://api-sandbox.koywe.com/api/v1/organizations/${orgId}/merchants/${merchantId}/orders`,
{
type: 'BALANCE_TRANSFER',
originCurrencySymbol: fromCurrency,
destinationCurrencySymbol: toCurrency,
amountIn: amount,
quoteId: quote.id
},
{ headers: { 'Authorization': `Bearer ${token}` } }
);
const order = orderResponse.data;
console.log(`✓ Transfer completed instantly`);
console.log(` Order ID: ${order.id}`);
console.log(` Status: ${order.status}`);
return {
success: true,
orderId: order.id,
amountOut: quote.amountOut,
currency: toCurrency
};
} catch (error) {
console.error('Transfer failed:', error.response?.data || error.message);
throw error;
}
}
// Usage
await transferCurrency('COP', 'USD', 1000000);Next Steps
Last updated on