private/accept_block_proposal
Accepts a block proposal and executes its block trade at once. The caller signs the taker side of private/execute_block_trade for its own subaccount, over the legs and prices of the proposal, in the opposite direction to the proposal’s direction. Send proposal_id with the signed fields subaccount_id, nonce, signer, max_fee, signature_expiry_sec and signature. The params have no legs or direction: the exchange uses those of the proposal, so a side signed over other terms fails the signature check. The first valid accept wins. The block trade executes at the prices of the proposal, with no broker fee. Returns the proposal with status executed and its block_trade_id. A failed accept leaves the proposal open, unless the maker side can no longer execute. The proposal is then cancelled, and the accept fails with block_proposal_not_open (11118). The error of a failed accept has no details, so it shows nothing about the maker. The caller can check its own side with private/verify_block_trade. If the outcome of the block trade is not known, the proposal stays executing until it expires, and private/get_block_trades shows whether the block trade executed. Fails with block_proposal_not_found (11117) if no proposal has that id, or if the proposal has a recipient_wallet that is not the caller’s wallet. Fails with block_proposal_not_open (11118) if the proposal is not open: it executed, was cancelled or declined, expired, or another accept is in progress. Fails with block_trade_same_owner (11115) if the caller’s wallet made the proposal, and with block_trade_outside_price_band (11123) if the total cost is now outside the price band. Requires the block_trade off-chain scope. A session key that signs the side needs block_trade and an RFQ trade scope for every instrument in the legs.
curl --request POST \
--url https://api.derive.xyz/v3/private/accept_block_proposal \
--header 'Content-Type: application/json' \
--header 'X-DeriveSignature: <api-key>' \
--header 'X-DeriveTimestamp: <api-key>' \
--header 'X-DeriveWallet: <api-key>' \
--data '
{
"max_fee": "<string>",
"nonce": "<string>",
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<string>",
"signature_expiry_sec": 123,
"signer": "<string>",
"subaccount_id": 123
}
'import requests
url = "https://api.derive.xyz/v3/private/accept_block_proposal"
payload = {
"max_fee": "<string>",
"nonce": "<string>",
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<string>",
"signature_expiry_sec": 123,
"signer": "<string>",
"subaccount_id": 123
}
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({
max_fee: '<string>',
nonce: '<string>',
proposal_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
signature: '<string>',
signature_expiry_sec: 123,
signer: '<string>',
subaccount_id: 123
})
};
fetch('https://api.derive.xyz/v3/private/accept_block_proposal', 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/accept_block_proposal",
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([
'max_fee' => '<string>',
'nonce' => '<string>',
'proposal_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'signature' => '<string>',
'signature_expiry_sec' => 123,
'signer' => '<string>',
'subaccount_id' => 123
]),
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/accept_block_proposal"
payload := strings.NewReader("{\n \"max_fee\": \"<string>\",\n \"nonce\": \"<string>\",\n \"proposal_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 123,\n \"signer\": \"<string>\",\n \"subaccount_id\": 123\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/accept_block_proposal")
.header("X-DeriveWallet", "<api-key>")
.header("X-DeriveTimestamp", "<api-key>")
.header("X-DeriveSignature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"max_fee\": \"<string>\",\n \"nonce\": \"<string>\",\n \"proposal_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 123,\n \"signer\": \"<string>\",\n \"subaccount_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/private/accept_block_proposal")
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 \"max_fee\": \"<string>\",\n \"nonce\": \"<string>\",\n \"proposal_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 123,\n \"signer\": \"<string>\",\n \"subaccount_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"block_trade_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"creation_timestamp": 123,
"currency": "<string>",
"direction": "buy",
"expires_at_sec": 123,
"last_update_timestamp": 123,
"legs": [
{
"amount": "<string>",
"direction": "buy",
"instrument_name": "<string>",
"price": "<string>"
}
],
"listed": true,
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"risk_universe_id": 1,
"status": "open"
}{
"error": {
"code": 123,
"message": "<string>",
"data": "<string>"
}
}Authorizations
Body
The caller's taker side, signed as for private/execute_block_trade over the legs of the proposal, in the opposite direction.
Response
Success
A block proposal as every other wallet sees it.
curl --request POST \
--url https://api.derive.xyz/v3/private/accept_block_proposal \
--header 'Content-Type: application/json' \
--header 'X-DeriveSignature: <api-key>' \
--header 'X-DeriveTimestamp: <api-key>' \
--header 'X-DeriveWallet: <api-key>' \
--data '
{
"max_fee": "<string>",
"nonce": "<string>",
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<string>",
"signature_expiry_sec": 123,
"signer": "<string>",
"subaccount_id": 123
}
'import requests
url = "https://api.derive.xyz/v3/private/accept_block_proposal"
payload = {
"max_fee": "<string>",
"nonce": "<string>",
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"signature": "<string>",
"signature_expiry_sec": 123,
"signer": "<string>",
"subaccount_id": 123
}
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({
max_fee: '<string>',
nonce: '<string>',
proposal_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
signature: '<string>',
signature_expiry_sec: 123,
signer: '<string>',
subaccount_id: 123
})
};
fetch('https://api.derive.xyz/v3/private/accept_block_proposal', 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/accept_block_proposal",
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([
'max_fee' => '<string>',
'nonce' => '<string>',
'proposal_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'signature' => '<string>',
'signature_expiry_sec' => 123,
'signer' => '<string>',
'subaccount_id' => 123
]),
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/accept_block_proposal"
payload := strings.NewReader("{\n \"max_fee\": \"<string>\",\n \"nonce\": \"<string>\",\n \"proposal_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 123,\n \"signer\": \"<string>\",\n \"subaccount_id\": 123\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/accept_block_proposal")
.header("X-DeriveWallet", "<api-key>")
.header("X-DeriveTimestamp", "<api-key>")
.header("X-DeriveSignature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"max_fee\": \"<string>\",\n \"nonce\": \"<string>\",\n \"proposal_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 123,\n \"signer\": \"<string>\",\n \"subaccount_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/private/accept_block_proposal")
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 \"max_fee\": \"<string>\",\n \"nonce\": \"<string>\",\n \"proposal_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"signature\": \"<string>\",\n \"signature_expiry_sec\": 123,\n \"signer\": \"<string>\",\n \"subaccount_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"block_trade_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"creation_timestamp": 123,
"currency": "<string>",
"direction": "buy",
"expires_at_sec": 123,
"last_update_timestamp": 123,
"legs": [
{
"amount": "<string>",
"direction": "buy",
"instrument_name": "<string>",
"price": "<string>"
}
],
"listed": true,
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"risk_universe_id": 1,
"status": "open"
}{
"error": {
"code": 123,
"message": "<string>",
"data": "<string>"
}
}