private/request_vault_withdraw
Submits a signed withdraw action that enqueues a request to burn a given number of vault shares and redeem the proceeds to the user’s subaccount. Inputs are the vault subaccount and the share quantity to burn (decimal string). Returns an acknowledgement with the queued request; requires the user-withdraw permission.
curl --request POST \
--url https://api.derive.xyz/v3/private/request_vault_withdraw \
--header 'Content-Type: application/json' \
--header 'X-DeriveSignature: <api-key>' \
--header 'X-DeriveTimestamp: <api-key>' \
--header 'X-DeriveWallet: <api-key>' \
--data '
{
"nonce": "<string>",
"shares_to_burn": "<string>",
"signature": "<string>",
"signature_expiry_sec": 1,
"signer": "<string>",
"subaccount_id": 1,
"vault_subaccount_id": 1
}
'import requests
url = "https://api.derive.xyz/v3/private/request_vault_withdraw"
payload = {
"nonce": "<string>",
"shares_to_burn": "<string>",
"signature": "<string>",
"signature_expiry_sec": 1,
"signer": "<string>",
"subaccount_id": 1,
"vault_subaccount_id": 1
}
headers = {
"X-DeriveWallet": "<api-key>",
"X-DeriveTimestamp": "<api-key>",
"X-DeriveSignature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-DeriveWallet': '<api-key>',
'X-DeriveTimestamp': '<api-key>',
'X-DeriveSignature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
nonce: '<string>',
shares_to_burn: '<string>',
signature: '<string>',
signature_expiry_sec: 1,
signer: '<string>',
subaccount_id: 1,
vault_subaccount_id: 1
})
};
fetch('https://api.derive.xyz/v3/private/request_vault_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.derive.xyz/v3/private/request_vault_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([
'nonce' => '<string>',
'shares_to_burn' => '<string>',
'signature' => '<string>',
'signature_expiry_sec' => 1,
'signer' => '<string>',
'subaccount_id' => 1,
'vault_subaccount_id' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-DeriveSignature: <api-key>",
"X-DeriveTimestamp: <api-key>",
"X-DeriveWallet: <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.derive.xyz/v3/private/request_vault_withdraw"
payload := strings.NewReader("{\n \"nonce\": \"<string>\",\n \"shares_to_burn\": \"<string>\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 1,\n \"signer\": \"<string>\",\n \"subaccount_id\": 1,\n \"vault_subaccount_id\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-DeriveWallet", "<api-key>")
req.Header.Add("X-DeriveTimestamp", "<api-key>")
req.Header.Add("X-DeriveSignature", "<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.derive.xyz/v3/private/request_vault_withdraw")
.header("X-DeriveWallet", "<api-key>")
.header("X-DeriveTimestamp", "<api-key>")
.header("X-DeriveSignature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"nonce\": \"<string>\",\n \"shares_to_burn\": \"<string>\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 1,\n \"signer\": \"<string>\",\n \"subaccount_id\": 1,\n \"vault_subaccount_id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/private/request_vault_withdraw")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-DeriveWallet"] = '<api-key>'
request["X-DeriveTimestamp"] = '<api-key>'
request["X-DeriveSignature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"nonce\": \"<string>\",\n \"shares_to_burn\": \"<string>\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 1,\n \"signer\": \"<string>\",\n \"subaccount_id\": 1,\n \"vault_subaccount_id\": 1\n}"
response = http.request(request)
puts response.read_body{
"request_id": {
"vault_nonce": "<string>",
"vault_subaccount_id": 1,
"wallet": "<string>"
}
}{
"error": {
"code": 123,
"message": "<string>",
"data": "<string>"
}
}Authorizations
The wallet the request acts for.
The current time in milliseconds, as a decimal string.
EIP-191 signature of the timestamp, by the wallet or one of its session keys.
Body
Fields common to every signed vault action. They appear alongside each endpoint's action-specific parameters in the same request object.
Number of vault shares to burn, as a decimal string.
0x-prefixed hex of the 65-byte EOA signature.
x >= 020-byte Ethereum address as a 0x-prefixed lowercase hex string.
42^0x[0-9a-fA-F]{40}$The subaccount the action is signed on; which subaccount applies depends on the specific method — see that method's reference.
x >= 0x >= 0Response
Success
Returned by request_vault_deposit / request_vault_withdraw: the id the queued request was assigned (the user's handle for polling / cancelling).
Composite vault request id: (vault_subaccount_id, wallet, vault_nonce)
Useful as a stable dedup key across off-chain and on-chain vault events.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.derive.xyz/v3/private/request_vault_withdraw \
--header 'Content-Type: application/json' \
--header 'X-DeriveSignature: <api-key>' \
--header 'X-DeriveTimestamp: <api-key>' \
--header 'X-DeriveWallet: <api-key>' \
--data '
{
"nonce": "<string>",
"shares_to_burn": "<string>",
"signature": "<string>",
"signature_expiry_sec": 1,
"signer": "<string>",
"subaccount_id": 1,
"vault_subaccount_id": 1
}
'import requests
url = "https://api.derive.xyz/v3/private/request_vault_withdraw"
payload = {
"nonce": "<string>",
"shares_to_burn": "<string>",
"signature": "<string>",
"signature_expiry_sec": 1,
"signer": "<string>",
"subaccount_id": 1,
"vault_subaccount_id": 1
}
headers = {
"X-DeriveWallet": "<api-key>",
"X-DeriveTimestamp": "<api-key>",
"X-DeriveSignature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-DeriveWallet': '<api-key>',
'X-DeriveTimestamp': '<api-key>',
'X-DeriveSignature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
nonce: '<string>',
shares_to_burn: '<string>',
signature: '<string>',
signature_expiry_sec: 1,
signer: '<string>',
subaccount_id: 1,
vault_subaccount_id: 1
})
};
fetch('https://api.derive.xyz/v3/private/request_vault_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.derive.xyz/v3/private/request_vault_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([
'nonce' => '<string>',
'shares_to_burn' => '<string>',
'signature' => '<string>',
'signature_expiry_sec' => 1,
'signer' => '<string>',
'subaccount_id' => 1,
'vault_subaccount_id' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-DeriveSignature: <api-key>",
"X-DeriveTimestamp: <api-key>",
"X-DeriveWallet: <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.derive.xyz/v3/private/request_vault_withdraw"
payload := strings.NewReader("{\n \"nonce\": \"<string>\",\n \"shares_to_burn\": \"<string>\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 1,\n \"signer\": \"<string>\",\n \"subaccount_id\": 1,\n \"vault_subaccount_id\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-DeriveWallet", "<api-key>")
req.Header.Add("X-DeriveTimestamp", "<api-key>")
req.Header.Add("X-DeriveSignature", "<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.derive.xyz/v3/private/request_vault_withdraw")
.header("X-DeriveWallet", "<api-key>")
.header("X-DeriveTimestamp", "<api-key>")
.header("X-DeriveSignature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"nonce\": \"<string>\",\n \"shares_to_burn\": \"<string>\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 1,\n \"signer\": \"<string>\",\n \"subaccount_id\": 1,\n \"vault_subaccount_id\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/private/request_vault_withdraw")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-DeriveWallet"] = '<api-key>'
request["X-DeriveTimestamp"] = '<api-key>'
request["X-DeriveSignature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"nonce\": \"<string>\",\n \"shares_to_burn\": \"<string>\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 1,\n \"signer\": \"<string>\",\n \"subaccount_id\": 1,\n \"vault_subaccount_id\": 1\n}"
response = http.request(request)
puts response.read_body{
"request_id": {
"vault_nonce": "<string>",
"vault_subaccount_id": 1,
"wallet": "<string>"
}
}{
"error": {
"code": 123,
"message": "<string>",
"data": "<string>"
}
}