Đặt lệnh mới
⚠️ Endpoint đang ở giai đoạn preview.
Đặt 1 lệnh mua hoặc bán mới cho subAccountId. Yêu cầu Tier 2 HMAC
đầy đủ + X-FH-BODYHASH (do request có body) + X-FH-2FA-TOKEN
(daily 2FA session).
Semantic quan trọng: HTTP 200 không bảo đảm sàn đã chấp nhận
lệnh. Đọc field result[].code — nếu non-null thì sàn từ chối (xem
result[].rejected_reason và bảng Order-level error codes trong
trang Errors). Sau khi đặt thành công, poll
GET /trading/v1/accounts/{subAccountId}/order-book/{orderId} để
theo dõi trạng thái khớp.
Quy tắc field giá:
type = LIMIT→limit_pricelà số VND,market_price = null.type = MARKET→market_pricelà enum (ATC,MP, …),limit_price = null.
Order type theo sàn:
- HOSE:
LO,MP,ATO,ATC,MTL - HNX:
LO,MTL,MOK,MAK,PLO,ATC - UPCOM / HCX: chỉ
LO
ORS auto-convert: HOSE MP → MTL; HNX MAK → FAK, MOK → FOK.
Authorizations
API key dài hạn của client. Cấu hình 1 lần lúc khởi tạo; có thể wire thẳng
vào static setter của SDK tự-gen. Đi kèm với FINHAY_API_SECRET — secret
này chỉ dùng ở phía client để tính X-FH-SIGNATURE, không bao giờ
gửi qua mạng.
Unix time hiện tại tính bằng milliseconds, đưới dạng chuỗi số thập phân.
Được tính per-request bởi signing middleware. Không set thủ công — dùng middleware mẫu trong README.
UUIDv4 duy nhất per-request (ví dụ crypto.randomUUID()). Server cache
cặp (apiKey, nonce) trong 5 phút; nếu nonce được reuse với cùng apiKey
trong window này, request sẽ bị từ chối với AUTH_NONCE_REUSED (401).
Server chấp nhận chuỗi opaque bất kỳ về mặt kỹ thuật, nhưng nên dùng UUIDv4 để đảm bảo tính unique.
Được tính per-request bởi signing middleware. Không set thủ công — xem middleware mẫu trong tài liệu Authentication.
HMAC-SHA256 của canonical signing payload, encode hex (lowercase).
Signing payload:
{X-FH-TIMESTAMP}\n{METHOD}\n{REQUEST_PATH}[?{QUERY}]\n{BODYHASH}?{QUERY}chỉ nối vào path khi request có query string.{BODYHASH}là chuỗi rỗng khi body rỗng (vẫn không có newline sau đó).
Được tính per-request bởi signing middleware. Không set thủ công — dùng middleware mẫu trong README.
SHA-256 của raw request body, encode hex (lowercase). Bắt buộc khi request có body (POST / PUT / PATCH). Có thể bỏ qua — hoặc gửi chuỗi rỗng — khi body rỗng.
Là segment cuối của canonical signing payload
({timestamp}\n{method}\n{path}[?{query}]\n{bodyHash}). Server dùng giá
trị client gửi lên để verify chữ ký; server không tự hash lại body,
nên client phải hash đúng chuỗi bytes đã gửi đi.
Được tính per-request bởi signing middleware. Không set thủ công — xem middleware mẫu trong tài liệu Authentication.
Daily 2FA session JWT do server cấp sau khi user xác thực qua OTP. Áp
dụng cho các write operation nhạy cảm (đặt / sửa / huỷ lệnh) — phải đi
cùng đủ 4 header HMAC + X-FH-BODYHASH.
Token có tuổi thọ 1 ngày giao dịch và được scope theo apiKey. Khi
hết hạn hoặc bị revoke, server trả HTTP 403 với 1 trong các
error_code:
OTP_SESSION_REQUIRED— chưa có session, cần khởi tạo OTP flow.OTP_SESSION_EXPIRED— session đã hết hạn.OTP_SESSION_INVALID— token không hợp lệ / chữ ký sai.OTP_SESSION_REVOKED— bị thu hồi (user logout, đổi key, …).
Khi gặp 403 thuộc các mã trên, client phải chạy lại OTP flow để xin token mới rồi retry request.
Path Parameters
subAccountId được lấy từ bootstrap flow
(GET /users/v1/users/{userId}/sub-accounts), chọn NORMAL hoặc MARGIN
tuỳ mục đích.
"0001234567"
Body
Body của request đặt lệnh mới
(POST /trading/oa/sub-accounts/{subAccountId}/orders).
Quy tắc field giá theo type:
type = LIMIT→ setlimit_price(VND);market_priceđểnull.type = MARKET→ setmarket_price(enumMarketPriceCode);limit_priceđểnull.
Sub-account ID dạng extended (kèm hậu tố .1 / .6 …), khác với
subAccountId ở path param. Lấy từ field sub_account_ext của
response GET /users/v1/users/{userId}/sub-accounts.
"120C000008.1"
Phía của lệnh.
| Giá trị | Ý nghĩa |
|---|---|
BUY | Lệnh mua |
SELL | Lệnh bán |
BUY, SELL Mã chứng khoán cần đặt lệnh.
"HPG"
Số lượng cổ phiếu. Lô chẵn HOSE/HNX là bội số 100. Đặt 1..99 là lô
lẻ và chỉ chấp nhận type = LIMIT.
x >= 1100
Kiểu định giá khi đặt lệnh — quyết định field giá nào phải set trong request body.
| Giá trị | Ý nghĩa | Field giá phải set |
|---|---|---|
LIMIT | Lệnh giới hạn — khớp tại đúng giá limit_price hoặc tốt hơn. | limit_price (VND); market_price = null. |
MARKET | Lệnh thị trường — khớp theo logic của order type chỉ định. | market_price (enum MarketPriceCode); limit_price = null. |
LIMIT, MARKET Giá đặt khi type = LIMIT, đơn vị VND (không nhân 1000). Để
null khi type = MARKET.
25500
Mã loại lệnh thị trường khi type = MARKET. Để null khi
type = LIMIT.
MP, ATO, ATC, MAK, MOK, MTL, PLO, FOK, FAK Phân loại công cụ tài chính. Mặc định STOCK nếu bỏ trống.
STOCK, BOND, FUND_CERTIFICATE, WARRANT, ETF Response
Server đã xử lý request. Phải đọc result[].code để biết sàn
chấp nhận hay từ chối lệnh.
Các field chung của envelope trong mọi response của Finhay API.
error_codelà"0"(string) khi thành công, mã khác"0"khi lỗi.messagelà thông điệp ngắn từ server.