O que é uma Cotação?
Uma Cotação é uma cotação de preço para conversão entre moedas. Ela bloqueia uma taxa de câmbio por 30 segundos, permitindo que os usuários vejam exatamente quanto receberão antes de se comprometer com uma transação.
Cotações são necessárias antes de criar qualquer ramp. Elas garantem transparência de preço e proteção contra flutuações de taxa.
Como as Cotações Funcionam
Solicitar Cotação
Especifique moedas, valor e métodos de pagamento
Receber Taxa
Obtenha taxa bloqueada válida por 30 segundos
Mostrar ao Usuário
Exiba valores exatos que o usuário enviará/receberá
Criar Ramp
Use o ID da cotação para executar transação na taxa cotada
Criando uma Cotação
Requisição:
{
"fromCurrency" : "COP" ,
"toCurrency" : "USDC" ,
"amount" : 100000 ,
"amountIsToCurrency" : false ,
"cashInMethod" : "PSE" ,
"cashOutMethod" : "POLYGON"
}
Resposta:
{
"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://teste-94u93qnn.uc.gateway.dev/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 ( `Taxa: ${ quote . rate } , Você recebe: ${ quote . toAmount } ${ toCurrency } ` );
return quote ;
};
Parâmetros da Cotação
Direção do Valor
A flag amountIsToCurrency determina qual valor é fixo:
Usuário especifica quanto enviar {
"fromCurrency" : "COP" ,
"toCurrency" : "USDC" ,
"amount" : 100000 ,
"amountIsToCurrency" : false
}
Resultado: “Envie 100.000 COP, receba ~23,81 USDC”Use quando: Usuário quer gastar valor exato de fiatUsuário especifica quanto receber {
"fromCurrency" : "COP" ,
"toCurrency" : "USDC" ,
"amount" : 25 ,
"amountIsToCurrency" : true
}
Resultado: “Envie ~105.000 COP, receba exatamente 25 USDC”Use quando: Usuário quer receber valor exato de cripto
Taxas de Câmbio
Componentes da Taxa
{
"rate" : 4200.50 ,
"spotPrice" : 4180.25
}
spotPrice : Taxa de mercado dos provedores de liquidez
rate : Taxa final incluindo taxas e margem da KillB
Cálculo:
toAmount = fromAmount / rate
Spread = rate - spotPrice
Fee % = (spread / spotPrice) * 100
Fatores da Taxa
As taxas de câmbio são influenciadas por:
Taxa de Mercado - Preço atual de mercado
Método de Pagamento - Diferentes métodos têm custos diferentes
Volume - Transações maiores podem obter melhores taxas
Rede - Rede blockchain afeta taxas
Tier do Cliente - Preço negociado do seu cliente
Contas pré-financiadas normalmente recebem melhores taxas devido aos custos operacionais reduzidos.
Expiração da Cotação
Cotações expiram após 30 segundos para proteger contra volatilidade do mercado.
async function createRampWithRetry ( quoteId , userId , accountId ) {
try {
const ramp = await createRamp ( quoteId , userId , accountId );
return ramp ;
} catch ( error ) {
if ( error . message . includes ( 'expired' )) {
// Obter nova cotação
const newQuote = await getQuotation ( /* params */ );
return await createRamp ( newQuote . id , userId , accountId );
}
throw error ;
}
}
Temporizador de Contagem Regressiva
Mostre aos usuários o tempo 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 > Cotação expira em: { timeLeft } s </ div > ;
}
Modo de Simulação
Teste cotações sem criar ramps:
POST /api/v2/quotations/simulation
Mesmos parâmetros que cotação regular, mas:
Nenhum ID de cotação retornado
Taxa é apenas indicativa
Não pode ser usada para criar ramp
Sem expiração
Use para:
Mostrar taxas estimadas
Funcionalidade de calculadora
Exibição de taxa de mercado
Educação do usuário
// Obter cotação simulada para exibição
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 taxa ao usuário
console . log ( `Taxa estimada: ${ simulatedQuote . rate } ` );
console . log ( `Você receberia: ${ simulatedQuote . toAmount } USDC` );
// Quando o usuário confirmar, obter cotação real
const realQuote = await getQuotation ( /* mesmos params */ );
Melhores Práticas de Exibição de Taxa
Exibir :
- Valor de origem : "100.000 COP"
- Valor de destino : "23,81 USDC"
- Taxa de câmbio : "1 USDC = 4.200,50 COP"
- Informação de taxa : "Inclui taxa de 0,5%"
Temporizador de Contagem Regressiva
"Esta taxa expira em 28 segundos"
- Mostrar contagem regressiva visual
- Avisar em 10 segundos restantes
- Auto - atualizar na expiração
// Auto-atualizar cotações periodicamente
setInterval ( async () => {
const newQuote = await getQuotation ( amount );
updateDisplay ( newQuote );
}, 5000 ); // A cada 5 segundos
Mostrar :
- "Taxa: 1 USDC = 4.200,50 COP"
- "Taxa de mercado: 4.180,25 COP"
- "Spread: 0,48%"
- "Última atualização: 2 segundos atrás"
Próximos Passos