longbridge provides an easy-to-use interface for invoking Longbridge OpenAPI.
| Context | Description |
|---|---|
QuoteContext |
Real-time quotes, candlesticks, options, warrants, watchlists, push subscriptions |
TradeContext |
Orders, positions, account balance, executions, cash flow |
AssetContext |
Account statement download |
ContentContext |
News, community topics |
FundamentalContext |
Financial reports, analyst ratings, dividends, valuation, company overview, shareholders |
MarketContext |
Market status, broker holdings, A/H premium, trade statistics, anomaly alerts, index constituents |
CalendarContext |
Financial calendar (earnings, dividends, splits, IPOs, macro data, market closures) |
PortfolioContext |
Exchange rates, portfolio P&L analysis |
AlertContext |
Price alert management (add/enable/disable/delete) |
DCAContext |
Dollar-cost averaging plan management |
SharelistContext |
Community sharelist management |
- SDK docs: https://longbridge.github.io/openapi/python/index.html
- Longbridge OpenAPI: https://open.longbridge.com/en/
Runnable examples live in examples/python/, grouped as follows.
Synchronous API (same as the snippets in this README):
examples/python/account_asset.pyexamples/python/history_candlesticks.pyexamples/python/http_client.pyexamples/python/subscribe_candlesticks.pyexamples/python/subscribe_quote.pyexamples/python/submit_order.pyexamples/python/today_orders.py
Asynchronous API (AsyncQuoteContext, AsyncTradeContext, HttpClient.request_async):
examples/python/account_asset_async.pyexamples/python/history_candlesticks_async.pyexamples/python/http_client_async.pyexamples/python/subscribe_candlesticks_async.pyexamples/python/subscribe_quote_async.pyexamples/python/submit_order_async.pyexamples/python/today_orders_async.py
-
The configuration of the SDK.
-
The Quote API part of the SDK, e.g.: get basic information of securities, subscribe quotes...
-
The Trade API part of the SDK, e.g.: submit order, get order status...
Install Longbridge OpenAPI SDK
pip install longbridgeLongbridge OpenAPI supports two authentication methods:
OAuth 2.0 is the modern authentication method that uses Bearer tokens without requiring HMAC signatures.
Step 1: Register OAuth Client
First, register an OAuth client to get your client_id:
bash / macOS / Linux
curl -X POST https://openapi.longbridge.com/oauth2/register \
-H "Content-Type: application/json" \
-d '{
"client_name": "My Application",
"redirect_uris": ["http://localhost:60355/callback"],
"grant_types": ["authorization_code", "refresh_token"]
}'PowerShell (Windows)
Invoke-RestMethod -Method Post -Uri https://openapi.longbridge.com/oauth2/register `
-ContentType "application/json" `
-Body '{
"client_name": "My Application",
"redirect_uris": ["http://localhost:60355/callback"],
"grant_types": ["authorization_code", "refresh_token"]
}'Response:
{
"client_id": "your-client-id-here",
"client_secret": null,
"client_name": "My Application",
"redirect_uris": ["http://localhost:60355/callback"]
}Save the client_id for use in your application.
Step 2: Build an OAuth client and create Config
OAuthBuilder loads a cached token from
~/.longbridge/openapi/tokens/<client_id>
(%USERPROFILE%\.longbridge\openapi\tokens\<client_id> on Windows) if one
exists and is still valid, or starts the browser authorization flow
automatically. The token is persisted to the same path after a successful
authorization or refresh.
from longbridge.openapi import OAuthBuilder, Config
oauth = OAuthBuilder("your-client-id").build(
lambda url: print(f"Open this URL to authorize: {url}")
)
config = Config.from_oauth(oauth)For async code use build_async:
import asyncio
from longbridge.openapi import OAuthBuilder, Config
async def main():
oauth = await OAuthBuilder("your-client-id").build_async(
lambda url: print(f"Open this URL to authorize: {url}")
)
config = Config.from_oauth(oauth)
asyncio.run(main())Setting environment variables (macOS/Linux)
export LONGBRIDGE_APP_KEY="App Key get from user center"
export LONGBRIDGE_APP_SECRET="App Secret get from user center"
export LONGBRIDGE_ACCESS_TOKEN="Access Token get from user center"Setting environment variables (Windows)
setx LONGBRIDGE_APP_KEY "App Key get from user center"
setx LONGBRIDGE_APP_SECRET "App Secret get from user center"
setx LONGBRIDGE_ACCESS_TOKEN "Access Token get from user center"| Name | Description |
|---|---|
| LONGBRIDGE_LANGUAGE | Language identifier, zh-CN, zh-HK or en (Default: en) |
| LONGBRIDGE_HTTP_URL | HTTP endpoint url (Default: https://openapi.longbridge.com) |
| LONGBRIDGE_QUOTE_WS_URL | Quote websocket endpoint url (Default: wss://openapi-quote.longbridge.com/v2) |
| LONGBRIDGE_TRADE_WS_URL | Trade websocket endpoint url (Default: wss://openapi-trade.longbridge.com/v2) |
| LONGBRIDGE_ENABLE_OVERNIGHT | Enable overnight quote, true or false (Default: false) |
| LONGBRIDGE_PUSH_CANDLESTICK_MODE | realtime or confirmed (Default: realtime) |
| LONGBRIDGE_PRINT_QUOTE_PACKAGES | Print quote packages when connected, true or false (Default: true) |
| LONGBRIDGE_LOG_PATH | Set the path of the log files (Default: no logs) |
| LONGBRIDGE_PAPERTRADING | Enable paper trading mode, true or false (Default: false). See Paper Trading. |
Then create a config from the environment:
from longbridge.openapi import Config
config = Config.from_apikey_env()from longbridge.openapi import Config, QuoteContext, OAuthBuilder
oauth = OAuthBuilder("your-client-id").build(
lambda url: print(f"Open this URL to authorize: {url}")
)
config = Config.from_oauth(oauth)
# Create a context for quote APIs
ctx = QuoteContext(config)
# Get basic information of securities
resp = ctx.quote(["700.HK", "AAPL.US", "TSLA.US", "NFLX.US"])
print(resp)from time import sleep
from longbridge.openapi import Config, QuoteContext, SubType, PushQuote, OAuthBuilder
oauth = OAuthBuilder("your-client-id").build(
lambda url: print(f"Open this URL to authorize: {url}")
)
config = Config.from_oauth(oauth)
# A callback to receive quote data
def on_quote(symbol: str, event: PushQuote):
print(symbol, event)
# Create a context for quote APIs
ctx = QuoteContext(config)
ctx.set_on_quote(on_quote)
# Subscribe
ctx.subscribe(["700.HK"], [SubType.Quote])
# Receive push for 30 seconds
sleep(30)from decimal import Decimal
from longbridge.openapi import TradeContext, Config, OrderType, OrderSide, TimeInForceType, OAuthBuilder
oauth = OAuthBuilder("your-client-id").build(
lambda url: print(f"Open this URL to authorize: {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)The SDK provides async contexts and an async HTTP client for use with Python's asyncio. All I/O methods return awaitables; callbacks (e.g. for push events) are set the same way as in the sync API. Async quote/trade contexts support async callbacks: if a set_on_quote, set_on_candlestick, or set_on_order_changed callback is an async function (returns a coroutine), it is scheduled on the event loop. When using async callbacks, pass the loop so the SDK can schedule them: AsyncQuoteContext.create(config, loop_=asyncio.get_running_loop()).
- Async quote: create with
ctx = AsyncQuoteContext.create(config)(synchronous, no await), then e.g.await ctx.quote(["700.HK"]),await ctx.subscribe(...). - Async trade: create with
ctx = AsyncTradeContext.create(config)(synchronous, no await), then e.g.await ctx.today_orders(),await ctx.submit_order(...). - Async HTTP:
resp = await http_cli.request_async("get", "/v1/trade/execution/today").
Example (async quote):
import asyncio
from longbridge.openapi import Config, AsyncQuoteContext, SubType, PushQuote, OAuthBuilder
def on_quote(symbol: str, event: PushQuote):
print(symbol, event)
async def main():
oauth = await OAuthBuilder("your-client-id").build_async(
lambda url: print(f"Open this URL to authorize: {url}")
)
config = Config.from_oauth(oauth)
ctx = AsyncQuoteContext.create(config, loop_=asyncio.get_running_loop())
ctx.set_on_quote(on_quote)
await ctx.subscribe(["700.HK", "AAPL.US"], [SubType.Quote])
quotes = await ctx.quote(["700.HK"])
print(quotes)
await asyncio.sleep(10)
asyncio.run(main())See the *_async.py examples in examples/python/ for full async flows.
If your account is a paper trading (simulation) account and you want to place orders, you must explicitly enable paper trading mode. When enabled, all API calls target the paper trading environment and the server validates the token — if the token belongs to a real-money account the server returns an error.
By default this option is off: the server imposes no restrictions and accepts requests from both paper trading and real-money accounts.
Via environment variable (applies automatically to all constructor methods):
export LONGBRIDGE_PAPERTRADING=true # macOS / Linux$env:LONGBRIDGE_PAPERTRADING = "true" # Windows PowerShellProgrammatically:
from longbridge.openapi import Config
config = Config.from_apikey(
"app-key", "app-secret", "access-token",
enable_papertrading=True,
)- Windows
setxrequires a new terminal; usesetfor the currentcmd.exesession. - If the program exits, you won't receive push events; keep the process alive (e.g.
sleep(...)). - For debugging, set
LONGBRIDGE_LOG_PATHto enable SDK logs.
Licensed under either of
- Apache License, Version 2.0,(LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT) at your option.