Copy Trading
Bulk update copy trading group followers
Creates or updates an entire copy trading group in one request. Specify the leader account, group name, symbol, and an array of follower configurations (account + ratio).
Followers not included in the request are removed from the group. Ratios must be whole numbers between 1 and 10.
Accounts can only belong to one group per symbol.
POST
/
trade
/
copy
/
group
Bulk update copy trading group followers
curl --request POST \
--url https://api.hyperprop.com/trade/copy/group \
--header 'Content-Type: application/json' \
--data '
{
"followers": [
{
"follower_account_id": "660e8400-e29b-41d4-a716-446655440001",
"is_active": true,
"ratio": 2
},
{
"follower_account_id": "770e8400-e29b-41d4-a716-446655440002",
"is_active": true,
"ratio": 1
}
],
"group_name": "group_a",
"leader_account_id": "550e8400-e29b-41d4-a716-446655440000",
"replace_existing": true,
"symbol": "*"
}
'import requests
url = "https://api.hyperprop.com/trade/copy/group"
payload = {
"followers": [
{
"follower_account_id": "660e8400-e29b-41d4-a716-446655440001",
"is_active": True,
"ratio": 2
},
{
"follower_account_id": "770e8400-e29b-41d4-a716-446655440002",
"is_active": True,
"ratio": 1
}
],
"group_name": "group_a",
"leader_account_id": "550e8400-e29b-41d4-a716-446655440000",
"replace_existing": True,
"symbol": "*"
}
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({
followers: [
{
follower_account_id: '660e8400-e29b-41d4-a716-446655440001',
is_active: true,
ratio: 2
},
{
follower_account_id: '770e8400-e29b-41d4-a716-446655440002',
is_active: true,
ratio: 1
}
],
group_name: 'group_a',
leader_account_id: '550e8400-e29b-41d4-a716-446655440000',
replace_existing: true,
symbol: '*'
})
};
fetch('https://api.hyperprop.com/trade/copy/group', 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/copy/group",
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([
'followers' => [
[
'follower_account_id' => '660e8400-e29b-41d4-a716-446655440001',
'is_active' => true,
'ratio' => 2
],
[
'follower_account_id' => '770e8400-e29b-41d4-a716-446655440002',
'is_active' => true,
'ratio' => 1
]
],
'group_name' => 'group_a',
'leader_account_id' => '550e8400-e29b-41d4-a716-446655440000',
'replace_existing' => true,
'symbol' => '*'
]),
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/copy/group"
payload := strings.NewReader("{\n \"followers\": [\n {\n \"follower_account_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n \"is_active\": true,\n \"ratio\": 2\n },\n {\n \"follower_account_id\": \"770e8400-e29b-41d4-a716-446655440002\",\n \"is_active\": true,\n \"ratio\": 1\n }\n ],\n \"group_name\": \"group_a\",\n \"leader_account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"replace_existing\": true,\n \"symbol\": \"*\"\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/copy/group")
.header("Content-Type", "application/json")
.body("{\n \"followers\": [\n {\n \"follower_account_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n \"is_active\": true,\n \"ratio\": 2\n },\n {\n \"follower_account_id\": \"770e8400-e29b-41d4-a716-446655440002\",\n \"is_active\": true,\n \"ratio\": 1\n }\n ],\n \"group_name\": \"group_a\",\n \"leader_account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"replace_existing\": true,\n \"symbol\": \"*\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/trade/copy/group")
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 \"followers\": [\n {\n \"follower_account_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n \"is_active\": true,\n \"ratio\": 2\n },\n {\n \"follower_account_id\": \"770e8400-e29b-41d4-a716-446655440002\",\n \"is_active\": true,\n \"ratio\": 1\n }\n ],\n \"group_name\": \"group_a\",\n \"leader_account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"replace_existing\": true,\n \"symbol\": \"*\"\n}"
response = http.request(request)
puts response.read_body{
"code": null,
"data": {
"configs": [
{
"follower_account_id": "2a9b1b83-7434-4510-94bc-aac7f92bfaf2",
"group_name": "150k group",
"id": "290eae9e-7a6c-4c19-8a68-232797189473",
"is_active": true,
"leader_account_id": "0b547750-8a5c-4396-9665-d9079511b822",
"ratio": 1,
"symbol": "*"
}
],
"group_count": 1,
"is_locked": false,
"leader_account_id": "0b547750-8a5c-4396-9665-d9079511b822",
"lock_reason": null
},
"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": "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
Bulk request to set follower configs for one leader/group/symbol in one call
Response
Group config saved
Related topics
Create or update a copy trading configDelete a copy trading configGet copy trading configurationToggle copy config active stateBulk update trading accounts⌘I
Bulk update copy trading group followers
curl --request POST \
--url https://api.hyperprop.com/trade/copy/group \
--header 'Content-Type: application/json' \
--data '
{
"followers": [
{
"follower_account_id": "660e8400-e29b-41d4-a716-446655440001",
"is_active": true,
"ratio": 2
},
{
"follower_account_id": "770e8400-e29b-41d4-a716-446655440002",
"is_active": true,
"ratio": 1
}
],
"group_name": "group_a",
"leader_account_id": "550e8400-e29b-41d4-a716-446655440000",
"replace_existing": true,
"symbol": "*"
}
'import requests
url = "https://api.hyperprop.com/trade/copy/group"
payload = {
"followers": [
{
"follower_account_id": "660e8400-e29b-41d4-a716-446655440001",
"is_active": True,
"ratio": 2
},
{
"follower_account_id": "770e8400-e29b-41d4-a716-446655440002",
"is_active": True,
"ratio": 1
}
],
"group_name": "group_a",
"leader_account_id": "550e8400-e29b-41d4-a716-446655440000",
"replace_existing": True,
"symbol": "*"
}
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({
followers: [
{
follower_account_id: '660e8400-e29b-41d4-a716-446655440001',
is_active: true,
ratio: 2
},
{
follower_account_id: '770e8400-e29b-41d4-a716-446655440002',
is_active: true,
ratio: 1
}
],
group_name: 'group_a',
leader_account_id: '550e8400-e29b-41d4-a716-446655440000',
replace_existing: true,
symbol: '*'
})
};
fetch('https://api.hyperprop.com/trade/copy/group', 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/copy/group",
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([
'followers' => [
[
'follower_account_id' => '660e8400-e29b-41d4-a716-446655440001',
'is_active' => true,
'ratio' => 2
],
[
'follower_account_id' => '770e8400-e29b-41d4-a716-446655440002',
'is_active' => true,
'ratio' => 1
]
],
'group_name' => 'group_a',
'leader_account_id' => '550e8400-e29b-41d4-a716-446655440000',
'replace_existing' => true,
'symbol' => '*'
]),
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/copy/group"
payload := strings.NewReader("{\n \"followers\": [\n {\n \"follower_account_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n \"is_active\": true,\n \"ratio\": 2\n },\n {\n \"follower_account_id\": \"770e8400-e29b-41d4-a716-446655440002\",\n \"is_active\": true,\n \"ratio\": 1\n }\n ],\n \"group_name\": \"group_a\",\n \"leader_account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"replace_existing\": true,\n \"symbol\": \"*\"\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/copy/group")
.header("Content-Type", "application/json")
.body("{\n \"followers\": [\n {\n \"follower_account_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n \"is_active\": true,\n \"ratio\": 2\n },\n {\n \"follower_account_id\": \"770e8400-e29b-41d4-a716-446655440002\",\n \"is_active\": true,\n \"ratio\": 1\n }\n ],\n \"group_name\": \"group_a\",\n \"leader_account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"replace_existing\": true,\n \"symbol\": \"*\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/trade/copy/group")
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 \"followers\": [\n {\n \"follower_account_id\": \"660e8400-e29b-41d4-a716-446655440001\",\n \"is_active\": true,\n \"ratio\": 2\n },\n {\n \"follower_account_id\": \"770e8400-e29b-41d4-a716-446655440002\",\n \"is_active\": true,\n \"ratio\": 1\n }\n ],\n \"group_name\": \"group_a\",\n \"leader_account_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"replace_existing\": true,\n \"symbol\": \"*\"\n}"
response = http.request(request)
puts response.read_body{
"code": null,
"data": {
"configs": [
{
"follower_account_id": "2a9b1b83-7434-4510-94bc-aac7f92bfaf2",
"group_name": "150k group",
"id": "290eae9e-7a6c-4c19-8a68-232797189473",
"is_active": true,
"leader_account_id": "0b547750-8a5c-4396-9665-d9079511b822",
"ratio": 1,
"symbol": "*"
}
],
"group_count": 1,
"is_locked": false,
"leader_account_id": "0b547750-8a5c-4396-9665-d9079511b822",
"lock_reason": null
},
"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": "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
}