curl --request GET \
--url https://test.deribit.com/api/v2/private/set_mmp_config \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": 7859,
"method": "private/set_mmp_config",
"params": {
"index_name": "btc_usd",
"mmp_group": "MassQuoteBot7",
"interval": 60,
"frozen_time": 0,
"quantity_limit": 3,
"max_quote_quantity": 2.5
}
}
'import requests
url = "https://test.deribit.com/api/v2/private/set_mmp_config"
payload = {
"jsonrpc": "2.0",
"id": 7859,
"method": "private/set_mmp_config",
"params": {
"index_name": "btc_usd",
"mmp_group": "MassQuoteBot7",
"interval": 60,
"frozen_time": 0,
"quantity_limit": 3,
"max_quote_quantity": 2.5
}
}
headers = {"Content-Type": "application/json"}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: 7859,
method: 'private/set_mmp_config',
params: {
index_name: 'btc_usd',
mmp_group: 'MassQuoteBot7',
interval: 60,
frozen_time: 0,
quantity_limit: 3,
max_quote_quantity: 2.5
}
})
};
fetch('https://test.deribit.com/api/v2/private/set_mmp_config', 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://test.deribit.com/api/v2/private/set_mmp_config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => 7859,
'method' => 'private/set_mmp_config',
'params' => [
'index_name' => 'btc_usd',
'mmp_group' => 'MassQuoteBot7',
'interval' => 60,
'frozen_time' => 0,
'quantity_limit' => 3,
'max_quote_quantity' => 2.5
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://test.deribit.com/api/v2/private/set_mmp_config"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": 7859,\n \"method\": \"private/set_mmp_config\",\n \"params\": {\n \"index_name\": \"btc_usd\",\n \"mmp_group\": \"MassQuoteBot7\",\n \"interval\": 60,\n \"frozen_time\": 0,\n \"quantity_limit\": 3,\n \"max_quote_quantity\": 2.5\n }\n}")
req, _ := http.NewRequest("GET", url, payload)
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.get("https://test.deribit.com/api/v2/private/set_mmp_config")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": 7859,\n \"method\": \"private/set_mmp_config\",\n \"params\": {\n \"index_name\": \"btc_usd\",\n \"mmp_group\": \"MassQuoteBot7\",\n \"interval\": 60,\n \"frozen_time\": 0,\n \"quantity_limit\": 3,\n \"max_quote_quantity\": 2.5\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.deribit.com/api/v2/private/set_mmp_config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": 7859,\n \"method\": \"private/set_mmp_config\",\n \"params\": {\n \"index_name\": \"btc_usd\",\n \"mmp_group\": \"MassQuoteBot7\",\n \"interval\": 60,\n \"frozen_time\": 0,\n \"quantity_limit\": 3,\n \"max_quote_quantity\": 2.5\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 7859,
"method": "private/set_mmp_config",
"result": {
"index_name": "btc_usd",
"mmp_group": "MassQuoteBot7",
"interval": 60,
"frozen_time": 0,
"quantity_limit": 3,
"max_quote_quantity": 2.5
}
}private/set_mmp_config
Configures Market Maker Protection (MMP) for a specific index. This method sets the monitoring window, freeze duration, and exposure limits (quantity, delta, vega, and Maximum Quote Quantity).
At least one limit parameter must be set. Maximum Quote Quantity (MQQ) is a required parameter that limits the total combined size of open MMP orders. MQQ is configured per index but enforced per side, per order book (instrument).
The interval parameter defines the monitoring window duration in seconds. The frozen_time parameter sets how long MMP remains active after being triggered. Set frozen_time to 0 to disable automatic reset (manual reset required).
For Mass Quotes, use the mmp_group parameter to configure MMP for a specific group. Set block_rfq to true to configure MMP for Block RFQ (requires block_rfq:read_write scope). Set interval to 0 to remove MMP configuration.
MMP margin reservation (MQQ-based Initial Margin)
Setting a non-zero max_quote_quantity immediately reserves Initial Margin equal to MQQ Γ 3%. This reservation is unconditional and continuous β it is held from the moment the config is active regardless of whether you have any open positions or open orders. Multiple MMP groups on the same currency pair each contribute independently. The reserved margin is visible in the Portfolio Margin section of the platform.
To release the reserved margin, remove the MMP configuration entirely by calling this method with interval = 0. Setting interval to 0 deletes the configuration entry for the specified index_name (and mmp_group if provided), which immediately frees all margin reserved by that config entry.
π Related Article: Market Maker Protection API Configuration
Scope: trade:read_write or block_rfq:read_write (when block_rfq = true)
curl --request GET \
--url https://test.deribit.com/api/v2/private/set_mmp_config \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": 7859,
"method": "private/set_mmp_config",
"params": {
"index_name": "btc_usd",
"mmp_group": "MassQuoteBot7",
"interval": 60,
"frozen_time": 0,
"quantity_limit": 3,
"max_quote_quantity": 2.5
}
}
'import requests
url = "https://test.deribit.com/api/v2/private/set_mmp_config"
payload = {
"jsonrpc": "2.0",
"id": 7859,
"method": "private/set_mmp_config",
"params": {
"index_name": "btc_usd",
"mmp_group": "MassQuoteBot7",
"interval": 60,
"frozen_time": 0,
"quantity_limit": 3,
"max_quote_quantity": 2.5
}
}
headers = {"Content-Type": "application/json"}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: 7859,
method: 'private/set_mmp_config',
params: {
index_name: 'btc_usd',
mmp_group: 'MassQuoteBot7',
interval: 60,
frozen_time: 0,
quantity_limit: 3,
max_quote_quantity: 2.5
}
})
};
fetch('https://test.deribit.com/api/v2/private/set_mmp_config', 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://test.deribit.com/api/v2/private/set_mmp_config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => 7859,
'method' => 'private/set_mmp_config',
'params' => [
'index_name' => 'btc_usd',
'mmp_group' => 'MassQuoteBot7',
'interval' => 60,
'frozen_time' => 0,
'quantity_limit' => 3,
'max_quote_quantity' => 2.5
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://test.deribit.com/api/v2/private/set_mmp_config"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": 7859,\n \"method\": \"private/set_mmp_config\",\n \"params\": {\n \"index_name\": \"btc_usd\",\n \"mmp_group\": \"MassQuoteBot7\",\n \"interval\": 60,\n \"frozen_time\": 0,\n \"quantity_limit\": 3,\n \"max_quote_quantity\": 2.5\n }\n}")
req, _ := http.NewRequest("GET", url, payload)
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.get("https://test.deribit.com/api/v2/private/set_mmp_config")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": 7859,\n \"method\": \"private/set_mmp_config\",\n \"params\": {\n \"index_name\": \"btc_usd\",\n \"mmp_group\": \"MassQuoteBot7\",\n \"interval\": 60,\n \"frozen_time\": 0,\n \"quantity_limit\": 3,\n \"max_quote_quantity\": 2.5\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.deribit.com/api/v2/private/set_mmp_config")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": 7859,\n \"method\": \"private/set_mmp_config\",\n \"params\": {\n \"index_name\": \"btc_usd\",\n \"mmp_group\": \"MassQuoteBot7\",\n \"interval\": 60,\n \"frozen_time\": 0,\n \"quantity_limit\": 3,\n \"max_quote_quantity\": 2.5\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 7859,
"method": "private/set_mmp_config",
"result": {
"index_name": "btc_usd",
"mmp_group": "MassQuoteBot7",
"interval": 60,
"frozen_time": 0,
"quantity_limit": 3,
"max_quote_quantity": 2.5
}
}Query Parameters
Index identifier of derivative instrument on the platform
btc_usd, eth_usd, btc_usdc, eth_usdc, ada_usdc, algo_usdc, avax_usdc, bch_usdc, bnb_usdc, doge_usdc, dot_usdc, hype_usdc, link_usdc, ltc_usdc, near_usdc, paxg_usdc, shib_usdc, sol_usdc, ton_usdc, trx_usdc, trump_usdc, uni_usdc, xrp_usdc, usde_usdc, buidl_usdc, btcdvol_usdc, ethdvol_usdc, btc_usdt, eth_usdt, all The duration of the monitoring window in seconds. For example, an interval of 3 implies a 3-second window.
The interval begins after the first trade. If a new trade is executed after the interval has ended, a new interval is started, and counters reset. If a trade occurs during an already running interval, that interval continues unaffected.
This mechanism allows the platform to track activity in short, rolling windows to identify potentially risky trading behavior.
If set to 0, the entire MMP configuration entry for this index_name (and mmp_group) is removed. This also releases any Initial Margin that was reserved by max_quote_quantity.
Maximum value: 3600 seconds (1 hour).
0 <= x <= 360060
Time in seconds that MMP remains active after being triggered. Once this frozen period has passed, MMP will automatically reset, allowing new orders to be submitted.
If you want to disable automatic reset, set frozen_time to 0. In that case, a manual reset is required using the private/reset_mmp method.
Manual reset is also possible during the frozen time period.
Maximum value: 3600 seconds (1 hour).
0 <= x <= 36000
Designates the MMP group for which the configuration is being set. If the specified group is already associated with a different index_name, an error is returned. This parameter enables distinct configurations for each MMP group, linked to particular index_name. Maximum 64 characters. Case sensitive.
Omitting this parameter targets the orders MMP group β the default group used for regular orders with the mmp flag set. This is not an error or an incomplete request.
Passing an explicit empty string ("") is not allowed and returns an error. Only omitting the parameter reaches the orders MMP group.
π Related Article: Mass Quotes Specifications
"MassQuoteBot7"
The total traded quantity, measured in units of the base currency (e.g., BTC in BTC-PERPETUAL), within the interval.
This count is direction-agnosticβa buy followed by a sell counts double.
Example: Buy 10 BTC and sell 10 BTC = 20 total quantity.
Applicable to both options and futures.
Positive value with maximum 4 decimal places.
3
The maximum allowable net transaction delta change during the interval.
Expressed in units of base currency.
The delta_limit is treated as an absolute threshold: e.g., delta_limit: 10 β MMP is triggered if net transaction delta exceeds +10 or drops below -10.
Direction matters: buying +5 delta and selling β5 delta cancels out if within the same interval.
Note: Note that we use the net transaction delta instead of delta. Net Transaction Delta = Delta - Mark Price. In the rest of this document, "delta" actually refers to net transaction delta.
Positive value with maximum 4 decimal places.
The maximum change in vega exposure allowed within a given interval, measured in absolute terms.
Expressed in USD, representing the change in sensitivity to implied volatility across executed trades.
This parameter is primarily relevant for options traders managing risk in volatile markets.
Similar to delta_limit, the vega_limit is direction-aware and evaluated on a net basis. If the exposure exceeds the set threshold (positively or negatively), MMP will be triggered.
Notice: When evaluating Delta and Vega limits for MMP, Deribit uses the greeks at the moment of trade execution. The system does not re-evaluate Delta or Vega using live greeks at the time of MMP checking.
Positive value with maximum 4 decimal places.
Maximum Quote Quantity (MQQ) in base currency. MQQ is configured per index but enforced per side, per order book (instrument) β the total combined size of open MMP orders per side per instrument cannot exceed MQQ. See response description for detailed information about MQQ behavior and limitations. Maximum 4 decimal places.
2.5
If true, configures MMP for Block RFQ. When set, requires block_rfq scope instead of trade scope. Block RFQ MMP settings are completely separate from normal order/quote MMP settings.
For Block RFQ only (block_rfq = true). Sets the maximum number of Block RFQ trades allowed in the lookback window. Each RFQ trade counts as +1 towards the limit (not individual legs). Works across all currency pairs. When using this parameter, index_name must be set to "all". Maximum - 1000.
1 <= x <= 1000Response
Success response
The JSON-RPC version (2.0)
2.0 Hide child attributes
Hide child attributes
Index identifier, matches (base) cryptocurrency with quote currency
btc_usd, eth_usd, ada_usdc, algo_usdc, avax_usdc, bch_usdc, bnb_usdc, btc_usdc, btcdvol_usdc, buidl_usdc, doge_usdc, dot_usdc, eurr_usdc, eth_usdc, ethdvol_usdc, hype_usdc, link_usdc, ltc_usdc, near_usdc, paxg_usdc, shib_usdc, sol_usdc, steth_usdc, ton_usdc, trump_usdc, trx_usdc, uni_usdc, usde_usdc, usyc_usdc, xrp_usdc, btc_usdt, eth_usdt, eurr_usdt, sol_usdt, steth_usdt, usdc_usdt, usde_usdt, btc_eurr, btc_usde, btc_usyc, eth_btc, eth_eurr, eth_usde, eth_usyc, steth_eth, paxg_btc, drbfix-btc_usdc, drbfix-eth_usdc The duration of the monitoring window in seconds. For example, an interval of 3 implies a 3-second window.
The interval begins after the first trade.
If a new trade is executed after the interval has ended, a new interval is started, and counters reset.
If a trade occurs during an already running interval, that interval continues unaffected.
This mechanism allows the platform to track activity in short, rolling windows to identify potentially risky trading behavior.
If set to 0, MMP is disabled.
Maximum value: 3600 seconds (1 hour).
0 <= x <= 3600Time in seconds that MMP remains active after being triggered. Once this frozen period has passed, MMP will automatically reset, allowing new orders to be submitted.
If you want to disable automatic reset, set frozen_time to 0. In that case, a manual reset is required using the private/reset_mmp method.
Manual reset is also possible during the frozen time period.
Maximum value: 3600 seconds (1 hour).
0 <= x <= 3600Integer identifier for the MMP group (int64). This is the programmatic identifier for the group. Entries without an mmp_group name correspond to the orders MMP group (the default group).
Name of the MMP group. Absent for the orders MMP group (the default group), which has no string name β its entry is identified by the id field alone.
The total traded quantity, measured in units of the base currency (e.g., BTC in BTC-PERPETUAL), within the interval.
This count is direction-agnosticβa buy followed by a sell counts double.
Example: Buy 10 BTC and sell 10 BTC = 20 total quantity.
Applicable to both options and futures.
Maximum 4 decimal places.
The maximum allowable net transaction delta change during the interval.
Expressed in units of base currency.
The delta_limit is treated as an absolute threshold: e.g., delta_limit: 10 β MMP is triggered if net transaction delta exceeds +10 or drops below -10.
Direction matters: buying +5 delta and selling β5 delta cancels out if within the same interval.
Note: Note that we use the net transaction delta instead of delta. Net Transaction Delta = Delta - Mark Price. In the rest of this document, "delta" actually refers to net transaction delta.
Maximum 4 decimal places.
The maximum change in vega exposure allowed within a given interval, measured in absolute terms.
Expressed in USD, representing the change in sensitivity to implied volatility across executed trades.
This parameter is primarily relevant for options traders managing risk in volatile markets.
Similar to delta_limit, the vega_limit is direction-aware and evaluated on a net basis. If the exposure exceeds the set threshold (positively or negatively), MMP will be triggered.
Notice: When evaluating Delta and Vega limits for MMP, Deribit uses the greeks at the moment of trade execution. The system does not re-evaluate Delta or Vega using live greeks at the time of MMP checking.
Maximum 4 decimal places.
Maximum Quote Quantity (MQQ). MQQ is configured per index but enforced per side, per order book (instrument) β the total combined size of open MMP orders per side per instrument cannot exceed MQQ (specified in base currency).
MQQ reserves Initial Margin unconditionally. As soon as MMP configuration with a non-zero MQQ is active, the platform reserves Initial Margin equal to MQQ Γ 3% β regardless of whether you have any open positions or open orders. This reservation is continuous: it applies from the moment the config is set until it is removed. The reserved margin is visible in the Portfolio Margin section of the platform.
Releasing MMP-reserved margin. To free the reserved margin, remove the MMP configuration entirely by calling private/set_mmp_config with interval = 0. Setting only max_quote_quantity = 0 without removing the config is not sufficient β the entire configuration entry must be deleted.
Important Notes:
- Configured per index, enforced per instrument: MQQ is configured at the index level (an MMP group is linked to an index). However, the limit is enforced separately per order book (instrument) per side. "Per order book" means per instrument (not per expiry). The limit is NOT the sum across all instruments β each instrument has its own separate MQQ enforcement.
- MQQ limits cumulative size, not order count: For example, with MQQ of 3 BTC, you can place multiple orders (three orders of 1 BTC each, or one order of 2.5 BTC plus one of 0.5 BTC) as long as the total size per side per instrument does not exceed 3 BTC
- MQQ is separate per MMP group: Each MMP group has its own independent MQQ configuration. MQQ limits are enforced separately for each MMP group.
- MQQ vs Quantity Limit relationship: You can set MQQ > quantity_limit. This allows quotes to be larger than the quantity limit, and enables MMP to trigger on partial fills of quotes. This decouples the MMP reserved margin from the MMP quantity limit.
- Base currency: MQQ is specified and enforced in base currency
- Inverse futures: Size is calculated as Amount / Price to convert to base currency
- Inverse future spreads: Size is calculated as Amount / IndexPrice
- SM accounts: MMP orders and quotes on options and option_combos are not supported for SM accounts
- Rejections: MQQ is enforced for MMP-enabled orders and quotes. Quote entries and MMP-enabled orders (i.e., orders with mmp=true) are rejected if their individual size is greater than max_quote_quantity, or if accepting them would make the total open MMP size per side per instrument exceed max_quote_quantity. NonβMMP orders are not subject to MQQ and may be larger than max_quote_quantity.
- Precision: All MMP configuration values support maximum 4 decimal places
- Latency: There are no latency benefits from MQQ if you already use mass quotes.
If true, indicates MMP configuration for Block RFQ. Block RFQ MMP settings are completely separate from normal order/quote MMP settings.
For Block RFQ only. The maximum number of Block RFQ trades allowed in the lookback window. Each RFQ trade counts as +1 towards the limit (not individual legs). Works across all currency pairs.
The id that was sent in the request
Was this page helpful?