New Order
Type: TRADE
POST /fapi/v1/order
Place a new order. Currently only LIMIT is supported; MARKET returns -1100 until the matching engine grows a MARKET type.
Request
POST /fapi/v1/order
Query params
All parameters (including timestamp, recvWindow, signature) are read from the URL query string. A request body is only concatenated into the signed payload; parameters sent in the body alone are not read by the handler, so a required parameter missing from the query string fails with HTTP 400 (plain-text axum rejection, not a {code, msg} JSON body).
| Name | Type | Required | Notes |
|---|---|---|---|
symbol | string | yes | standard pair, e.g. BTCUSDT. |
side | string | yes | BUY or SELL. |
type | string | yes | Only LIMIT accepted today. |
quantity | string | yes | Base-asset quantity. Must parse as a positive decimal (-1100 otherwise). |
price | string | yes for LIMIT | Limit price. Must parse as a positive decimal (-1100 otherwise). |
newClientOrderId | string | no | Free-form idempotency key. Auto-generated UUID if omitted. Re-sending the same value within 15 minutes returns the original orderId without placing a new order. It is not persisted: GET /fapi/v1/order and GET /fapi/v1/openOrders report clientOrderId equal to orderId. |
Response — 200
{
"orderId": "8a3f5b2c-4d1e-6f7a-8b9c-0d1e2f3a4b5c",
"clientOrderId": "my-bot-1748275200-001",
"symbol": "BTCUSDT",
"status": "NEW",
"side": "BUY",
"type": "LIMIT",
"price": "76500.00",
"origQty": "0.001",
"updateTime": 1748275200500
}
status is always NEW in this response (the order is acknowledged before matching; an order that fills immediately is still reported as NEW). price and origQty echo the request strings verbatim; updateTime is the server time at response.
Errors
| HTTP | code | msg |
|---|---|---|
400 | -1100 | Unknown symbol, invalid side, unsupported type (e.g. MARKET), or price / quantity not a positive decimal. |
400 | -1102 | price missing on a LIMIT order. |
422 | -2010 | Insufficient balance to lock the required margin. Also returned when the market is inactive or trading is paused by the insurance-fund risk gate (BlockAllOpen / ForceDeleverage, or BlockHighLeverage with leverage > 5) — orders that only reduce an existing position still pass the gate. |
401 | -2015 | Invalid or revoked API key. |
500 | -1000 | Downstream (trading-api / ledger) failure. |
Signature and API-key failures (-1021, -1022, -1102, -2014, -2015) and rate limiting (-1003, HTTP 429) apply to every signed endpoint; see Error Codes.
Other standard params not yet supported:
timeInForce,reduceOnly,closePosition,stopPrice,activationPrice,callbackRate,workingType,priceProtect,newOrderRespType,positionSide. They are silently ignored if sent (not rejected); every order behaves asGTC, one-way (BOTH), non-reduce-only.
Leverage: this order uses whatever leverage you last set for symbol via POST /fapi/v1/leverage (1–100x; defaults to 10x if you've never called it). It is not a per-order parameter on this endpoint — matches real Binance Futures, where leverage is a standing per-symbol setting, not inline on each order.