Use this endpoint to generate a guaranteed exchange rate for a specific corridor. The quote response includes a quoteId that you must supply when you create the payout.
Endpoint
POST {{baseURL}}/v1/quote
Quotes expire after the duration returned in expiresInSeconds. Create the payout before it expires or request a fresh quote.
Request body
{
"paymentChannel" : "BANK_TRANSFER" ,
"source" : {
"amount" : 150000 ,
"country" : "NG" ,
"currency" : "NGN"
},
"target" : {
"country" : "US" ,
"currency" : "USD"
}
}
Body fields
Field Type Description Required Example paymentChannelString Payment channel used to settle the payout (e.g. BANK_TRANSFER, MOBILE_MONEY). ✅ Yes BANK_TRANSFERsource.amountNumber Amount you want to convert in the source currency. ✅ Yes 150000source.countryString ISO 3166-1 alpha-2 code for the sender country. ✅ Yes NGsource.currencyString ISO 4217 code for the sender currency. ✅ Yes NGNtarget.countryString ISO 3166-1 alpha-2 code for the recipient country. ✅ Yes UStarget.currencyString ISO 4217 code for the recipient currency. ✅ Yes USD
Header Type Description Required Example x-api-keyString API key associated with your workspace. ✅ Yes YOUR_API_KEYContent-TypeString Media type of the request body. ✅ Yes application/json
Request examples
cURL
JavaScript (fetch)
Python (requests)
Node.js (axios)
curl --request POST '{{baseURL}}/v1/quote' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"paymentChannel": "BANK_TRANSFER",
"source": {
"amount": 150000,
"country": "NG",
"currency": "NGN"
},
"target": {
"country": "US",
"currency": "USD"
}
}'
Successful response
{
"message" : "quote successfully created" ,
"status" : "success" ,
"data" : {
"id" : "e5eec724-38f9-40e2-9i86-xxxxxxxxxxxxx" ,
"source" : {
"currency" : "NGN" ,
"country" : "NG" ,
"amount" : 150000
},
"target" : {
"currency" : "USD" ,
"country" : "US" ,
"amount" : 81.97
},
"rate" : 1830 ,
"fee" : {
"amount" : 0
},
"summary" : {
"total" : 150000
},
"rules" : [
{
"category" : "LIMIT" ,
"appliedCurrency" : "USD" ,
"transaction" : {
"minimum" : 1 ,
"maximum" : 200000
}
}
],
"expiresInSeconds" : 600 ,
"settlementTime" : "1 hr"
}
}
Field reference
Field Type Description idString Quote identifier to reuse in payout requests. rateNumber Exchange rate applied to the conversion. summary.totalNumber Amount to debit in the source currency. fee.amountNumber Total fees charged for the quote. expiresInSecondsNumber Time remaining before the quote becomes invalid. rulesArray Corridor rules that were evaluated (limits, compliance, etc.).
Error responses
Status Message Cause How to handle 400 Invalid country or currency ISO codeThe source/target country or currency combination is not supported. Use valid ISO codes for corridors enabled on your workspace. 400 Invalid Payment Channel, check docs or contact supportpaymentChannel is not valid for the selected corridor.Choose a supported channel for the corridor and amount. 400 Required field missing or invalid requestMandatory fields are missing or have invalid formats. Validate source, target, paymentChannel, and metadata before sending. 400 Minimum target amount for transaction is {minimum_transaction_amount}Requested target amount is below the corridor’s minimum. Increase the target amount to at least the stated minimum. 400 Maximum target amount for transaction is {maximum_transaction_amount}Requested target amount exceeds the corridor’s limit. Reduce the target amount below the maximum threshold. 400 Transaction target amount {transaction_amount} requires invoiceAmount surpasses invoice thresholds that require documentation. Collect and attach the required invoice before retrying. 401 API key missing or incorrectx-api-key header missing, invalid, or expired.Include the correct API key for sandbox/production. 403 Quote route not available, contact supportEndpoint disabled for your workspace or environment. Reach out to support to enable quotes for the corridor. 403 Access denied: IP address not whitelistedRequest originated from an IP that isn’t on your allowlist. Add your server IP in the dashboard. 429 API rate limit exceededToo many quote requests in a short window. Apply exponential backoff and distribute requests. 500 Service temporarily unavailableTemporary outage or maintenance event. Retry after a delay; contact support if persistent.
Best practices
Cache quotes temporarily so the user can confirm without re-requesting.
Surface the quote expiry countdown in your UI to encourage timely confirmation.
Use the Get Quote API if you need to display the quote again before payout.