private/send_rfq
Taker-side call that opens a new RFQ for a multi-leg structure on a subaccount, inviting makers to quote it. You supply the legs (instrument, amount, and direction per leg) plus optional min/max total cost limits that filter only the best quote, a partial-fill step, a label, and a list of specific counterparties to restrict who can see it. Returns the created RFQ including its assigned id and validity window. Requires trade scope for every instrument in the legs.
curl --request POST \
--url https://api.derive.xyz/v3/private/send_rfq \
--header 'Content-Type: application/json' \
--header 'X-DeriveSignature: <api-key>' \
--header 'X-DeriveTimestamp: <api-key>' \
--header 'X-DeriveWallet: <api-key>' \
--data '
{
"legs": [
{
"amount": "<string>",
"instrument_name": "<string>"
}
],
"subaccount_id": 1,
"client": "",
"counterparties": null,
"extra_fee": "0",
"label": "",
"max_total_cost": null,
"min_total_cost": null,
"partial_fill_step": "1",
"referral_code": ""
}
'import requests
url = "https://api.derive.xyz/v3/private/send_rfq"
payload = {
"legs": [
{
"amount": "<string>",
"instrument_name": "<string>"
}
],
"subaccount_id": 1,
"client": "",
"counterparties": None,
"extra_fee": "0",
"label": "",
"max_total_cost": None,
"min_total_cost": None,
"partial_fill_step": "1",
"referral_code": ""
}
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({
legs: [{amount: '<string>', instrument_name: '<string>'}],
subaccount_id: 1,
client: '',
counterparties: null,
extra_fee: '0',
label: '',
max_total_cost: null,
min_total_cost: null,
partial_fill_step: '1',
referral_code: ''
})
};
fetch('https://api.derive.xyz/v3/private/send_rfq', 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/send_rfq",
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([
'legs' => [
[
'amount' => '<string>',
'instrument_name' => '<string>'
]
],
'subaccount_id' => 1,
'client' => '',
'counterparties' => null,
'extra_fee' => '0',
'label' => '',
'max_total_cost' => null,
'min_total_cost' => null,
'partial_fill_step' => '1',
'referral_code' => ''
]),
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/send_rfq"
payload := strings.NewReader("{\n \"legs\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\"\n }\n ],\n \"subaccount_id\": 1,\n \"client\": \"\",\n \"counterparties\": null,\n \"extra_fee\": \"0\",\n \"label\": \"\",\n \"max_total_cost\": null,\n \"min_total_cost\": null,\n \"partial_fill_step\": \"1\",\n \"referral_code\": \"\"\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/send_rfq")
.header("X-DeriveWallet", "<api-key>")
.header("X-DeriveTimestamp", "<api-key>")
.header("X-DeriveSignature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"legs\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\"\n }\n ],\n \"subaccount_id\": 1,\n \"client\": \"\",\n \"counterparties\": null,\n \"extra_fee\": \"0\",\n \"label\": \"\",\n \"max_total_cost\": null,\n \"min_total_cost\": null,\n \"partial_fill_step\": \"1\",\n \"referral_code\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/private/send_rfq")
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 \"legs\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\"\n }\n ],\n \"subaccount_id\": 1,\n \"client\": \"\",\n \"counterparties\": null,\n \"extra_fee\": \"0\",\n \"label\": \"\",\n \"max_total_cost\": null,\n \"min_total_cost\": null,\n \"partial_fill_step\": \"1\",\n \"referral_code\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"ask_total_cost": "<string>",
"bid_total_cost": "<string>",
"cancel_reason": "",
"creation_timestamp": 123,
"filled_pct": "<string>",
"label": "<string>",
"last_update_timestamp": 123,
"legs": [
{
"amount": "<string>",
"direction": "buy",
"instrument_name": "<string>"
}
],
"mark_total_cost": "<string>",
"max_total_cost": "<string>",
"min_total_cost": "<string>",
"partial_fill_step": "<string>",
"rfq_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "open",
"subaccount_id": 123,
"total_cost": "<string>",
"valid_until": 123,
"wallet": "<string>",
"counterparties": [
"<string>"
],
"filled_direction": "buy"
}{
"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
Show child attributes
Show child attributes
x >= 0Non-negative decimal string of the human value (e.g. "1.5"), up to 12 fractional digits; a string or JSON number is accepted
Highest total cost you accept when you execute as buyer (direction: buy). Optional decimal string (e.g. "500") or JSON number.
Total cost is in USD for the full RFQ size, from your side of the trade. A positive cost means you pay. A negative cost means you receive.
private/rfq_get_best_quote and the {subaccount_id}.best.quotes channel skip quotes above this value. This is a quote filter only. private/execute_quote does not check it, and private/poll_quotes returns all quotes. Makers do not see this value.
Highest total cost you accept when you execute as seller (direction: sell). Optional decimal string (e.g. "-180") or JSON number.
It uses the same sign as max_total_cost, so a sale that pays you has a negative cost. To set the smallest amount you will receive, send that amount as a negative number. For example, -180 skips quotes that pay you less than 180. A positive value such as 180 skips only quotes that cost you more than 180.
It applies in the same places as max_total_cost. private/execute_quote does not check it. Makers do not see this value.
Non-negative decimal string of the human value (e.g. "1.5"), up to 12 fractional digits; a string or JSON number is accepted
Response
Success
Optional decimal string of the human value (e.g. "1.5"), up to 12 fractional digits, or null; a string or JSON number is accepted
Optional decimal string of the human value (e.g. "1.5"), up to 12 fractional digits, or null; a string or JSON number is accepted
, user_request, insufficient_margin, signed_max_fee_too_low, mmp_trigger, cancel_on_disconnect, session_key_deregistered, subaccount_withdrawn, rfq_no_longer_open, compliance, validation_failed Non-negative decimal string of the human value (e.g. "1.5"), up to 12 fractional digits; a string or JSON number is accepted
Show child attributes
Show child attributes
Optional decimal string of the human value (e.g. "1.5"), up to 12 fractional digits, or null; a string or JSON number is accepted
The max_total_cost sent with the RFQ, as a decimal string, or null. It filters the best quote only. See private/send_rfq.
The min_total_cost sent with the RFQ, as a decimal string, or null. It filters the best quote only. See private/send_rfq.
Non-negative decimal string of the human value (e.g. "1.5"), up to 12 fractional digits; a string or JSON number is accepted
UUID v4 string
open, filled, cancelled, expired Optional decimal string of the human value (e.g. "1.5"), up to 12 fractional digits, or null; a string or JSON number is accepted
20-byte Ethereum address as a 0x-prefixed lowercase hex string.
42^0x[0-9a-fA-F]{40}$20-byte Ethereum address as a 0x-prefixed lowercase hex string.
42^0x[0-9a-fA-F]{40}$buy, sell curl --request POST \
--url https://api.derive.xyz/v3/private/send_rfq \
--header 'Content-Type: application/json' \
--header 'X-DeriveSignature: <api-key>' \
--header 'X-DeriveTimestamp: <api-key>' \
--header 'X-DeriveWallet: <api-key>' \
--data '
{
"legs": [
{
"amount": "<string>",
"instrument_name": "<string>"
}
],
"subaccount_id": 1,
"client": "",
"counterparties": null,
"extra_fee": "0",
"label": "",
"max_total_cost": null,
"min_total_cost": null,
"partial_fill_step": "1",
"referral_code": ""
}
'import requests
url = "https://api.derive.xyz/v3/private/send_rfq"
payload = {
"legs": [
{
"amount": "<string>",
"instrument_name": "<string>"
}
],
"subaccount_id": 1,
"client": "",
"counterparties": None,
"extra_fee": "0",
"label": "",
"max_total_cost": None,
"min_total_cost": None,
"partial_fill_step": "1",
"referral_code": ""
}
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({
legs: [{amount: '<string>', instrument_name: '<string>'}],
subaccount_id: 1,
client: '',
counterparties: null,
extra_fee: '0',
label: '',
max_total_cost: null,
min_total_cost: null,
partial_fill_step: '1',
referral_code: ''
})
};
fetch('https://api.derive.xyz/v3/private/send_rfq', 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/send_rfq",
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([
'legs' => [
[
'amount' => '<string>',
'instrument_name' => '<string>'
]
],
'subaccount_id' => 1,
'client' => '',
'counterparties' => null,
'extra_fee' => '0',
'label' => '',
'max_total_cost' => null,
'min_total_cost' => null,
'partial_fill_step' => '1',
'referral_code' => ''
]),
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/send_rfq"
payload := strings.NewReader("{\n \"legs\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\"\n }\n ],\n \"subaccount_id\": 1,\n \"client\": \"\",\n \"counterparties\": null,\n \"extra_fee\": \"0\",\n \"label\": \"\",\n \"max_total_cost\": null,\n \"min_total_cost\": null,\n \"partial_fill_step\": \"1\",\n \"referral_code\": \"\"\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/send_rfq")
.header("X-DeriveWallet", "<api-key>")
.header("X-DeriveTimestamp", "<api-key>")
.header("X-DeriveSignature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"legs\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\"\n }\n ],\n \"subaccount_id\": 1,\n \"client\": \"\",\n \"counterparties\": null,\n \"extra_fee\": \"0\",\n \"label\": \"\",\n \"max_total_cost\": null,\n \"min_total_cost\": null,\n \"partial_fill_step\": \"1\",\n \"referral_code\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/private/send_rfq")
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 \"legs\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\"\n }\n ],\n \"subaccount_id\": 1,\n \"client\": \"\",\n \"counterparties\": null,\n \"extra_fee\": \"0\",\n \"label\": \"\",\n \"max_total_cost\": null,\n \"min_total_cost\": null,\n \"partial_fill_step\": \"1\",\n \"referral_code\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"ask_total_cost": "<string>",
"bid_total_cost": "<string>",
"cancel_reason": "",
"creation_timestamp": 123,
"filled_pct": "<string>",
"label": "<string>",
"last_update_timestamp": 123,
"legs": [
{
"amount": "<string>",
"direction": "buy",
"instrument_name": "<string>"
}
],
"mark_total_cost": "<string>",
"max_total_cost": "<string>",
"min_total_cost": "<string>",
"partial_fill_step": "<string>",
"rfq_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "open",
"subaccount_id": 123,
"total_cost": "<string>",
"valid_until": 123,
"wallet": "<string>",
"counterparties": [
"<string>"
],
"filled_direction": "buy"
}{
"error": {
"code": 123,
"message": "<string>",
"data": "<string>"
}
}