Orders
Attach TP/SL bracket to an existing order
Attaches a take-profit and/or stop-loss bracket to an existing filled or working parent order.
Bracket children are limit (TP) and stop (SL) orders linked to the parent. When one side fills, the other is automatically cancelled (OCO behavior).
TP must be on the profitable side of entry, SL on the losing side. Both are validated against tick size.
This is a direct mutation (not queued), so the response contains the created bracket orders immediately.
POST
/
trade
/
order
/
attach-bracket
Attach TP/SL bracket to an existing order
curl --request POST \
--url https://api.hyperprop.com/trade/order/attach-bracket \
--header 'Content-Type: application/json' \
--data '
{
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"order_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"stop_loss": 6075,
"take_profit": 6125
}
'import requests
url = "https://api.hyperprop.com/trade/order/attach-bracket"
payload = {
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"order_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"stop_loss": 6075,
"take_profit": 6125
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: '550e8400-e29b-41d4-a716-446655440000',
order_id: '7c9e6679-7425-40de-944b-e07fc1f90ae7',
stop_loss: 6075,
take_profit: 6125
})
};
fetch('https://api.hyperprop.com/trade/order/attach-bracket', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hyperprop.com/trade/order/attach-bracket",
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([
'account_id' => '550e8400-e29b-41d4-a716-446655440000',
'order_id' => '7c9e6679-7425-40de-944b-e07fc1f90ae7',
'stop_loss' => 6075,
'take_profit' => 6125
]),
CURLOPT_HTTPHEADER => [
"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://api.hyperprop.com/trade/order/attach-bracket"
payload := strings.NewReader("{\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"order_id\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n \"stop_loss\": 6075,\n \"take_profit\": 6125\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.hyperprop.com/trade/order/attach-bracket")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"order_id\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n \"stop_loss\": 6075,\n \"take_profit\": 6125\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/trade/order/attach-bracket")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"order_id\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n \"stop_loss\": 6075,\n \"take_profit\": 6125\n}"
response = http.request(request)
puts response.read_body{
"code": null,
"data": {
"order": {
"contract": "MNQU6",
"id": "7f3a2b1c-9d4e-4f6a-8b2c-1e5d7a9c3b60",
"limit_price": 29510.25,
"order_type": "limit",
"quantity": 2,
"side": "buy",
"status": "working"
},
"stop_loss_order": {
"bracket_type": "stop_loss",
"contract": "MNQU6",
"id": "8a4b3c2d-0e5f-4a7b-9c3d-2f6e8b0d4c71",
"order_type": "stop",
"quantity": 2,
"side": "sell",
"status": "working",
"stop_price": 29488
},
"take_profit_order": {
"bracket_type": "take_profit",
"contract": "MNQU6",
"id": "9b5c4d3e-1f6a-4b8c-0d4e-3a7f9c1e5d82",
"limit_price": 29562.25,
"order_type": "limit",
"quantity": 2,
"side": "sell",
"status": "working"
}
},
"error": null,
"success": true
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "RATE_LIMITED",
"data": null,
"error": "Rate limit exceeded for order submissions. Max 10 requests per second per account. Retry after 0.1 seconds.",
"rate_limit": {
"limit": 10,
"remaining": 0,
"reset": 1711800125,
"retry_after": 0.1
},
"success": false
}Body
application/json
Attach TP/SL bracket to an existing order
UUID of the trading account
Example:
"550e8400-e29b-41d4-a716-446655440000"
UUID of the parent entry order
Example:
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
Optional stop-loss price
Example:
6075
Optional take-profit price
Example:
6125
Related topics
Detach TP/SL bracket leg from an orderSet TP/SL at the position level for one (account, contract) pair.Create or update account lockoutChangelogCancel a pending order⌘I
Attach TP/SL bracket to an existing order
curl --request POST \
--url https://api.hyperprop.com/trade/order/attach-bracket \
--header 'Content-Type: application/json' \
--data '
{
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"order_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"stop_loss": 6075,
"take_profit": 6125
}
'import requests
url = "https://api.hyperprop.com/trade/order/attach-bracket"
payload = {
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"order_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"stop_loss": 6075,
"take_profit": 6125
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: '550e8400-e29b-41d4-a716-446655440000',
order_id: '7c9e6679-7425-40de-944b-e07fc1f90ae7',
stop_loss: 6075,
take_profit: 6125
})
};
fetch('https://api.hyperprop.com/trade/order/attach-bracket', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hyperprop.com/trade/order/attach-bracket",
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([
'account_id' => '550e8400-e29b-41d4-a716-446655440000',
'order_id' => '7c9e6679-7425-40de-944b-e07fc1f90ae7',
'stop_loss' => 6075,
'take_profit' => 6125
]),
CURLOPT_HTTPHEADER => [
"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://api.hyperprop.com/trade/order/attach-bracket"
payload := strings.NewReader("{\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"order_id\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n \"stop_loss\": 6075,\n \"take_profit\": 6125\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.hyperprop.com/trade/order/attach-bracket")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"order_id\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n \"stop_loss\": 6075,\n \"take_profit\": 6125\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/trade/order/attach-bracket")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"order_id\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n \"stop_loss\": 6075,\n \"take_profit\": 6125\n}"
response = http.request(request)
puts response.read_body{
"code": null,
"data": {
"order": {
"contract": "MNQU6",
"id": "7f3a2b1c-9d4e-4f6a-8b2c-1e5d7a9c3b60",
"limit_price": 29510.25,
"order_type": "limit",
"quantity": 2,
"side": "buy",
"status": "working"
},
"stop_loss_order": {
"bracket_type": "stop_loss",
"contract": "MNQU6",
"id": "8a4b3c2d-0e5f-4a7b-9c3d-2f6e8b0d4c71",
"order_type": "stop",
"quantity": 2,
"side": "sell",
"status": "working",
"stop_price": 29488
},
"take_profit_order": {
"bracket_type": "take_profit",
"contract": "MNQU6",
"id": "9b5c4d3e-1f6a-4b8c-0d4e-3a7f9c1e5d82",
"limit_price": 29562.25,
"order_type": "limit",
"quantity": 2,
"side": "sell",
"status": "working"
}
},
"error": null,
"success": true
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "ERROR_CODE",
"data": null,
"error": "Error message describing what went wrong",
"success": false
}{
"code": "RATE_LIMITED",
"data": null,
"error": "Rate limit exceeded for order submissions. Max 10 requests per second per account. Retry after 0.1 seconds.",
"rate_limit": {
"limit": 10,
"remaining": 0,
"reset": 1711800125,
"retry_after": 0.1
},
"success": false
}