> This page is for API Reference.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://okx-demo.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://okx-demo.ferndocs.com/_mcp/server.

# Place order

POST https://www.okx.com/api/v5/trade/order
Content-Type: application/json

You can place an order only if you have sufficient funds.

Reference: https://okx-demo.ferndocs.com/api/api-reference/trade/place-order

## Authentication

- `OK-ACCESS-KEY` header (required) — Your API key.
- `OK-ACCESS-SIGN` header (required) — Base64-encoded HMAC-SHA256 signature of the prehash string.
- `OK-ACCESS-TIMESTAMP` header (required) — ISO 8601 UTC timestamp, e.g. 2020-12-08T09:08:57.715Z.
- `OK-ACCESS-PASSPHRASE` header (required) — The passphrase you set when creating the API key.

## Request

### Body (application/json)

This endpoint expects an object.

- `instId` (string, required) — Instrument ID, e.g. `BTC-USDT`
- `tdMode` (enum, required) — Trade mode Margin mode `cross` `isolated` (`isolated` is only applicable to spot margin isolated) Non-Margin mode `cash` `spot_isolated` (only applicable to SPOT lead trading, `tdMode` should be `spot_isolated` for `SPOT` lead trading.) Note: `isolated` (spot margin isolated) is not available in multi-currency margin mode and portfolio margin mode. Event contracts symbols only support `isolated`
  - Allowed values: `cross`, `isolated`, `cash`, `spot_isolated`
- `side` (enum, required) — Order side, `buy` `sell`
  - Allowed values: `buy`, `sell`
- `ordType` (enum, required) — Order type `market`: Market order, only applicable to `SPOT/MARGIN/FUTURES/SWAP` `limit`: Limit order `post_only`: Post-only order `fok`: Fill-or-kill order `ioc`: Immediate-or-cancel order `optimal_limit_ioc`: Places a limit order at the maximum buy price (upper price limit) for buy orders, or the minimum sell price (lower price limit) for sell orders, as defined by the exchange's price limit bands. Any unfilled portion is immediately cancelled (IOC). Applicable only to Expiry Futures and Perpetual Futures. `mmp`: Market Maker Protection (only applicable to Option in Portfolio Margin mode) `mmp_and_post_only`: Market Maker Protection and Post-only order(only applicable to Option in Portfolio Margin mode) `rpi`: Retail Price Improvement order `elp`: Enhanced Liquidity Program order (Deprecated; use `rpi`. Accepted until October 31, 2026.)
  - Allowed values: `market`, `limit`, `post_only`, `fok`, `ioc`, `optimal_limit_ioc`, `mmp`, `mmp_and_post_only`, `elp`
- `sz` (string, required) — Quantity to buy or sell
- `ccy` (string, optional) — Margin currency Applicable to all `isolated` `MARGIN` orders and `cross` `MARGIN` orders in `Futures mode`.
- `clOrdId` (string, optional) — Client Order ID as assigned by the client A combination of case-sensitive alphanumerics, all numbers, or all letters of up to 32 characters. Only applicable to general order. It will not be posted to algoId when placing TP/SL order after the general order is filled completely.
- `tag` (string, optional) — Order tag A combination of case-sensitive alphanumerics, all numbers, or all letters of up to 16 characters.
- `posSide` (enum, optional) — Position side The default is `net` in the `net` mode It is required in the `long/short` mode, and can only be `long` or `short`. Only applicable to `FUTURES`/`SWAP`. Do not send this field for `SPOT` or `MARGIN` orders. Omitting it for `FUTURES`/`SWAP` in long/short mode returns error 51000.
  - Allowed values: `net`, `long`, `short`
- `px` (string, optional) — Order price. Only applicable to `limit`,`post_only`,`fok`,`ioc`,`mmp`,`mmp_and_post_only` order. When placing an option order, one of px/pxUsd/pxVol must be filled in, and only one can be filled in
- `pxUsd` (string, optional) — Place options orders in `USD` Only applicable to options When placing an option order, one of px/pxUsd/pxVol must be filled in, and only one can be filled in
- `pxVol` (string, optional) — Place options orders based on implied volatility, where 1 represents 100% Only applicable to options When placing an option order, one of px/pxUsd/pxVol must be filled in, and only one can be filled in
- `reduceOnly` (boolean, optional) — Whether orders can only reduce in position size. Valid options: `true` or `false`. The default value is `false`. Only applicable to `MARGIN` orders, and `FUTURES`/`SWAP` orders in `net` mode Only applicable to `Futures mode` and `Multi-currency margin`
- `tgtCcy` (enum, optional) — Whether the target currency uses the quote or base currency. `base_ccy`: Base currency ,`quote_ccy`: Quote currency Only applicable to `SPOT` Market Orders Default is `quote_ccy` for buy, `base_ccy` for sell
  - Allowed values: `base_ccy`, `quote_ccy`
- `slippagePct` (string, optional) — Maximum acceptable slippage for spot and spot margin market-side orders, where `tgtCcy` is the received currency (`base_ccy` for buy, `quote_ccy` for sell). Range: `0` to `0.05` (0% to 5%, inclusive). Up to 2 decimal places of the percentage, e.g., `0.01` (1%) and `0.0123` (1.23%) are accepted; `0.01234` (1.234%) is rejected. If not specified or empty, defaults to `0.00%`. Slippage cannot be modified on an existing order. Cancel and resubmit to change the slippage setting. Only applicable to `SPOT` and `SPOT margin` `market` orders.
- `banAmend` (boolean, optional) — Whether to disallow the system from automatically reducing the order size when account balance is insufficient for the full SPOT Market Order. Valid options: `true` or `false`. The default value is `false`. If `true`: the entire order is rejected when balance is insufficient. If `false` (default): the system reduces sz to fit the available balance and executes the smaller order. Only applicable to SPOT Market Orders
- `pxAmendType` (enum, optional) — The price amendment type for orders `0`: Do not allow the system to amend to order price if `px` exceeds the price limit `1`: Allow the system to amend the price to the best available value within the price limit if `px` exceeds the price limit The default value is `0`
  - Allowed values: `0`, `1`
- `tradeQuoteCcy` (string, optional) — The quote currency used for trading. Only applicable to `SPOT`. The default value is the quote currency of the `instId`, for example: for `BTC-USD`, the default is `USD`.
- `stpMode` (enum, optional) — Self trade prevention mode. `cancel_maker`,`cancel_taker`, `cancel_both` Cancel both does not support FOK The account-level acctStpMode will be used to place orders by default. The default value of this field is `cancel_maker`. Users can log in to the webpage through the master account to modify this configuration. Users can also utilize the stpMode request parameter of the placing order endpoint to determine the stpMode of a certain order.
  - Allowed values: `cancel_maker`, `cancel_taker`, `cancel_both`
- `attachAlgoOrds` (list of ApiV5TradeOrderPostRequestBodyContentApplicationJsonSchemaAttachAlgoOrdsItems, optional) — Attached TP/SL or trailing stop order information

## Response

### 200

Successful response

- `code` (string, optional) — Result code. `0` means success; any other value is an error code.
- `msg` (string, optional) — Error message. Empty on success.
- `data` (list of ApiV5TradeOrderPostResponsesContentApplicationJsonSchemaDataItems, optional)

## Types

### ApiV5TradeOrderPostRequestBodyContentApplicationJsonSchemaAttachAlgoOrdsItems

- `attachAlgoClOrdId` (string, optional) — Client-supplied algo order ID for the attached TP/SL order.
- `tpTriggerPx` (string, optional) — Take-profit trigger price.
- `tpOrdPx` (string, optional) — Take-profit order price. -1 means market price.
- `tpOrdKind` (enum, optional) — Take-profit order kind.
  - Allowed values: `condition`, `limit`
- `slTriggerPx` (string, optional) — Stop-loss trigger price.
- `slOrdPx` (string, optional) — Stop-loss order price. -1 means market price.
- `tpTriggerPxType` (enum, optional) — Take-profit trigger price type.
  - Allowed values: `last`, `index`, `mark`
