See the complete V3 prompt endpoint table for chart/research requests, conversation history, connection settings and restricted worker operations.
Manage persistent limits, stops, trailing orders, TWAP, VWAP, participation and linked OCO, OTO and OTOCO orders directly through the API. An LLM is not required.
The new reference covers REST and WebSocket signing, decimal precision, the $15 opening-notional minimum, cancellation and bounded, newest-first managed-order history.
Available on deployments that enable advanced orders for eligible accounts and markets. Advanced-order support spans two route groups: POST /api/v2/order creates a managed single-parent order when apiManaged: true is supplied, while /api/v3 provides linked-order, managed-parent collection/history and prompt routes. A V2 LIMIT or MARKET request without apiManaged: true remains a regular order.
Introduction
Non-rehypothecation and collateral coverage: V6's non-upgradeable code restricts supported ERC-20 collateral to registered-wallet withdrawals that pass its release controls. It provides no general-purpose lending, third-party spending-approval, or arbitrary-transfer path.
To verify backing, reconcile published positions with published funding balances, then compare actual funding-contract assets with aggregate positive user liabilities at a matching, completed snapshot. Assets greater than those published liabilities establish a surplus at that snapshot. See the verification reference for addresses, scales, snapshot checks, and formulas.
API Key Setup
Some endpoints will require an API Key. Please register here to obtain an API key.
Never share your API key or secret key with anyone.
Quote.Trade /api/v2 is the canonical route group for regular order placement, lookup and cancellation, and it also carries managed single-parent placement when apiManaged: true is supplied. Quote.Trade /api/v3 provides linked-order lists, managed-parent collection/history and prompt extensions; it does not replace the V2 single-order route. Compatibility is endpoint-specific: signing, instrument symbols, execution behavior and response fields have documented differences, so changing only the hostname is not sufficient for every Binance client.
After an API key is created, its default restriction is Enable Reading.
To enable withdrawals via API, any identity verification requested by Quote.Trade must be completed, and the API key
restriction needs to
be modified by the admin.
For questions about a sudden drop in API or WebSocket performance.
For questions about your API or WebSocket implementation.
For any general questions about the API not covered in the documentation.
For cases such as missing funds, help with 2FA, etc.
General Info
General API Information
The base endpoint is: https://app.quote.trade/api
All HTTP POST and PUT endpoints expect minified JSON. ({} if there
is no data to send.)
For GET endpoints, parameters must be sent in the query string.
For POST and PUT endpoints, the parameters must be sent
as the
request body with content type
application/json.
All HTTP endpoints return either a minified JSON object or a minified JSON array.
HTTP Return Codes
HTTP 200 return code is used for success or business rejection responses.
HTTP 4XX return codes are used for malformed requests;
the issue is on the sender's side.
HTTP 403 return code is used when the WAF Limit (Web Application Firewall) has been
violated.
HTTP 409 return code is used when a cancelReplace order partially succeeds. (e.g. if the
cancellation of the order fails but the new order placement succeeds.)
HTTP 429 return code is used when breaking a request rate limit.
HTTP 418 return code is used when an IP has been auto-banned for continuing to send
requests after receiving 429 codes.
HTTP 5XX return codes are used for internal errors; the issue is on
quote.trade's side.
It is important to NOT treat this as a failed operation; the execution status is
UNKNOWN and the operation may have succeeded.
Error Codes and Messages
If an error occurs, the API returns an error message explaining the reason.
The API error payload is as follows:
{"error":"Invalid symbol."}
LIMITS
REST Rate Limits
Rate limits are runtime configuration and can differ by deployment. Do not hard-code a value from this page.
Read the current advertised order limit from GET /api/exchangeInfo and its rateLimits array.
Additional gateway, IP, authenticated user/account, route-specific or burst controls may be stricter than the advertised order bucket.
When the server returns HTTP 429 or {"error":"rate limit exceeded"}, stop sending requests and retry with bounded backoff. Honor Retry-After when it is present.
Do not blindly retry an order, cancellation, transfer or withdrawal after an ambiguous timeout or rate-limit response. Query or reconcile its status first.
WebSocket Limits
Connection, message-rate, payload-size and subscription limits are deployment-specific.
Clients must use bounded reconnect backoff and reconcile missed order state after reconnecting.
Ping, pong and subscription-control traffic may count toward gateway message limits.
API Limit Introduction
The /api/* endpoints can be subject to independent IP, user/account, endpoint and gateway controls.
The rateLimits array returned by GET /api/exchangeInfo is the current advertised order
limit for that deployment; it is not a guarantee that every endpoint shares one bucket or that no stricter
control applies.
Data Sources
The API system is asynchronous, so some delay in the response is normal and expected.
Each endpoint has a data source indicating where the data is being retrieved, and thus which endpoints
have the most up-to-date response.
These are the three sources, ordered from the most up-to-date to the one with potential update delays.
Matching Engine - the data is from the matching engine
Memory - the data is from a server's local or external memory
Database - the data is taken directly from a database
Endpoint security type
Each endpoint has a security type that determines how you will
interact with it. This is stated next to the NAME of the endpoint.
If no security type is stated, assume the security type is NONE.
API keys are passed into the REST API via the X-MBX-APIKEY
header.
API keys and secret keys are case sensitive.
API keys can access only the routes permitted by their assigned permissions; a trade-only key cannot authorize withdrawals.
Security Type
Description
NONE
Endpoint can be accessed freely.
TRADE
Endpoint requires sending a valid API-Key and signature.
USER_DATA
Endpoint requires sending a valid API-Key and signature.
USER_STREAM
Endpoint requires sending a valid API-Key.
MARKET_DATA
Endpoint requires sending a valid API-Key.
TRADE, and USER_DATA endpoints are
SIGNED endpoints.
SIGNED (TRADE, AND USER_DATA )
Endpoint security
SIGNED endpoints require an additional parameter, signature, to be
sent in the http headers.
Endpoints use HMAC SHA256 signatures. The HMAC SHA256 signature is a keyed
HMAC SHA256 operation.
Use your secretKey as the key. For POST requests, the value is the raw query string after ? exactly as sent (if the URL has one) immediately followed by the exact serialized request body bytes; with no query string it is just the body. Send those same bytes without reformatting. For signed GET requests, sign the raw query string after ? exactly as sent (for example, symbol=USDT), or the empty string when there is no query. Sensitive account actions (profile, password, 2FA, API keys, withdrawals, transfers, whitelists, banks, user files) must include a millisecond timestamp (and optionally recvWindow) inside the signed payload. Withdrawals, transfers and apiKey/apiKeys must be signed with a wallet (non-trade-only) API key.
The signature is not case sensitive.
SIGNED Endpoint Example for POST /api/v2/order
Sign the exact minified request-body bytes that you send. The example below generates a current millisecond
timestamp, signs the body with HMAC SHA256, and sends a regular priced LIMIT order. Replace the placeholder
credentials before using it.
If the URL contains a query string, sign the exact raw query string followed immediately by the exact body
bytes. Do not parse, reformat, or reserialize the body after calculating the signature.
Public API Definitions
Terminology
These terms will be used throughout the documentation, so it is recommended especially for new users to read
to help their understanding of the API.
base asset refers to the asset that is the quantity of a symbol. For the
symbol BTC/USDC, BTC would be the base asset.
quote asset refers to the asset that is the price of a symbol. For the symbol
BTC/USDC, USDC would be the quote asset.
ENUM definitions
Symbol status (status):
PRE_TRADING
TRADING
POST_TRADING
END_OF_DAY
HALT
AUCTION_MATCH
BREAK
Account and Symbol Permissions (permissions):
SPOT
MARGIN
LEVERAGED
TRD_GRP_002
TRD_GRP_003
TRD_GRP_004
TRD_GRP_005
Order status (status):
Status
Description
NEW
The order has been accepted by the engine.
PARTIALLY_FILLED
A part of the order has been filled.
FILLED
The order has been completed.
CANCELED
The order has been canceled by the user.
PENDING_CANCEL
Currently unused
REJECTED
The order was not accepted by the engine and not processed.
EXPIRED
The order was canceled according to the order type's rules (e.g. LIMIT FOK orders with no fill,
LIMIT IOC or MARKET orders that partially fill) or by the exchange, (e.g. orders canceled during
liquidation, orders canceled during maintenance)
OCO Status (listStatusType):
Status
Description
RESPONSE
This is used when the ListStatus is responding to a failed action. (e.g. order list placement or cancellation)
EXEC_STARTED
The order list has been placed or there is an update to the order list status.
ALL_DONE
The order list has finished executing and is no longer active.
OCO Order Status (listOrderStatus):
Status
Description
EXECUTING
Either an order list has been placed or there is an update to the status of the list.
ALL_DONE
An order list has completed execution and is no longer active.
REJECT
The list status indicates a failed action during order placement or cancellation.
Order types (orderTypes, type):
LIMIT
MARKET
STOP_LOSS
STOP_LOSS_LIMIT
TAKE_PROFIT
TAKE_PROFIT_LIMIT
LIMIT_MAKER
Order Response Type (newOrderRespType):
ACK
RESULT
FULL
Order side (side):
BUY
SELL
Time in force (timeInForce):
This sets how long an order will be active before expiration.
Status
Description
GTC
Good Till Canceled An order will be on the book unless the order is canceled.
IOC
Immediate Or Cancel An order will fill as much as possible before it expires.
FOK
Fill or Kill An order will expire if the full order cannot be filled upon execution.
Kline/Candlestick chart intervals:
s-> seconds; m -> minutes; h -> hours; d -> days; w -> weeks; M -> months
1s
1m
3m
5m
15m
30m
1h
2h
4h
6h
8h
12h
1d
3d
1w
1M
User Registration
Code:
const { Wallet, verifyMessage } = require("ethers"); // ethers.js version 6.13.5
const privateKey = "0x"; // Replace with your actual private key
const wallet = new Wallet(privateKey);
/**
* Signs a message with the given private key.
* @param {string} challenge - The challenge text received from the server.
* @returns {Promise} - The signed message.
*/
async function signMessage(challenge) {
const signature = await wallet.signMessage(challenge);
return signature;
}
Request Data:
{
"signature": "{ecrecover signature generated in step 2}",
"challenge": "{CHALLENGE TEXT received in step 1}"
}
Send an HTTP POST request to the following API with the Ethereum wallet address:
API URL:
https://app.quote.trade/api/getChallenge
Request Data:
{ "login": "{ETHEREUM_WALLET_ADDRESS}" }
Response: Extract the challenge text from the response:
{ "challenge": "{CHALLENGE_TEXT}" }
Generate an ecrecover signature for the challenge text.
Use the Ethereum wallet's private key to sign the challenge text received in step 1. The resulting
signature
will be used for the registration request.
The following code demonstrates how to generate the ecrecover signature using the ethers.js library.
Call the Register User API
Send an HTTP POST request to the following API with the necessary data:
API URL:
https://app.quote.trade/api/registerUser
{ "signature": "{ecrecover signature generated in step 2}", "challenge": "{CHALLENGE
TEXT received in step 1}" }
Response: Extract the requestToken and requestSecret from the
API
response:
const { Wallet, verifyMessage } = require("ethers"); // ethers.js version 6.13.5
const privateKey = "0x"; // Replace with your actual private key
const wallet = new Wallet(privateKey);
/**
* Signs a message with the given private key.
* @param {string} challenge - The challenge text received from the server.
* @returns {Promise} - The signed message.
*/
async function signMessage(challenge) {
const signature = await wallet.signMessage(challenge);
return signature;
}
To authenticate a user, follow these steps:
Prerequisites
Already registered Ethereum wallet address.
Access to the wallet's private key.
Steps
Get the challenge text
Send an HTTP POST request to the following API with the Ethereum wallet address:
API URL:
https://app.quote.trade/api/getChallenge
Request Data:
{ "login": "{ETHEREUM_WALLET_ADDRESS}" }
Response: Extract the challenge text from the response:
{ "challenge": "{CHALLENGE_TEXT}" }
Generate an ecrecover signature for the challenge text.
Use the Ethereum wallet's private key to sign the challenge text received in step 1. The resulting
signature
will be used for the registration request.
The following code demonstrates how to generate the ecrecover signature using the ethers.js library.
Call the Register User API
Send an HTTP POST request to the following API with the necessary data:
API URL: https://app.quote.trade/api/logon
Request Data:
{ "signature": "{ecrecover signature generated in step 2}", "challenge": "{CHALLENGE
TEXT received in step 1}" }
Response: Extract the requestToken and requestSecret from the
API
response:
Zero-based number of current catalog entries to skip. Defaults to 0.
limit
INT
NO
Positive page size. When omitted, zero or negative, the current implementation returns the complete catalog and reports limit: 0. No server-side maximum is currently documented; use bounded pages.
count is the total number of current, non-expired catalog entries before paging;
skip and limit echo the applied request values. The response above is an illustrative
snapshot, so IDs, symbols, metadata and count can differ by deployment.
This is an illustrative production response snapshot. Read rateLimits on the live deployment
instead of hard-coding the example value; runtime configuration and additional gateway or route-specific limits can
change independently. Use the exact live symbol and status metadata when constructing requests.
The response is a snapshot. serverTime and contract addresses are deployment values; clients
must use the live response rather than copying the example address.
The response above is illustrative. Request the selected symbol (USDT, USDC, or XUSDC) and use the returned chain and deposit address. The following transfer example applies only when the response selects Ethereum mainnet. A deposit requires the authorized wallet to sign and send the token transfer; retrieving an address does not move funds.
import { ethers } from "ethers"; // (ethers.js version 6.13.5)
// ✅ Configuration: Replace with your actual values
const PRIVATE_KEY = "your_private_key_here"; // ⚠️ Keep this secret!
const DEPOSIT_ADDRESS = "0xYOUR_RETURNED_DEPOSIT_ADDRESS"; // Use getDepositAddress for USDT; verify its chain is ETHEREUM
const USDT_CONTRACT_ADDRESS = "0xdac17f958d2ee523a2206206994597c13d831ec7"; // USDT on Ethereum
const RPC_URL = "https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY"; // Replace with your Infura/Alchemy RPC
// ✅ USDT ERC-20 ABI (Minimal for transfer function)
const USDT_ABI = [
"function transfer(address to, uint256 amount) public returns (bool)"
];
// ✅ Initialize ethers.js Provider & Wallet
const provider = new ethers.JsonRpcProvider(RPC_URL);
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
// ✅ Connect to USDT Smart Contract
const usdtContract = new ethers.Contract(USDT_CONTRACT_ADDRESS, USDT_ABI, wallet);
async function sendUSDT() {
try {
console.log(`🔹 Sending USDT from ${wallet.address} to ${DEPOSIT_ADDRESS}...`);
// ✅ Convert USDT amount (5 USDT = 5 * 10^6 because USDT has 6 decimals)
const amount = ethers.parseUnits("5", 6);
// ✅ Call transfer function
const tx = await usdtContract.transfer(DEPOSIT_ADDRESS, amount);
console.log("📨 Transaction sent! Hash:", tx.hash);
// ✅ Wait for transaction confirmation
await tx.wait();
console.log("✅ Transaction Confirmed:", tx.hash);
} catch (error) {
console.error("❌ Error Sending USDT:", error);
}
}
// ✅ Execute the function
sendUSDT();
Withdraw
POST /api/sendWithdrawWithVTokenRequest
Submit a signed withdrawal request with a withdrawal-enabled API key and the authenticated account's registered wallet address. The server checks permissions and available balance; the funding contract enforces its withdrawal gates. Request acceptance does not mean the on-chain payout is complete.
The example matches the web client's payload. quantity is an integer string in token base units: 50 USDT is "50000000" at quantity_scale: 6. Use the selected token's decimal scale; set both toAddress and address to the registered wallet. instrumentId: 0 is the client's default when selecting by symbol.
Two-factor authentication: when the account has 2FA enabled, a withdrawal signed with the wallet API key pair must also carry code, the current six-digit authenticator code (as a string). Without it the server answers {"error":"2FA code required","twoFactorRequired":true}; a wrong code answers {"error":"invalid auth code"}. Withdrawals signed with a created API key that has the Withdraw permission need no code, but creating such a key on a 2FA account requires code. After a security change (password change or reset, disabling 2FA or replacing its secret, email or security-question change) withdrawals are refused for a hold period (24 hours by default); the refusal says how long remains.
Use POST /api/v2/order without apiManaged: true for regular MARKET and LIMIT orders.
The unversioned POST /api/order route belongs to the older native JSON contract and specialized
flows; it is not a drop-in alias for the V2 request body. Existing clients may continue using that contract.
Use DELETE /api/v2/order for cancellation and the V2 status /
history queries to verify the result.
Regular orders execute against Quote.Trade's private liquidity. A LIMIT request supplies an executable price
condition; it does not publish a resting order to a public order book. Always verify the returned status and
the account or order-status response.
POST /api/v2/order
BUY / SELL
Parameters:
Name
Type
Mandatory
Description
symbol
STRING
YES
Supported symbol from getInstrumentPairs or exchangeInfo, for example BTC. USDC and USDT select supported stablecoin conversion flows.
side
STRING
YES
BUY or SELL.
quantity
DECIMAL
YES
Positive base-asset quantity. The regular order parser uses up to six decimal places; also follow the instrument's live minimum and precision metadata.
type
STRING
NO
LIMIT or MARKET. Defaults to LIMIT.
price
DECIMAL
CONDITIONAL
LIMIT price in USD, with up to eight decimal places. It may be omitted or set to 0 for a server-priced LIMIT. It is not required for MARKET and is ignored for supported stablecoin conversions.
targetStrategy
INT
NO
Defaults to 0 for a normal order. Use 204 only with type: "MARKET" for the aggressive MARKET strategy.
timeInForce
STRING
NO
Defaults to GTC for this regular REST order path.
newClientOrderId
STRING
NO
Client-provided unique order ID with at least three characters. clientOrderId is also accepted. The server generates an ID when omitted.
account
INT
NO
Account ID. Defaults to the authenticated user's account. Trading for another account requires the appropriate entitlement.
isToClose
INT
NO
Defaults to 0. Set to 1 when requesting an order that closes an existing position; server-side reduction checks still apply.
disableLeverage
INT
NO
Defaults to 0. Set to 1 to disable leverage for the request.
blockWaitAck
INT
NO
Defaults to 1. Use 1 to wait briefly for an order acknowledgement or 0 to return immediately.
apiManaged
BOOLEAN
NO
Omit or set to false for the regular order flow documented here. Setting it to true requests an API-managed advanced parent and switches to the advanced-order contract.
timestamp
LONG
NO
Recommended request creation time in Unix milliseconds.
recvWindow
LONG
NO
Optional compatibility field. Use a value from 1 to 60000 when the selected transport validates request freshness.
Quote.Trade /api/v2 is the canonical single-order API. It handles regular placement, lookup and cancellation, and also identifies API-managed single-parent orders. Quote.Trade /api/v3 handles linked-order lists, managed-parent collection/history and prompt extensions; it does not replace V2 single-order operations.
REST
WebSocket method
Result
GET /api/v2/order
order.status
One native order, or one API-managed parent by its identity.
GET /api/v2/allOrders
allOrders
Bounded array of latest native order snapshots, including closed orders.
GET /api/v2/getOrderStatus GET /api/v2/orderStatus
getOrderStatus, orderStatus
Aliases of order.status.
GET /api/v2/getOrderHistory
getOrderHistory
Quote.Trade alias of allOrders. This is not a Binance endpoint name.
These GET routes are read-only. Create a regular order, or a managed single-parent order with apiManaged: true, through POST /api/v2/order; cancel one identified order through DELETE /api/v2/order. API-managed parent collection/history remains on GET /api/v3/openOrders; native child executions may also appear in native history. Do not count parent size and child fills as separate trades.
Query parameters
Name
Required
Description
symbol
Yes
Exact instrument symbol from exchangeInfo, for example BTC/USD.
orderId
One identity
Server order ID; alternatively supply a client order ID.
origClientOrderId
One identity
Client order ID. Also accepts clientOrderId, clOrdId or clordid. If orderId is also supplied, both identities must match.
timestamp
Yes
Current Unix time in milliseconds.
recvWindow
No
Default 5000 ms; greater than 0 and at most 60000 ms.
signature
Yes
HMAC-SHA256 of the exact encoded query, excluding signature. Send the API key in X-MBX-APIKEY.
Order status
Supply symbol and either orderId or origClientOrderId. The aliases clientOrderId, clOrdId and clordid are accepted. Query client IDs must be nonempty and at most 64 characters; managed-order creation has a separate 36-character limit. Conflicting client-ID aliases are rejected. If both numeric and client IDs are present, both must match the same order. IDs remain 64-bit integers; do not round them through JavaScript floating-point values.
Native lookup checks current and archived orders, then persisted execution reports on a cache miss. Client IDs are case-sensitive. On a cache hit, reused client IDs resolve among cached matching records; persistence is consulted only on a cache miss. Do not reuse client IDs across logical orders or assume a global latest-across-cache-and-database lookup. Use the returned orderId to disambiguate. API-managed parent IDs use the existing negative-ID namespace.
Illustrative canceled native order · no explanation was recorded
Prices and quantities on the new V2 GET queries are decimal strings. A status is the latest known state, not a promise that a new order will fill. Unknown native orders return {"code":-2013,"msg":"Order does not exist"}. A negative managed-parent ID uses the managed lookup and its error contract; do not assume every missing parent returns -2013.
Authentication for V2 GET queries
Use X-MBX-APIKEY and a signed query, with timestamp in Unix milliseconds. HMAC-SHA256 signs the exact URL-encoded query bytes before the signature parameter is appended. A signature header is also accepted. If both are supplied they must agree.
recvWindow defaults to 5000 milliseconds, must be greater than zero and no more than 60000, and accepts up to three fractional digits. Requests 1000 milliseconds or more ahead of server time or older than the receive window are rejected. These V2 GET queries use timestamp validation; the existing POST endpoints retain their nonce rules.
API keys require active READ permission. User/account ownership or an existing on-behalf entitlement and IP restrictions are checked before any lookup. A known order ID never grants access to another account.
Signed GET · client-ID lookup
GET /api/v2/order?symbol=BTC%2FUSD&origClientOrderId=my-btc-limit×tamp=REPLACE_WITH_CURRENT_MS&signature=HMAC_HEX
X-MBX-APIKEY: YOUR_API_KEY
Use the exact symbol returned by the deployment's exchangeInfo catalog. A Quote.Trade USD instrument is not automatically the same product as Binance BTCUSDT spot.
GET /api/v2/allOrders Alias: GET /api/v2/getOrderHistory
Use the same signed GET authentication as order status. Returns an array of latest order snapshots, rather than a list of every execution event.
allOrders requires symbol. It returns one latest snapshot per native order, including NEW, PARTIALLY_FILLED, FILLED, CANCELED, EXPIRED and REJECTED when recorded. An empty successful query returns []. Database failures return an error, never an apparently empty history.
limit: default 500; minimum 1; maximum 1000. Larger or invalid values are rejected.
orderId: inclusive lower bound, not an exact-match filter on this list endpoint. For a forward scan of positive native IDs, start at orderId=1 and continue with the last returned orderId plus one. Starting without orderId selects the newest page; advancing from that page does not recover older orders. Rejections without an assigned ID are not covered by a positive-ID scan; query them by client ID while retained.
Without orderId, the newest numeric order IDs are selected. The returned page is sorted by ascending orderId. This differs from the UI's newest-first managed-parent list.
startTime and endTime: inclusive Unix milliseconds, filtering stored update/event time. This is a Quote.Trade difference from an exchange's order-creation-time filtering.
Client-ID aliases can filter the native list. Use the single-order endpoint for an exact server-ID lookup.
Inclusive update/event-time bounds in Unix milliseconds.
origClientOrderId
No
Client-ID filter; clientOrderId, clOrdId and clordid are aliases.
timestamp / signature
Yes
Signed GET authentication; recvWindow is optional.
Signed GET history request
GET /api/v2/allOrders?symbol=BTC%2FUSD&limit=100×tamp=REPLACE_WITH_CURRENT_MS&signature=HMAC_HEX
X-MBX-APIKEY: YOUR_API_KEY
Existing V2 POST status and event-history endpoints
POST /api/v2/orderStatus also accepts the alias POST /api/v2/getOrderStatus. These are existing V2 POST contracts, not aliases of the newer signed GET response shape: they retain scaled-integer price/quantity fields and their scale fields. POST /api/v2/getOrderHistory retains its {"orders":[...]} execution-event envelope and decimal-string fields. Existing POST signing and nonce conventions still apply. Current User.validateNonce accepts every value, so these POST calls do not gain the timestamp freshness checks of the newer V2 GET queries; see the REST replay-protection limitation.
Both gain client-ID aliases and additive clientOrderId/status/rejectReason/reason/errorMessage fields. Event history returns at most the latest 1000 retained events in chronological order. For snapshot pagination use GET /api/v2/allOrders. A specific native history request no longer appends unrelated managed-parent orders. The unversioned /api/* native contract is separate and is not redefined by this V2 reference.
Compatibility and deployment
This adds Binance-style query names, signing, ID lookup, statuses and decimal-string values. It is not a claim of full Binance Spot API parity. Native order snapshots do not currently provide all Binance fields, such as original creation time, cumulative quote quantity and self-trade-prevention metadata. Quote.Trade instruments, FOK execution, managed negative parent IDs and request-rejection retention differ.
Regular placement uses POST /api/v2/order without apiManaged: true. Managed single-parent placement uses the same endpoint with apiManaged: true. Query and cancellation of one identified order use GET and DELETE /api/v2/order. Linked-order operations and managed-parent collection/history use the documented /api/v3 routes, including /api/v3/openOrders. Managed snapshots have their own schema and do not currently return the native rejectReason/reason/errorMessage fields.
Deploy the updated API and documentation together. Preserve the versioned paths at the gateway: /api/v2/... must reach the V2 API handler, and /api/v3/... must reach the matching advanced-order or prompt servlet. Do not apply a legacy /api/ to /liquidityApi/ rewrite to these versioned paths. An empty HTTP 200 body is not a successful status/history result; verify routing and the deployed API build before interpreting it as an empty order list. The configured GET allowlist must permit orderStatus and allOrders; do not replace a restricted allowlist with a wildcard. If using the existing POST alias, allow getOrderStatus for POST as well. Verify signed REST and WebSocket requests against a staging deployment with a read-only test account. Check PostgreSQL plans for account/symbol/order-ID and account/client-ID lookups on production-sized history.
Supply origClientOrderId, clientOrderId, clOrdId or clordid on the order-status query. These aliases also filter native order history. Values are case-sensitive; conflicting aliases are rejected. When both orderId and a client ID are supplied, both must identify the same order.
Canceled and rejected orders
Field
Meaning
status
Latest recorded order state, including CANCELED or REJECTED.
rejectReason
Recorded engine business-rejection enum, when available.
reason
Recorded execution-restatement/cancellation enum, when available.
errorMessage
Recorded rejection text, with JSON escaping preserved.
Missing reasons are null. A canceled order is not necessarily an error. A failed cancellation request must not change the original order to REJECTED.
If you want to STAKE, set side=BUY. If you want to UN-STAKE, set side=SELL.
symbol
STRING
YES
Eg: "USDC"
stake
INT
YES
Set the value to 1
stakeOption
INT
YES
If you want to STAKE, set option value. If you want to UN-STAKE, set stakeOption=0.
Stake Options:
1 = 24-Hour Lockup (Current Rate is 5%)
2 = 6-Month Lockup (Up to 20% APR MIN rate is 5% Guaranteed)
3 = 12-Month Lockup (Up to 30% APR MIN rate is 5.5% Guaranteed)
4 = 18-Month Lockup (Up to 40% APR MIN rate is 6% Guaranteed)
Streams can be accessed either in a single raw stream or in a combined stream
Raw streams are accessed at /ws/listenKey
All symbols for streams are lowercase
Subscribe to a Stream
For this legacy push subscription, requestToken is an account/wallet session token. A key created in API Management is not a session token. An existing valid listen key goes in a separate listenKey field. For signed V2 query messages, send the managed API key in params.apiKey; those messages need no prior subscription login. See signed order queries.
order.status, getOrderStatus and orderStatus query a single order. allOrders and getOrderHistory query bounded native history. Methods are versionless; these queries belong to regular V2 order flow.
Use the existing /ws/listenKey WebSocket API connection and its authentication convention. Supply flat params with apiKey, timestamp and signature. For HMAC, sort all parameter names except signature alphabetically and join their decoded key=value pairs with & before signing.
Successful replies use {"id":"status-1","status":200,"result":{...},"rateLimits":[]}. History uses an array in result. Query errors use the same request id with an error object. Subscribe to private execution updates and reconcile after reconnect using the read-only queries; queries do not submit orders.
Streams can be accessed either in a single raw stream or in a combined stream
Raw streams are accessed at /ws/listenKey
All symbols for streams are lowercase
Subscribe to a Stream
For this legacy push subscription, requestToken is an account/wallet session token. A key created in API Management is not a session token. An existing valid listen key goes in a separate listenKey field. For signed V2 query messages, send the managed API key in params.apiKey; those messages need no prior subscription login. See signed order queries.
Streams can be accessed either in a single raw stream or in a combined stream
Raw streams are accessed at /ws/listenKey
All symbols for streams are lowercase
Subscribe to a Stream
For this legacy push subscription, requestToken is an account/wallet session token. A key created in API Management is not a session token. An existing valid listen key goes in a separate listenKey field. For signed V2 query messages, send the managed API key in params.apiKey; those messages need no prior subscription login. See signed order queries.