curl --request POST \
--url https://api.saber.money/api/v2/wallet/transaction/crypto/sell \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--header 'X-Request-Id: <x-request-id>' \
--header 'X-Signature: <x-signature>' \
--header 'X-Timestamp: <x-timestamp>' \
--header 'X-User-Id: <x-user-id>' \
--data '
{
"payment_method": "bank_transfer",
"destination_instrument_id": "3e8be4b2-5f8a-47be-a645-4175b0f57089",
"quote_id": "7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7",
"sender_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"refund_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"network": "BSC",
"refund_network": "BSC",
"remarks": "customer payout"
}
'import requests
url = "https://api.saber.money/api/v2/wallet/transaction/crypto/sell"
payload = {
"payment_method": "bank_transfer",
"destination_instrument_id": "3e8be4b2-5f8a-47be-a645-4175b0f57089",
"quote_id": "7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7",
"sender_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"refund_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"network": "BSC",
"refund_network": "BSC",
"remarks": "customer payout"
}
headers = {
"X-Api-Key": "<x-api-key>",
"X-Signature": "<x-signature>",
"X-Timestamp": "<x-timestamp>",
"X-Request-Id": "<x-request-id>",
"X-User-Id": "<x-user-id>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Api-Key': '<x-api-key>',
'X-Signature': '<x-signature>',
'X-Timestamp': '<x-timestamp>',
'X-Request-Id': '<x-request-id>',
'X-User-Id': '<x-user-id>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
payment_method: 'bank_transfer',
destination_instrument_id: '3e8be4b2-5f8a-47be-a645-4175b0f57089',
quote_id: '7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7',
sender_wallet_address: '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
refund_wallet_address: '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
network: 'BSC',
refund_network: 'BSC',
remarks: 'customer payout'
})
};
fetch('https://api.saber.money/api/v2/wallet/transaction/crypto/sell', 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.saber.money/api/v2/wallet/transaction/crypto/sell",
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([
'payment_method' => 'bank_transfer',
'destination_instrument_id' => '3e8be4b2-5f8a-47be-a645-4175b0f57089',
'quote_id' => '7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7',
'sender_wallet_address' => '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
'refund_wallet_address' => '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
'network' => 'BSC',
'refund_network' => 'BSC',
'remarks' => 'customer payout'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <x-api-key>",
"X-Request-Id: <x-request-id>",
"X-Signature: <x-signature>",
"X-Timestamp: <x-timestamp>",
"X-User-Id: <x-user-id>"
],
]);
$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.saber.money/api/v2/wallet/transaction/crypto/sell"
payload := strings.NewReader("{\n \"payment_method\": \"bank_transfer\",\n \"destination_instrument_id\": \"3e8be4b2-5f8a-47be-a645-4175b0f57089\",\n \"quote_id\": \"7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7\",\n \"sender_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"refund_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"network\": \"BSC\",\n \"refund_network\": \"BSC\",\n \"remarks\": \"customer payout\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<x-api-key>")
req.Header.Add("X-Signature", "<x-signature>")
req.Header.Add("X-Timestamp", "<x-timestamp>")
req.Header.Add("X-Request-Id", "<x-request-id>")
req.Header.Add("X-User-Id", "<x-user-id>")
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.saber.money/api/v2/wallet/transaction/crypto/sell")
.header("X-Api-Key", "<x-api-key>")
.header("X-Signature", "<x-signature>")
.header("X-Timestamp", "<x-timestamp>")
.header("X-Request-Id", "<x-request-id>")
.header("X-User-Id", "<x-user-id>")
.header("Content-Type", "application/json")
.body("{\n \"payment_method\": \"bank_transfer\",\n \"destination_instrument_id\": \"3e8be4b2-5f8a-47be-a645-4175b0f57089\",\n \"quote_id\": \"7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7\",\n \"sender_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"refund_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"network\": \"BSC\",\n \"refund_network\": \"BSC\",\n \"remarks\": \"customer payout\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.saber.money/api/v2/wallet/transaction/crypto/sell")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<x-api-key>'
request["X-Signature"] = '<x-signature>'
request["X-Timestamp"] = '<x-timestamp>'
request["X-Request-Id"] = '<x-request-id>'
request["X-User-Id"] = '<x-user-id>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"payment_method\": \"bank_transfer\",\n \"destination_instrument_id\": \"3e8be4b2-5f8a-47be-a645-4175b0f57089\",\n \"quote_id\": \"7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7\",\n \"sender_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"refund_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"network\": \"BSC\",\n \"refund_network\": \"BSC\",\n \"remarks\": \"customer payout\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "01992e48-db7d-7c55-bb87-6f4e1abf5fe3",
"status": "CREATED",
"fiat_symbol": "INR",
"crypto_symbol": "USDT",
"fiat_amount": 55.38,
"crypto_amount": 0.695712,
"payment_method": "bank_transfer",
"deposit_crypto_address": "0xabcdef1234567890abcdef1234567890abcdef12",
"deposit_network": "BSC",
"destination_instrument_id": "a4680ba9-5ac6-4629-9493-2a88b160cd33",
"refund_wallet_address": "0x318d2aae4c99c2e74f7b5949fa1c34df837789b8",
"refund_network": "",
"refund_tag": "",
"sender_wallet_address": "0x318d2aae4c99c2e74f7b5949fa1c34df837789b8",
"created_at": 1757418150839,
"updated_at": 1757418150841
}
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}Create External Sell
Create an external crypto sell transaction that settles to fiat.
Response field values
| Field | Possible Values |
|---|---|
status | CREATED, PAYMENT_INITIATED, FUNDS_RECEIVED, COMPLETED, FAILED, REFUND_INITIATED, REFUND_COMPLETED, REFUND_FAILED. Typically CREATED immediately after creation. Check status via Get External Sell Transaction Details using transaction_type=EXTERNAL_SELL. |
failure_code, failure_desc | Empty string until the transaction fails |
refund_wallet_address | Defaults to sender_wallet_address when not provided |
refund_network | Defaults to network when not provided |
curl --request POST \
--url https://api.saber.money/api/v2/wallet/transaction/crypto/sell \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--header 'X-Request-Id: <x-request-id>' \
--header 'X-Signature: <x-signature>' \
--header 'X-Timestamp: <x-timestamp>' \
--header 'X-User-Id: <x-user-id>' \
--data '
{
"payment_method": "bank_transfer",
"destination_instrument_id": "3e8be4b2-5f8a-47be-a645-4175b0f57089",
"quote_id": "7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7",
"sender_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"refund_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"network": "BSC",
"refund_network": "BSC",
"remarks": "customer payout"
}
'import requests
url = "https://api.saber.money/api/v2/wallet/transaction/crypto/sell"
payload = {
"payment_method": "bank_transfer",
"destination_instrument_id": "3e8be4b2-5f8a-47be-a645-4175b0f57089",
"quote_id": "7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7",
"sender_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"refund_wallet_address": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"network": "BSC",
"refund_network": "BSC",
"remarks": "customer payout"
}
headers = {
"X-Api-Key": "<x-api-key>",
"X-Signature": "<x-signature>",
"X-Timestamp": "<x-timestamp>",
"X-Request-Id": "<x-request-id>",
"X-User-Id": "<x-user-id>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Api-Key': '<x-api-key>',
'X-Signature': '<x-signature>',
'X-Timestamp': '<x-timestamp>',
'X-Request-Id': '<x-request-id>',
'X-User-Id': '<x-user-id>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
payment_method: 'bank_transfer',
destination_instrument_id: '3e8be4b2-5f8a-47be-a645-4175b0f57089',
quote_id: '7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7',
sender_wallet_address: '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
refund_wallet_address: '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
network: 'BSC',
refund_network: 'BSC',
remarks: 'customer payout'
})
};
fetch('https://api.saber.money/api/v2/wallet/transaction/crypto/sell', 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.saber.money/api/v2/wallet/transaction/crypto/sell",
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([
'payment_method' => 'bank_transfer',
'destination_instrument_id' => '3e8be4b2-5f8a-47be-a645-4175b0f57089',
'quote_id' => '7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7',
'sender_wallet_address' => '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
'refund_wallet_address' => '1FfmbHfnpaZjKFvyi1okTjJJusN455paPH',
'network' => 'BSC',
'refund_network' => 'BSC',
'remarks' => 'customer payout'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <x-api-key>",
"X-Request-Id: <x-request-id>",
"X-Signature: <x-signature>",
"X-Timestamp: <x-timestamp>",
"X-User-Id: <x-user-id>"
],
]);
$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.saber.money/api/v2/wallet/transaction/crypto/sell"
payload := strings.NewReader("{\n \"payment_method\": \"bank_transfer\",\n \"destination_instrument_id\": \"3e8be4b2-5f8a-47be-a645-4175b0f57089\",\n \"quote_id\": \"7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7\",\n \"sender_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"refund_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"network\": \"BSC\",\n \"refund_network\": \"BSC\",\n \"remarks\": \"customer payout\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<x-api-key>")
req.Header.Add("X-Signature", "<x-signature>")
req.Header.Add("X-Timestamp", "<x-timestamp>")
req.Header.Add("X-Request-Id", "<x-request-id>")
req.Header.Add("X-User-Id", "<x-user-id>")
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.saber.money/api/v2/wallet/transaction/crypto/sell")
.header("X-Api-Key", "<x-api-key>")
.header("X-Signature", "<x-signature>")
.header("X-Timestamp", "<x-timestamp>")
.header("X-Request-Id", "<x-request-id>")
.header("X-User-Id", "<x-user-id>")
.header("Content-Type", "application/json")
.body("{\n \"payment_method\": \"bank_transfer\",\n \"destination_instrument_id\": \"3e8be4b2-5f8a-47be-a645-4175b0f57089\",\n \"quote_id\": \"7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7\",\n \"sender_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"refund_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"network\": \"BSC\",\n \"refund_network\": \"BSC\",\n \"remarks\": \"customer payout\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.saber.money/api/v2/wallet/transaction/crypto/sell")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<x-api-key>'
request["X-Signature"] = '<x-signature>'
request["X-Timestamp"] = '<x-timestamp>'
request["X-Request-Id"] = '<x-request-id>'
request["X-User-Id"] = '<x-user-id>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"payment_method\": \"bank_transfer\",\n \"destination_instrument_id\": \"3e8be4b2-5f8a-47be-a645-4175b0f57089\",\n \"quote_id\": \"7cd89b3c-7c76-48ad-9f2a-b0a7f871c4a7\",\n \"sender_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"refund_wallet_address\": \"1FfmbHfnpaZjKFvyi1okTjJJusN455paPH\",\n \"network\": \"BSC\",\n \"refund_network\": \"BSC\",\n \"remarks\": \"customer payout\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "01992e48-db7d-7c55-bb87-6f4e1abf5fe3",
"status": "CREATED",
"fiat_symbol": "INR",
"crypto_symbol": "USDT",
"fiat_amount": 55.38,
"crypto_amount": 0.695712,
"payment_method": "bank_transfer",
"deposit_crypto_address": "0xabcdef1234567890abcdef1234567890abcdef12",
"deposit_network": "BSC",
"destination_instrument_id": "a4680ba9-5ac6-4629-9493-2a88b160cd33",
"refund_wallet_address": "0x318d2aae4c99c2e74f7b5949fa1c34df837789b8",
"refund_network": "",
"refund_tag": "",
"sender_wallet_address": "0x318d2aae4c99c2e74f7b5949fa1c34df837789b8",
"created_at": 1757418150839,
"updated_at": 1757418150841
}
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}{
"success": false,
"errors": [
{
"code": 400001,
"text": "missing or invalid parameters"
}
]
}Headers
Your API key (configured in credentials)
HMAC-SHA256 signature (auto-generated) To test manually: HMAC-SHA256 of apiKey + timestamp (or apiKey + timestamp + userId when X-User-Id is required), keyed with your API secret. The HMAC Generator flow computes this for you.
Unix timestamp in seconds (auto-generated) Unix seconds, e.g. Math.floor(Date.now() / 1000). Must match the timestamp used in the X-Signature computation.
Unique request identifier (auto-generated) Any unique string per request, e.g. a UUID.
User UUID (set above)
Body
Payout or payment method.
Sender network.
Fiat destination instrument.
Quote UUID.
Sender or funding wallet address.
Refund wallet address. Crypto is returned here (minus network fee) if the transaction fails.
Refund network. Defaults to the sender network when omitted.
Optional note.
Whether the transaction is a first-party transfer.
Memo/tag for the sender deposit on tag-based networks (e.g. XRP, XLM, TON).
Memo/tag for the refund address on tag-based networks. Counterpart of refund_network.
Optional semantic reason code. When provided it must be an allowed value; an invalid value is rejected with error 403006.
Related topics
Get External Sell Transaction DetailsGet Sell Transaction DetailsGet Pool Sell Transaction DetailsGet Crypto Deposit Transaction DetailsGet Pool Buy Transaction DetailsWas this page helpful?