const res = await fetch('https://app.trdrs.co/api/trading/match?provider=rithmic&instrument=ES1!&account=PA-4821-07', {
headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
})
const data = await res.json()curl 'https://app.trdrs.co/api/trading/match?provider=rithmic&instrument=ES1!&account=PA-4821-07' \
-H "Authorization: Bearer $TRDRS_API_KEY"import requests
url = "https://app.trdrs.co/api/trading/match"
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/trading/match",
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/trading/match"
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/trading/match")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/trading/match")
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{
"instrument": "BINANCE:BTCUSDT",
"market": "BINANCE:BTCUSDT",
"type": "crypto",
"tradable": false,
"contract": null,
"rollAt": null,
"refusal": {
"code": "instrument_not_offered",
"params": {
"instrument": "BINANCE:BTCUSDT",
"provider": "hyperliquid",
"alternative": "HYPERLIQUID:BTC",
"underlying": "BTC"
},
"message": "hyperliquid does not trade BINANCE:BTCUSDT; this account trades BTC as HYPERLIQUID:BTC"
},
"checkedAt": 1787581920
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Match a market for an account
Returns whether the account trades the market an instrument names, and as which contract, or why it doesn’t. It is the judgment every order meets first, before any hold, margin or buying power check, and an order is refused by it with the same code. Asked here, it is judged for an order that may add exposure. An order on a continuous future (ES1!) trades the dated contract contract names, so show that month on the order ticket. Asking keeps the market in view for half an hour: the account stream’s trading event then carries its match whenever it changes. Nothing is sent.
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/match?provider=rithmic&instrument=ES1!&account=PA-4821-07', {
headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
})
const data = await res.json()curl 'https://app.trdrs.co/api/trading/match?provider=rithmic&instrument=ES1!&account=PA-4821-07' \
-H "Authorization: Bearer $TRDRS_API_KEY"import requests
url = "https://app.trdrs.co/api/trading/match"
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/trading/match",
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/trading/match"
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/trading/match")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/trading/match")
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{
"instrument": "BINANCE:BTCUSDT",
"market": "BINANCE:BTCUSDT",
"type": "crypto",
"tradable": false,
"contract": null,
"rollAt": null,
"refusal": {
"code": "instrument_not_offered",
"params": {
"instrument": "BINANCE:BTCUSDT",
"provider": "hyperliquid",
"alternative": "HYPERLIQUID:BTC",
"underlying": "BTC"
},
"message": "hyperliquid does not trade BINANCE:BTCUSDT; this account trades BTC as HYPERLIQUID:BTC"
},
"checkedAt": 1787581920
}{
"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. An unknown value is refused with 400.
The account number at that provider. It must be one of your own accounts, or the call is refused with 400. Omit it to use your default account there.
The symbol to match, as a chart or symbol search names it (ES1!, CME:ESZ2026, BINANCE:BTCUSDT).
Response
The match. A refused market carries its refusal; see refusal for each code.
Whether the account trades a market, and as which contract, or why it doesn't. Every order is refused by this same judgment before anything else is checked, so a market it calls untradable is one no order is accepted on. The account's holds, its locks and the price of the moment are not part of it: the account stream's gates and GET /api/trading/actions state those.
The symbol as you asked about it, or as the account holds it.
The market key the symbol names, or null where it names no market.
The market's class, with the values symbol search returns, or the symbol's own type where its feed states one (index). Null where nothing states it.
True when the account trades the market now.
The instrument an order on the market trades: the dated contract a continuous future names now (CME:ESZ2026), and the market itself otherwise. An order on a continuous future trades this contract. Null where the match refuses, and where the order is sent as written for the provider to resolve: a continuous future no rule here names a contract for, and any market of a provider whose markets trdrs doesn't list.
When contract stops being the one a continuous future names, where that is known.
Why the account doesn't trade the market now, or null when it does:
unknown_instrument: the symbol names no market. An index or a venue's published data series is data only.asset_class_not_supported: the account's provider doesn't route the class, or trading in it is switched off.instrument_not_offered: the account doesn't trade the market. Where it trades its own market on the same asset,alternativenames it.entry_halted,venue_route_missing,venue_route_retired,instrument_not_permitted,venue_instrument_disabledandvenue_instrument_expired: the account's venue holds the market closed to new entries.- The account's risk policy's own code, where it states no terms for the market.
bare_root_unresolved,contract_past_safe_windowandcontract_dates_uncovered: the provider's rule can't name a futures contract to trade now.
Show child attributes
Show child attributes
When the match was worked out, in epoch seconds.