curl --request POST \
--url https://sandbox-api.kotanipay.com/api/v3/rate/onramp \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": "KES",
"to": "USDT",
"fiatAmount": 1000,
"source": "fiat",
"chain": "CELO",
"hostedCheckout": true
}
'import requests
url = "https://sandbox-api.kotanipay.com/api/v3/rate/onramp"
payload = {
"from": "KES",
"to": "USDT",
"fiatAmount": 1000,
"source": "fiat",
"chain": "CELO",
"hostedCheckout": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
from: 'KES',
to: 'USDT',
fiatAmount: 1000,
source: 'fiat',
chain: 'CELO',
hostedCheckout: true
})
};
fetch('https://sandbox-api.kotanipay.com/api/v3/rate/onramp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox-api.kotanipay.com/api/v3/rate/onramp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => 'KES',
'to' => 'USDT',
'fiatAmount' => 1000,
'source' => 'fiat',
'chain' => 'CELO',
'hostedCheckout' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox-api.kotanipay.com/api/v3/rate/onramp"
payload := strings.NewReader("{\n \"from\": \"KES\",\n \"to\": \"USDT\",\n \"fiatAmount\": 1000,\n \"source\": \"fiat\",\n \"chain\": \"CELO\",\n \"hostedCheckout\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox-api.kotanipay.com/api/v3/rate/onramp")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": \"KES\",\n \"to\": \"USDT\",\n \"fiatAmount\": 1000,\n \"source\": \"fiat\",\n \"chain\": \"CELO\",\n \"hostedCheckout\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.kotanipay.com/api/v3/rate/onramp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": \"KES\",\n \"to\": \"USDT\",\n \"fiatAmount\": 1000,\n \"source\": \"fiat\",\n \"chain\": \"CELO\",\n \"hostedCheckout\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Available exchange rate.",
"data": {
"from": "USD",
"to": "KES",
"value": "130.5",
"id": "1234567890",
"fiatAmount": "1305",
"cryptoAmount": "10",
"transactionAmount": "1279",
"fee": "26",
"walletDebitAmount": "1331",
"hosted": {
"chain": "CELO",
"receiveAmount": 10,
"networkFee": 0.5,
"processingFee": 0.17,
"fee": 0.3,
"partnerFee": 0.25,
"partnerFeeLocal": 32,
"totalUsd": 10.97,
"feesCurrency": "USD",
"estimatedRate": 129.4,
"estimatedFiatAmount": 1420,
"note": "<string>"
}
}
}{
"success": false,
"message": "Invalid API Key",
"data": {}
}Get Onramp Exchange Rate
An integrator can use this endpoint to get the exchange rate between two currencies. For an onramp that will use hosted checkout, send chain: the quote then carries a hosted block with exactly what the customer receives and every fee, in USD, and refuses an amount too small to deliver on that chain.
curl --request POST \
--url https://sandbox-api.kotanipay.com/api/v3/rate/onramp \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": "KES",
"to": "USDT",
"fiatAmount": 1000,
"source": "fiat",
"chain": "CELO",
"hostedCheckout": true
}
'import requests
url = "https://sandbox-api.kotanipay.com/api/v3/rate/onramp"
payload = {
"from": "KES",
"to": "USDT",
"fiatAmount": 1000,
"source": "fiat",
"chain": "CELO",
"hostedCheckout": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
from: 'KES',
to: 'USDT',
fiatAmount: 1000,
source: 'fiat',
chain: 'CELO',
hostedCheckout: true
})
};
fetch('https://sandbox-api.kotanipay.com/api/v3/rate/onramp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox-api.kotanipay.com/api/v3/rate/onramp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => 'KES',
'to' => 'USDT',
'fiatAmount' => 1000,
'source' => 'fiat',
'chain' => 'CELO',
'hostedCheckout' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox-api.kotanipay.com/api/v3/rate/onramp"
payload := strings.NewReader("{\n \"from\": \"KES\",\n \"to\": \"USDT\",\n \"fiatAmount\": 1000,\n \"source\": \"fiat\",\n \"chain\": \"CELO\",\n \"hostedCheckout\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox-api.kotanipay.com/api/v3/rate/onramp")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": \"KES\",\n \"to\": \"USDT\",\n \"fiatAmount\": 1000,\n \"source\": \"fiat\",\n \"chain\": \"CELO\",\n \"hostedCheckout\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.kotanipay.com/api/v3/rate/onramp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": \"KES\",\n \"to\": \"USDT\",\n \"fiatAmount\": 1000,\n \"source\": \"fiat\",\n \"chain\": \"CELO\",\n \"hostedCheckout\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Available exchange rate.",
"data": {
"from": "USD",
"to": "KES",
"value": "130.5",
"id": "1234567890",
"fiatAmount": "1305",
"cryptoAmount": "10",
"transactionAmount": "1279",
"fee": "26",
"walletDebitAmount": "1331",
"hosted": {
"chain": "CELO",
"receiveAmount": 10,
"networkFee": 0.5,
"processingFee": 0.17,
"fee": 0.3,
"partnerFee": 0.25,
"partnerFeeLocal": 32,
"totalUsd": 10.97,
"feesCurrency": "USD",
"estimatedRate": 129.4,
"estimatedFiatAmount": 1420,
"note": "<string>"
}
}
}{
"success": false,
"message": "Invalid API Key",
"data": {}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The fiat currency the customer pays in.
"KES"
The stablecoin to deliver.
CUSD, USDC, USDT, USDGLO, CKES, CGHS, MSAT, ADA "USDT"
How much to convert. Holds the fiat amount by default; if you set source to crypto it holds the crypto amount instead.
1000
Which currency fiatAmount holds. Defaults to fiat, set crypto to pass a crypto amount.
fiat, crypto "fiat"
The chain the crypto is delivered on. Send it for an onramp that will use hosted checkout: the quote then includes the network fee for that chain and a hosted block with the exact amount the customer receives. Ignored for other onramps.
ETHEREUM, CELO, AVALANCHE, POLYGON, ARBITRUM, OPTIMISM, BINANCE, STELLAR, TRON, FUSE, LIGHTNING, SOLANA, PROVENANCE, CARDANO, HEDERA, BASE, LISK, VICTION, SCROLL "CELO"
Quote for hosted checkout (or not) explicitly, as on the onramp request. When omitted with a chain, hosted checkout is assumed where your account uses it for this currency.