Trading

trade-order-place

Place a new order.

POST
/api/v3/trading/order

Authorization

Bearer
AuthorizationBearer <token>

Enter the JWT token in the format Bearer <token>.

In: header

Header Parameters

Content-Typestringrequired

The format of the request body content. Primarily application/json.

User-Agentstringoptional

Information about the client sending the request.

Accept-Languagestringoptional

The desired response language. If this header is absent, the system will default to en

X-Signaturestringrequired

The HMAC-SHA256 signature used to verify the integrity of the request.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

bodyobjectrequired
clientRequestIdstring | nulloptional

An order identifier created by the client, used for reconciliation in subsequent responses. This field is optional, but if provided it should be unique to avoid confusion when processing responses. When left empty, the system will automatically generate an order identifier for the customer and return it in the response & streaming.

accountNostringrequired

The trading account number.

symbolstringrequired

The securities symbol.

sidestringrequired

The buy or sell side of the trading order. (B - Buy, S - Sell)

orderTypestringrequired

The type of the trading order. (LO - Limit Order, ATO - At The Open, ATC - At The Close, MP - Market Price, MAK - Match and Kill, MOK - Match or Kill, MTL - Match then Limit, PLO)

quantitynumberrequired

The order quantity.

pricestringrequired

The order price. Required when orderType is LO (Limit Order); not required for other order types (ATO, ATC, MP, MAK, MOK, MTL, PLO).

deviceIdstringrequired

The identifier of the device sending the order placement request. Typically the device's MAC address or IMEI.

userAgentstringoptional

Information about the browser or application sending the request.

ipAddressstringoptional

The IP address of the device sending the request.

isReturnOrderIdboolean | nulloptional

Optional — whether the response should include `orderId`. When omitted (or `null`), the system uses a default based on the account type: - Equity accounts: default `true` (the response includes `orderId`). - Derivatives accounts: default `false` (the response has no `orderId`; get it from streaming or the order book). For derivatives accounts, send `true` to receive `orderId` in the response. When the effective value is `false`, `orderId` in the response is `null`; the order is still placed normally and can still be modified/cancelled by `clientRequestId`. For the WebSocket API (`order.place`, `order.batchNew`), the `PD` ack never includes `orderId` regardless of this value; `orderId` arrives on the `order.{accountNo}` channel.

Response Headers

X-RATELIMIT-LIMITstringoptional

The request limit within the cycle.

X-RATELIMIT-REMAININGstringoptional

The number of requests remaining in the current cycle.

X-RATELIMIT-RESETstringoptional

The time at which the request limit resets.

Response Body

application/json

application/json

curl -X POST "https://api.ssi.com.vn/api/v3/trading/order" \  -H "Content-Type: application/json" \  -H "X-Signature: sha256=abc123..." \  -H "Content-Type: application/json" \  -d '{    "accountNo": "string",    "symbol": "string",    "side": "B",    "orderType": "LO",    "quantity": 0.1,    "price": "string",    "deviceId": "string"  }'

Success

{
  "clientRequestId": "string",
  "orderId": "string",
  "orderStatus": "string",
  "clientModifyId": "string",
  "clientCancelId": "string"
}

Invalid request.

{
  "code": "400",
  "msg": "Invalid request"
}