const res = await fetch('https://app.trdrs.co/api/trading/margin-preview', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_API_KEY}`,
},
body: JSON.stringify({
"instrument": "ESU6",
"side": "buy",
"qty": 2,
"orderType": "market"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/trading/margin-preview' \
-H "Authorization: Bearer $TRDRS_API_KEY" \
-H 'content-type: application/json' \
-d '{"instrument":"ESU6","side":"buy","qty":2,"orderType":"market"}'import requests
url = "https://app.trdrs.co/api/trading/margin-preview"
payload = {
"instrument": "ESU6",
"side": "buy",
"qty": 2,
"orderType": "market"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trdrs.co/api/trading/margin-preview",
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([
'instrument' => 'ESU6',
'side' => 'buy',
'qty' => 2,
'orderType' => 'market'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://app.trdrs.co/api/trading/margin-preview"
payload := strings.NewReader("{\n \"instrument\": \"ESU6\",\n \"side\": \"buy\",\n \"qty\": 2,\n \"orderType\": \"market\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.trdrs.co/api/trading/margin-preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"instrument\": \"ESU6\",\n \"side\": \"buy\",\n \"qty\": 2,\n \"orderType\": \"market\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/trading/margin-preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"instrument\": \"ESU6\",\n \"side\": \"buy\",\n \"qty\": 2,\n \"orderType\": \"market\"\n}"
response = http.request(request)
puts response.read_body{
"marginRequired": 3080,
"estimate": false,
"currency": "USD",
"sufficient": true
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Preview order margin
Returns the margin an order would need and whether the account can cover it, without placing anything. Because nothing is placed, it takes no clientOrderId and isn’t stopped by a risk lock.
Required key: Trading API key. A Connect app’s backend can also send it with the app’s API key, and a venue’s backend with its Venue key, which carries trader:trade, each naming one of its own traders in x-trdrs-trader: it then runs on that trader’s own accounts.
const res = await fetch('https://app.trdrs.co/api/trading/margin-preview', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_API_KEY}`,
},
body: JSON.stringify({
"instrument": "ESU6",
"side": "buy",
"qty": 2,
"orderType": "market"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/trading/margin-preview' \
-H "Authorization: Bearer $TRDRS_API_KEY" \
-H 'content-type: application/json' \
-d '{"instrument":"ESU6","side":"buy","qty":2,"orderType":"market"}'import requests
url = "https://app.trdrs.co/api/trading/margin-preview"
payload = {
"instrument": "ESU6",
"side": "buy",
"qty": 2,
"orderType": "market"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trdrs.co/api/trading/margin-preview",
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([
'instrument' => 'ESU6',
'side' => 'buy',
'qty' => 2,
'orderType' => 'market'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://app.trdrs.co/api/trading/margin-preview"
payload := strings.NewReader("{\n \"instrument\": \"ESU6\",\n \"side\": \"buy\",\n \"qty\": 2,\n \"orderType\": \"market\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.trdrs.co/api/trading/margin-preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"instrument\": \"ESU6\",\n \"side\": \"buy\",\n \"qty\": 2,\n \"orderType\": \"market\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/trading/margin-preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"instrument\": \"ESU6\",\n \"side\": \"buy\",\n \"qty\": 2,\n \"orderType\": \"market\"\n}"
response = http.request(request)
puts response.read_body{
"marginRequired": 3080,
"estimate": false,
"currency": "USD",
"sufficient": true
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Authorizations
The Trading API key (trdrs_sk_…), for market data, orders and account state on the accounts its owner holds. Use it server-to-server, and keep it on your server. Its scope is named trading in the API.
Query Parameters
The provider the account is at, such as rithmic or paper. Omit it to use your default provider. An unknown value is refused with 400, never replaced with another provider.
The account number at that provider. It must be one of your own accounts, or the call is refused with 400.
Body
The order to preview.
The instrument.
Buy or sell.
buy, sell The quantity.
The order type. Omit it for market.
The limit price, for a limit or stop-limit order.
The trigger price, for a stop order.
Response
The preview. estimate is false where the provider computes the figure itself (a Tastytrade dry run) and true otherwise, and marginRequired is null when it isn't known. On the paper book, including a Demo, the figure is the initial margin the order adds under the account's risk policy: trdrs's own for a Demo, and the policy your venue published for an issued account. sufficient says whether the order fits the account's free collateral now, judged the same way the order is judged when it arrives: the paper book refuses an order that adds exposure when its margin, plus the commission of an order that fills now, doesn't fit. The figure stays an estimate, because the price and the free collateral can change before your order arrives. marginRequired and sufficient are null when there's no verdict: there's no price, a position can't be valued, the risk policy doesn't cover the instrument, or the order would be refused for another reason first. basis says which. A risk lock and your size limits aren't judged here.
The margin the order would need, and whether the account can cover it.
The margin the order would need, or null when it isn't known.
True when the figure is trdrs's estimate rather than the provider's own.
The currency of the figure.
Whether the account can cover the order, by the provider's own figures, or on the paper book by the same collateral check the order meets when it arrives. False means your interface should block the order. Null means there is no verdict and nothing blocks: the figure is unknown, or it can't be judged now.
Where the figure comes from, or why it is unknown, where the provider says. The paper book names the risk policy version the figure was read from, or says why there is no verdict.