curl --request POST \
--url https://www.oceanx.trade/api/v1/copy-trading/follows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"wallet": "<string>",
"targetWallet": "<string>",
"maxPerTradeUsd": "<string>",
"dailyCapUsd": "<string>",
"slippageBps": 150,
"clientOrderId": "<string>",
"sizingMode": "fixed",
"fixedUsd": "<string>"
}
'import requests
url = "https://www.oceanx.trade/api/v1/copy-trading/follows"
payload = {
"wallet": "<string>",
"targetWallet": "<string>",
"maxPerTradeUsd": "<string>",
"dailyCapUsd": "<string>",
"slippageBps": 150,
"clientOrderId": "<string>",
"sizingMode": "fixed",
"fixedUsd": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
wallet: '<string>',
targetWallet: '<string>',
maxPerTradeUsd: '<string>',
dailyCapUsd: '<string>',
slippageBps: 150,
clientOrderId: '<string>',
sizingMode: 'fixed',
fixedUsd: '<string>'
})
};
fetch('https://www.oceanx.trade/api/v1/copy-trading/follows', 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://www.oceanx.trade/api/v1/copy-trading/follows",
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([
'wallet' => '<string>',
'targetWallet' => '<string>',
'maxPerTradeUsd' => '<string>',
'dailyCapUsd' => '<string>',
'slippageBps' => 150,
'clientOrderId' => '<string>',
'sizingMode' => 'fixed',
'fixedUsd' => '<string>'
]),
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://www.oceanx.trade/api/v1/copy-trading/follows"
payload := strings.NewReader("{\n \"wallet\": \"<string>\",\n \"targetWallet\": \"<string>\",\n \"maxPerTradeUsd\": \"<string>\",\n \"dailyCapUsd\": \"<string>\",\n \"slippageBps\": 150,\n \"clientOrderId\": \"<string>\",\n \"sizingMode\": \"fixed\",\n \"fixedUsd\": \"<string>\"\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://www.oceanx.trade/api/v1/copy-trading/follows")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"wallet\": \"<string>\",\n \"targetWallet\": \"<string>\",\n \"maxPerTradeUsd\": \"<string>\",\n \"dailyCapUsd\": \"<string>\",\n \"slippageBps\": 150,\n \"clientOrderId\": \"<string>\",\n \"sizingMode\": \"fixed\",\n \"fixedUsd\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/copy-trading/follows")
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 \"wallet\": \"<string>\",\n \"targetWallet\": \"<string>\",\n \"maxPerTradeUsd\": \"<string>\",\n \"dailyCapUsd\": \"<string>\",\n \"slippageBps\": 150,\n \"clientOrderId\": \"<string>\",\n \"sizingMode\": \"fixed\",\n \"fixedUsd\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}Copy trade (unavailable)
Closed copy-follow intake pending signing-contracts; no follow or automation is persisted. Separate copy.trade scope is reserved and unavailable from the dashboard; copy.read never authorizes this operation. After authentication and key/IP policy, bounded exact wire bytes go to request-signature admission before JSON parsing, validation or provider wallet lookup. Before activation every state-changing call requires per-key request signing with timestamp, nonce, method/path and exact body hash plus an atomic bounded replay window. The independent request-signing gate refuses all requests until a reviewed verifier is released, even if the backend signer becomes available. Provider-bound account wallet ownership remains required after future verification. Chain coverage matches the released copy identity contract (SOL, Base, BNB, Ethereum, Robinhood). The verified continuation validates exact positive USD decimal strings, caps and fixed/percentage sizing; no dry-run success or execution authority is implied.
curl --request POST \
--url https://www.oceanx.trade/api/v1/copy-trading/follows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"wallet": "<string>",
"targetWallet": "<string>",
"maxPerTradeUsd": "<string>",
"dailyCapUsd": "<string>",
"slippageBps": 150,
"clientOrderId": "<string>",
"sizingMode": "fixed",
"fixedUsd": "<string>"
}
'import requests
url = "https://www.oceanx.trade/api/v1/copy-trading/follows"
payload = {
"wallet": "<string>",
"targetWallet": "<string>",
"maxPerTradeUsd": "<string>",
"dailyCapUsd": "<string>",
"slippageBps": 150,
"clientOrderId": "<string>",
"sizingMode": "fixed",
"fixedUsd": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
wallet: '<string>',
targetWallet: '<string>',
maxPerTradeUsd: '<string>',
dailyCapUsd: '<string>',
slippageBps: 150,
clientOrderId: '<string>',
sizingMode: 'fixed',
fixedUsd: '<string>'
})
};
fetch('https://www.oceanx.trade/api/v1/copy-trading/follows', 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://www.oceanx.trade/api/v1/copy-trading/follows",
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([
'wallet' => '<string>',
'targetWallet' => '<string>',
'maxPerTradeUsd' => '<string>',
'dailyCapUsd' => '<string>',
'slippageBps' => 150,
'clientOrderId' => '<string>',
'sizingMode' => 'fixed',
'fixedUsd' => '<string>'
]),
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://www.oceanx.trade/api/v1/copy-trading/follows"
payload := strings.NewReader("{\n \"wallet\": \"<string>\",\n \"targetWallet\": \"<string>\",\n \"maxPerTradeUsd\": \"<string>\",\n \"dailyCapUsd\": \"<string>\",\n \"slippageBps\": 150,\n \"clientOrderId\": \"<string>\",\n \"sizingMode\": \"fixed\",\n \"fixedUsd\": \"<string>\"\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://www.oceanx.trade/api/v1/copy-trading/follows")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"wallet\": \"<string>\",\n \"targetWallet\": \"<string>\",\n \"maxPerTradeUsd\": \"<string>\",\n \"dailyCapUsd\": \"<string>\",\n \"slippageBps\": 150,\n \"clientOrderId\": \"<string>\",\n \"sizingMode\": \"fixed\",\n \"fixedUsd\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/copy-trading/follows")
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 \"wallet\": \"<string>\",\n \"targetWallet\": \"<string>\",\n \"maxPerTradeUsd\": \"<string>\",\n \"dailyCapUsd\": \"<string>\",\n \"slippageBps\": 150,\n \"clientOrderId\": \"<string>\",\n \"sizingMode\": \"fixed\",\n \"fixedUsd\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}Authorizations
An OceanX API key, created in the app under Settings → Developer API. Send it as Authorization: Bearer ox_live_…. Required scopes are operation-specific: market reads use md.read, tracker uses tracker.read, copy reads use copy.read, alert operations use alerts.read or alerts.write, and owned wallet/funding reads require explicit account.read. New scopes require explicit selection and grant no trading authority. Existing perps operations retain their documented scopes.
Body
- Option 1
- Option 2
solana, base, bnb, ethereum, robinhood 4444buys, all 48^(0|[1-9]\d{0,19})(\.\d{1,18})?$48^(0|[1-9]\d{0,19})(\.\d{1,18})?$1 <= x <= 3001 - 64^[A-Za-z0-9_-]+$"fixed"48^(0|[1-9]\d{0,19})(\.\d{1,18})?$