curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/trades \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/trades"
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}/trades', 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}/trades",
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}/trades"
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}/trades")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/trades")
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": [
{
"id": "<string>",
"signature": "<string>",
"slot": "<string>",
"instructionIndex": 1,
"innerInstructionIndex": 1,
"poolAddress": "<string>",
"dex": "<string>",
"maker": "<string>",
"identity": {
"label": "<string>",
"image": "<string>",
"twitter": "<string>",
"type": "<string>",
"platform": "<string>",
"flags": [
"<string>"
],
"source": "oceanx_wallet_labels",
"asOf": 1,
"profileAsOf": 1,
"profileSource": "wallet_label_reviews"
},
"side": "buy",
"tokenAmount": "<string>",
"nativeAmount": "<string>",
"baseAtomicAmount": null,
"quoteAtomicAmount": null,
"baseDecimals": null,
"quoteDecimals": null,
"priceUsd": "<string>",
"volumeUsd": "<string>",
"priceSource": "<string>",
"eventAtMs": 1,
"observedAtMs": null,
"finality": null
}
],
"nextCursor": "<string>",
"hasNextPage": true,
"meta": {
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"methodVersion": "public-token-tape-v1",
"source": "cache",
"chain": "solana",
"address": "<string>",
"sortDirection": "asc",
"asOfMs": 1,
"snapshotRevision": "<string>",
"cursorTtlMs": 30000,
"window": {
"fromMs": 123,
"toMs": 123
},
"coverage": {
"status": "complete",
"reason": "<string>",
"from": 1,
"through": 1,
"cursor": "<string>",
"complete": true,
"basis": "retained_cache",
"scope": "all"
}
}
}{
"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>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>",
"meta": {
"coverage": {
"status": "complete",
"reason": "<string>",
"from": 1,
"through": 1,
"cursor": "<string>",
"complete": true,
"basis": "retained_cache",
"scope": "all"
}
}
}Read cached token execution legs
Requires md.read and consumes the existing REST key limiter. Solana only; unsupported chains return 400 unsupported_chain. Unknown/repeated query parameters and URLs over 8 KiB are rejected. Responses use Cache-Control: no-store. No paid enrichment is started. Reads only the native source=cache, scope=all tape: retained memory, live ring or bounded captured-history objects; no RPC, enrichment lease, replay or history build. Newest first by default; sortDirection=asc reads oldest first. Stable execution-leg IDs. Default limit stays 100, maximum 500. Optional identity reads only native labels and reviewed profiles for displayed wallets; failure leaves identity null. Coverage is passed through in meta.coverage; partial means retained observations only. hasNextPage is nextCursor !== null, not proof of historical completeness. Uncached or unqualified empty pages return 503 tape_unavailable, with unavailable coverage when provided by the reader; only proven complete empty results succeed. Decimal strings come from exact source facts; unavailable fields remain null. Pinned cursors bind token, all filters, range, limit and correction revision, expire after 30 seconds, and do not include later inserts. Repeat wallet, pool, sortDirection, all other selectors and both bounds from meta.window when using nextCursor. Missing bounds return 400; changed filters return 409 cursor_mismatch; expiry returns 410 cursor_expired; corrections return 409 snapshot_reorg_restart.
curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/trades \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/trades"
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}/trades', 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}/trades",
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}/trades"
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}/trades")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}/trades")
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": [
{
"id": "<string>",
"signature": "<string>",
"slot": "<string>",
"instructionIndex": 1,
"innerInstructionIndex": 1,
"poolAddress": "<string>",
"dex": "<string>",
"maker": "<string>",
"identity": {
"label": "<string>",
"image": "<string>",
"twitter": "<string>",
"type": "<string>",
"platform": "<string>",
"flags": [
"<string>"
],
"source": "oceanx_wallet_labels",
"asOf": 1,
"profileAsOf": 1,
"profileSource": "wallet_label_reviews"
},
"side": "buy",
"tokenAmount": "<string>",
"nativeAmount": "<string>",
"baseAtomicAmount": null,
"quoteAtomicAmount": null,
"baseDecimals": null,
"quoteDecimals": null,
"priceUsd": "<string>",
"volumeUsd": "<string>",
"priceSource": "<string>",
"eventAtMs": 1,
"observedAtMs": null,
"finality": null
}
],
"nextCursor": "<string>",
"hasNextPage": true,
"meta": {
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"methodVersion": "public-token-tape-v1",
"source": "cache",
"chain": "solana",
"address": "<string>",
"sortDirection": "asc",
"asOfMs": 1,
"snapshotRevision": "<string>",
"cursorTtlMs": 30000,
"window": {
"fromMs": 123,
"toMs": 123
},
"coverage": {
"status": "complete",
"reason": "<string>",
"from": 1,
"through": 1,
"cursor": "<string>",
"complete": true,
"basis": "retained_cache",
"scope": "all"
}
}
}{
"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>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>"
}{
"error": {
"code": "no_route",
"message": "<string>"
},
"requestId": "<string>",
"meta": {
"coverage": {
"status": "complete",
"reason": "<string>",
"from": 1,
"through": 1,
"cursor": "<string>",
"complete": true,
"basis": "retained_cache",
"scope": "all"
}
}
}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 ^[1-9A-HJ-NP-Za-km-z]{32,44}$Query Parameters
Default preserves the trade contract. all/liquidity return TokenActivityResponse from our own captures, with eventType discriminators and partial LP coverage. side/minUsd are rejected for mixed/LP reads. No SolanaTracker. LP scopes admit 2 concurrent requests/IP, 60 starts/min/IP and 32 global; unavailable limiter fails closed.
trades, all, liquidity Exact case-sensitive Solana signer. Combines with pool. Public execution filter, not an owned-wallet permission.
Execution time order. Repeat on every cursor request.
asc, desc buy, sell Nonnegative decimal within native decimal precision/range; unsupported precision returns 400 invalid_min_usd. Unknown valuations are excluded by this filter.
^(0|[1-9]\d*)(\.\d+)?$Inclusive epoch milliseconds. Defaults to toMs minus one hour.
x >= 0Exclusive epoch milliseconds, no later than now; defaults to now rounded down to a second.
x >= 01 <= x <= 500Opaque pinned cursor. Repeat fromMs, toMs, limit and filters from the first page. Restart on expiry or correction.
20 - 1024Response
Cached execution-leg page with explicit retained coverage; no empty partial success.
- Option 1
- Option 2
500Show child attributes
Show child attributes
Another page exists in this retained snapshot; false is not proof of complete token or wallet history. Equivalent to nextCursor !== null.
Show child attributes
Show child attributes
