从 OKX DEX 市场行情 API (v6) 获取代币最新价格,适用于获取支持的 EVM/So... 链上一种或多种代币的即时价格。
This skill generates production-ready code for fetching token prices from the OKX DEX Market Price API v6. The API returns the latest price for one or more tokens on a given chain. It is a batch endpoint: you send a list of (chainIndex, tokenContractAddress) and receive a list of price results.
Key capabilities:
time (price timestamp in ms) and price (string for precision)OKX_ACCESS_KEY — API keyOKX_SECRET_KEY — Secret key for HMAC signingOKX_PASSPHRASE — Account passphraserequests, hmac, hashlib, base64, datetime, json (stdlib except requests)axios or node-fetch, built-in cryptotext
POST https://web3.okx.com/api/v6/dex/market/price
chainIndex (String, required): Supported chain ID, e.g. "1" = Ethereum, "56" = BSC.
tokenContractAddress (String, required): Token contract address.
0x382bb369d343125bfb2117af9c149795c6c65c50).0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.OKX API requires HMAC-SHA256 signed requests. For POST, the body is part of the prehash.
Headers:
text
Content-Type: application/json
OK-ACCESS-KEY: <api_key>
OK-ACCESS-SIGN: <hmac_signature>
OK-ACCESS-PASSPHRASE: <passphrase>
OK-ACCESS-TIMESTAMP: <iso8601_timestamp>
Signing algorithm (POST):
text
timestamp = ISO 8601 UTC (e.g. "2025-01-15T12:00:00.000Z")
request_path = "/api/v6/dex/market/price" // no query string for this endpoint
body = exact JSON string that will be sent (e.g. '[{"chainIndex":"1","tokenContractAddress":"0x..."}]'
prehash = timestamp + "POST" + request_path + body
signature = Base64(HMAC-SHA256(secret_key, prehash))
CRITICAL for POST:
"POST".Request body example:
json
[
{ "chainIndex": "1", "tokenContractAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" },
{ "chainIndex": "56", "tokenContractAddress": "0x382bb369d343125bfb2117af9c149795c6c65c50" }
]
Success response structure:
json
{
"code": "0",
"data": [
{
"chainIndex": "1",
"tokenContractAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"time": "1716892020000",
"price": "1.00012345"
}
],
"msg": ""
}
Fields:
code: "0" = success; non-zero = error (see msg).data: Array of price objects, one per requested token (order may match request).chainIndex, tokenContractAddress: Echo of request.time: Price timestamp in Unix milliseconds (string).price: Latest token price (string to preserve precision).price (string) to number only when needed for display/math to avoid precision loss.time for “price as of” display (e.g. convert ms to local time).code !== "0", surface msg and do not treat as success.tokenContractAddress format (EVM hex length/case, Solana base58) before sending.json.dumps(payload, separators=(',', ':')) for deterministic output.JSON.stringify(payload) — ensure no trailing spaces.response["code"] == "0" before using data.tokenParamList (e.g. empty list or >100 items) returns param error.python
import os
import json
import hmac
import hashlib
import base64
import requests
from datetime import datetime, timezone
API_KEY = os.environ["OKX_ACCESS_KEY"]
SECRET_KEY = os.environ["OKX_SECRET_KEY"]
PASSPHRASE = os.environ["OKX_PASSPHRASE"]
BASE_URL = "https://web3.okx.com"
PRICE_PATH = "/api/v6/dex/market/price"
def get_prices(token_param_list):
# 1–100 items
if not token_param_list or len(token_param_list) > 100:
raise ValueError("token_param_list must have 1–100 items")
body = json.dumps(token_param_list, separators=(',', ':'))
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
prehash = timestamp + "POST" + PRICE_PATH + body
signature = base64.b64encode(
hmac.new(SECRET_KEY.encode(), prehash.encode(), hashlib.sha256).digest()
).decode()
headers = {
"Content-Type": "application/json",
"OK-ACCESS-KEY": API_KEY,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-PASSPHRASE": PASSPHRASE,
"OK-ACCESS-TIMESTAMP": timestamp,
}
resp = requests.post(BASE_URL + PRICE_PATH, headers=headers, data=body, timeout=30)
resp.raise_for_status()
data = resp.json()
if data.get("code") != "0":
raise Exception(f"OKX API error: {data.get('msg', 'Unknown')}")
return data.get("data", [])
# One token on Ethereum (USDC)
payload = [{"chainIndex": "1", "tokenContractAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"}]
prices = get_prices(payload)
for p in prices:
print(f"{p['tokenContractAddress']} @ {p['time']}: {p['price']}")
javascript
const crypto = require("crypto");
const https = require("https");
const API_KEY = process.env.OKX_ACCESS_KEY;
const SECRET_KEY = process.env.OKX_SECRET_KEY;
const PASSPHRASE = process.env.OKX_PASSPHRASE;
const BASE = "https://web3.okx.com";
const PATH = "/api/v6/dex/market/price";
function getPrices(tokenParamList) {
const body = JSON.stringify(tokenParamList);
const timestamp = new Date().toISOString();
const prehash = timestamp + "POST" + PATH + body;
const signature = crypto.createHmac("sha256", SECRET_KEY).update(prehash).digest("base64");
const options = {
method: "POST",
headers: {
"Content-Type": "application/json",
"OK-ACCESS-KEY": API_KEY,
"OK-ACCESS-SIGN": signature,
"OK-ACCESS-PASSPHRASE": PASSPHRASE,
"OK-ACCESS-TIMESTAMP": timestamp,
},
};
return new Promise((resolve, reject) => {
const req = https.request(BASE + PATH, options, (res) => {
let data = "";
res.on("data", (chunk) => (data += chunk));
res.on("end", () => {
const json = JSON.parse(data);
if (json.code !== "0") reject(new Error(json.msg || "API error"));
else resolve(json.data || []);
});
});
req.on("error", reject);
req.write(body);
req.end();
});
}
ProblemCauseSolution401 UnauthorizedSignature mismatchEnsure prehash = timestamp + "POST" + path + exact body; same body for sign and request.tokenParamList param errorEmpty or >100 itemsSend array with 1–100 elements.Invalid token addressWrong format or chainEVM: 42-char hex lowercase; use native token placeholder for ETH/BNB.code non-zeroAPI / param errorRead msg; check chain support and address validity.Missing price for a tokenToken not supported or no liquidityAPI may omit or fail for that pair; check supported chains/tokens.
ChainchainIndexEthereum1BSC56Polygon137Arbitrum42161Optimism10Base8453Solana501Unichain130
ItemDescriptionMethodPOSTURLhttps://web3.okx.com/api/v6/dex/market/priceBodyJSON array of { "chainIndex": string, "tokenContractAddress": string }, length 1–100Success code"0"data[]chainIndex, tokenContractAddress, time (ms string), price (string)