const res = await fetch('https://app.trdrs.co/api/trading/replace', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_API_KEY}`,
},
body: JSON.stringify({
"providerOrderId": "234992187",
"instrument": "ESU6",
"side": "sell",
"qty": 2,
"orderType": "limit",
"price": 6497.25,
"clientOrderId": "replace-tp-1787582100"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/trading/replace' \
-H "Authorization: Bearer $TRDRS_API_KEY" \
-H 'content-type: application/json' \
-d '{"providerOrderId":"234992187","instrument":"ESU6","side":"sell","qty":2,"orderType":"limit","price":6497.25,"clientOrderId":"replace-tp-1787582100"}'import requests
url = "https://app.trdrs.co/api/trading/replace"
payload = {
"providerOrderId": "234992187",
"instrument": "ESU6",
"side": "sell",
"qty": 2,
"orderType": "limit",
"price": 6497.25,
"clientOrderId": "replace-tp-1787582100"
}
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/replace",
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([
'providerOrderId' => '234992187',
'instrument' => 'ESU6',
'side' => 'sell',
'qty' => 2,
'orderType' => 'limit',
'price' => 6497.25,
'clientOrderId' => 'replace-tp-1787582100'
]),
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/replace"
payload := strings.NewReader("{\n \"providerOrderId\": \"234992187\",\n \"instrument\": \"ESU6\",\n \"side\": \"sell\",\n \"qty\": 2,\n \"orderType\": \"limit\",\n \"price\": 6497.25,\n \"clientOrderId\": \"replace-tp-1787582100\"\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/replace")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"providerOrderId\": \"234992187\",\n \"instrument\": \"ESU6\",\n \"side\": \"sell\",\n \"qty\": 2,\n \"orderType\": \"limit\",\n \"price\": 6497.25,\n \"clientOrderId\": \"replace-tp-1787582100\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/trading/replace")
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 \"providerOrderId\": \"234992187\",\n \"instrument\": \"ESU6\",\n \"side\": \"sell\",\n \"qty\": 2,\n \"orderType\": \"limit\",\n \"price\": 6497.25,\n \"clientOrderId\": \"replace-tp-1787582100\"\n}"
response = http.request(request)
puts response.read_body{
"outcome": "amended",
"providerOrderId": "234992187",
"message": null
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Replace an order
Moves one resting order to a new price, as one operation under one clientOrderId. Where the provider can change an order in place, trdrs does, and the order keeps its id; elsewhere trdrs cancels it and places it again. Always show the outcome: replaced and amended mean it worked, and restored, gone, unconfirmed and order_lost mean it didn’t.
A take profit or stop loss of a bracket moves with its bracket, through PUT /api/trading/exits/{id}. An entry keeps the bracket waiting on it: the bracket follows the entry to the order it rests as afterwards.
On the paper book, a limit moved to a price the market already crosses fills at once, as a new limit order at that price would: it takes the market’s price and never a worse one than the new limit, and a bracket waiting on the entry is armed by the fill. The old order ends replaced in the same moment, nothing rests, and providerOrderId is null.
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/replace', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_API_KEY}`,
},
body: JSON.stringify({
"providerOrderId": "234992187",
"instrument": "ESU6",
"side": "sell",
"qty": 2,
"orderType": "limit",
"price": 6497.25,
"clientOrderId": "replace-tp-1787582100"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/trading/replace' \
-H "Authorization: Bearer $TRDRS_API_KEY" \
-H 'content-type: application/json' \
-d '{"providerOrderId":"234992187","instrument":"ESU6","side":"sell","qty":2,"orderType":"limit","price":6497.25,"clientOrderId":"replace-tp-1787582100"}'import requests
url = "https://app.trdrs.co/api/trading/replace"
payload = {
"providerOrderId": "234992187",
"instrument": "ESU6",
"side": "sell",
"qty": 2,
"orderType": "limit",
"price": 6497.25,
"clientOrderId": "replace-tp-1787582100"
}
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/replace",
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([
'providerOrderId' => '234992187',
'instrument' => 'ESU6',
'side' => 'sell',
'qty' => 2,
'orderType' => 'limit',
'price' => 6497.25,
'clientOrderId' => 'replace-tp-1787582100'
]),
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/replace"
payload := strings.NewReader("{\n \"providerOrderId\": \"234992187\",\n \"instrument\": \"ESU6\",\n \"side\": \"sell\",\n \"qty\": 2,\n \"orderType\": \"limit\",\n \"price\": 6497.25,\n \"clientOrderId\": \"replace-tp-1787582100\"\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/replace")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"providerOrderId\": \"234992187\",\n \"instrument\": \"ESU6\",\n \"side\": \"sell\",\n \"qty\": 2,\n \"orderType\": \"limit\",\n \"price\": 6497.25,\n \"clientOrderId\": \"replace-tp-1787582100\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/trading/replace")
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 \"providerOrderId\": \"234992187\",\n \"instrument\": \"ESU6\",\n \"side\": \"sell\",\n \"qty\": 2,\n \"orderType\": \"limit\",\n \"price\": 6497.25,\n \"clientOrderId\": \"replace-tp-1787582100\"\n}"
response = http.request(request)
puts response.read_body{
"outcome": "amended",
"providerOrderId": "234992187",
"message": null
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"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. Omit it to use your default provider.
The account number at that provider. It must be one of your own accounts.
Body
The working order to change, and what it should become.
The order id at the provider.
The instrument.
Buy or sell.
buy, sell The order type.
limit, stop, stop_limit The new price: a limit order's limit, or a stop or stop-limit order's trigger.
Your own id for this change, and its idempotency key.
The order's whole quantity after the change, filled and open, as FIX's OrderQty. What can still fill is this less what the order has filled when the change is made, so a fill that lands while the request is on its way counts. At or below what has filled, the order ends filled and nothing rests. The paper book takes it; any other provider answers 400 order_qty_unsupported, and takes qty. Send orderQty or qty, not both.
Deprecated: send orderQty. The new quantity in the provider's own terms, which a provider that does not take orderQty still reads.
Required for a stop-limit order: the limit price it rests at once triggered.
Response
The replace is finished. Read outcome.
What happened to the order.
What happened. See the operation for what each outcome means.
amended, replaced, gone, restored, unconfirmed, order_lost The id of the order that is working after the change: the same id where the provider changes the order in place, and a new one where the order was cancelled and placed again. Null where nothing works after it, as when an orderQty no more than what the order has filled ends it filled, or when the new price crosses the market and the paper book fills the replacement at once.
More detail, as an English sentence, or null.