Submit Order
This API is used to submit order for HK and US stocks, warrant and option.
longbridge order buy TSLA.US 100 --price 250.00
longbridge order sell TSLA.US 100 --price 260.00
SDK Links
Python |
Rust |
Go |
Node.js |
Java |
C++ |
Request
| HTTP Method | POST |
| HTTP URL | /v1/trade/order |
Parameters
Content-Type: application/json; charset=utf-8
| Name | Type | Required | Description |
|---|---|---|---|
| symbol | string | YES | Stock symbol, use ticker.region format, example: AAPL.US |
| order_type | string | YES | Order Type |
| submitted_price | string | NO | Submitted price, example: 388.5LO / ELO / ALO / ODD / LIT Order Required |
| submitted_quantity | string | YES | Submitted quantity, example: 100 |
| trigger_price | string | NO | Trigger price, example: 388.5LIT / MIT Order Required |
| limit_offset | string | NO | Limit offset amountTSLPAMT / TSLPPCT Order Required whenlimit_depth_level is set to 0 |
| trailing_amount | string | NO | Trailing amountTSLPAMT Order Required |
| trailing_percent | string | NO | Trailing percentTSLPPCT Order Required |
| expire_date | string | NO | Long term order expire date, format YYYY-MM-DD, example: 2022-12-05Required when time_in_force is GTD |
| side | string | YES | Order Side Enum Value: BuySell |
| outside_rth | string | NO | Enable or disable outside regular trading hours Enum Value: RTH_ONLY - regular trading hour onlyANY_TIME - any timeOVERNIGHT - OvernightOPTION_PRE_MARKET - Overnight option |
| time_in_force | string | YES | Time in force Type Enum Value: Day - Day OrderGTC - Good Til Canceled OrderGTD - Good Til Date Order |
| remark | string | NO | remark (Maximum 255 characters) |
| limit_depth_level | int32 | NO | Specifies the bid/ask depth level. Value range is -5 ~ 0 ~ 5. Negative numbers indicate bid levels (e.g., -1 means best bid level 1), positive numbers indicate ask levels (e.g., 1 means best ask level 1). When set to 0, the limit_offset parameter takes effect.Valid for TSLPAMT / TSLPPCT orders. |
| monitor_price | string | NO | Monitoring price. Monitoring starts only after reaching this price, updating the reference price. Valid for TSLPAMT / TSLPPCT orders. |
| trigger_count | int32 | NO | Number of triggers. Value range is 0 ~ 3. Specifies that within 1 minute, the order will only be placed after being triggered multiple times. Valid for LIT / MIT / TSLPAMT / TSLPPCT orders. |
| client_request_id | string | NO | Idempotent request ID for preventing duplicate order submissions. The server caches this request ID for 10 minutes. If a request with the same ID is received within this period, it returns the same response without creating a duplicate order. Must be a unique identifier (e.g., UUID). |
| attached_params | object | NO | Attached order parameters (take-profit / stop-loss) |
| attached_params.attached_order_type | string | NO | Attached order type Enum Value: PROFIT_TAKER - Take ProfitSTOP_LOSS - Stop LossBRACKET - Bracket Order |
| attached_params.profit_taker_price | string | NO | Take-profit trigger price |
| attached_params.stop_loss_price | string | NO | Stop-loss trigger price |
| attached_params.time_in_force | string | NO | Attached order time in force type Enum Value: Day - Day OrderGTC - Good Til Canceled OrderGTD - Good Til Date Order (inherits the main order’s expire_date in this case) |
| attached_params.expire_time | int64 | NO | Expire time (Unix timestamp, in seconds) |
| attached_params.activate_order_type | string | NO | Order type submitted after triggering, e.g. LIT (limit-if-touched) or MIT (market-if-touched) |
| attached_params.profit_taker_submit_price | string | NO | Take-profit limit order submitted price, required when activate_order_type is LIT |
| attached_params.stop_loss_submit_price | string | NO | Stop-loss limit order submitted price, required when activate_order_type is LIT |
| attached_params.activate_rth | string | NO | Whether the order submitted after triggering allows pre/post market trading Enum Value: RTH_ONLY - Regular trading hours onlyANY_TIME - Any time |
Idempotency
To ensure orders are not duplicated due to network retries or client failures, you can use the client_request_id parameter:
- Purpose: Prevents duplicate order creation when the same request is retried
- Cache Duration: 10 minutes (server-side)
- Format: Any unique string per request (e.g., UUID, or a client-generated identifier)
- Behavior: If the same
client_request_idis received within 10 minutes, the server returns the cached response from the original request without creating a new order
Idempotency Example
First request: client_request_id="abc123-uuid-request" → Creates order with ID 12345
Retry (same ID within 10 min): client_request_id="abc123-uuid-request" → Returns existing order ID 12345 (no duplicate)
New request: client_request_id="xyz789-uuid-request" → Creates new order with different ID
When Omitting client_request_id
If you do not provide client_request_id (or pass an empty value), the request will still succeed and create an order normally. However, idempotency protection will be skipped, meaning:
- Each request (even identical ones) will create a separate order
- Network retries or accidental duplicate requests may result in duplicate orders
- No server-side caching of the request will be performed
It is strongly recommended to always provide a unique client_request_id for critical order submissions to prevent unintended duplicates.
Request Example
from decimal import Decimal
from longbridge.openapi import TradeContext, Config, OrderType, OrderSide, TimeInForceType, OAuthBuilder
oauth = OAuthBuilder("your-client-id").build(lambda url: print("Visit:", url))
config = Config.from_oauth(oauth)
# Create a context for trade APIs
ctx = TradeContext(config)
# Submit order
resp = ctx.submit_order("700.HK", OrderType.LO, OrderSide.Buy, Decimal(500), TimeInForceType.Day, submitted_price=Decimal(50), remark="Hello from Python SDK")
print(resp)import asyncio
from decimal import Decimal
from longbridge.openapi import AsyncTradeContext, Config, OrderType, OrderSide, TimeInForceType, OAuthBuilder
async def main() -> None:
oauth = await OAuthBuilder("your-client-id").build_async(lambda url: print("Visit:", url))
config = Config.from_oauth(oauth)
# Create a context for trade APIs
ctx = AsyncTradeContext.create(config)
# Submit order
resp = await ctx.submit_order("700.HK", OrderType.LO, OrderSide.Buy, Decimal(500), TimeInForceType.Day, submitted_price=Decimal(50), remark="Hello from Python SDK")
print(resp)
if __name__ == "__main__":
asyncio.run(main())const { Config, TradeContext, OAuth, OrderType, OrderSide, TimeInForceType, Decimal } = require('longbridge')
async function main() {
const oauth = await OAuth.build('your-client-id', (_, url) => {
console.log('Open this URL to authorize: ' + url)
})
const config = Config.fromOAuth(oauth)
const ctx = TradeContext.new(config)
const resp = await ctx.submitOrder({
symbol: '700.HK',
orderType: OrderType.LO,
side: OrderSide.Buy,
submittedQuantity: new Decimal(500),
timeInForce: TimeInForceType.Day,
submittedPrice: new Decimal(50),
remark: 'Hello',
})
console.log(resp)
}
main().catch(console.error)import com.longbridge.*;
import com.longbridge.trade.*;
import java.math.BigDecimal;
class Main {
public static void main(String[] args) throws Exception {
try (OAuth oauth = new OAuthBuilder("your-client-id").build(url -> System.out.println("Open to authorize: " + url)).get();
Config config = Config.fromOAuth(oauth);
TradeContext ctx = TradeContext.create(config)) {
SubmitOrderResponse resp = ctx.submitOrder(new SubmitOrderOptions("700.HK", OrderType.LO, OrderSide.Buy, new BigDecimal("500"), TimeInForceType.Day).setSubmittedPrice(new BigDecimal("50")).setRemark("Hello")).get();
System.out.println(resp.orderId);
}
}
}use std::sync::Arc;
use longbridge::{oauth::OAuthBuilder, trade::{TradeContext, SubmitOrderOptions, OrderType, OrderSide, TimeInForceType}, Config};
use rust_decimal::Decimal;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let oauth = OAuthBuilder::new("your-client-id").build(|url| println!("Open this URL to authorize: {url}")).await?;
let config = Arc::new(Config::from_oauth(oauth));
let (ctx, _) = TradeContext::new(config);
let resp = ctx.submit_order(
SubmitOrderOptions::new("700.HK", OrderType::LO, OrderSide::Buy, Decimal::from(500), TimeInForceType::Day)
.submitted_price(Decimal::from(50))
.remark("Hello")
).await?;
println!("{:?}", resp);
Ok(())
}#include <iostream>
#include <longbridge.hpp>
#ifdef WIN32
#include <windows.h>
#endif
using namespace longbridge;
using namespace longbridge::trade;
static void
run(const OAuth& oauth)
{
Config config = Config::from_oauth(oauth);
TradeContext ctx = TradeContext::create(config);
SubmitOrderOptions opts{"700.HK", OrderType::LO, OrderSide::Buy, 200, TimeInForceType::Day, Decimal(50.0), std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt};
ctx.submit_order(opts, [](auto res) {
if (!res) { std::cout << "failed" << std::endl; return; }
std::cout << "order_id: " << res->order_id << std::endl;
});
}
int main(int argc, char const* argv[]) {
#ifdef WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
const std::string client_id = "your-client-id";
OAuthBuilder(client_id).build(
[](const std::string& url) {
std::cout << "Open this URL to authorize: " << url << std::endl;
},
[](auto res) {
if (!res) {
std::cout << "authorization failed: " << *res.status().message() << std::endl;
return;
}
run(*res);
});
std::cin.get();
return 0;
}package main
import (
"context"
"fmt"
"log"
"github.com/longbridge/openapi-go/config"
"github.com/longbridge/openapi-go/oauth"
"github.com/longbridge/openapi-go/trade"
"github.com/shopspring/decimal"
)
func main() {
o := oauth.New("your-client-id").
OnOpenURL(func(url string) { fmt.Println("Open this URL to authorize:", url) })
if err := o.Build(context.Background()); err != nil {
log.Fatal(err)
}
conf, err := config.New(config.WithOAuthClient(o))
if err != nil {
log.Fatal(err)
}
tctx, err := trade.NewFromCfg(conf)
if err != nil {
log.Fatal(err)
}
defer tctx.Close()
orderID, err := tctx.SubmitOrder(context.Background(), &trade.SubmitOrder{
Symbol: "700.HK",
OrderType: trade.OrderTypeLO,
Side: trade.OrderSideBuy,
SubmittedQuantity: 500,
SubmittedPrice: decimal.NewFromFloat(50),
TimeInForce: trade.TimeTypeDay,
Remark: "Hello from Go SDK",
})
if err != nil {
log.Fatal(err)
}
fmt.Println("order_id:", orderID)
}Response
Response Headers
- Content-Type: application/json
Response Example
{
"code": 0,
"message": "success",
"data": {
"order_id": 683615454870679600
}
}
Response Status
| Status | Description | Schema |
|---|---|---|
| 200 | The submission was successful and the order was commissioned. | None |
| 400 | The submit was rejected with an incorrect request parameter. | None |