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.

ParameterTypeDescription
configClientConfigLoaded configuration (credentials, server URL)
optionsPushClientOptions?Optional settings (host/port, intervals, timeouts)

PushClientOptions fields:

FieldTypeDefaultDescription
pushHoststringopenapi.tigerfintech.comPush server host
pushPortnumber9883Push server port
heartbeatIntervalnumber10000 (ms)Heartbeat send interval
reconnectIntervalnumber5000 (ms)Initial reconnect interval
autoReconnectbooleantrueEnable automatic reconnection
connectTimeoutnumber30000 (ms)Initial connect timeout
useFullTickbooleanfalseRequest 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(): void

Gracefully sends a DISCONNECT message and closes the socket. Stops heartbeat and cancels any pending reconnect attempts.

pc.disconnect();

state (getter)

get state(): ConnectionState

Returns the current connection state as a member of the ConnectionState enum:

ValueMeaning
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): void

Replaces 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/*.

CallbackPayload typeTriggered when
onConnect() => voidConnection established (after CONNECTED)
onDisconnect() => voidConnection closed
onError(err: Error) => voidTransport or protocol error occurs
onKickout(message: string) => voidServer forces disconnection
onQuote(data: QuoteData) => voidReal-time quote update
onTick(data: TradeTickData) => voidTrade tick received
onDepth(data: QuoteDepthData) => voidOrder-book depth update
onOption(data: QuoteData) => voidOption quote update (same shape as QuoteData)
onFuture(data: QuoteData) => voidFutures quote update (same shape as QuoteData)
onKline(data: KlineData) => voidK-line bar update
onStockTop(data: StockTopData) => voidStock top-list update
onOptionTop(data: OptionTopData) => voidOption top-list update
onFullTick(data: TickData) => voidFull tick stream (when useFullTick is enabled)
onQuoteBBO(data: QuoteData) => voidBBO-only quote update
onAsset(data: AssetData) => voidAccount asset change
onPosition(data: PositionData) => voidPosition change
onOrder(data: OrderStatusData) => voidOrder status change
onTransaction(data: OrderTransactionData) => voidFill / 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 throw Unknown DataType after subscribing — Cc pushes are now routed to the onQuote callback (same QuoteData body). 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[]): void

Subscribe 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[]): void

Subscribe 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[]): void

Subscribe to Level 2 order-book depth updates.

pc.subscribeDepth(['AAPL']);
pc.unsubscribeDepth(['AAPL']);

subscribeOption / unsubscribeOption

subscribeOption(symbols: string[]): void
unsubscribeOption(symbols?: string[]): void

Subscribe 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[]): void

Subscribe to real-time futures quote updates.

pc.subscribeFuture(['ES2506', 'NQ2506']);
pc.unsubscribeFuture(['ES2506']);

subscribeKline / unsubscribeKline

subscribeKline(symbols: string[]): void
unsubscribeKline(symbols?: string[]): void

Subscribe 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[]): void

Subscribe 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

NameTypeRequiredDescription
marketstringYesMarket code: 'US' / 'HK' / 'CN'
indicatorsstring[]Yese.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[]): void

Subscribe to real-time option top-list updates. Data is delivered via the onOptionTop callback (OptionTopData).

Parameters

NameTypeRequiredDescription
marketstringYesMarket code: 'US' / 'HK' / 'CN'
indicatorsstring[]Yese.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[]): void

Subscribe 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

NameTypeRequiredDescription
symbolsstring[]YesCrypto 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): void

Subscribe 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

NameTypeRequiredDescription
marketstringYesMarket 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(): void

Subscribe 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(): void

Subscribe to position updates (new position opened, quantity changed, position closed).

pc.subscribePosition();
pc.unsubscribePosition();

subscribeOrder / unsubscribeOrder

subscribeOrder(account?: string): void
unsubscribeOrder(): void

Subscribe to order status changes (submitted, partially filled, fully filled, cancelled).

pc.subscribeOrder();
pc.unsubscribeOrder();

subscribeTransaction / unsubscribeTransaction

subscribeTransaction(account?: string): void
unsubscribeTransaction(): void

Subscribe 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();