Create cross-border collection quote
curl --request POST \
--url https://api.nexapay.ng/api/v1/business/cross-border/quote \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"businessId": "<string>",
"country": "UG",
"currency": "UGX",
"amount": 20000,
"sourceCurrency": "UGX",
"targetCurrency": "NGN"
}
'import requests
url = "https://api.nexapay.ng/api/v1/business/cross-border/quote"
payload = {
"businessId": "<string>",
"country": "UG",
"currency": "UGX",
"amount": 20000,
"sourceCurrency": "UGX",
"targetCurrency": "NGN"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
businessId: '<string>',
country: 'UG',
currency: 'UGX',
amount: 20000,
sourceCurrency: 'UGX',
targetCurrency: 'NGN'
})
};
fetch('https://api.nexapay.ng/api/v1/business/cross-border/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://api.nexapay.ng/api/v1/business/cross-border/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([
'businessId' => '<string>',
'country' => 'UG',
'currency' => 'UGX',
'amount' => 20000,
'sourceCurrency' => 'UGX',
'targetCurrency' => 'NGN'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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://api.nexapay.ng/api/v1/business/cross-border/quote"
payload := strings.NewReader("{\n \"businessId\": \"<string>\",\n \"country\": \"UG\",\n \"currency\": \"UGX\",\n \"amount\": 20000,\n \"sourceCurrency\": \"UGX\",\n \"targetCurrency\": \"NGN\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://api.nexapay.ng/api/v1/business/cross-border/quote")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"businessId\": \"<string>\",\n \"country\": \"UG\",\n \"currency\": \"UGX\",\n \"amount\": 20000,\n \"sourceCurrency\": \"UGX\",\n \"targetCurrency\": \"NGN\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nexapay.ng/api/v1/business/cross-border/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"businessId\": \"<string>\",\n \"country\": \"UG\",\n \"currency\": \"UGX\",\n \"amount\": 20000,\n \"sourceCurrency\": \"UGX\",\n \"targetCurrency\": \"NGN\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"quote": {
"corridorKey": "UG_UGX_NGN",
"provider": "brails",
"country": "UG",
"sourceCurrency": "UGX",
"targetCurrency": "NGN",
"sourceAmount": 100,
"providerRate": 0.4,
"merchantRate": 0.36,
"merchantReceives": 7200,
"markupType": "percentage",
"markupValue": 10,
"rateSource": "sellRate",
"creditMode": "instant"
}
}Cross-Border Collections
Create Cross-Border Quote
Calculates the NGN amount a merchant will receive for a supported local-currency collection. For Kenya, send KES in normal customer-facing units. For Uganda, send UGX in normal customer-facing units.
POST
/
cross-border
/
quote
Create cross-border collection quote
curl --request POST \
--url https://api.nexapay.ng/api/v1/business/cross-border/quote \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"businessId": "<string>",
"country": "UG",
"currency": "UGX",
"amount": 20000,
"sourceCurrency": "UGX",
"targetCurrency": "NGN"
}
'import requests
url = "https://api.nexapay.ng/api/v1/business/cross-border/quote"
payload = {
"businessId": "<string>",
"country": "UG",
"currency": "UGX",
"amount": 20000,
"sourceCurrency": "UGX",
"targetCurrency": "NGN"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
businessId: '<string>',
country: 'UG',
currency: 'UGX',
amount: 20000,
sourceCurrency: 'UGX',
targetCurrency: 'NGN'
})
};
fetch('https://api.nexapay.ng/api/v1/business/cross-border/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://api.nexapay.ng/api/v1/business/cross-border/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([
'businessId' => '<string>',
'country' => 'UG',
'currency' => 'UGX',
'amount' => 20000,
'sourceCurrency' => 'UGX',
'targetCurrency' => 'NGN'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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://api.nexapay.ng/api/v1/business/cross-border/quote"
payload := strings.NewReader("{\n \"businessId\": \"<string>\",\n \"country\": \"UG\",\n \"currency\": \"UGX\",\n \"amount\": 20000,\n \"sourceCurrency\": \"UGX\",\n \"targetCurrency\": \"NGN\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://api.nexapay.ng/api/v1/business/cross-border/quote")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"businessId\": \"<string>\",\n \"country\": \"UG\",\n \"currency\": \"UGX\",\n \"amount\": 20000,\n \"sourceCurrency\": \"UGX\",\n \"targetCurrency\": \"NGN\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nexapay.ng/api/v1/business/cross-border/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"businessId\": \"<string>\",\n \"country\": \"UG\",\n \"currency\": \"UGX\",\n \"amount\": 20000,\n \"sourceCurrency\": \"UGX\",\n \"targetCurrency\": \"NGN\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"quote": {
"corridorKey": "UG_UGX_NGN",
"provider": "brails",
"country": "UG",
"sourceCurrency": "UGX",
"targetCurrency": "NGN",
"sourceAmount": 100,
"providerRate": 0.4,
"merchantRate": 0.36,
"merchantReceives": 7200,
"markupType": "percentage",
"markupValue": 10,
"rateSource": "sellRate",
"creditMode": "instant"
}
}Calculates the estimated NGN amount a merchant will receive for a supported local-currency collection.
For Kenya collections, send
country as KE, currency as KES, and the customer amount in normal KES units. For Uganda collections, send country as UG, currency as UGX, and the customer amount in normal UGX units.
The returned merchantReceives amount is the NGN amount after NexaPay’s FX margin.
Notes
- Quotes use provider sell rates.
- The rate shown by this endpoint is for preview.
- The final locked rate is stored when the collection is initiated.
- Merchant-facing integrations should display
merchantRateandmerchantReceives.
Authorizations
Merchant API Key (e.g., nexa-prod-... or nexa-test-...)
Headers
Target environment selector (live production vs. simulated sandbox).
Available options:
prod, test Body
application/json