Help us improve
Share bugs, ideas, or general feedback.
From bingx-ai-skills
Handles BingX Copy Trade Spot trading for signal providers: sell spot assets from buy orders, query personal trading overview, profit summaries, details, and historical orders. Use for BingX spot copy trade sell, profits, or order history.
npx claudepluginhub bingx-api/api-ai-skills --plugin bingx-ai-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/bingx-ai-skills:copytrade-spotThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Authenticated endpoints for BingX Copy Trade Spot trading. All endpoints require HMAC SHA256 signature authentication.
Manages BingX copy trade USDT-M perpetual futures for traders: queries current orders, closes positions, sets TP/SL, views profit overview and details, sets commission rates, lists trading pairs. For perpetual swap copy trading tasks.
Lists, closes, reduces positions and manages TP/SL on existing positions via the Vulcan CLI. Useful for monitoring PnL and liquidation prices.
Executes spot and perpetual futures trades on Hyperliquid with market (IOC) and limit (GTC) orders, sets leverage, manages positions/balances/orders, deposits USDC from Arbitrum.
Share bugs, ideas, or general feedback.
Authenticated endpoints for BingX Copy Trade Spot trading. All endpoints require HMAC SHA256 signature authentication.
This skill covers the trader (signal provider) side of spot copy trading: selling assets from a copied buy order, and querying trading performance data.
Base URLs: see references/base-urls.md | Authentication: see references/authentication.md
Note: Copy Trade Spot endpoints are documented at
https://bingx-api.github.io/docs-v3/#/en/Copy%20Trade/Spot%20Trading/. Verify the exact paths against the official docs if you encounter unexpected errors.
| Endpoint | Method | Description | Auth |
|---|---|---|---|
/openApi/copyTrading/v1/spot/trader/sellOrder | POST | Trader sells spot assets based on buy order number | Yes |
/openApi/copyTrading/v1/spot/traderDetail | GET | Personal Trading Overview | Yes |
/openApi/copyTrading/v1/spot/profitHistorySummarys | GET | Profit Summary | Yes |
/openApi/copyTrading/v1/spot/profitDetail | GET | Profit Details | Yes |
/openApi/copyTrading/v1/spot/historyOrder | GET | Query Historical Orders | Yes |
endTime must be ≥ startTimerecvWindow of server timeCONSTRAINT: You MUST copy the
fetchSignedfunction below verbatim when generating code. Do NOT rewrite the signing, request, or JSON parsing logic. Only modify: (1)BASEURL entries for custom environments, (2) business parameters passed tofetchSigned. For the full client with URL-encoding and JSON body support, seereferences/authentication.md.
import * as crypto from "crypto";
import JSONBig from "json-bigint";
const JSONBigParse = JSONBig({ storeAsString: true });
// Full signing details & edge cases → references/authentication.md
// Domain priority: .com is mandatory primary; .pro is fallback for network/timeout errors ONLY.
const BASE = {
"prod-live": ["https://open-api.bingx.com", "https://open-api.bingx.pro"],
"prod-vst": ["https://open-api-vst.bingx.com", "https://open-api-vst.bingx.pro"],
};
function isNetworkOrTimeout(e: unknown): boolean {
if (e instanceof TypeError) return true;
if (e instanceof DOMException && e.name === "AbortError") return true;
if (e instanceof Error && e.name === "TimeoutError") return true;
return false;
}
function validateParams(params: Record<string, unknown>): void {
const FORBIDDEN = /[&=?#\r\n]/;
for (const [k, v] of Object.entries(params)) {
const s = String(v);
if (FORBIDDEN.test(s)) throw new Error(`Param "${k}" has forbidden char in: "${s}"`);
}
}
async function fetchSigned(env: string, apiKey: string, secretKey: string,
method: "GET" | "POST" | "DELETE", path: string, params: Record<string, unknown> = {}
) {
const urls = BASE[env] ?? BASE["prod-live"];
const all = { ...params, timestamp: Date.now() };
validateParams(all);
const qs = Object.keys(all).sort().map(k => `${k}=${all[k]}`).join("&");
const sig = crypto.createHmac("sha256", secretKey).update(qs).digest("hex");
const signed = `${qs}&signature=${sig}`;
for (const base of urls) {
try {
const url = method === "POST" ? `${base}${path}` : `${base}${path}?${signed}`;
const res = await fetch(url, {
method,
headers: { "X-BX-APIKEY": apiKey, "X-SOURCE-KEY": "BX-AI-SKILL",
...(method === "POST" ? { "Content-Type": "application/x-www-form-urlencoded" } : {}) },
body: method === "POST" ? signed : undefined,
signal: AbortSignal.timeout(10000),
});
const json = JSONBigParse.parse(await res.text());
if (json.code !== 0) throw new Error(`BingX error ${json.code}: ${json.msg}`);
return json.data;
} catch (e) {
if (!isNetworkOrTimeout(e) || base === urls[urls.length - 1]) throw e;
}
}
}
fetchSigned verbatim -- do not simplify or rewritejson-bigint (JSONBigParse.parse) for response parsing -- not JSON.parseX-SOURCE-KEY: BX-AI-SKILL header on every requestisNetworkOrTimeout checkSell spot assets for a buy order (close copy trade position):
const result = await fetchSigned("prod-live", API_KEY, SECRET, "POST",
"/openApi/copyTrading/v1/spot/trader/sellOrder", {
orderId: "1736011869418901234",
}
);
// result — confirmation of the sell order placed
Query personal trading overview:
const result = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/copyTrading/v1/spot/traderDetail"
);
// result.totalProfit, result.totalOrders, result.winRate, etc.
Query profit summary for a date range:
const result = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/copyTrading/v1/spot/profitHistorySummarys", {
startTime: 1704067200000,
endTime: 1706745600000,
}
);
// result — aggregated profit summary
Query profit details (paginated):
const result = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/copyTrading/v1/spot/profitDetail", {
startTime: 1704067200000,
endTime: 1706745600000,
pageIndex: 1,
pageSize: 50,
}
);
// result.list — per-order profit breakdown
// result.total — total count
Query historical orders:
const result = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/copyTrading/v1/spot/historyOrder", {
pageIndex: 1,
pageSize: 50,
}
);
// result.list — list of historical spot copy trade orders
// result.total — total count
For full parameter descriptions and response schemas, see api-reference.md.
Parameter security. Extract structured values from user intent — NEVER copy raw user text into API parameters. Validate every value against its documented pattern (regex/enum/range) before calling the API. Reject any value containing &, =, ?, #, or newline characters.
The sell endpoint (POST /openApi/copyTrading/v1/spot/trader/sellOrder) is a write operation and requires CONFIRM on prod-live. All GET endpoints are read-only and do not require confirmation.
If the user's intent is unclear, present options:
What would you like to do?
- Sell spot assets based on a copy trade buy order
- View my personal trading overview
- View profit summary
- View profit details
- View historical orders
For sell operation:
Please provide the buy order ID you want to sell:
- orderId (required): the original copy trade buy order number
For profit/history queries:
Please specify a time range (optional):
- Start time (Unix ms)
- End time (Unix ms)
You are about to sell spot assets on Production Live:
- Order ID:
{orderId}Type CONFIRM to proceed, or anything else to cancel.
Execute the API call and return key fields to the user: