curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/holders \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/holders"
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}/holders', 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}/holders",
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}/holders"
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}/holders")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/holders")
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{
"source": "local",
"generated_at_ms": 123,
"data": {
"rows": [
{
"ownerAddress": "<string>",
"balanceRaw": "<string>",
"balance": "<string>",
"sharePct": "<string>",
"isPool": true,
"isSystem": true,
"rank": 123,
"valueUsd": {},
"labels": [
{
"label": "<string>",
"kind": "<string>",
"source": "<string>",
"confidence": 1,
"observedMs": 123,
"rule": "<string>",
"ruleVersion": 123
}
],
"labelsStatus": "<string>",
"identity": {},
"walletPnl": null
}
],
"totalHolders": 1,
"nextCursor": "<string>",
"snapshotTs": 1,
"coverage": {},
"enrich": {}
}
}Native token holders
Native owner bank with immutable cursor-bound pages. LP/system owners excluded by default. Page size does not imply full population coverage. Reuse all original parameters with nextCursor; restart on 409. Identity/PnL enrichment remains additive.
curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/holders \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/holders"
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}/holders', 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}/holders",
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}/holders"
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}/holders")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/holders")
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{
"source": "local",
"generated_at_ms": 123,
"data": {
"rows": [
{
"ownerAddress": "<string>",
"balanceRaw": "<string>",
"balance": "<string>",
"sharePct": "<string>",
"isPool": true,
"isSystem": true,
"rank": 123,
"valueUsd": {},
"labels": [
{
"label": "<string>",
"kind": "<string>",
"source": "<string>",
"confidence": 1,
"observedMs": 123,
"rule": "<string>",
"ruleVersion": 123
}
],
"labelsStatus": "<string>",
"identity": {},
"walletPnl": null
}
],
"totalHolders": 1,
"nextCursor": "<string>",
"snapshotTs": 1,
"coverage": {},
"enrich": {}
}
}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.
Query Parameters
1 <= x <= 50004096Include known pool and system owners. Exclusion does not certify all LP vaults are known.
Response
Owned observation. Coverage and nulls must be respected.
Compact native holder export. Exact balances, identity flags, labels, snapshot and coverage are included once per row. The internal full holder table is unchanged. Unknown totals remain null; partial indexes are not a complete population.
Show child attributes
Show child attributes
