curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}"
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}', 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}",
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}"
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}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}")
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": {
"chain": "solana",
"address": "<string>",
"name": "<string>",
"symbol": "<string>",
"decimals": 1,
"supply": "<string>",
"supplyType": "<string>",
"firstObservedAtMs": 1,
"createdAtMs": 1,
"imageUrl": "<string>",
"imageStatus": "resolved",
"website": "<string>",
"socialLinks": {
"twitter": "<string>",
"telegram": "<string>"
},
"launchpad": "<string>",
"dex": "<string>",
"poolAddress": "<string>",
"stage": "<string>",
"bondingProgressPct": "<string>",
"priceUsd": "<string>",
"priceNative": "<string>",
"marketCapUsd": "<string>",
"fdvUsd": "<string>",
"liquidityUsd": "<string>",
"holders": 1,
"windows": {},
"fieldMeta": {},
"risk": {
"chain": "solana",
"address": "<string>",
"modelVersion": "public-risk-v1",
"facts": {},
"tags": [
{
"status": "known",
"observedAtMs": 1,
"staleAfterMs": 1,
"source": "<string>",
"methodVersion": "<string>",
"coverage": {
"reason": "<string>",
"complete": true
},
"code": "mint_authority_active",
"state": "present",
"severity": "warning",
"value": true,
"unit": "<string>"
}
]
}
},
"meta": {
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"methodVersion": "<string>",
"chain": "solana"
}
}{
"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 cached token identity and market facts
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. Market amounts require exact source strings; current float-only snapshot fields remain null. Window buy/sell/economic-volume fields remain unavailable until qualified, rather than relabeling execution-leg statistics. Field observations retain source clocks; retrieval does not renew freshness.
curl --request GET \
--url https://www.oceanx.trade/api/v1/tokens/{chain}/{address} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.oceanx.trade/api/v1/tokens/{chain}/{address}"
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}', 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}",
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}"
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}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.oceanx.trade/api/v1/tokens/{chain}/{address}")
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": {
"chain": "solana",
"address": "<string>",
"name": "<string>",
"symbol": "<string>",
"decimals": 1,
"supply": "<string>",
"supplyType": "<string>",
"firstObservedAtMs": 1,
"createdAtMs": 1,
"imageUrl": "<string>",
"imageStatus": "resolved",
"website": "<string>",
"socialLinks": {
"twitter": "<string>",
"telegram": "<string>"
},
"launchpad": "<string>",
"dex": "<string>",
"poolAddress": "<string>",
"stage": "<string>",
"bondingProgressPct": "<string>",
"priceUsd": "<string>",
"priceNative": "<string>",
"marketCapUsd": "<string>",
"fdvUsd": "<string>",
"liquidityUsd": "<string>",
"holders": 1,
"windows": {},
"fieldMeta": {},
"risk": {
"chain": "solana",
"address": "<string>",
"modelVersion": "public-risk-v1",
"facts": {},
"tags": [
{
"status": "known",
"observedAtMs": 1,
"staleAfterMs": 1,
"source": "<string>",
"methodVersion": "<string>",
"coverage": {
"reason": "<string>",
"complete": true
},
"code": "mint_authority_active",
"state": "present",
"severity": "warning",
"value": true,
"unit": "<string>"
}
]
}
},
"meta": {
"requestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"methodVersion": "<string>",
"chain": "solana"
}
}{
"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 ^[1-9A-HJ-NP-Za-km-z]{32,44}$Query Parameters
risk 