Use the samples below to experiment with the POST /v1/quote endpoint. Each tab shows the request payload and the success response for a different corridor.
Endpoint
POST {{baseURL}}/v1/quote
| Header | Description | Required | Example |
|---|
x-api-key | Workspace API key. | ✅ Yes | YOUR_API_KEY |
Content-Type | Media type of the request body. | ✅ Yes | application/json |
Requests and responses
Convert 100,000 NGN to EUR
curl --request POST '{{baseURL}}/v1/quote' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"paymentChannel": "BANK_TRANSFER",
"source": {
"amount": 100000,
"country": "NG",
"currency": "NGN"
},
"target": {
"country": "DK",
"currency": "EUR"
}
}'
Convert 100,000 NGN to GBP
curl --request POST '{{baseURL}}/v1/quote' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"paymentChannel": "BANK_TRANSFER",
"source": { "amount": 100000, "country": "NG", "currency": "NGN" },
"target": { "country": "GB", "currency": "GBP" }
}'
Convert 500,000 NGN to USD
curl --request POST '{{baseURL}}/v1/quote' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"paymentChannel": "BANK_TRANSFER",
"source": { "amount": 500000, "country": "NG", "currency": "NGN" },
"target": { "country": "US", "currency": "USD" }
}'
Convert 5,000 NGN domestically
curl --request POST '{{baseURL}}/v1/quote' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"paymentChannel": "BANK_TRANSFER",
"source": { "amount": 5000, "country": "NG", "currency": "NGN" },
"target": { "country": "NG", "currency": "NGN" }
}'
Response field reference
Quotes expire 10 minutes after creation unless otherwise stated. If expiresInSeconds hits zero, request a new quote.
General attributes
| Field | Type | Description |
|---|
message | String | Overall result of the request. |
status | String | success or error. |
data.id | String | Quote identifier required when creating payouts. |
Source (send) details
| Field | Type | Description |
|---|
source.currency | String | Currency being debited. |
source.country | String | Country where funds originate. |
source.amount | Number | Amount the sender pays before fees. |
Target (receive) details
| Field | Type | Description |
|---|
target.currency | String | Currency being delivered. |
target.country | String | Destination country. |
target.amount | Number | Amount the recipient receives. |
Rates, fees, and rules
| Field | Type | Description |
|---|
rate | Number | Exchange rate applied. |
fee.amount | Number | Fees charged on this quote. |
rules[].category | String | Rule category (e.g. LIMIT). |
rules[].transaction.minimum | Number | Minimum transaction size allowed. |
rules[].transaction.maximum | Number | Maximum transaction size allowed. |
Expiry and settlement
| Field | Type | Description |
|---|
summary.total | Number | Total debit amount including fees. |
settlementTime | String | Estimated delivery time for the payout. |
quoteCurrency | String | Currency context for the quote rate. |
expiresInSeconds | Number | Time remaining before the quote becomes invalid. |
Error handling
| Status | Message | Cause | Next steps |
|---|
| 400 | Invalid country or currency ISO code | Country/currency combination is not supported. | Align to the corridors enabled for your workspace. |
| 400 | Invalid Payment Channel, check docs or contact support | paymentChannel isn’t supported for the corridor. | Switch to a supported channel before retrying. |
| 400 | Required field missing or invalid request | Missing or malformed required fields. | Validate payload fields prior to calling the API. |
| 400 | Minimum target amount for transaction is {minimum_transaction_amount} | Target amount is below the minimum allowed. | Increase the amount to meet the stated minimum. |
| 400 | Maximum target amount for transaction is {maximum_transaction_amount} | Target amount exceeds the maximum allowed. | Reduce the amount to fall under the limit. |
| 400 | Transaction target amount {transaction_amount} requires invoice | Amount crosses invoice documentation threshold. | Attach the required invoice before requesting the quote. |
| 401 | API key missing or incorrect | Authentication header missing/invalid. | Include the proper API key for the environment. |
| 403 | Quote route not available, contact support | Quote endpoint disabled for your workspace. | Contact support to enable the route. |
| 403 | Access denied: IP address not whitelisted | Request comes from a non-whitelisted IP. | Add the IP inside the dashboard allowlist. |
| 429 | API rate limit exceeded | Too many quote requests in a short period. | Implement retries with exponential backoff. |
| 500 | Service temporarily unavailable | Temporary outage or maintenance. | Retry after a delay; escalate if it persists. |
Best practices
- Keep the
quoteId from the response and use it immediately when you call the payout API.
- Inspect the
rules array to decide whether to prompt the user for a different amount.
- When running demos, delete sensitive logs that may contain your API key before sharing.