const res = await fetch('https://app.trdrs.co/api/account/snapshot', {
headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
})
const data = await res.json()curl 'https://app.trdrs.co/api/account/snapshot' \
-H "Authorization: Bearer $TRDRS_API_KEY"import requests
url = "https://app.trdrs.co/api/account/snapshot"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trdrs.co/api/account/snapshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.trdrs.co/api/account/snapshot"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.trdrs.co/api/account/snapshot")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/account/snapshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"accountId": "7a1f4c93b28d05e6f1a3c7d9b4e28f60",
"revision": 4831,
"clock": "observation",
"positionModel": "net",
"capabilities": {
"adapter": "rithmic",
"assetClasses": [
"futures"
],
"orderTypes": [
"market",
"limit",
"stop",
"stop_limit"
],
"tifs": [
"day",
"gtc"
],
"nativeBracket": true,
"multiTargetBracket": true,
"nativeAutoBreakeven": false,
"bracketLevelAmend": true,
"amendOrder": true,
"reduceOnly": false,
"exits": true,
"symbolConfig": false,
"marginPreview": "estimate",
"updates": {
"summary": true,
"positions": true,
"orders": true,
"executions": false
},
"instrumentFacts": {
"priceIncrement": true,
"quantityStep": true,
"quantityBounds": false,
"contractMultiplier": true
},
"exitPlanSupport": [
"stop_loss",
"take_profit",
"multiple_targets",
"runner_leg",
"breakeven",
"trailing_stop"
],
"completeOrderBook": false
},
"connected": true,
"account": {
"broker": "rithmic",
"accountNumber": "PA-4821-07",
"balance": 50245.5,
"realizedPnl": 245.5,
"unrealizedPnl": 75,
"netLiquidating": 50320.5,
"availableBuyingPower": 47120.5,
"usedBuyingPower": 3200,
"marginBalance": null,
"currency": "USD",
"asOf": 1787581920
},
"positions": [
{
"instrument": "ESU6",
"root": "ES",
"qty": 2,
"avgPrice": 6480.5,
"unrealizedPnl": 75,
"liquidationPrice": null,
"leverage": null,
"margin": null
}
],
"orders": [
{
"brokerOrderId": "234992187",
"instrument": "ESU6",
"side": "sell",
"qty": 2,
"orderType": "limit",
"triggerPrice": null,
"limitPrice": 6492.25,
"status": "working",
"clientOrderId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"submittedAt": 1787581400,
"tif": "gtc",
"reduceOnly": true
}
]
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Get the account snapshot
Returns the account summary, positions, and working orders at a single consistent revision. Read this rather than combining the one-shot reads: three reads taken separately are three moments, and nothing in them says whether they agree. It serves the same body the stream frames carry, so a client with no stream open, or one coming back after a disconnect, reads exactly what it would have received.
const res = await fetch('https://app.trdrs.co/api/account/snapshot', {
headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
})
const data = await res.json()curl 'https://app.trdrs.co/api/account/snapshot' \
-H "Authorization: Bearer $TRDRS_API_KEY"import requests
url = "https://app.trdrs.co/api/account/snapshot"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trdrs.co/api/account/snapshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.trdrs.co/api/account/snapshot"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.trdrs.co/api/account/snapshot")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/account/snapshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"accountId": "7a1f4c93b28d05e6f1a3c7d9b4e28f60",
"revision": 4831,
"clock": "observation",
"positionModel": "net",
"capabilities": {
"adapter": "rithmic",
"assetClasses": [
"futures"
],
"orderTypes": [
"market",
"limit",
"stop",
"stop_limit"
],
"tifs": [
"day",
"gtc"
],
"nativeBracket": true,
"multiTargetBracket": true,
"nativeAutoBreakeven": false,
"bracketLevelAmend": true,
"amendOrder": true,
"reduceOnly": false,
"exits": true,
"symbolConfig": false,
"marginPreview": "estimate",
"updates": {
"summary": true,
"positions": true,
"orders": true,
"executions": false
},
"instrumentFacts": {
"priceIncrement": true,
"quantityStep": true,
"quantityBounds": false,
"contractMultiplier": true
},
"exitPlanSupport": [
"stop_loss",
"take_profit",
"multiple_targets",
"runner_leg",
"breakeven",
"trailing_stop"
],
"completeOrderBook": false
},
"connected": true,
"account": {
"broker": "rithmic",
"accountNumber": "PA-4821-07",
"balance": 50245.5,
"realizedPnl": 245.5,
"unrealizedPnl": 75,
"netLiquidating": 50320.5,
"availableBuyingPower": 47120.5,
"usedBuyingPower": 3200,
"marginBalance": null,
"currency": "USD",
"asOf": 1787581920
},
"positions": [
{
"instrument": "ESU6",
"root": "ES",
"qty": 2,
"avgPrice": 6480.5,
"unrealizedPnl": 75,
"liquidationPrice": null,
"leverage": null,
"margin": null
}
],
"orders": [
{
"brokerOrderId": "234992187",
"instrument": "ESU6",
"side": "sell",
"qty": 2,
"orderType": "limit",
"triggerPrice": null,
"limitPrice": 6492.25,
"status": "working",
"clientOrderId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"submittedAt": 1787581400,
"tif": "gtc",
"reduceOnly": true
}
]
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Authorizations
Your firm’s API key (the API calls this the tenant key; trdrs_sk_…), server-to-server only.
Response
The account at one revision
WireAccountSnapshot (@trdrs/contracts): the whole account at one revision. This is the body of this endpoint and of every account frame on the stream — one shape, not two. It replaced three independently timed reads, which no client could tell apart from one coherent picture. Apply it by the revision and nothing else: keep the newest frame you have for this accountId, drop anything at or behind it, and replace your whole picture with anything ahead of it. A frame that skips revisions is still complete, so there is nothing to recover and no resync to make. Never compute a revision of your own. accountId is opaque: key panels and subscriptions by it, never take it apart. clock says whether the revision is the account's own history ('engine') or trdrs reading a venue ('observation'). On an observation clock every read is a new reading and carries a new revision, so two reads of an account nothing happened to still differ: compare revisions, never count them. positionModel is 'net', so there is at most one signed position row per instrument.
engine, observation net WireAccountCapabilities (@trdrs/contracts): what the adapter behind this account implements, so a host renders only what the account supports rather than offering a control the venue will refuse. Every flag is about code that exists and is verified against the venue; anything unproven is false and the order path refuses it. A time-in-force absent from tifs is refused, never silently mapped to a different lifetime. This is not permission: whether the account may trade right now is the risk lock, which rides the stream's own lock channel.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
{
"broker": "rithmic",
"accountNumber": "PA-4821-07",
"balance": 50245.5,
"realizedPnl": 245.5,
"unrealizedPnl": 75,
"netLiquidating": 50320.5,
"availableBuyingPower": 47120.5,
"usedBuyingPower": 3200,
"marginBalance": null,
"currency": "USD",
"asOf": 1787581920
}
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes