Quote withdrawals
curl --request POST \
--url https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--header 'X-Stabyl-Nonce: <x-stabyl-nonce>' \
--header 'X-Stabyl-Signature: <x-stabyl-signature>' \
--header 'X-Stabyl-Timestamp: <x-stabyl-timestamp>' \
--data '
{
"currency": "NGN",
"items": [
{
"amount": "200000000.00",
"client_item_id": "beneficiary-a",
"description": "Supplier settlement",
"destination": {
"account_name": "Jane Doe",
"account_number": "0123456789",
"bank_code": "044",
"bank_name": "Access Bank",
"type": "bank_account"
}
}
]
}
'import requests
url = "https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes"
payload = {
"currency": "NGN",
"items": [
{
"amount": "200000000.00",
"client_item_id": "beneficiary-a",
"description": "Supplier settlement",
"destination": {
"account_name": "Jane Doe",
"account_number": "0123456789",
"bank_code": "044",
"bank_name": "Access Bank",
"type": "bank_account"
}
}
]
}
headers = {
"X-Stabyl-Timestamp": "<x-stabyl-timestamp>",
"X-Stabyl-Nonce": "<x-stabyl-nonce>",
"X-Stabyl-Signature": "<x-stabyl-signature>",
"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-Stabyl-Timestamp': '<x-stabyl-timestamp>',
'X-Stabyl-Nonce': '<x-stabyl-nonce>',
'X-Stabyl-Signature': '<x-stabyl-signature>',
'X-Api-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
currency: 'NGN',
items: [
{
amount: '200000000.00',
client_item_id: 'beneficiary-a',
description: 'Supplier settlement',
destination: {
account_name: 'Jane Doe',
account_number: '0123456789',
bank_code: '044',
bank_name: 'Access Bank',
type: 'bank_account'
}
}
]
})
};
fetch('https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes', 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.stabyl.com/v1/partner/wallets/withdrawal/quotes",
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([
'currency' => 'NGN',
'items' => [
[
'amount' => '200000000.00',
'client_item_id' => 'beneficiary-a',
'description' => 'Supplier settlement',
'destination' => [
'account_name' => 'Jane Doe',
'account_number' => '0123456789',
'bank_code' => '044',
'bank_name' => 'Access Bank',
'type' => 'bank_account'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>",
"X-Stabyl-Nonce: <x-stabyl-nonce>",
"X-Stabyl-Signature: <x-stabyl-signature>",
"X-Stabyl-Timestamp: <x-stabyl-timestamp>"
],
]);
$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.stabyl.com/v1/partner/wallets/withdrawal/quotes"
payload := strings.NewReader("{\n \"currency\": \"NGN\",\n \"items\": [\n {\n \"amount\": \"200000000.00\",\n \"client_item_id\": \"beneficiary-a\",\n \"description\": \"Supplier settlement\",\n \"destination\": {\n \"account_name\": \"Jane Doe\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"044\",\n \"bank_name\": \"Access Bank\",\n \"type\": \"bank_account\"\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Stabyl-Timestamp", "<x-stabyl-timestamp>")
req.Header.Add("X-Stabyl-Nonce", "<x-stabyl-nonce>")
req.Header.Add("X-Stabyl-Signature", "<x-stabyl-signature>")
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.stabyl.com/v1/partner/wallets/withdrawal/quotes")
.header("X-Stabyl-Timestamp", "<x-stabyl-timestamp>")
.header("X-Stabyl-Nonce", "<x-stabyl-nonce>")
.header("X-Stabyl-Signature", "<x-stabyl-signature>")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"currency\": \"NGN\",\n \"items\": [\n {\n \"amount\": \"200000000.00\",\n \"client_item_id\": \"beneficiary-a\",\n \"description\": \"Supplier settlement\",\n \"destination\": {\n \"account_name\": \"Jane Doe\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"044\",\n \"bank_name\": \"Access Bank\",\n \"type\": \"bank_account\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Stabyl-Timestamp"] = '<x-stabyl-timestamp>'
request["X-Stabyl-Nonce"] = '<x-stabyl-nonce>'
request["X-Stabyl-Signature"] = '<x-stabyl-signature>'
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"currency\": \"NGN\",\n \"items\": [\n {\n \"amount\": \"200000000.00\",\n \"client_item_id\": \"beneficiary-a\",\n \"description\": \"Supplier settlement\",\n \"destination\": {\n \"account_name\": \"Jane Doe\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"044\",\n \"bank_name\": \"Access Bank\",\n \"type\": \"bank_account\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"amount": "200000000.00",
"currency": "NGN",
"quotes": [
{
"as_of": "2026-10-20T12:00:00Z",
"debit_amount": "200000200.00",
"estimated_receive": "200000000.00",
"fee": "200.00",
"items": [
{
"amount": "200000000.00",
"client_item_id": "beneficiary-1",
"destination": {
"account_name": "Example Recipient",
"account_number": "0123456789",
"bank_code": "044",
"bank_name": "Access Bank",
"type": "bank_account"
},
"transfers": [
{
"amount": "100000000.00",
"sequence": 1,
"status": "available"
},
{
"amount": "100000000.00",
"sequence": 2,
"status": "available"
}
]
}
],
"max_transfer_amount": "100000000.00",
"max_withdrawable_amount": "299999700.00",
"rail": "bank_transfer",
"receive_currency": "NGN",
"status": "available",
"transfer_count": 2
}
]
},
"status": "success"
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "invalid request parameters"
},
"status": "error"
}{
"error": {
"code": "UNAUTHORIZED",
"message": "missing X-Api-Key header"
},
"status": "error"
}{
"error": {
"code": "FORBIDDEN",
"message": "request is not allowed"
},
"status": "error"
}Wallets
Quote withdrawals
Quotes NGN bank items, one NGN CNGN item, or one USD stablecoin item. NGN quotes include max_withdrawable_amount and as_of for the selected rail. An oversized valid NGN request returns status unavailable and the current maximum while preserving the requested fee, debit, and receive amounts. Quoting never reserves funds; submit rechecks availability.
POST
/
partner
/
wallets
/
withdrawal
/
quotes
Quote withdrawals
curl --request POST \
--url https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--header 'X-Stabyl-Nonce: <x-stabyl-nonce>' \
--header 'X-Stabyl-Signature: <x-stabyl-signature>' \
--header 'X-Stabyl-Timestamp: <x-stabyl-timestamp>' \
--data '
{
"currency": "NGN",
"items": [
{
"amount": "200000000.00",
"client_item_id": "beneficiary-a",
"description": "Supplier settlement",
"destination": {
"account_name": "Jane Doe",
"account_number": "0123456789",
"bank_code": "044",
"bank_name": "Access Bank",
"type": "bank_account"
}
}
]
}
'import requests
url = "https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes"
payload = {
"currency": "NGN",
"items": [
{
"amount": "200000000.00",
"client_item_id": "beneficiary-a",
"description": "Supplier settlement",
"destination": {
"account_name": "Jane Doe",
"account_number": "0123456789",
"bank_code": "044",
"bank_name": "Access Bank",
"type": "bank_account"
}
}
]
}
headers = {
"X-Stabyl-Timestamp": "<x-stabyl-timestamp>",
"X-Stabyl-Nonce": "<x-stabyl-nonce>",
"X-Stabyl-Signature": "<x-stabyl-signature>",
"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-Stabyl-Timestamp': '<x-stabyl-timestamp>',
'X-Stabyl-Nonce': '<x-stabyl-nonce>',
'X-Stabyl-Signature': '<x-stabyl-signature>',
'X-Api-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
currency: 'NGN',
items: [
{
amount: '200000000.00',
client_item_id: 'beneficiary-a',
description: 'Supplier settlement',
destination: {
account_name: 'Jane Doe',
account_number: '0123456789',
bank_code: '044',
bank_name: 'Access Bank',
type: 'bank_account'
}
}
]
})
};
fetch('https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes', 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.stabyl.com/v1/partner/wallets/withdrawal/quotes",
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([
'currency' => 'NGN',
'items' => [
[
'amount' => '200000000.00',
'client_item_id' => 'beneficiary-a',
'description' => 'Supplier settlement',
'destination' => [
'account_name' => 'Jane Doe',
'account_number' => '0123456789',
'bank_code' => '044',
'bank_name' => 'Access Bank',
'type' => 'bank_account'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>",
"X-Stabyl-Nonce: <x-stabyl-nonce>",
"X-Stabyl-Signature: <x-stabyl-signature>",
"X-Stabyl-Timestamp: <x-stabyl-timestamp>"
],
]);
$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.stabyl.com/v1/partner/wallets/withdrawal/quotes"
payload := strings.NewReader("{\n \"currency\": \"NGN\",\n \"items\": [\n {\n \"amount\": \"200000000.00\",\n \"client_item_id\": \"beneficiary-a\",\n \"description\": \"Supplier settlement\",\n \"destination\": {\n \"account_name\": \"Jane Doe\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"044\",\n \"bank_name\": \"Access Bank\",\n \"type\": \"bank_account\"\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Stabyl-Timestamp", "<x-stabyl-timestamp>")
req.Header.Add("X-Stabyl-Nonce", "<x-stabyl-nonce>")
req.Header.Add("X-Stabyl-Signature", "<x-stabyl-signature>")
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.stabyl.com/v1/partner/wallets/withdrawal/quotes")
.header("X-Stabyl-Timestamp", "<x-stabyl-timestamp>")
.header("X-Stabyl-Nonce", "<x-stabyl-nonce>")
.header("X-Stabyl-Signature", "<x-stabyl-signature>")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"currency\": \"NGN\",\n \"items\": [\n {\n \"amount\": \"200000000.00\",\n \"client_item_id\": \"beneficiary-a\",\n \"description\": \"Supplier settlement\",\n \"destination\": {\n \"account_name\": \"Jane Doe\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"044\",\n \"bank_name\": \"Access Bank\",\n \"type\": \"bank_account\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.stabyl.com/v1/partner/wallets/withdrawal/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Stabyl-Timestamp"] = '<x-stabyl-timestamp>'
request["X-Stabyl-Nonce"] = '<x-stabyl-nonce>'
request["X-Stabyl-Signature"] = '<x-stabyl-signature>'
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"currency\": \"NGN\",\n \"items\": [\n {\n \"amount\": \"200000000.00\",\n \"client_item_id\": \"beneficiary-a\",\n \"description\": \"Supplier settlement\",\n \"destination\": {\n \"account_name\": \"Jane Doe\",\n \"account_number\": \"0123456789\",\n \"bank_code\": \"044\",\n \"bank_name\": \"Access Bank\",\n \"type\": \"bank_account\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"amount": "200000000.00",
"currency": "NGN",
"quotes": [
{
"as_of": "2026-10-20T12:00:00Z",
"debit_amount": "200000200.00",
"estimated_receive": "200000000.00",
"fee": "200.00",
"items": [
{
"amount": "200000000.00",
"client_item_id": "beneficiary-1",
"destination": {
"account_name": "Example Recipient",
"account_number": "0123456789",
"bank_code": "044",
"bank_name": "Access Bank",
"type": "bank_account"
},
"transfers": [
{
"amount": "100000000.00",
"sequence": 1,
"status": "available"
},
{
"amount": "100000000.00",
"sequence": 2,
"status": "available"
}
]
}
],
"max_transfer_amount": "100000000.00",
"max_withdrawable_amount": "299999700.00",
"rail": "bank_transfer",
"receive_currency": "NGN",
"status": "available",
"transfer_count": 2
}
]
},
"status": "success"
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "invalid request parameters"
},
"status": "error"
}{
"error": {
"code": "UNAUTHORIZED",
"message": "missing X-Api-Key header"
},
"status": "error"
}{
"error": {
"code": "FORBIDDEN",
"message": "request is not allowed"
},
"status": "error"
}Withdrawal quote and submit calls require an Ed25519 signature over the exact HTTP method, request path and query, timestamp, nonce, and raw body hash. Reuse the business idempotency key with a new timestamp, nonce, and signature when retrying an uncertain response.
Authorizations
Headers
Body
application/json
List-shaped withdrawal to quote: NGN bank items, or exactly one crypto item with currency NGN and settlement_rail CNGN, or currency USD and settlement_rail USDT/USDC. The signed HTTP request authenticates the caller; quoting does not reserve funds.
Was this page helpful?