201 not meaning acceptance applies here too.Futures involve borrowed money and you can lose your entire margin. With 10x leverage, a 10% move against you wipes out your position. This is not the place to learn how the API works. Practice on spot first.
| Leverage | Margin you post | A 10% price move against you |
|---|---|---|
| 1x | 600 USDT | You lose 60 USDT, about 10% of your margin |
| 10x | 60 USDT | You lose 60 USDT, which is all of your margin |
| 20x | 30 USDT | You are liquidated well before the 10% is reached |
positionSide | You are betting | You profit when |
|---|---|---|
LONG | The price goes up | The price rises |
SHORT | The price goes down | The price falls |
side (BUY or SELL) is separate. side opens or closes, and positionSide says which direction the position runs in. Opening a long is positionSide: LONG with side: BUY.marginMode | Meaning |
|---|---|
ISOLATED | Only the margin assigned to this position is at risk. A liquidation cannot touch anything else |
CROSS | Your whole futures balance backs the position. It survives larger moves, but a liquidation can consume much more |
ISOLATED is the safer default and caps your downside per position.You cannot mix modes on one symbol. If you already have an open position on BTC-USDTusingCROSS, anISOLATEDorder on the same symbol returns409 MARGIN_MODE_CONFLICT.
reduceOnly: true means the order may only shrink an existing position, never open or enlarge one. Use it to close out safely, so a mistake cannot accidentally flip you into a position on the other side. It must be a real JSON boolean. The string "false" is rejected.margin = quantity x referencePrice / leverage, plus a buffer (5% by default), rounded upreduceOnly order already covered by an open position can legitimately reserve "0".| Spot | Futures | |
|---|---|---|
| Order type field name | type | orderType |
| Endpoint | POST /v1/orders | POST /v1/futures/orders |
| Extra required fields | none | positionSide, leverage, marginMode |
| Listing open orders | GET /v1/orders returns everything | GET /v1/futures/orders returns open only |
| Listing finished orders | same endpoint | GET /v1/futures/orders/history |
| Fills and fees | not itemized | fills array on the list endpoints only |
| Order rate limit | per-key 600/min | an extra 30 orders per minute per user |
| KYC | required | required, with no exemption at all |
orderType on futures and type on spot. It is a genuine inconsistency, and it is the most common porting bug.GET /v1/futures/orders returns orders that are not finished. GET /v1/futures/orders/history returns those that are (FILLED, CANCELED, EXPIRED, REJECTED). An order appears in one list or the other, never both and never neither.status: "REJECTED" it adds rejectReason and venueCode. On every other row those keys are absent, not null.fee, feeAsset or realisedPnl fields. Add up fills[].feeAmount and fills[].realisedPnl yourself. Note that GET /v1/futures/orders/{id} returns a single order without its fills, so use the history list when you need executions.leverage is the one number that is a numberleverage is a plain JSON integer. Do not send it as "10".GET /v1/market/futures/symbols. Contract symbols are not always the same set as spot symbols.GET /v1/futures/balance?asset=USDT. This reads the futures wallet, which is separate from spot. If the money is in the wrong wallet, move it in the web app.POST /v1/futures/orders
{
"symbol": "BTC-USDT",
"positionSide": "LONG",
"side": "BUY",
"orderType": "LIMIT",
"price": "60000",
"quantity": "0.01",
"leverage": 10,
"marginMode": "ISOLATED",
"reduceOnly": false
}status from the body. Same rule as spot: 201 is not acceptance.GET /v1/futures/orders?limit=50 while it is open, then GET /v1/futures/orders/history?limit=50 once it finishes.side on the same positionSide, with reduceOnly: true. To close the long above, send side: "SELL", positionSide: "LONG", reduceOnly: true.DELETE /v1/futures/orders/{id}. Cancelling an order is not the same as closing a position. Cancelling removes an order that has not filled. Closing needs an opposing reduceOnly order.| Not available | What to do instead |
|---|---|
| Stop-loss and take-profit orders | No stopPrice, triggerPrice, takeProfit or stopLoss fields exist. Watch the price yourself and send a reduceOnly order |
IOC, FOK or post-only | timeInForce supports GTC only, and is forbidden on MARKET orders |
GET /v1/futures/positions | Outside the API key permission set. Session only |
GET /v1/futures/fills | Currently broken and returns 500 on every call. Read fills from /v1/futures/orders/history |
Custom clientOrderId | The server mints one for you |
| Working list filters | symbol, orderType, startTime and endTime are accepted and then ignored. Only limit filters. Filter in your own code |