Master Wallet
curl --request POST \
--url https://api.blockradar.co/v1/wallets/{walletId}/withdraw \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"assets": [
{
"address": "0xRecipient1Address",
"amount": "10.5",
"id": "{{assetId1}}",
"metadata": {
"employeeId": "EMP001"
},
"note": "Salary payment",
"reference": "payout-001"
},
{
"address": "0xRecipient2Address",
"amount": "25.0",
"id": "{{assetId2}}",
"metadata": {
"invoiceId": "INV-123"
},
"note": "Vendor payment",
"reference": "payout-002"
}
]
}
'import requests
url = "https://api.blockradar.co/v1/wallets/{walletId}/withdraw"
payload = { "assets": [
{
"address": "0xRecipient1Address",
"amount": "10.5",
"id": "{{assetId1}}",
"metadata": { "employeeId": "EMP001" },
"note": "Salary payment",
"reference": "payout-001"
},
{
"address": "0xRecipient2Address",
"amount": "25.0",
"id": "{{assetId2}}",
"metadata": { "invoiceId": "INV-123" },
"note": "Vendor payment",
"reference": "payout-002"
}
] }
headers = {
"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-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assets: [
{
address: '0xRecipient1Address',
amount: '10.5',
id: '{{assetId1}}',
metadata: {employeeId: 'EMP001'},
note: 'Salary payment',
reference: 'payout-001'
},
{
address: '0xRecipient2Address',
amount: '25.0',
id: '{{assetId2}}',
metadata: {invoiceId: 'INV-123'},
note: 'Vendor payment',
reference: 'payout-002'
}
]
})
};
fetch('https://api.blockradar.co/v1/wallets/{walletId}/withdraw', 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.blockradar.co/v1/wallets/{walletId}/withdraw",
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([
'assets' => [
[
'address' => '0xRecipient1Address',
'amount' => '10.5',
'id' => '{{assetId1}}',
'metadata' => [
'employeeId' => 'EMP001'
],
'note' => 'Salary payment',
'reference' => 'payout-001'
],
[
'address' => '0xRecipient2Address',
'amount' => '25.0',
'id' => '{{assetId2}}',
'metadata' => [
'invoiceId' => 'INV-123'
],
'note' => 'Vendor payment',
'reference' => 'payout-002'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.blockradar.co/v1/wallets/{walletId}/withdraw"
payload := strings.NewReader("{\n \"assets\": [\n {\n \"address\": \"0xRecipient1Address\",\n \"amount\": \"10.5\",\n \"id\": \"{{assetId1}}\",\n \"metadata\": {\n \"employeeId\": \"EMP001\"\n },\n \"note\": \"Salary payment\",\n \"reference\": \"payout-001\"\n },\n {\n \"address\": \"0xRecipient2Address\",\n \"amount\": \"25.0\",\n \"id\": \"{{assetId2}}\",\n \"metadata\": {\n \"invoiceId\": \"INV-123\"\n },\n \"note\": \"Vendor payment\",\n \"reference\": \"payout-002\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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.blockradar.co/v1/wallets/{walletId}/withdraw")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"assets\": [\n {\n \"address\": \"0xRecipient1Address\",\n \"amount\": \"10.5\",\n \"id\": \"{{assetId1}}\",\n \"metadata\": {\n \"employeeId\": \"EMP001\"\n },\n \"note\": \"Salary payment\",\n \"reference\": \"payout-001\"\n },\n {\n \"address\": \"0xRecipient2Address\",\n \"amount\": \"25.0\",\n \"id\": \"{{assetId2}}\",\n \"metadata\": {\n \"invoiceId\": \"INV-123\"\n },\n \"note\": \"Vendor payment\",\n \"reference\": \"payout-002\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockradar.co/v1/wallets/{walletId}/withdraw")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assets\": [\n {\n \"address\": \"0xRecipient1Address\",\n \"amount\": \"10.5\",\n \"id\": \"{{assetId1}}\",\n \"metadata\": {\n \"employeeId\": \"EMP001\"\n },\n \"note\": \"Salary payment\",\n \"reference\": \"payout-001\"\n },\n {\n \"address\": \"0xRecipient2Address\",\n \"amount\": \"25.0\",\n \"id\": \"{{assetId2}}\",\n \"metadata\": {\n \"invoiceId\": \"INV-123\"\n },\n \"note\": \"Vendor payment\",\n \"reference\": \"payout-002\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"amlScreening": null,
"amount": "10",
"amountPaid": "10",
"asset": {
"address": "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
"blockchain": {
"createdAt": "2024-05-14T11:53:33.095Z",
"derivationPath": "m/44'/60'/0'/0",
"id": "85ffc132-3972-4c9e-99a5-5cf0ccb688bf",
"isActive": true,
"isEvmCompatible": true,
"logoUrl": "https://res.cloudinary.com/blockradar/image/upload/v1716800081/crypto-assets/ethereum-eth-logo_idraq2.png",
"name": "ethereum",
"slug": "ethereum",
"symbol": "eth",
"tokenStandard": "ERC20",
"updatedAt": "2024-06-14T22:32:11.983Z"
},
"createdAt": "2024-05-14T11:53:33.682Z",
"decimals": 6,
"id": "fe04a28c-c615-4e41-8eda-f84c862864f5",
"isActive": true,
"logoUrl": "https://res.cloudinary.com/blockradar/image/upload/v1716800083/crypto-assets/usd-coin-usdc-logo_fs9mhv.png",
"name": "USDC Coin",
"network": "testnet",
"standard": "ERC20",
"symbol": "USDC",
"updatedAt": "2024-06-14T22:32:12.589Z"
},
"assetSwept": null,
"assetSweptAmount": null,
"assetSweptAt": null,
"assetSweptGasFee": null,
"assetSweptHash": null,
"assetSweptRecipientAddress": null,
"assetSweptResponse": null,
"assetSweptSenderAddress": null,
"blockHash": null,
"blockNumber": null,
"blockchain": {
"createdAt": "2024-05-14T11:53:33.095Z",
"derivationPath": "m/44'/60'/0'/0",
"id": "85ffc132-3972-4c9e-99a5-5cf0ccb688bf",
"isActive": true,
"isEvmCompatible": true,
"logoUrl": "https://res.cloudinary.com/blockradar/image/upload/v1716800081/crypto-assets/ethereum-eth-logo_idraq2.png",
"name": "ethereum",
"slug": "ethereum",
"symbol": "eth",
"tokenStandard": "ERC20",
"updatedAt": "2024-06-14T22:32:11.983Z"
},
"chainId": null,
"confirmations": null,
"confirmed": false,
"createdAt": "2024-10-23T11:33:58.765Z",
"currency": "USD",
"fee": null,
"feeMetadata": null,
"gasFee": null,
"gasPrice": null,
"gasUsed": null,
"hash": "0xded90bc7f3d98f5ff0c3a97f711717192e83e01d89ac1ff4483ae6fd9d229e6d",
"id": "081d6315-159f-4c38-b02a-c4708836c5bd",
"metadata": null,
"network": "testnet",
"note": null,
"reason": null,
"recipientAddress": "0x2455eC6700092991Ce0782365A89d5Cd89c8Fa22",
"senderAddress": "0x947514e4B803e312C312da0F1B41fEDdbe15ae7a",
"status": "PENDING",
"tokenAddress": null,
"type": "WITHDRAW",
"updatedAt": "2024-10-23T11:33:58.765Z",
"wallet": {
"id": "d236a191-c1d4-423c-a439-54ce6542ca41"
}
},
"message": "Withdrawal request initiated successfully",
"statusCode": 200
}
Withdraw
Master Wallet
This endpoint allows you to initiate a withdrawal from a specific wallet.
Body Parameters
| Key | Required | Type | Description |
|---|---|---|---|
| assetId | true* | string (UUID) | The ID of the asset to withdraw. Required if assets array is not provided. |
| address | true* | string | The destination wallet address for the withdrawal. Required if assets array is not provided. |
| amount | true* | string | The withdrawal amount. Must be greater than 0. Required if assets array is not provided. |
| reference | false | string | An optional reference note for the withdrawal. |
| note | false | string | A short message or internal remark to associate with this withdrawal. On Solana it is attached as the on-chain memo. On Stellar it is the memo only when recipientRouting is omitted (an all-digit note becomes a memo ID; text memos are limited to 28 bytes) — see On-chain Memos. Not visible on-chain elsewhere. |
| recipientRouting | false | object | Stellar only, single withdrawals (ignored when assets is provided; set it on each Asset instead). Sets the memo for a G… recipient, separately from note: {type: memo_id, value: "10012345"}, {type: memo_text, value: "INV-1042"}, or {type: none} to send no memo. Rejected for non-Stellar wallets and for M… or C… recipients. See Memos on Stellar. |
| metadata | false | object | Optional metadata (key-value pairs) for additional transaction details. |
| assets | false | array of Asset | Used for batch withdrawals. Required if assetId, amount, and address are not provided. |
Asset (for Batch Withdrawals)
| Key | Required | Type | Description |
|---|---|---|---|
| id | true | string (UUID) | The ID of the asset to withdraw. |
| amount | true | string | The withdrawal amount. Must be greater than 0. |
| address | true | string | The destination wallet address for the withdrawal. |
| reference | false | string | Optional reference note for this asset withdrawal. |
| note | false | string | A short message or internal remark for this asset withdrawal. On Solana it is attached as the on-chain memo. On Stellar it is the memo only when recipientRouting is omitted (an all-digit note becomes a memo ID; text memos are limited to 28 bytes) — see On-chain Memos. Not visible on-chain elsewhere. |
| recipientRouting | false | object | Stellar only. Sets the memo for this asset withdrawal to a G… recipient, separately from note: {type: memo_id, value: "10012345"}, {type: memo_text, value: "INV-1042"}, or {type: none} to send no memo. Rejected for non-Stellar wallets and for M… or C… recipients. See Memos on Stellar. |
| metadata | false | object | Optional metadata (key-value pairs) for this asset withdrawal. |
Notes
- Single withdrawal: Provide
assetId,amount, andaddressat the top level. - Batch withdrawal: Omit top-level
assetId,amount, andaddress, and instead provide an array ofassets(each followingAsset).
POST
/
v1
/
wallets
/
{walletId}
/
withdraw
Master Wallet
curl --request POST \
--url https://api.blockradar.co/v1/wallets/{walletId}/withdraw \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"assets": [
{
"address": "0xRecipient1Address",
"amount": "10.5",
"id": "{{assetId1}}",
"metadata": {
"employeeId": "EMP001"
},
"note": "Salary payment",
"reference": "payout-001"
},
{
"address": "0xRecipient2Address",
"amount": "25.0",
"id": "{{assetId2}}",
"metadata": {
"invoiceId": "INV-123"
},
"note": "Vendor payment",
"reference": "payout-002"
}
]
}
'import requests
url = "https://api.blockradar.co/v1/wallets/{walletId}/withdraw"
payload = { "assets": [
{
"address": "0xRecipient1Address",
"amount": "10.5",
"id": "{{assetId1}}",
"metadata": { "employeeId": "EMP001" },
"note": "Salary payment",
"reference": "payout-001"
},
{
"address": "0xRecipient2Address",
"amount": "25.0",
"id": "{{assetId2}}",
"metadata": { "invoiceId": "INV-123" },
"note": "Vendor payment",
"reference": "payout-002"
}
] }
headers = {
"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-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
assets: [
{
address: '0xRecipient1Address',
amount: '10.5',
id: '{{assetId1}}',
metadata: {employeeId: 'EMP001'},
note: 'Salary payment',
reference: 'payout-001'
},
{
address: '0xRecipient2Address',
amount: '25.0',
id: '{{assetId2}}',
metadata: {invoiceId: 'INV-123'},
note: 'Vendor payment',
reference: 'payout-002'
}
]
})
};
fetch('https://api.blockradar.co/v1/wallets/{walletId}/withdraw', 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.blockradar.co/v1/wallets/{walletId}/withdraw",
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([
'assets' => [
[
'address' => '0xRecipient1Address',
'amount' => '10.5',
'id' => '{{assetId1}}',
'metadata' => [
'employeeId' => 'EMP001'
],
'note' => 'Salary payment',
'reference' => 'payout-001'
],
[
'address' => '0xRecipient2Address',
'amount' => '25.0',
'id' => '{{assetId2}}',
'metadata' => [
'invoiceId' => 'INV-123'
],
'note' => 'Vendor payment',
'reference' => 'payout-002'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.blockradar.co/v1/wallets/{walletId}/withdraw"
payload := strings.NewReader("{\n \"assets\": [\n {\n \"address\": \"0xRecipient1Address\",\n \"amount\": \"10.5\",\n \"id\": \"{{assetId1}}\",\n \"metadata\": {\n \"employeeId\": \"EMP001\"\n },\n \"note\": \"Salary payment\",\n \"reference\": \"payout-001\"\n },\n {\n \"address\": \"0xRecipient2Address\",\n \"amount\": \"25.0\",\n \"id\": \"{{assetId2}}\",\n \"metadata\": {\n \"invoiceId\": \"INV-123\"\n },\n \"note\": \"Vendor payment\",\n \"reference\": \"payout-002\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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.blockradar.co/v1/wallets/{walletId}/withdraw")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"assets\": [\n {\n \"address\": \"0xRecipient1Address\",\n \"amount\": \"10.5\",\n \"id\": \"{{assetId1}}\",\n \"metadata\": {\n \"employeeId\": \"EMP001\"\n },\n \"note\": \"Salary payment\",\n \"reference\": \"payout-001\"\n },\n {\n \"address\": \"0xRecipient2Address\",\n \"amount\": \"25.0\",\n \"id\": \"{{assetId2}}\",\n \"metadata\": {\n \"invoiceId\": \"INV-123\"\n },\n \"note\": \"Vendor payment\",\n \"reference\": \"payout-002\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.blockradar.co/v1/wallets/{walletId}/withdraw")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assets\": [\n {\n \"address\": \"0xRecipient1Address\",\n \"amount\": \"10.5\",\n \"id\": \"{{assetId1}}\",\n \"metadata\": {\n \"employeeId\": \"EMP001\"\n },\n \"note\": \"Salary payment\",\n \"reference\": \"payout-001\"\n },\n {\n \"address\": \"0xRecipient2Address\",\n \"amount\": \"25.0\",\n \"id\": \"{{assetId2}}\",\n \"metadata\": {\n \"invoiceId\": \"INV-123\"\n },\n \"note\": \"Vendor payment\",\n \"reference\": \"payout-002\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"amlScreening": null,
"amount": "10",
"amountPaid": "10",
"asset": {
"address": "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
"blockchain": {
"createdAt": "2024-05-14T11:53:33.095Z",
"derivationPath": "m/44'/60'/0'/0",
"id": "85ffc132-3972-4c9e-99a5-5cf0ccb688bf",
"isActive": true,
"isEvmCompatible": true,
"logoUrl": "https://res.cloudinary.com/blockradar/image/upload/v1716800081/crypto-assets/ethereum-eth-logo_idraq2.png",
"name": "ethereum",
"slug": "ethereum",
"symbol": "eth",
"tokenStandard": "ERC20",
"updatedAt": "2024-06-14T22:32:11.983Z"
},
"createdAt": "2024-05-14T11:53:33.682Z",
"decimals": 6,
"id": "fe04a28c-c615-4e41-8eda-f84c862864f5",
"isActive": true,
"logoUrl": "https://res.cloudinary.com/blockradar/image/upload/v1716800083/crypto-assets/usd-coin-usdc-logo_fs9mhv.png",
"name": "USDC Coin",
"network": "testnet",
"standard": "ERC20",
"symbol": "USDC",
"updatedAt": "2024-06-14T22:32:12.589Z"
},
"assetSwept": null,
"assetSweptAmount": null,
"assetSweptAt": null,
"assetSweptGasFee": null,
"assetSweptHash": null,
"assetSweptRecipientAddress": null,
"assetSweptResponse": null,
"assetSweptSenderAddress": null,
"blockHash": null,
"blockNumber": null,
"blockchain": {
"createdAt": "2024-05-14T11:53:33.095Z",
"derivationPath": "m/44'/60'/0'/0",
"id": "85ffc132-3972-4c9e-99a5-5cf0ccb688bf",
"isActive": true,
"isEvmCompatible": true,
"logoUrl": "https://res.cloudinary.com/blockradar/image/upload/v1716800081/crypto-assets/ethereum-eth-logo_idraq2.png",
"name": "ethereum",
"slug": "ethereum",
"symbol": "eth",
"tokenStandard": "ERC20",
"updatedAt": "2024-06-14T22:32:11.983Z"
},
"chainId": null,
"confirmations": null,
"confirmed": false,
"createdAt": "2024-10-23T11:33:58.765Z",
"currency": "USD",
"fee": null,
"feeMetadata": null,
"gasFee": null,
"gasPrice": null,
"gasUsed": null,
"hash": "0xded90bc7f3d98f5ff0c3a97f711717192e83e01d89ac1ff4483ae6fd9d229e6d",
"id": "081d6315-159f-4c38-b02a-c4708836c5bd",
"metadata": null,
"network": "testnet",
"note": null,
"reason": null,
"recipientAddress": "0x2455eC6700092991Ce0782365A89d5Cd89c8Fa22",
"senderAddress": "0x947514e4B803e312C312da0F1B41fEDdbe15ae7a",
"status": "PENDING",
"tokenAddress": null,
"type": "WITHDRAW",
"updatedAt": "2024-10-23T11:33:58.765Z",
"wallet": {
"id": "d236a191-c1d4-423c-a439-54ce6542ca41"
}
},
"message": "Withdrawal request initiated successfully",
"statusCode": 200
}
Authorizations
Path Parameters
Example:
"YOUR_WALLET_ID"
Body
application/json
The destination wallet address. Stellar accepts classic (G...), muxed (M...), and Soroban contract (C...) recipients. Contract recipients are valid for token assets only, not native XLM.
Show child attributes
Show child attributes
Example:
[ { "address": "0xRecipient1Address", "amount": "10.5", "id": "{{assetId1}}", "metadata": { "employeeId": "EMP001" }, "note": "Salary payment", "reference": "payout-001" }, { "address": "0xRecipient2Address", "amount": "25.0", "id": "{{assetId2}}", "metadata": { "invoiceId": "INV-123" }, "note": "Vendor payment", "reference": "payout-002" } ]
Stellar only. Sets the memo of a withdrawal to a G... recipient, separately from note. Requests that include it for a non-Stellar wallet, or for an M... muxed or C... contract recipient, return a 400. When omitted, note is sent as the memo (an all-digit note as a memo ID, anything else as a text memo of up to 28 bytes). The memo is validated when the request is made. See Memos on Stellar.
Show child attributes
Show child attributes
Example:
{ "type": "memo_id", "value": "10012345" }

