bingx-spot-trade
BingX Spot Trade
Authenticated trading endpoints for BingX spot market. All endpoints require HMAC SHA256 signature authentication.
Base URLs: see references/base-urls.md | Authentication: see references/authentication.md
Quick Reference
| Endpoint | Method | Description | Authentication |
|---|---|---|---|
/openApi/spot/v1/trade/order |
POST | Place a single order | Yes |
/openApi/spot/v1/trade/batchOrders |
POST | Place multiple orders (max 5) | Yes |
/openApi/spot/v1/trade/cancel |
POST | Cancel an order | Yes |
/openApi/spot/v1/trade/cancelOrders |
POST | Cancel multiple orders | Yes |
/openApi/spot/v1/trade/cancelOpenOrders |
POST | Cancel all open orders on a symbol | Yes |
/openApi/spot/v1/trade/cancelAllAfter |
POST | Auto-cancel countdown (kill switch) | Yes |
/openApi/spot/v1/trade/order/cancelReplace |
POST | Cancel and replace order | Yes |
/openApi/spot/v1/trade/query |
GET | Query order details | Yes |
/openApi/spot/v1/trade/openOrders |
GET | Query current open orders | Yes |
/openApi/spot/v1/trade/historyOrders |
GET | Query order history | Yes |
/openApi/spot/v1/trade/myTrades |
GET | Query transaction details (trade fills) | Yes |
/openApi/spot/v1/user/commissionRate |
GET | Query trading commission rate | Yes |
/openApi/spot/v1/oco/order |
POST | Create OCO order | Yes |
/openApi/spot/v1/oco/cancel |
POST | Cancel OCO order | Yes |
/openApi/spot/v1/oco/orderList |
GET | Query OCO order list | Yes |
/openApi/spot/v1/oco/openOrderList |
GET | Query all open OCO orders | Yes |
/openApi/spot/v1/oco/historyOrderList |
GET | Query OCO historical order list | Yes |
Parameters
Order Parameters
- symbol: Trading pair in
BASE-QUOTEformat (e.g.,BTC-USDT,ETH-USDT) - side: Order direction —
BUYorSELL - type: Order type (see Enums)
- quantity: Order quantity in base asset (e.g.,
0.1BTC for BTC-USDT) - quoteOrderQty: Order amount in quote asset (e.g.,
100USDT);quantitytakes priority if both provided - price: Limit price (required for
LIMIT,TAKE_STOP_LIMIT,TRIGGER_LIMIT) - stopPrice: Trigger price (required for
TAKE_STOP_LIMIT,TAKE_STOP_MARKET,TRIGGER_LIMIT,TRIGGER_MARKET) - timeInForce:
GTC|IOC|FOK|PostOnly— defaultGTC; required forLIMITtype - newClientOrderId: Custom order ID, 1–40 chars
- recvWindow: Request validity window in milliseconds (max 60000)
- orderId: System order ID (for cancel/query)
- clientOrderID: Custom order ID (for cancel/query)
Enums
type (Order type):
MARKET— Market order (fills immediately at best available price)LIMIT— Limit order (requirespriceandtimeInForce)TAKE_STOP_LIMIT— Take-profit/stop-loss limit order (requiresstopPriceandprice)TAKE_STOP_MARKET— Take-profit/stop-loss market order (requiresstopPrice)TRIGGER_LIMIT— Trigger limit order (requiresstopPriceandprice)TRIGGER_MARKET— Trigger market order (requiresstopPrice)
side: BUY | SELL
timeInForce: GTC | IOC | FOK | PostOnly
cancelReplaceMode:
STOP_ON_FAILURE— Abort if the cancel step failsALLOW_FAILURE— Place the new order even if cancel fails
cancelRestrictions (limit cancellation by order status):
NEW|PENDING|PARTIALLY_FILLED
Parameter Validation Rules
Before sending a request, validate parameters client-side to avoid unnecessary API errors:
- symbol: Must match
^[A-Z0-9]+-[A-Z]+$; max 20 characters (e.g.,BTC-USDT) - quantity: Must be a positive number (> 0); precision depends on the symbol's lot-size filter
- quoteOrderQty: When provided, must be a positive number (> 0); represents amount in quote asset
- price: When provided, must be a positive number (> 0)
- stopPrice: When provided, must be a positive number (> 0)
- newClientOrderId: 1–40 characters; avoid special characters that could be interpreted as injection
- recvWindow: Integer, 1–5000 ms; keep as small as possible (see Replay Protection)
- timestamp: Unix time in milliseconds; must be within
recvWindowof server time
Quick Start
CONSTRAINT: 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;
}
}
}
Code Usage Rules
- MUST copy
fetchSignedverbatim -- do not simplify or rewrite - MUST use
json-bigint(JSONBigParse.parse) for response parsing -- notJSON.parse - MUST include
X-SOURCE-KEY: BX-AI-SKILLheader on every request - MUST NOT remove the domain fallback loop or
isNetworkOrTimeoutcheck
Common Calls
Place a market buy order (spend 100 USDT):
const order = await fetchSigned("prod-live", API_KEY, SECRET, "POST",
"/openApi/spot/v1/trade/order", {
symbol: "BTC-USDT",
side: "BUY",
type: "MARKET",
quoteOrderQty: 100,
}
);
// order.orderId, order.status, order.executedQty, order.cummulativeQuoteQty
Place a limit sell order:
const order = await fetchSigned("prod-live", API_KEY, SECRET, "POST",
"/openApi/spot/v1/trade/order", {
symbol: "BTC-USDT",
side: "SELL",
type: "LIMIT",
quantity: 0.001,
price: 100000,
timeInForce: "GTC",
}
);
Cancel an order:
await fetchSigned("prod-live", API_KEY, SECRET, "POST",
"/openApi/spot/v1/trade/cancel", {
symbol: "BTC-USDT",
orderId: 123456789,
}
);
Query open orders:
const data = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/spot/v1/trade/openOrders", {
symbol: "BTC-USDT",
}
);
// data.orders[].orderId, data.orders[].price, data.orders[].status
Query order history:
const data = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/spot/v1/trade/historyOrders", {
symbol: "BTC-USDT",
pageIndex: 1,
pageSize: 20,
}
);
Query trade fills for an order:
const data = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/spot/v1/trade/myTrades", {
symbol: "BTC-USDT",
orderId: 123456789,
}
);
// data.fills[].price, data.fills[].qty, data.fills[].commission
Query commission rate:
const data = await fetchSigned("prod-live", API_KEY, SECRET, "GET",
"/openApi/spot/v1/user/commissionRate", {
symbol: "BTC-USDT",
}
);
// data.takerCommissionRate, data.makerCommissionRate
Additional Resources
For full parameter descriptions, response schemas, and all 17 endpoints, see api-reference.md.
Agent Interaction Rules
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.
All write operations (place order, cancel order, OCO create/cancel) require CONFIRM on prod-live. Read-only queries do not.
- prod-live: Ask user to type CONFIRM before any order placement or cancellation.
- prod-vst: No CONFIRM required. Inform user: "You are operating in the Production Simulated (VST) environment."
Step 1 — Identify the Operation
If the user's intent is unclear, present options:
What would you like to do?
- Place a new order
- Cancel an order / Cancel all orders
- Check open orders
- Check order history
- Check trade fills (transaction details)
- Check trading commission rate
- OCO order (create / cancel / query)
Step 2 — Collect symbol (if not provided)
Please select a trading pair (or type another):
- BTC-USDT
- ETH-USDT
- SOL-USDT
- BNB-USDT
- Other (format: BASE-USDT)
Step 3 — Collect side (for order placement)
Order direction:
- BUY
- SELL
Step 4 — Collect order type
Order type:
- MARKET — execute immediately at best price
- LIMIT — execute at a specific price (requires
priceandtimeInForce)- TAKE_STOP_LIMIT — take-profit/stop-loss limit (requires
stopPrice+price)- TAKE_STOP_MARKET — take-profit/stop-loss market (requires
stopPrice)- TRIGGER_LIMIT — trigger limit order (requires
stopPrice+price)- TRIGGER_MARKET — trigger market order (requires
stopPrice)
Step 5 — Collect quantity and price
- MARKET BUY: ask for
quoteOrderQty(USDT to spend) orquantity(base asset amount) - MARKET SELL: ask for
quantity(base asset amount to sell) - LIMIT: ask for
quantityandprice; confirmtimeInForce(default GTC) - TAKE_STOP_LIMIT / TRIGGER_LIMIT: ask for
quantity,stopPrice(trigger), andprice(execution) - TAKE_STOP_MARKET / TRIGGER_MARKET: ask for
quantityandstopPrice
Step 6 — Confirm (prod-live only)
For prod-live, present a summary and ask:
You are about to place the following order on Production Live:
- Symbol: BTC-USDT
- Side: BUY
- Type: MARKET
- Amount: 100 USDT
Type CONFIRM to proceed, or anything else to cancel.
Step 7 — Execute and report
Execute the API call and return the order ID, status, and filled quantity to the user.
Cancel Order Flow
- Ask for
symbolandorderId(orclientOrderID) if not provided. - For
prod-live: ask for CONFIRM. - Execute POST
/openApi/spot/v1/trade/cancel.
Cancel All Open Orders Flow
- Ask for
symbol(optional — omit to cancel all pairs). - For
prod-live: ask for CONFIRM. - Execute POST
/openApi/spot/v1/trade/cancelOpenOrders.
OCO Order Flow
OCO (One-Cancels-the-Other) pairs a limit order with a stop-limit order; when one fills or triggers, the other is automatically cancelled.
- Ask for
symbol,side,quantity. - Ask for
limitPrice(limit order execution price). - Ask for
triggerPrice(stop-limit trigger price). - Ask for
orderPrice(stop-limit execution price after trigger fires). - For
prod-live: ask for CONFIRM. - Execute POST
/openApi/spot/v1/oco/order.
More from bingx-api/api-ai-skills
bingx-swap-trade
BingX perpetual swap trading — place/cancel orders, manage positions, set leverage, and configure margin settings. Use when the user asks about BingX swap trading, order placement, cancellation, position management, leverage, or margin type settings.
88bingx-swap-market
Query BingX perpetual swap market data including ticker prices, order book depth, recent trades, funding rates, klines/candlesticks, open interest, mark price, and contract info. Use when the user asks about BingX swap or perpetual futures prices, order books, candlestick charts, funding rates, or market statistics.
87bingx-swap-account
Query BingX perpetual swap account data including balance, positions, commission rates, and fund flow history. Use when the user asks about BingX account balance, margin info, current positions, PnL, liquidation price, fee rates, or income/fund flow records.
85bingx-agent
BingX Agent (affiliate/broker) management — query invited users, daily commission details, agent user information, API transaction commission, and partner information. Use when the user asks about BingX agent invited users, affiliate commissions, referral relationships, partner data, or broker commission reports.
81bingx-coinm-market
Query BingX Coin-M (inverse/coin-margined) perpetual futures market data including contract info, mark price, funding rates, klines, order book depth, open interest, and 24h ticker. Use when the user asks about BingX Coin-M or inverse futures prices, order books, candlestick charts, funding rates, or market statistics.
74bingx-fund-account
BingX Fund Account management — query fund account balance, get asset overview across all account types, transfer assets between accounts, and perform internal P2P transfers. Use when the user asks about BingX fund account balance, asset overview, transferring assets between spot/futures/standard contract accounts, or sending internal transfers to other BingX users.
74