public/get_margin
Calculates net initial and maintenance margin for a fully simulated portfolio under a chosen margin type (SM or PM2; market selects the currency a PM2 manager must cover), optionally with a further simulated state change layered on top. Values are net margin — mark-to-market value minus the requirement — so positive means healthy. Does not take open-order margin into account.
curl --request POST \
--url https://api.derive.xyz/v3/public/get_margin \
--header 'Content-Type: application/json' \
--data '
{
"margin_type": "<string>",
"simulated_collaterals": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_positions": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": null
}
],
"market": null,
"simulated_collateral_changes": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_position_changes": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": null
}
]
}
'import requests
url = "https://api.derive.xyz/v3/public/get_margin"
payload = {
"margin_type": "<string>",
"simulated_collaterals": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_positions": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": None
}
],
"market": None,
"simulated_collateral_changes": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_position_changes": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": None
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
margin_type: '<string>',
simulated_collaterals: [{amount: '<string>', asset_name: '<string>'}],
simulated_positions: [{amount: '<string>', instrument_name: '<string>', entry_price: null}],
market: null,
simulated_collateral_changes: [{amount: '<string>', asset_name: '<string>'}],
simulated_position_changes: [{amount: '<string>', instrument_name: '<string>', entry_price: null}]
})
};
fetch('https://api.derive.xyz/v3/public/get_margin', 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/public/get_margin",
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([
'margin_type' => '<string>',
'simulated_collaterals' => [
[
'amount' => '<string>',
'asset_name' => '<string>'
]
],
'simulated_positions' => [
[
'amount' => '<string>',
'instrument_name' => '<string>',
'entry_price' => null
]
],
'market' => null,
'simulated_collateral_changes' => [
[
'amount' => '<string>',
'asset_name' => '<string>'
]
],
'simulated_position_changes' => [
[
'amount' => '<string>',
'instrument_name' => '<string>',
'entry_price' => null
]
]
]),
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://api.derive.xyz/v3/public/get_margin"
payload := strings.NewReader("{\n \"margin_type\": \"<string>\",\n \"simulated_collaterals\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_positions\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ],\n \"market\": null,\n \"simulated_collateral_changes\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_position_changes\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.derive.xyz/v3/public/get_margin")
.header("Content-Type", "application/json")
.body("{\n \"margin_type\": \"<string>\",\n \"simulated_collaterals\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_positions\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ],\n \"market\": null,\n \"simulated_collateral_changes\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_position_changes\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/public/get_margin")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"margin_type\": \"<string>\",\n \"simulated_collaterals\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_positions\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ],\n \"market\": null,\n \"simulated_collateral_changes\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_position_changes\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"is_valid_trade": true,
"post_initial_margin": "<string>",
"post_maintenance_margin": "<string>",
"pre_initial_margin": "<string>",
"pre_maintenance_margin": "<string>",
"subaccount_id": 1
}Body
SM (standard margin) or PM2 (portfolio margin).
Collaterals of the simulated portfolio.
Show child attributes
Show child attributes
Positions of the simulated portfolio.
Show child attributes
Show child attributes
Currency the PM2 manager must cover; required for PM2.
Optional collateral deltas to simulate deposits / withdrawals / spot trades.
Show child attributes
Show child attributes
Optional position deltas to simulate perp / option trades.
Show child attributes
Show child attributes
Response
Success
Result of public/get_margin / private/get_margin: net margin (MtM minus requirement; positive = healthy) before and after the simulated changes, as USD decimal strings.
true when post-change initial margin passes, or the change is risk-reducing while maintenance margin stays healthy.
0 for the public simulated-portfolio variant.
x >= 0curl --request POST \
--url https://api.derive.xyz/v3/public/get_margin \
--header 'Content-Type: application/json' \
--data '
{
"margin_type": "<string>",
"simulated_collaterals": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_positions": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": null
}
],
"market": null,
"simulated_collateral_changes": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_position_changes": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": null
}
]
}
'import requests
url = "https://api.derive.xyz/v3/public/get_margin"
payload = {
"margin_type": "<string>",
"simulated_collaterals": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_positions": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": None
}
],
"market": None,
"simulated_collateral_changes": [
{
"amount": "<string>",
"asset_name": "<string>"
}
],
"simulated_position_changes": [
{
"amount": "<string>",
"instrument_name": "<string>",
"entry_price": None
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
margin_type: '<string>',
simulated_collaterals: [{amount: '<string>', asset_name: '<string>'}],
simulated_positions: [{amount: '<string>', instrument_name: '<string>', entry_price: null}],
market: null,
simulated_collateral_changes: [{amount: '<string>', asset_name: '<string>'}],
simulated_position_changes: [{amount: '<string>', instrument_name: '<string>', entry_price: null}]
})
};
fetch('https://api.derive.xyz/v3/public/get_margin', 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/public/get_margin",
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([
'margin_type' => '<string>',
'simulated_collaterals' => [
[
'amount' => '<string>',
'asset_name' => '<string>'
]
],
'simulated_positions' => [
[
'amount' => '<string>',
'instrument_name' => '<string>',
'entry_price' => null
]
],
'market' => null,
'simulated_collateral_changes' => [
[
'amount' => '<string>',
'asset_name' => '<string>'
]
],
'simulated_position_changes' => [
[
'amount' => '<string>',
'instrument_name' => '<string>',
'entry_price' => null
]
]
]),
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://api.derive.xyz/v3/public/get_margin"
payload := strings.NewReader("{\n \"margin_type\": \"<string>\",\n \"simulated_collaterals\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_positions\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ],\n \"market\": null,\n \"simulated_collateral_changes\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_position_changes\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.derive.xyz/v3/public/get_margin")
.header("Content-Type", "application/json")
.body("{\n \"margin_type\": \"<string>\",\n \"simulated_collaterals\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_positions\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ],\n \"market\": null,\n \"simulated_collateral_changes\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_position_changes\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.derive.xyz/v3/public/get_margin")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"margin_type\": \"<string>\",\n \"simulated_collaterals\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_positions\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ],\n \"market\": null,\n \"simulated_collateral_changes\": [\n {\n \"amount\": \"<string>\",\n \"asset_name\": \"<string>\"\n }\n ],\n \"simulated_position_changes\": [\n {\n \"amount\": \"<string>\",\n \"instrument_name\": \"<string>\",\n \"entry_price\": null\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"is_valid_trade": true,
"post_initial_margin": "<string>",
"post_maintenance_margin": "<string>",
"pre_initial_margin": "<string>",
"pre_maintenance_margin": "<string>",
"subaccount_id": 1
}