¿Qué es una Cotización?
Una Cotización es una cotización de precio para convertir entre monedas. Bloquea una tasa de cambio por 30 segundos, permitiendo a los usuarios ver exactamente cuánto recibirán antes de comprometerse con una transacción.
Las cotizaciones son necesarias antes de crear cualquier ramp. Aseguran transparencia de precio y protección contra fluctuaciones de tasa.
Cómo Funcionan las Cotizaciones
Solicitar Cotización
Especifica monedas, monto y métodos de pago
Recibir Tasa
Obtén tasa bloqueada válida por 30 segundos
Mostrar al Usuario
Muestra montos exactos que el usuario enviará/recibirá
Crear Ramp
Usa el ID de la cotización para ejecutar transacción a la tasa cotizada
Creando una Cotización
Solicitud:
{
"fromCurrency" : "COP" ,
"toCurrency" : "USDC" ,
"amount" : 100000 ,
"amountIsToCurrency" : false ,
"cashInMethod" : "PSE" ,
"cashOutMethod" : "POLYGON"
}
Respuesta:
{
"id" : "quot-9f8e7d6c-5b4a-3c2d-1e0f" ,
"fromCurrency" : "COP" ,
"toCurrency" : "USDC" ,
"fromAmount" : 100000 ,
"toAmount" : 23.81 ,
"rate" : 4200.50 ,
"spotPrice" : 4180.25 ,
"expiresAt" : 1704657630000 ,
"cashInMethod" : "PSE" ,
"cashOutMethod" : "POLYGON"
}
const getQuote = async ( fromAmount , fromCurrency = 'COP' , toCurrency = 'USDC' ) => {
const response = await fetch ( 'https://sandbox.killb.app/api/v2/quotations' , {
method: 'POST' ,
headers: {
'Authorization' : `Bearer ${ token } ` ,
'Content-Type' : 'application/json'
},
body: JSON . stringify ({
fromCurrency ,
toCurrency ,
amount: fromAmount ,
amountIsToCurrency: false ,
cashInMethod: 'PSE' ,
cashOutMethod: 'POLYGON'
})
});
const quote = await response . json ();
console . log ( `Tasa: ${ quote . rate } , Recibes: ${ quote . toAmount } ${ toCurrency } ` );
return quote ;
};
Parámetros de la Cotización
Dirección del Monto
El flag amountIsToCurrency determina qué monto es fijo:
Usuario especifica cuánto enviar {
"fromCurrency" : "COP" ,
"toCurrency" : "USDC" ,
"amount" : 100000 ,
"amountIsToCurrency" : false
}
Resultado: “Envía 100.000 COP, recibe ~23,81 USDC”Usar cuando: Usuario quiere gastar monto exacto de fiatUsuario especifica cuánto recibir {
"fromCurrency" : "COP" ,
"toCurrency" : "USDC" ,
"amount" : 25 ,
"amountIsToCurrency" : true
}
Resultado: “Envía ~105.000 COP, recibe exactamente 25 USDC”Usar cuando: Usuario quiere recibir monto exacto de cripto
Tasas de Cambio
Componentes de la Tasa
{
"rate" : 4200.50 ,
"spotPrice" : 4180.25
}
spotPrice : Tasa de mercado de proveedores de liquidez
rate : Tasa final incluyendo tarifas y margen de KillB
Cálculo:
toAmount = fromAmount / rate
Spread = rate - spotPrice
Fee % = (spread / spotPrice) * 100
Factores de la Tasa
Las tasas de cambio están influenciadas por:
Tasa de Mercado - Precio actual de mercado
Método de Pago - Diferentes métodos tienen costos diferentes
Volumen - Transacciones más grandes pueden obtener mejores tasas
Red - Red blockchain afecta tarifas
Tier del Cliente - Precio negociado de tu cliente
Las cuentas pre-fondeadas típicamente reciben mejores tasas debido a costos operacionales reducidos.
Expiración de la Cotización
Las cotizaciones expiran después de 30 segundos para proteger contra volatilidad del mercado.
Manejando la Expiración
async function createRampWithRetry ( quoteId , userId , accountId ) {
try {
const ramp = await createRamp ( quoteId , userId , accountId );
return ramp ;
} catch ( error ) {
if ( error . message . includes ( 'expired' )) {
// Obtener nueva cotización
const newQuote = await getQuotation ( /* params */ );
return await createRamp ( newQuote . id , userId , accountId );
}
throw error ;
}
}
Temporizador de Cuenta Regresiva
Muestra a los usuarios el tiempo restante:
function QuoteTimer ({ expiresAt , onExpire }) {
const [ timeLeft , setTimeLeft ] = useState ( 30 );
useEffect (() => {
const interval = setInterval (() => {
const remaining = Math . max ( 0 , Math . floor (( expiresAt - Date . now ()) / 1000 ));
setTimeLeft ( remaining );
if ( remaining === 0 ) {
onExpire ();
}
}, 1000 );
return () => clearInterval ( interval );
}, [ expiresAt ]);
return < div > Cotización expira en: { timeLeft } s </ div > ;
}
Modo de Simulación
Prueba cotizaciones sin crear ramps:
POST /api/v2/quotations/simulation
Mismos parámetros que cotización regular, pero:
No se retorna ID de cotización
Tasa es solo indicativa
No se puede usar para crear ramp
Sin expiración
Usar para:
Mostrar tasas estimadas
Funcionalidad de calculadora
Visualización de tasa de mercado
Educación del usuario
// Obtener cotización simulada para visualización
const simulatedQuote = await fetch ( '/api/v2/quotations/simulation' , {
method: 'POST' ,
headers: {
'Authorization' : `Bearer ${ token } ` ,
'Content-Type' : 'application/json'
},
body: JSON . stringify ({
fromCurrency: 'COP' ,
toCurrency: 'USDC' ,
amount: userAmount ,
amountIsToCurrency: false ,
cashInMethod: 'PSE' ,
cashOutMethod: 'POLYGON'
})
}). then ( r => r . json ());
// Mostrar tasa al usuario
console . log ( `Tasa estimada: ${ simulatedQuote . rate } ` );
console . log ( `Recibirías: ${ simulatedQuote . toAmount } USDC` );
// Cuando el usuario confirme, obtener cotización real
const realQuote = await getQuotation ( /* mismos params */ );
Mejores Prácticas de Visualización de Tasa
Mostrar :
- Monto de origen : "100.000 COP"
- Monto de destino : "23,81 USDC"
- Tasa de cambio : "1 USDC = 4.200,50 COP"
- Información de tarifa : "Incluye tarifa de 0,5%"
Temporizador de Cuenta Regresiva
"Esta tasa expira en 28 segundos"
- Mostrar cuenta regresiva visual
- Avisar en 10 segundos restantes
- Auto - actualizar en expiración
// Auto-actualizar cotizaciones periódicamente
setInterval ( async () => {
const newQuote = await getQuotation ( amount );
updateDisplay ( newQuote );
}, 5000 ); // Cada 5 segundos
Mostrar :
- "Tasa: 1 USDC = 4.200,50 COP"
- "Tasa de mercado: 4.180,25 COP"
- "Spread: 0,48%"
- "Última actualización: hace 2 segundos"
Próximos Pasos
Crear Cotizaciones Referencia de la API para cotizaciones
Construir Ramps Aprende cómo usar cotizaciones en ramps
Guía de Precios Mejores prácticas para mostrar tasas
Pares Soportados Ver todos los pares de monedas disponibles