const res = await fetch('https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"readingId": "00000000-0000-0000-0000-000000000001",
"markets": "all",
"activate": true,
"orderTypes": [
"limit",
"market",
"stop"
],
"timeInForce": [
"day",
"gtc"
],
"quantityMax": "50"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"readingId":"00000000-0000-0000-0000-000000000001","markets":"all","activate":true,"orderTypes":["limit","market","stop"],"timeInForce":["day","gtc"],"quantityMax":"50"}'import requests
url = "https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets"
payload = {
"readingId": "00000000-0000-0000-0000-000000000001",
"markets": "all",
"activate": True,
"orderTypes": ["limit", "market", "stop"],
"timeInForce": ["day", "gtc"],
"quantityMax": "50"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"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/venues/{venueId}/connections/{connectionId}/markets",
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([
'readingId' => '00000000-0000-0000-0000-000000000001',
'markets' => 'all',
'activate' => true,
'orderTypes' => [
'limit',
'market',
'stop'
],
'timeInForce' => [
'day',
'gtc'
],
'quantityMax' => '50'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/venues/{venueId}/connections/{connectionId}/markets"
payload := strings.NewReader("{\n \"readingId\": \"00000000-0000-0000-0000-000000000001\",\n \"markets\": \"all\",\n \"activate\": true,\n \"orderTypes\": [\n \"limit\",\n \"market\",\n \"stop\"\n ],\n \"timeInForce\": [\n \"day\",\n \"gtc\"\n ],\n \"quantityMax\": \"50\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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/venues/{venueId}/connections/{connectionId}/markets")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"readingId\": \"00000000-0000-0000-0000-000000000001\",\n \"markets\": \"all\",\n \"activate\": true,\n \"orderTypes\": [\n \"limit\",\n \"market\",\n \"stop\"\n ],\n \"timeInForce\": [\n \"day\",\n \"gtc\"\n ],\n \"quantityMax\": \"50\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"readingId\": \"00000000-0000-0000-0000-000000000001\",\n \"markets\": \"all\",\n \"activate\": true,\n \"orderTypes\": [\n \"limit\",\n \"market\",\n \"stop\"\n ],\n \"timeInForce\": [\n \"day\",\n \"gtc\"\n ],\n \"quantityMax\": \"50\"\n}"
response = http.request(request)
puts response.read_body{
"connectionId": "00000000-0000-0000-0000-000000000001",
"reading": {
"id": "00000000-0000-0000-0000-000000000001",
"listId": "fxcubic-0f3c2a9e1b7d4c6a8e5f2d1c0b9a8e7f",
"payloadHash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"readAt": "2026-09-14T12:00:00.000Z",
"markets": 2
},
"items": [
{
"providerSymbol": "EURUSD",
"symbol": "FX:EURUSD",
"instrument": {
"id": "00000000-0000-0000-0000-000000000001",
"venueId": "00000000-0000-0000-0000-000000000001",
"environment": "sandbox",
"contentHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"createdAt": "2026-09-14T12:00:00.000Z",
"state": "candidate",
"tradingReady": false
},
"created": true,
"activation": {
"instrumentId": "FX:EURUSD",
"instrumentVersionId": "00000000-0000-0000-0000-000000000001",
"revision": 1
},
"refusal": null
}
],
"conversions": [
{
"asset": "EUR",
"route": [
{
"base": "EUR",
"quote": "USD",
"sourceId": "provider:00000000-0000-0000-0000-000000000001:provider-market"
}
],
"providerSymbol": "EURUSD"
}
]
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Add a connection's provider markets
Adds markets of one reading to your catalog: each becomes an instrument candidate counted in lots of the provider’s contract size, on its tick, quantity grid and sessions, mapped to the connection under the provider’s symbol, priced from the connection’s own price source (provider:<connectionId>:provider-market), and bound to the contract the provider states at that reading, which the paper book fills it on. Name markets as all, every market the reading lists, or as the provider symbols to add, each with the symbol and name you list it under where they differ. You state only what is yours: the order forms (orderTypes, timeInForce) where the provider states none, how old a price may be (maxAgeMs, 2,000 where you state none), and the largest order (quantityMax) where the provider states none. With activate: true each added market enters the catalog too. A market that can’t be added says why, and the rest are added. conversions names, for each currency the added markets’ profit or margin is in other than US dollars, the route your risk policy names to convert it at the live rate of this source, and the provider symbol of the pair it reads, which must be listed and active. Required scope: venue:configure. Preview: served on the sandbox to every venue, and production availability is arranged when a venue qualifies. Trading API keys and pre-registration keys do not authorize these routes.
const res = await fetch('https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"readingId": "00000000-0000-0000-0000-000000000001",
"markets": "all",
"activate": true,
"orderTypes": [
"limit",
"market",
"stop"
],
"timeInForce": [
"day",
"gtc"
],
"quantityMax": "50"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"readingId":"00000000-0000-0000-0000-000000000001","markets":"all","activate":true,"orderTypes":["limit","market","stop"],"timeInForce":["day","gtc"],"quantityMax":"50"}'import requests
url = "https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets"
payload = {
"readingId": "00000000-0000-0000-0000-000000000001",
"markets": "all",
"activate": True,
"orderTypes": ["limit", "market", "stop"],
"timeInForce": ["day", "gtc"],
"quantityMax": "50"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"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/venues/{venueId}/connections/{connectionId}/markets",
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([
'readingId' => '00000000-0000-0000-0000-000000000001',
'markets' => 'all',
'activate' => true,
'orderTypes' => [
'limit',
'market',
'stop'
],
'timeInForce' => [
'day',
'gtc'
],
'quantityMax' => '50'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/venues/{venueId}/connections/{connectionId}/markets"
payload := strings.NewReader("{\n \"readingId\": \"00000000-0000-0000-0000-000000000001\",\n \"markets\": \"all\",\n \"activate\": true,\n \"orderTypes\": [\n \"limit\",\n \"market\",\n \"stop\"\n ],\n \"timeInForce\": [\n \"day\",\n \"gtc\"\n ],\n \"quantityMax\": \"50\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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/venues/{venueId}/connections/{connectionId}/markets")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"readingId\": \"00000000-0000-0000-0000-000000000001\",\n \"markets\": \"all\",\n \"activate\": true,\n \"orderTypes\": [\n \"limit\",\n \"market\",\n \"stop\"\n ],\n \"timeInForce\": [\n \"day\",\n \"gtc\"\n ],\n \"quantityMax\": \"50\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/venues/{venueId}/connections/{connectionId}/markets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"readingId\": \"00000000-0000-0000-0000-000000000001\",\n \"markets\": \"all\",\n \"activate\": true,\n \"orderTypes\": [\n \"limit\",\n \"market\",\n \"stop\"\n ],\n \"timeInForce\": [\n \"day\",\n \"gtc\"\n ],\n \"quantityMax\": \"50\"\n}"
response = http.request(request)
puts response.read_body{
"connectionId": "00000000-0000-0000-0000-000000000001",
"reading": {
"id": "00000000-0000-0000-0000-000000000001",
"listId": "fxcubic-0f3c2a9e1b7d4c6a8e5f2d1c0b9a8e7f",
"payloadHash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"readAt": "2026-09-14T12:00:00.000Z",
"markets": 2
},
"items": [
{
"providerSymbol": "EURUSD",
"symbol": "FX:EURUSD",
"instrument": {
"id": "00000000-0000-0000-0000-000000000001",
"venueId": "00000000-0000-0000-0000-000000000001",
"environment": "sandbox",
"contentHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"createdAt": "2026-09-14T12:00:00.000Z",
"state": "candidate",
"tradingReady": false
},
"created": true,
"activation": {
"instrumentId": "FX:EURUSD",
"instrumentVersionId": "00000000-0000-0000-0000-000000000001",
"revision": 1
},
"refusal": null
}
],
"conversions": [
{
"asset": "EUR",
"route": [
{
"base": "EUR",
"quote": "USD",
"sourceId": "provider:00000000-0000-0000-0000-000000000001:provider-market"
}
],
"providerSymbol": "EURUSD"
}
]
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Authorizations
The Venue key (trdrs_vk_sandbox_… or trdrs_vk_production_…), in preview. It belongs to one venue in one environment and carries the scopes it was created with. The venue's verified owner creates it while signed in. It works on the /api/venues/{venueId} routes and, with trader:read or trader:trade, on the account, market and trading routes, reading the venue's own traders' accounts and routing their orders, each request naming its trader in x-trdrs-trader. A trdrs_sk_… key can't be used in its place. It reaches its venue's routes and its venue's own traders, and the owner manages keys from a signed-in session. Keep it on your server.
Headers
A key you choose, 1 to 128 characters. A retry with the same key and body adds nothing again and answers each market as it stands.
1 - 128Body
all, or 1 to 500 markets by the provider's own symbol.
market, limit, stop, stop_limit day, gtc, ioc, fok, post_only 1 <= x <= 2000An exact decimal string, such as "12.5", with at most 18 digits after the point and no exponent.