Real-Time Push
The TypeScript SDK's PushClient maintains a persistent Protobuf/TCP+TLS connection to the Tiger OpenAPI server. Data is transmitted using Protobuf encoding with varint32 length-prefix framing. It supports automatic reconnection, heartbeat keep-alive, and callback-based delivery of market data and account events. All callback payloads are the Protobuf-generated types defined in src/push/pb/*.
Quick Start
import { createClientConfig, PushClient } from '@tigeropenapi/tigeropen';
const config = createClientConfig();
const pc = new PushClient(config);
// Register all callbacks in one call — before connecting
pc.setCallbacks({
onConnect: () => {
console.log('Connected to push server');
},
onDisconnect: () => {
console.log('Disconnected from push server');
},
onError: (err) => {
console.error('Push error:', err.message);
},
onQuote: (data) => {
// data: QuoteData (protobuf-generated)
console.log(`Quote: ${data.symbol} price=${data.latestPrice} vol=${data.volume}`);
},
onTick: (data) => {
// data: TradeTickData
console.log(`Tick: ${data.symbol}`);
},
onOrder: (data) => {
// data: OrderStatusData
console.log(`Order update: id=${data.id} status=${data.status}`);
},
onAsset: (data) => {
console.log('Asset change received');
},
onPosition: (data) => {
console.log('Position change received');
},
onTransaction: (data) => {
console.log('Transaction received');
},
});
await pc.connect();
pc.subscribeQuote(['AAPL', 'TSLA']);
pc.subscribeTick(['AAPL']);
pc.subscribeDepth(['AAPL']);
pc.subscribeAsset();
pc.subscribeOrder();
pc.subscribePosition();
pc.subscribeTransaction();Client Lifecycle
constructor
constructor(config: ClientConfig, options?: PushClientOptions)Creates a new PushClient. The client is idle until connect() is called.
| Parameter | Type | Description |
|---|---|---|
config | ClientConfig | Loaded configuration (credentials, server URL) |
options | PushClientOptions? | Optional settings (host/port, intervals, timeouts) |
PushClientOptions fields:
| Field | Type | Default | Description |
|---|---|---|---|
pushHost | string | openapi.tigerfintech.com | Push server host |
pushPort | number | 9883 | Push server port |
heartbeatInterval | number | 10000 (ms) | Heartbeat send interval |
reconnectInterval | number | 5000 (ms) | Initial reconnect interval |
autoReconnect | boolean | true | Enable automatic reconnection |
connectTimeout | number | 30000 (ms) | Initial connect timeout |
useFullTick | boolean | false | Request full tick stream |
connect
connect(): Promise<void>Opens the TCP+TLS connection, sends the authentication message, and resolves when the server confirms the handshake (CONNECTED response).
await pc.connect();
console.log('Ready to subscribe');disconnect
disconnect(): voidGracefully sends a DISCONNECT message and closes the socket. Stops heartbeat and cancels any pending reconnect attempts.
pc.disconnect();state (getter)
get state(): ConnectionStateReturns the current connection state as a member of the ConnectionState enum:
| Value | Meaning |
|---|---|
ConnectionState.Disconnected (0) | Not connected |
ConnectionState.Connecting (1) | TLS handshake in progress |
ConnectionState.Connected (2) | Fully authenticated |
import { ConnectionState } from '@tigeropenapi/tigeropen';
if (pc.state === ConnectionState.Connected) {
console.log('Push client is live');
}setCallbacks
setCallbacks(callbacks: Callbacks): voidReplaces the current callback set. Call this before connect() so no initial messages are missed. All fields on Callbacks are optional.
getSubscriptions / getAccountSubscriptions
getSubscriptions(): Map<SubjectType, string[]>
getAccountSubscriptions(): SubjectType[]Returns the current local subscription state (symbol-based and account-level respectively). These are also used internally to re-subscribe after an automatic reconnect.
Callbacks
Callbacks are passed via setCallbacks({...}). Payload types are the protobuf-generated interfaces from src/push/pb/*.
| Callback | Payload type | Triggered when |
|---|---|---|
onConnect | () => void | Connection established (after CONNECTED) |
onDisconnect | () => void | Connection closed |
onError | (err: Error) => void | Transport or protocol error occurs |
onKickout | (message: string) => void | Server forces disconnection |
onQuote | (data: QuoteData) => void | Real-time quote update |
onTick | (data: TradeTickData) => void | Trade tick received |
onDepth | (data: QuoteDepthData) => void | Order-book depth update |
onOption | (data: QuoteData) => void | Option quote update (same shape as QuoteData) |
onFuture | (data: QuoteData) => void | Futures quote update (same shape as QuoteData) |
onKline | (data: KlineData) => void | K-line bar update |
onStockTop | (data: StockTopData) => void | Stock top-list update |
onOptionTop | (data: OptionTopData) => void | Option top-list update |
onFullTick | (data: TickData) => void | Full tick stream (when useFullTick is enabled) |
onQuoteBBO | (data: QuoteData) => void | BBO-only quote update |
onAsset | (data: AssetData) => void | Account asset change |
onPosition | (data: PositionData) => void | Position change |
onOrder | (data: OrderStatusData) => void | Order status change |
onTransaction | (data: OrderTransactionData) => void | Fill / execution received |
pc.setCallbacks({
onQuote: (data) => {
console.log(`${data.symbol}: $${data.latestPrice}`);
},
onDepth: (data) => {
console.log(`Depth update for ${data.symbol}`);
console.log(' Best bid:', data.bidList?.[0]);
console.log(' Best ask:', data.askList?.[0]);
},
onKline: (data) => {
console.log(`Kline ${data.symbol}: O=${data.open} H=${data.high} L=${data.low} C=${data.close}`);
},
onTransaction: (data) => {
console.log(`Fill: ${data.symbol} qty=${data.filledQuantity} price=${data.filledPrice}`);
},
});Market Data Subscriptions
v0.4.0 note: Fixed a dispatcher bug where crypto (
Cc) pushes used to throwUnknown DataTypeafter subscribing —Ccpushes are now routed to theonQuotecallback (sameQuoteDatabody). Also added 4 new subscription pairs — stock / option top rankings, crypto quotes, and market-status (see "New in v0.4.0" subsections below).
subscribeQuote / unsubscribeQuote
subscribeQuote(symbols: string[]): void
unsubscribeQuote(symbols?: string[]): voidSubscribe to or unsubscribe from real-time best-bid/ask and last-price updates. Pass no argument to unsubscribeQuote() to unsubscribe all currently subscribed symbols.
pc.subscribeQuote(['AAPL', 'TSLA', 'MSFT']);
pc.unsubscribeQuote(['TSLA']);subscribeTick / unsubscribeTick
subscribeTick(symbols: string[]): void
unsubscribeTick(symbols?: string[]): voidSubscribe to tick-by-tick trade data (each individual executed trade).
pc.subscribeTick(['AAPL']);
pc.unsubscribeTick(['AAPL']);subscribeDepth / unsubscribeDepth
subscribeDepth(symbols: string[]): void
unsubscribeDepth(symbols?: string[]): voidSubscribe to Level 2 order-book depth updates.
pc.subscribeDepth(['AAPL']);
pc.unsubscribeDepth(['AAPL']);subscribeOption / unsubscribeOption
subscribeOption(symbols: string[]): void
unsubscribeOption(symbols?: string[]): voidSubscribe to real-time option quote updates using OCC-style identifiers.
pc.subscribeOption(['AAPL 250117C00150000']);
pc.unsubscribeOption(['AAPL 250117C00150000']);subscribeFuture / unsubscribeFuture
subscribeFuture(symbols: string[]): void
unsubscribeFuture(symbols?: string[]): voidSubscribe to real-time futures quote updates.
pc.subscribeFuture(['ES2506', 'NQ2506']);
pc.unsubscribeFuture(['ES2506']);subscribeKline / unsubscribeKline
subscribeKline(symbols: string[]): void
unsubscribeKline(symbols?: string[]): voidSubscribe to real-time K-line bar updates.
pc.subscribeKline(['AAPL']);
pc.unsubscribeKline(['AAPL']);subscribeStockTop / unsubscribeStockTop (new in v0.4.0)
subscribeStockTop(market: string, indicators: string[]): void
unsubscribeStockTop(market: string, indicators: string[]): voidSubscribe to real-time stock top-list updates for the given market. Pick one or more indicators (latest price / gainers / losers / volume / turnover / amplitude / turnover rate). Data is delivered via the onStockTop callback (StockTopData).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| market | string | Yes | Market code: 'US' / 'HK' / 'CN' |
| indicators | string[] | Yes | e.g. 'LATEST_PRICE', 'HIGHER', 'LOWER', 'VOLUME', 'AMOUNT', 'AMPLITUDE', 'TURNOVER_RATE' |
Callback
onStockTop: (data: StockTopData) => void
Example
pc.setCallbacks({
onStockTop: (data) => {
console.log(`[StockTop] market=${data.market} items=${data.topData?.length ?? 0}`);
},
});
pc.subscribeStockTop('US', ['LATEST_PRICE', 'HIGHER', 'LOWER']);
pc.unsubscribeStockTop('US', ['LATEST_PRICE', 'HIGHER', 'LOWER']);subscribeOptionTop / unsubscribeOptionTop (new in v0.4.0)
subscribeOptionTop(market: string, indicators: string[]): void
unsubscribeOptionTop(market: string, indicators: string[]): voidSubscribe to real-time option top-list updates. Data is delivered via the onOptionTop callback (OptionTopData).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| market | string | Yes | Market code: 'US' / 'HK' / 'CN' |
| indicators | string[] | Yes | e.g. 'LATEST_PRICE', 'HIGHER', 'LOWER', 'VOLUME', 'AMOUNT' |
Callback
onOptionTop: (data: OptionTopData) => void
Example
pc.setCallbacks({
onOptionTop: (data) => {
console.log(`[OptionTop] market=${data.market} items=${data.topData?.length ?? 0}`);
},
});
pc.subscribeOptionTop('US', ['VOLUME', 'AMOUNT']);
pc.unsubscribeOptionTop('US', ['VOLUME', 'AMOUNT']);subscribeCc / unsubscribeCc (new in v0.4.0)
subscribeCc(symbols: string[]): void
unsubscribeCc(symbols?: string[]): voidSubscribe to real-time crypto quotes.
Note: Crypto pushes share the same body shape as stock QuoteData and are delivered via the onQuote callback — there is no separate onCc callback. The dispatcher routes the Cc dataType to onQuote (aligned with the Python SDK). Before v0.4.0 the dispatcher threw Unknown DataType on arrival; that bug is now fixed.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| symbols | string[] | Yes | Crypto symbols, e.g. ['BTCUSD', 'ETHUSD'] |
Callback
onQuote: (data: QuoteData) => void (shared with regular quotes)
Example
pc.setCallbacks({
onQuote: (data) => {
// Cc pushes flow through onQuote too
console.log(`[Quote/Cc] ${data.symbol} latest=${data.latestPrice}`);
},
});
pc.subscribeCc(['BTCUSD', 'ETHUSD']);
pc.unsubscribeCc(['BTCUSD', 'ETHUSD']);subscribeMarket / unsubscribeMarket (new in v0.4.0)
subscribeMarket(market: string): void
unsubscribeMarket(market: string): voidSubscribe to market-status updates (pre-open, trading, lunch break, after-hours, close, etc.) for a whole market.
Note: On the wire this uses dataType=Quote with only the market field set; data is delivered via the onQuote callback.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| market | string | Yes | Market code: 'US' / 'HK' / 'CN' / 'SG' |
Callback
onQuote: (data: QuoteData) => void (shared with regular quotes)
Example
pc.setCallbacks({
onQuote: (data) => {
// Market-status changes also arrive here
console.log(`[Market/Quote] symbol=${data.symbol}`);
},
});
pc.subscribeMarket('US');
pc.unsubscribeMarket('US');Account Subscriptions
Account-level subscriptions default to the account in the active config. Pass an explicit account string to override.
subscribeAsset / unsubscribeAsset
subscribeAsset(account?: string): void
unsubscribeAsset(): voidSubscribe to account asset changes (cash balance, net liquidation value, buying power).
pc.subscribeAsset(); // use config account
pc.subscribeAsset('DU123456'); // explicit account
pc.unsubscribeAsset();subscribePosition / unsubscribePosition
subscribePosition(account?: string): void
unsubscribePosition(): voidSubscribe to position updates (new position opened, quantity changed, position closed).
pc.subscribePosition();
pc.unsubscribePosition();subscribeOrder / unsubscribeOrder
subscribeOrder(account?: string): void
unsubscribeOrder(): voidSubscribe to order status changes (submitted, partially filled, fully filled, cancelled).
pc.subscribeOrder();
pc.unsubscribeOrder();subscribeTransaction / unsubscribeTransaction
subscribeTransaction(account?: string): void
unsubscribeTransaction(): voidSubscribe to individual fill (execution) events.
pc.subscribeTransaction();
pc.unsubscribeTransaction();Complete Subscription Reference
// Market data subscriptions
pc.subscribeQuote(['AAPL', 'TSLA']);
pc.subscribeTick(['AAPL']);
pc.subscribeDepth(['AAPL']);
pc.subscribeOption(['AAPL 250117C00150000']);
pc.subscribeFuture(['ES2506']);
pc.subscribeKline(['AAPL']);
// Account subscriptions
pc.subscribeAsset();
pc.subscribePosition();
pc.subscribeOrder();
pc.subscribeTransaction();
// Unsubscribe from market data
pc.unsubscribeQuote(['TSLA']);
pc.unsubscribeTick(['AAPL']);
pc.unsubscribeDepth(['AAPL']);
pc.unsubscribeOption(['AAPL 250117C00150000']);
pc.unsubscribeFuture(['ES2506']);
pc.unsubscribeKline(['AAPL']);
// Unsubscribe from account events
pc.unsubscribeAsset();
pc.unsubscribePosition();
pc.unsubscribeOrder();
pc.unsubscribeTransaction();Updated 15 days ago