- `slTriggerPxType` (enum, optional) — Stop-loss trigger price type.
  - Allowed values: `last`, `index`, `mark`

### ApiV5TradeOrderPostResponsesContentApplicationJsonSchemaDataItems

- `ordId` (string, optional) — Order ID.
- `clOrdId` (string, optional) — Client-supplied order ID.
- `tag` (string, optional) — Order tag.
- `ts` (string, optional) — Timestamp when the order request processing finished, Unix timestamp in ms.
- `sCode` (string, optional) — Result code. 0 means success.
- `sMsg` (string, optional) — Rejection or success message.

## Examples

**Request**

```json
{
  "instId": "BTC-USDT",
  "tdMode": "cash",
  "side": "buy",
  "ordType": "limit",
  "sz": "0.01"
}
```

**Response**

```json
{
  "code": "0",
  "msg": "",
  "data": [
    {
      "ordId": "312269865356374016",
      "clOrdId": "oktswap6",
      "tag": "",
      "ts": "1695190491421",
      "sCode": "0",
      "sMsg": "",
      "subCode": ""
    }
  ],
  "inTime": "1695190491421339",
  "outTime": "1695190491423240"
}
```

**SDK Code**

```python trade_placeOrder_example
import requests

url = "https://www.okx.com/api/v5/trade/order"

payload = {
    "instId": "BTC-USDT",
    "tdMode": "cash",
    "side": "buy",
    "ordType": "limit",
    "sz": "0.01"
}
headers = {
    "OK-ACCESS-KEY": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript trade_placeOrder_example
const url = 'https://www.okx.com/api/v5/trade/order';
const options = {
  method: 'POST',
  headers: {'OK-ACCESS-KEY': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"instId":"BTC-USDT","tdMode":"cash","side":"buy","ordType":"limit","sz":"0.01"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go trade_placeOrder_example
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://www.okx.com/api/v5/trade/order"

	payload := strings.NewReader("{\n  \"instId\": \"BTC-USDT\",\n  \"tdMode\": \"cash\",\n  \"side\": \"buy\",\n  \"ordType\": \"limit\",\n  \"sz\": \"0.01\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("OK-ACCESS-KEY", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby trade_placeOrder_example
require 'uri'
require 'net/http'

url = URI("https://www.okx.com/api/v5/trade/order")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["OK-ACCESS-KEY"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"instId\": \"BTC-USDT\",\n  \"tdMode\": \"cash\",\n  \"side\": \"buy\",\n  \"ordType\": \"limit\",\n  \"sz\": \"0.01\"\n}"

response = http.request(request)
puts response.read_body
```

```java trade_placeOrder_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://www.okx.com/api/v5/trade/order")
  .header("OK-ACCESS-KEY", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"instId\": \"BTC-USDT\",\n  \"tdMode\": \"cash\",\n  \"side\": \"buy\",\n  \"ordType\": \"limit\",\n  \"sz\": \"0.01\"\n}")
  .asString();
```

```php trade_placeOrder_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://www.okx.com/api/v5/trade/order', [
  'body' => '{
  "instId": "BTC-USDT",
  "tdMode": "cash",
  "side": "buy",
  "ordType": "limit",
  "sz": "0.01"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'OK-ACCESS-KEY' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp trade_placeOrder_example
using RestSharp;

var client = new RestClient("https://www.okx.com/api/v5/trade/order");
var request = new RestRequest(Method.POST);
request.AddHeader("OK-ACCESS-KEY", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"instId\": \"BTC-USDT\",\n  \"tdMode\": \"cash\",\n  \"side\": \"buy\",\n  \"ordType\": \"limit\",\n  \"sz\": \"0.01\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift trade_placeOrder_example
import Foundation

let headers = [
  "OK-ACCESS-KEY": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "instId": "BTC-USDT",
  "tdMode": "cash",
  "side": "buy",
  "ordType": "limit",
  "sz": "0.01"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://www.okx.com/api/v5/trade/order")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```