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": [
{
"debit_amount": "200000500.00",
"estimated_receive": "200000000.00",
"fee": "500.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": "pending"
},
{
"amount": "100000000.00",
"sequence": 2,
"status": "pending"
}
]
}
],
"max_transfer_amount": "100000000.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"
}Quote withdrawals
Validates a list-shaped NGN bank or one-item USD stablecoin withdrawal and returns aggregate debit, fee, expected receive amount, item previews, and transfer count. Quoting never reserves funds.
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": [
{
"debit_amount": "200000500.00",
"estimated_receive": "200000000.00",
"fee": "500.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": "pending"
},
{
"amount": "100000000.00",
"sequence": 2,
"status": "pending"
}
]
}
],
"max_transfer_amount": "100000000.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"
}Authorizations
API credential. Withdrawal quote and submit operations additionally require the documented Ed25519 timestamp, nonce, and signature headers.
Headers
Current Unix time in milliseconds. The server accepts at most 30 seconds of clock skew.
A new UUIDv4 or UUIDv7 for this HTTP attempt. A verified nonce is single-use for five minutes.
Unpadded base64url Ed25519 signature of the version 1 canonical payload. The exact path includes the server prefix, for example /v1/partner/wallets/withdrawals.
Body
List-shaped NGN or one-item USD withdrawal to quote. Do not include an authorization token; the signed HTTP request authenticates the caller and quoting does not reserve funds.
Was this page helpful?