curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders', 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/tokens/{chain}/{address}/top-traders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"wallet": "<string>",
"rank": 1,
"boughtTokens": "<string>",
"soldTokens": "<string>",
"boughtUsd": "<string>",
"soldUsd": "<string>",
"buys": 1,
"sells": 1,
"lastTradeAtMs": 1,
"realizedPnl": {
"value": {
"usd": "<string>",
"native": "<string>",
"roiPct": "<string>"
},
"status": "partial",
"reason": "observed_swaps_only_not_transfer_aware",
"observedAtMs": 1
}
}
],
"pagination": {
"total": 1,
"hasMore": true,
"nextCursor": "<string>"
},
"meta": {
"requestId": "<string>",
"methodVersion": "public-research-v1",
"chain": "solana",
"observedAtMs": 1,
"address": "<string>",
"window": "1h",
"ranking": "observed_volume_desc",
"source": "native_execution_view",
"status": "partial",
"coverage": {
"basis": "observed_swaps_only",
"transferAware": false,
"windowFromMs": 1,
"windowToMs": 1,
"coveredFromMs": 1,
"historyComplete": true
}
}
}{
"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>"
}Read observed top traders
Ranks wallets by observed buy plus sell USD volume descending, using an already cached native execution view. PnL is explicitly partial execution-only accounting, not transfer-aware wallet PnL; no claim of canonical current holdings is made. all means retained built history. Source cursors pin the selected window and expire after 30 seconds; correction revisions invalidate them. Source observedAtMs and history coverage remain visible even when retained history is old. Solana only. Requires md.read; one shared REST bucket request per call, including coalesced reads. Cache-Control: no-store. Unknown amounts remain null; exact monetary strings are never synthesized from floats. No RPC, vendor fallback, history build, background refresh, or per-result snapshot fetch. Unknown/repeated parameters and URLs over 8 KiB are rejected.
curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders', 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/tokens/{chain}/{address}/top-traders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/top-traders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"wallet": "<string>",
"rank": 1,
"boughtTokens": "<string>",
"soldTokens": "<string>",
"boughtUsd": "<string>",
"soldUsd": "<string>",
"buys": 1,
"sells": 1,
"lastTradeAtMs": 1,
"realizedPnl": {
"value": {
"usd": "<string>",
"native": "<string>",
"roiPct": "<string>"
},
"status": "partial",
"reason": "observed_swaps_only_not_transfer_aware",
"observedAtMs": 1
}
}
],
"pagination": {
"total": 1,
"hasMore": true,
"nextCursor": "<string>"
},
"meta": {
"requestId": "<string>",
"methodVersion": "public-research-v1",
"chain": "solana",
"observedAtMs": 1,
"address": "<string>",
"window": "1h",
"ranking": "observed_volume_desc",
"source": "native_execution_view",
"status": "partial",
"coverage": {
"basis": "observed_swaps_only",
"transferAware": false,
"windowFromMs": 1,
"windowToMs": 1,
"coveredFromMs": 1,
"historyComplete": true
}
}
}{
"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, and alert operations use alerts.read or alerts.write. New scopes require explicit selection and grant no trading authority. Existing perps operations retain their documented scopes.
Path Parameters
solana Valid base58 Solana mint.
Query Parameters
1h, 24h, all 1 <= x <= 100Opaque source cursor. Repeat all selectors. Changed/expired views return 409; restart from the first page.
1 - 512