WebSocket API

order.batchCancel

Hủy nhiều lệnh trong một message (Batch Order). Mỗi lệnh trong params.orders có cấu trúc và quy tắc như order.cancel (xác định lệnh qua orderId HOẶC clientRequestId).

Áp dụng cùng quy tắc chung và cùng luồng ack nhanh PD như order.batchNew (tối đa 50 lệnh, validation all-or-nothing, chống replay 30 giây, idempotency theo batchRequestId, chữ ký trên toàn bộ params). Kết quả thật của từng yêu cầu hủy đến sau qua kênh thông báo order.{accountNo}.

Scope bắt buộc: tradingws:order:delete.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

bodyobjectrequired
idstringrequired
methodstringrequired
paramsobjectrequired
batchRequestIdstringrequired

Định danh batch do client tạo ra, phải duy nhất theo từng API Key và từng loại thao tác (đặt/hủy) trong ngày. Dùng làm khóa idempotency.

batchRequestTimeintegerrequired

Thời điểm client tạo batch, tính bằng epoch milliseconds (UTC). Phải lệch không quá 30 giây so với thời gian máy chủ.

ordersarrayrequired

Danh sách lệnh cần hủy, tối đa 50 lệnh. Mỗi phần tử có cấu trúc như `params` của `order.cancel`.

orders[]objectrequired

Bắt buộc truyền đúng một trong hai trường `orderId`/`clientRequestId` để xác định lệnh cần hủy.

clientCancelIdstring | nulloptional

Định danh hủy lệnh do client tạo ra. Khi để trống, hệ thống tự sinh.

clientRequestIdstring | nulloptional

Định danh lệnh gốc do client tạo ra khi đặt lệnh. Dùng XOR với `orderId`.

orderIdstring | nulloptional

Định danh lệnh gốc sinh bởi hệ thống SSI. Dùng XOR với `clientRequestId`.

accountNostringrequired

Số tài khoản giao dịch.

deviceIdstringrequired

Định danh thiết bị gửi yêu cầu hủy lệnh.

userAgentstring | nulloptional

Thông tin trình duyệt/ứng dụng gửi yêu cầu.

signaturestringrequired

Chữ ký RSA+SHA256 (base64) trên toàn bộ nội dung `params`. Bắt buộc.

timestampintegerrequired

Response Body

application/json

application/json

Sample Request

wscat -c wss://api.ssi.com.vn/ws/v3/trading -x '{
  "id": "req-0011",
  "method": "order.batchCancel",
  "params": {
    "batchRequestId": "batch-20261014-0002",
    "batchRequestTime": 1755000020000,
    "orders": [
      {
        "orderId": "ORD123456",
        "accountNo": "0901351",
        "deviceId": "MAC-AABBCCDDEEFF"
      },
      {
        "clientRequestId": "o-0002",
        "accountNo": "0901351",
        "deviceId": "MAC-AABBCCDDEEFF"
      }
    ]
  },
  "signature": "base64(RSA-SHA256(...))",
  "timestamp": 1755000020000
}'

Sample Response

{
  "id": "req-0011",
  "method": "order.batchCancel",
  "status": 200,
  "result": {
    "batchRequestId": "batch-20261014-0002",
    "results": [
      {
        "clientRequestId": "o-0001",
        "clientCancelId": "c-0001",
        "orderId": "ORD123456",
        "orderStatus": "PD",
        "success": true
      },
      {
        "clientRequestId": "o-0002",
        "clientCancelId": "c-0002",
        "orderStatus": "PD",
        "success": true
      }
    ]
  },
  "rateLimit": {
    "limit": 50,
    "remaining": 45,
    "resetMs": 850
  }
}

order.batchNewWS

Đặt nhiều lệnh mới trong một message (Batch Order). Mỗi lệnh trong `params.orders` có cấu trúc và quy tắc như `order.place`. **Quy tắc chung** - Tối đa **50 lệnh** mỗi batch. Các lệnh có thể thuộc nhiều tài khoản, nhưng tất cả tài khoản phải nằm trong danh sách tài khoản được cấp quyền cho API Key. - Validation theo cơ chế **all-or-nothing**: nếu bất kỳ lệnh nào không hợp lệ, toàn bộ batch bị từ chối và không có lệnh nào được gửi đi. - **Chống replay**: `batchRequestTime` (epoch milliseconds, UTC) phải lệch không quá **30 giây** so với thời gian máy chủ. - **Idempotency**: `batchRequestId` phải duy nhất theo từng API Key, từng loại thao tác (đặt/hủy) trong ngày; gửi lại cùng `batchRequestId` bị từ chối là request trùng lặp. - Chữ ký `signature` (RSA+SHA256) được tính trên **toàn bộ `params`**, tức cả `batchRequestId`, `batchRequestTime` và `orders`. **Phản hồi:** hệ thống trả về **một ack duy nhất** cho cả batch, trong đó mỗi lệnh có `orderStatus: "PD"` — đây chưa phải kết quả khớp lệnh. Kết quả thật của từng lệnh (khớp/bị từ chối/đã hủy) được gửi riêng qua kênh thông báo `order.{accountNo}` (xem mục "Đặt/sửa/hủy lệnh: xác nhận nhanh, kết quả đến sau" ở đầu tài liệu), nên client **bắt buộc phải đăng ký nhận thông báo** cho các tài khoản liên quan. Khác với REST, ack của WebSocket không chứa `orderId` và không phản ánh việc từng lệnh có bị từ chối ở bước xử lý nghiệp vụ hay không. Scope bắt buộc: `tradingws:order:post`.

fco.placeWS

Đặt lệnh điều kiện (Conditional Order) — response trả về ngay kết quả tạo lệnh, không theo luồng xác nhận nhanh như `order.*`. Nếu bị từ chối, response trả về lỗi kèm `error.code: "FCO_ERROR"`. Yêu cầu chữ ký `signature`. Tham khảo thêm [Tham khảo đặt lệnh điều kiện](/docs/api-reference/appendix/fco-reference). Scope bắt buộc: `tradingws:fco:post`.