Get Quote
curl --request POST \
--url https://quickei.io/api/partner/sandbox/v1/quote \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"lookup_token": "<string>",
"amount": 123,
"sender_currency": "<string>",
"receiver_currency": "<string>"
}
'import requests
url = "https://quickei.io/api/partner/sandbox/v1/quote"
payload = {
"lookup_token": "<string>",
"amount": 123,
"sender_currency": "<string>",
"receiver_currency": "<string>"
}
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({
lookup_token: '<string>',
amount: 123,
sender_currency: '<string>',
receiver_currency: '<string>'
})
};
fetch('https://quickei.io/api/partner/sandbox/v1/quote', 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://quickei.io/api/partner/sandbox/v1/quote",
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([
'lookup_token' => '<string>',
'amount' => 123,
'sender_currency' => '<string>',
'receiver_currency' => '<string>'
]),
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://quickei.io/api/partner/sandbox/v1/quote"
payload := strings.NewReader("{\n \"lookup_token\": \"<string>\",\n \"amount\": 123,\n \"sender_currency\": \"<string>\",\n \"receiver_currency\": \"<string>\"\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://quickei.io/api/partner/sandbox/v1/quote")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"lookup_token\": \"<string>\",\n \"amount\": 123,\n \"sender_currency\": \"<string>\",\n \"receiver_currency\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://quickei.io/api/partner/sandbox/v1/quote")
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 \"lookup_token\": \"<string>\",\n \"amount\": 123,\n \"sender_currency\": \"<string>\",\n \"receiver_currency\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"quote_id": "<string>",
"amount": 123,
"sender_currency": "<string>",
"receiver_currency": "<string>",
"exchange_rate": 123,
"fee": 123,
"total_deducted": 123,
"receiver_amount": 123,
"expires_at": "<string>"
}Partner API
Get Quote
Get exchange rate and fees before executing a payout
POST
/
api
/
partner
/
sandbox
/
v1
/
quote
Get Quote
curl --request POST \
--url https://quickei.io/api/partner/sandbox/v1/quote \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"lookup_token": "<string>",
"amount": 123,
"sender_currency": "<string>",
"receiver_currency": "<string>"
}
'import requests
url = "https://quickei.io/api/partner/sandbox/v1/quote"
payload = {
"lookup_token": "<string>",
"amount": 123,
"sender_currency": "<string>",
"receiver_currency": "<string>"
}
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({
lookup_token: '<string>',
amount: 123,
sender_currency: '<string>',
receiver_currency: '<string>'
})
};
fetch('https://quickei.io/api/partner/sandbox/v1/quote', 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://quickei.io/api/partner/sandbox/v1/quote",
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([
'lookup_token' => '<string>',
'amount' => 123,
'sender_currency' => '<string>',
'receiver_currency' => '<string>'
]),
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://quickei.io/api/partner/sandbox/v1/quote"
payload := strings.NewReader("{\n \"lookup_token\": \"<string>\",\n \"amount\": 123,\n \"sender_currency\": \"<string>\",\n \"receiver_currency\": \"<string>\"\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://quickei.io/api/partner/sandbox/v1/quote")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"lookup_token\": \"<string>\",\n \"amount\": 123,\n \"sender_currency\": \"<string>\",\n \"receiver_currency\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://quickei.io/api/partner/sandbox/v1/quote")
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 \"lookup_token\": \"<string>\",\n \"amount\": 123,\n \"sender_currency\": \"<string>\",\n \"receiver_currency\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"quote_id": "<string>",
"amount": 123,
"sender_currency": "<string>",
"receiver_currency": "<string>",
"exchange_rate": 123,
"fee": 123,
"total_deducted": 123,
"receiver_amount": 123,
"expires_at": "<string>"
}Request a quote to preview the exchange rate, fees, and final amount before executing a payout.
Success Response
Parameters
number
required
Amount to send from your merchant wallet. Must be greater than 0.
string
required
ISO 4217 currency code of your merchant wallet (e.g.
EUR, USD, XAF). Max 10 characters.string
required
ISO 4217 currency code of the recipient’s target wallet (e.g.
XAF, USD). Max 10 characters. Must match one of the currencies returned in the lookup response.Example Request
curl -X POST https://quickei.io/api/partner/sandbox/v1/quote \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"lookup_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"amount": 100.00,
"sender_currency": "EUR",
"receiver_currency": "XAF"
}'
Success Response 200
{
"message": {
"success": ["Quote generated."]
},
"data": {
"quote_id": "f7e6d5c4-b3a2-1098-7654-321fedcba098",
"amount": 100.00,
"sender_currency": "EUR",
"receiver_currency": "XAF",
"exchange_rate": 655.957,
"fee": 2.50,
"total_deducted": 102.50,
"receiver_amount": 65595.70,
"expires_at": "2026-03-29T14:05:00+00:00"
}
}
string
UUID identifying this quote. Pass it to the Payout endpoint to lock in this rate. Valid for 5 minutes.
number
The amount that will be sent (before fees).
string
The currency being sent from your merchant wallet.
string
The currency the recipient will receive.
number
The applied exchange rate from
sender_currency to receiver_currency.number
The total fee charged (fixed + percentage). Debited from your merchant wallet in
sender_currency.number
Total amount debited from your merchant wallet (
amount + fee).number
The amount the recipient will receive in their wallet.
string
ISO 8601 timestamp when this quote expires.
Same-Currency Example
When sending and receiving currencies match, the exchange rate is1.0:
curl -X POST https://quickei.io/api/partner/sandbox/v1/quote \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"lookup_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"amount": 50.00,
"sender_currency": "EUR",
"receiver_currency": "EUR"
}'
{
"message": {
"success": ["Quote generated."]
},
"data": {
"quote_id": "d4c3b2a1-0987-6543-2109-876543210fed",
"amount": 50.00,
"sender_currency": "EUR",
"receiver_currency": "EUR",
"exchange_rate": 1.0,
"fee": 1.00,
"total_deducted": 51.00,
"receiver_amount": 50.00,
"expires_at": "2026-03-29T14:05:00+00:00"
}
}
Error Responses
| Status | Message | Cause |
|---|---|---|
400 | Invalid or expired lookup token. | The lookup_token has expired (older than 10 minutes) or does not belong to your account |
400 | Merchant wallet not found for currency: EUR | You do not have a wallet in the specified sender_currency |
400 | Invalid receiver currency. | The receiver_currency does not exist or is inactive |
400 | Recipient has no wallet for currency: XAF | The recipient does not have a wallet for the receiver_currency |
400 | Currency EUR is not authorized for payouts. | The currency is not enabled for payouts on your merchant account |
422 | Validation error | Missing or invalid required fields |
401 | Invalid API credentials. | Bad or missing Bearer token |
Quotes expire after 5 minutes. If a quote expires, request a new one before executing the payout.

