<!-- markdownlint-disable no-inline-html first-line-h1 -->
<div align="center">
    <img src="https://itick.org/img/apple.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/alphabet.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/microsoft.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/icon/us-nasdaq-tsla.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/icon/us-nasdaq-nvda.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/crypto/XTVCBTC.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/crypto/XTVCETH.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/crypto/XTVCUSDT.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/crypto/XTVCSHIB.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/indices/s-and-p-500.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/indices/nasdaq-100.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/indices/hang-seng.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/indices/nikkei-225.svg" style="border-radius: 50%;margin-right: 6px;" />
    <img src="https://itick.org/img/metal/gold.svg" style="border-radius: 50%;margin-right: 6px;" />
  </div>

<div align="center">
  <a href="https://itick.org" target="_blank" style="display: flex;justify-content: center;margin-top: 20px;">
    <img width="400" src="https://itick.org/images/logo/logo.svg" alt="iTick logo">
  </a>
  
  <h1>iTick Web browser js SDK</h1>

[![npm version][npm-version-img]][npm-link]
[![CDNJS][cdn-js-img]][cdn-js-link]
[![install size][npm-install-size-img]][npm-install-size-link]
[![npm bundle size][bundle-size-img]][bundle-size-link]
[![license badge][license-img]][license-link]

</div>

<!-- markdownlint-enable no-inline-html -->

[English](https://github.com/itick-org/javascript-sdk/blob/main/README.md) | [简体中文](https://github.com/itick-org/javascript-sdk/blob/main/README.zh-CN.md) | [繁體中文](https://github.com/itick-org/javascript-sdk/blob/main/README.zh-HK.md)

The web browser javascript SDK for iTick API, providing REST API queries and WebSocket real-time data subscription for basics, stocks, indices, futures, funds, forex, and crypto. Used to access real-time financial market data from the iTick API.

## ✨ Features

- **Comprehensive Market Coverage**: Access global financial markets including stocks, crypto, forex, indices, futures, and funds
- **Real-time Data**: WebSocket-based real-time data streaming with automatic reconnection support
- **RESTful API**: Clean and intuitive REST API for retrieving historical data and snapshots
- **Type Safety**: Full TypeScript support with comprehensive type definitions
- **Auto Reconnection**: Built-in automatic reconnection mechanism (5-second interval, configurable unlimited attempts)
- **Heartbeat Keep-alive**: Automatic ping/pong mechanism (30-second interval) to maintain stable connections
- **Modular Design**: Independent modules organized by asset type for clearer structure
- **Flexible Subscription**: Support for subscribing to quotes, order book depth, trades, and candlestick data

## Browser Support

|                                                     Chrome                                                     |                                                      Firefox                                                      |                                                     Safari                                                     |                                                    Opera                                                    |                                                   Edge                                                   |
| :------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------: |
| ![Chrome browser logo](https://raw.githubusercontent.com/alrra/browser-logos/main/src/chrome/chrome_48x48.png) | ![Firefox browser logo](https://raw.githubusercontent.com/alrra/browser-logos/main/src/firefox/firefox_48x48.png) | ![Safari browser logo](https://raw.githubusercontent.com/alrra/browser-logos/main/src/safari/safari_48x48.png) | ![Opera browser logo](https://raw.githubusercontent.com/alrra/browser-logos/main/src/opera/opera_48x48.png) | ![Edge browser logo](https://raw.githubusercontent.com/alrra/browser-logos/main/src/edge/edge_48x48.png) |
|                                                    Latest ✔                                                    |                                                     Latest ✔                                                      |                                                    Latest ✔                                                    |                                                  Latest ✔                                                   |                                                 Latest ✔                                                 |



## 🚀 Installation

### Package manager

Using npm:

```bash
npm install @itick/browser-sdk
```

Using yarn:

```bash
yarn add @itick/browser-sdk
```

Using pnpm:

```bash
pnpm add @itick/browser-sdk
```

### CDN

```html
<!-- Using unpkg CDN -->
<script src="https://unpkg.com/@itick/browser-sdk@latest/dist/itick-sdk.min.js"></script>

<!-- Or using jsDelivr CDN -->
<script src="https://cdn.jsdelivr.net/npm/@itick/browser-sdk@latest/dist/itick-sdk.min.js"></script>

<script>
  const { BaseClient, StockClient, CryptoClient, ForexClient, IndicesClient, FutureClient, FundClient } = window.iTickSDK;
</script>
```

## 🎯 Quick Start

### Basic Usage

```javascript
import { StockClient } from "@itick/browser-sdk";

// Initialize client with API Token
const token = process.env.ITICK_TOKEN;
const client = new StockClient(token);

// Get stock quote
async function getQuote() {
  try {
    const response = await client.getQuote({ region: "US", code: "AAPL" });

    if (response.code === 0 && response.data) {
      console.log("Latest Price:", response.data.ld);
      console.log("Change %:", response.data.chp);
    }
  } catch (error) {
    console.error("Error:", error.message);
  }
}

getQuote();
```

### Real-time Data via WebSocket

```javascript
import { CryptoClient } from "@itick/browser-sdk";
const client = new CryptoClient(token);

// Create WebSocket connection with subscription data - SDK handles connection and automatically subscribes after reconnection, no need to send subscription data again
const socket = client.createSocket({
  maxReconnectTimes: 10, // Maximum reconnection attempts, default is 0 (unlimited)
  pingInterval: 30000, // Ping interval, default 30 seconds
  reconnectInterval: 5000, // Reconnection interval, default 5 seconds
  subscribeData: {
    codes: ["BTCUSDT$BA", "ETHUSDT$BA"],
    types: ["quote", "tick"],
  },
});

// Create custom WebSocket connection
const socket = client.createSocket();

// Send subscription data after successful connection or reconnection
socket.onSocketOpen(() => {
  socket.subscribeData({
    codes: ["BTCUSDT$BA", "ETHUSDT$BA"],
    types: ["quote", "tick"],
  });
});

// Handle received messages
socket.onSocketMessage((res) => {
  console.log("Received data:", res);
});

// Handle errors
socket.onSocketError((error) => {
  console.error("WebSocket error:", error);
});

// Disconnect when done
// socket.disconnectSocket();
```

## 📚 API Reference

### Base Module

Financial instrument listings, market holiday information, and trading hours.

```typescript
import { BaseClient } from "@itick/browser-sdk";

const client = new BaseClient(token);

// Get symbol list
await client.getSymbolList({ type: "stock", region: "US" });
await client.getSymbolList({ type: "crypto", region: "BA" });
await client.getSymbolList({ type: "forex", region: "GB" });

// Get market holidays
await client.getSymbolHolidays("US");
await client.getSymbolHolidays("HK");
```

#### BaseClient Method Reference Table

| Method Name         | Parameters                                                                                                                                                                        | Return Type                              | Description                                                                          | Details                                                                         |
| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------- | :----------------------------------------------------------------------------------- | :------------------------------------------------------------------------------ |
| `getSymbolList`     | `options`: `Object`<br>- `type`:`enum` (Product type, e.g., `stock`,`forex`,`fund`,`future`,`indices`) <br>- `region`:`string` (Market region code, e.g., `US`, `BA`, `GB`, etc.) | `Promise<APIResponse<SymbolListData[]>>` | Get financial instrument listings (symbol list) for specified market and asset type. | [iTick Symbol List](https://docs.itick.org/rest-api/basics/symbol-list)         |
| `getSymbolHolidays` | region: `string` (Market region code, e.g., `US`, `HK`, etc.)                                                                                                                     | `Promise<APIResponse<HolidayData[]>>`    | Get holiday information for specified market, including trading hours schedule.      | [iTick Market Holidays](https://docs.itick.org/rest-api/basics/symbol-holidays) |

### Stock Module

Access global stock market data including US stocks, Hong Kong stocks, etc.

```javascript
import { StockClient } from "@itick/browser-sdk";

const client = new StockClient(token);

// Get single stock information
await client.getInfo({ region: "US", code: "AAPL" });

// Get real-time quote
await client.getQuote({ region: "US", code: "AAPL" });

// Get order book depth
await client.getDepth({ region: "US", code: "AAPL" });

// Get latest trade
await client.getTick({ region: "US", code: "AAPL" });

// Get candlestick data
await client.getKline({
  region: "US",
  code: "AAPL",
  interval: "5m",
  limit: 100,
});

// Batch queries
await client.getQuotes({ region: "US", codes: ["AAPL", "MSFT", "GOOGL"] });
await client.getDepths({ region: "US", codes: ["AAPL", "MSFT"] });
await client.getTicks({ region: "US", codes: ["AAPL", "MSFT"] });
await client.getKlines({
  region: "US",
  codes: ["AAPL", "MSFT"],
  interval: "1d",
  limit: 50,
});

// IPO information
await client.getIPO({ region: "US", code: "RIVN" });

// Stock split information
await client.getSplit({ region: "US", code: "AAPL" });
```

#### StockClient Method Reference Table

| Method Name    | Parameters                                                                                                                                                                                                                                                                                                | Return Type                          | Description                                                 | Details                                                                           |
| :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------- | :---------------------------------------------------------- | :-------------------------------------------------------------------------------- |
| `getInfo`      | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Stock code, e.g., `AAPL`)<br>-`exchange`?:`string` (Optional, Exchange code e.g., `NYSE`, `NASDAQ`)                                                                                                                                                                         | `Promise<APIResponse<StockInfo>>`    | Get basic stock information                                 | [iTick Stock Info](https://docs.itick.org/rest-api/stocks/stock-info)             |
| `getIPO`       | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Stock code, e.g., `AAPL`)                                                                                                                                                                         | `Promise<APIResponse<StockIPO>>`     | Get stock IPO information                                   | [iTick Stock IPO](https://docs.itick.org/rest-api/stocks/stock-ipo)               |
| `getSplit`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Stock code, e.g., `AAPL`)                                                                                                                                                                         | `Promise<APIResponse<StockSplit>>`   | Get stock ex-rights and dividend information                | [iTick Stock Split](https://docs.itick.org/rest-api/stocks/stock-split)           |
| `getTick`      | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Stock code, e.g., `AAPL`)                                                                                                                                                                         | `Promise<APIResponse<TickData>>`     | Get latest trade data for a single stock                    | [iTick Stock Real-time Tick](https://docs.itick.org/rest-api/stocks/stock-tick)   |
| `getQuote`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Stock code, e.g., `AAPL`)                                                                                                                                                                         | `Promise<APIResponse<QuoteData>>`    | Get latest quote for a single stock                         | [iTick Stock Real-time Quote](https://docs.itick.org/rest-api/stocks/stock-quote) |
| `getDepth`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Stock code, e.g., `AAPL`)                                                                                                                                                                         | `Promise<APIResponse<DepthData>>`    | Get latest order book depth for a single stock              | [iTick Stock Real-time Depth](https://docs.itick.org/rest-api/stocks/stock-depth) |
| `getKline`     | `options`: `GetKlineOptions`<br>- `region`: `string` (Market code)<br>- `code`: `string` (Stock code)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp)                    | `Promise<APIResponse<KlineData[]>>`  | Get candlestick data for a single stock                     | [iTick Stock K-line](https://docs.itick.org/rest-api/stocks/stock-kline)          |
| `getTicks`     | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Stock code list)                                                                                                                                                                                             | `Promise<APIResponse<TickDataMap>>`  | Get latest trade data for multiple stocks                   | [iTick Stock Batch Ticks](https://docs.itick.org/rest-api/stocks/stock-ticks)     |
| `getQuotes`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Stock code list)                                                                                                                                                                                             | `Promise<APIResponse<QuoteDataMap>>` | Get latest quotes for multiple stocks                       | [iTick Stock Batch Quotes](https://docs.itick.org/rest-api/stocks/stock-quotes)   |
| `getDepths`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Stock code list)                                                                                                                                                                                             | `Promise<APIResponse<DepthDataMap>>` | Get latest order book depth for multiple stocks             | [iTick Stock Batch Depths](https://docs.itick.org/rest-api/stocks/stock-depths)   |
| `getKlines`     | `options`: `GetKlinesOptions`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Stock code list)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp) | `Promise<APIResponse<KlineDataMap>>` | Get candlestick data for multiple stocks                    | [iTick Stock Batch K-lines](https://docs.itick.org/rest-api/stocks/stock-klines)  |
| `createSocket` | `options`?: `CreateSocketOptions` (Optional, WebSocket connection options)                                                                                                                                                                                                                                | `SocketClient`                       | Create WebSocket connection for real-time data subscription | [iTick WebSocket Stocks](https://docs.itick.org/websocket/stocks)                 |

### Crypto Module

Access crypto market data from multiple exchanges.

```javascript
import { CryptoClient } from "@itick/browser-sdk";

const client = new CryptoClient(token);

// Get real-time data
await client.getQuote({ region: "BA", code: "BTCUSDT" });
await client.getDepth({ region: "BA", code: "ETHUSDT" });
await client.getTick({ region: "BA", code: "BTCUSDT" });

// Get candlestick data
await client.getKline({
  region: "BA",
  code: "BTCUSDT",
  interval: "1h",
  limit: 100,
});

// Batch queries
await client.getQuotes({ region: "BA", codes: ["BTCUSDT", "ETHUSDT"] });
```

#### CryptoClient Method Reference Table

| Method Name    | Parameters                                                                                                                                                                                                                                                                                                 | Return Type                          | Description                                                 | Details                                                                             |
| :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------- | :---------------------------------------------------------- | :---------------------------------------------------------------------------------- |
| `getTick`      | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `BA`, `BT`, `PB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `BTCUSDT`)                                                                                                                                                                | `Promise<APIResponse<TickData>>`     | Get latest trade data for a single crypto                   | [iTick Crypto Real-time Tick](https://docs.itick.org/rest-api/crypto/crypto-tick)   |
| `getQuote`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `BA`, `BT`, `PB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `BTCUSDT`)                                                                                                                                                                | `Promise<APIResponse<QuoteData>>`    | Get latest quote for a single crypto                        | [iTick Crypto Real-time Quote](https://docs.itick.org/rest-api/crypto/crypto-quote) |
| `getDepth`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `BA`, `BT`, `PB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `BTCUSDT`)                                                                                                                                                                | `Promise<APIResponse<DepthData>>`    | Get latest order book depth for a single crypto             | [iTick Crypto Real-time Depth](https://docs.itick.org/rest-api/crypto/crypto-depth) |
| `getKline`     | `options`: `GetKlineOptions`<br>- `region`: `string` (Market code)<br>- `code`: `string` (Symbol code)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp)                    | `Promise<APIResponse<KlineData[]>>`  | Get candlestick data for a single crypto                    | [iTick Crypto K-line](https://docs.itick.org/rest-api/crypto/crypto-kline)          |
| `getTicks`     | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<TickDataMap>>`  | Get latest trade data for multiple crypto                   | [iTick Crypto Batch Ticks](https://docs.itick.org/rest-api/crypto/crypto-ticks)     |
| `getQuotes`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<QuoteDataMap>>` | Get latest quotes for multiple crypto                       | [iTick Crypto Batch Quotes](https://docs.itick.org/rest-api/crypto/crypto-quotes)   |
| `getDepths`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<DepthDataMap>>` | Get latest order book depth for multiple crypto             | [iTick Crypto Batch Depths](https://docs.itick.org/rest-api/crypto/crypto-depths)   |
| `getKlines`     | `options`: `GetKlinesOptions`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp) | `Promise<APIResponse<KlineDataMap>>` | Get candlestick data for multiple crypto                    | [iTick Crypto Batch K-lines](https://docs.itick.org/rest-api/crypto/crypto-klines)  |
| `createSocket` | `options`?: `CreateSocketOptions` (Optional, WebSocket connection options)                                                                                                                                                                                                                                 | `SocketClient`                       | Create WebSocket connection for real-time data subscription | [iTick WebSocket Crypto](https://docs.itick.org/websocket/crypto)                   |

### Forex Module

Access foreign exchange market data.

```javascript
import { ForexClient } from "@itick/browser-sdk";

const client = new ForexClient(token);

await client.getQuote({ region: "GB", code: "EURUSD" });
await client.getDepth({ region: "GB", code: "GBPUSD" });
await client.getTick({ region: "GB", code: "USDJPY" });
await client.getKline({
  region: "GB",
  code: "EURUSD",
  interval: "1d",
  limit: 50,
});
```

#### ForexClient Method Reference Table

| Method Name    | Parameters                                                                                                                                                                                                                                                                                                 | Return Type                          | Description                                                 | Details                                                                          |
| :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------- | :---------------------------------------------------------- | :------------------------------------------------------------------------------- |
| `getTick`      | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `GB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `EURUSD`)                                                                                                                                                                             | `Promise<APIResponse<TickData>>`     | Get latest trade data for a single currency pair            | [iTick Forex Real-time Tick](https://docs.itick.org/rest-api/forex/forex-tick)   |
| `getQuote`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `GB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `EURUSD`)                                                                                                                                                                             | `Promise<APIResponse<QuoteData>>`    | Get latest quote for a single currency pair                 | [iTick Forex Real-time Quote](https://docs.itick.org/rest-api/forex/forex-quote) |
| `getDepth`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `GB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `EURUSD`)                                                                                                                                                                             | `Promise<APIResponse<DepthData>>`    | Get latest order book depth for a single currency pair      | [iTick Forex Real-time Depth](https://docs.itick.org/rest-api/forex/forex-depth) |
| `getKline`     | `options`: `GetKlineOptions`<br>- `region`: `string` (Market code)<br>- `code`: `string` (Symbol code)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp)                    | `Promise<APIResponse<KlineData[]>>`  | Get candlestick data for a single currency pair             | [iTick Forex K-line](https://docs.itick.org/rest-api/forex/forex-kline)          |
| `getTicks`     | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<TickDataMap>>`  | Get latest trade data for multiple currency pairs           | [iTick Forex Batch Ticks](https://docs.itick.org/rest-api/forex/forex-ticks)     |
| `getQuotes`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<QuoteDataMap>>` | Get latest quotes for multiple currency pairs               | [iTick Forex Batch Quotes](https://docs.itick.org/rest-api/forex/forex-quotes)   |
| `getDepths`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<DepthDataMap>>` | Get latest order book depth for multiple currency pairs     | [iTick Forex Batch Depths](https://docs.itick.org/rest-api/forex/forex-depths)   |
| `getKlines`     | `options`: `GetKlinesOptions`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp) | `Promise<APIResponse<KlineDataMap>>` | Get candlestick data for multiple currency pairs            | [iTick Forex Batch K-lines](https://docs.itick.org/rest-api/forex/forex-klines)  |
| `createSocket` | `options`?: `CreateSocketOptions` (Optional, WebSocket connection options)                                                                                                                                                                                                                                 | `SocketClient`                       | Create WebSocket connection for real-time data subscription | [iTick WebSocket Forex](https://docs.itick.org/websocket/forex)                  |

### Indices Module

Access global stock index data.

```javascript
import { IndicesClient } from "@itick/browser-sdk";

const client = new IndicesClient(token);

await client.getQuote({ region: "US", code: "SPX" });
await client.getDepth({ region: "US", code: "NDX" });
await client.getKline({ region: "US", code: "DJI", interval: "1w", limit: 20 });
```

#### IndicesClient Method Reference Table

| Method Name    | Parameters                                                                                                                                                                                                                                                                                                 | Return Type                          | Description                                                 | Details                                                                                |
| :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------- | :---------------------------------------------------------- | :------------------------------------------------------------------------------------- |
| `getTick`      | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `GB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `DJI`, `SPX`)                                                                                                                                                                   | `Promise<APIResponse<TickData>>`     | Get latest trade data for a single index                    | [iTick Indices Real-time Tick](https://docs.itick.org/rest-api/indices/indices-tick)   |
| `getQuote`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `GB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `DJI`, `SPX`)                                                                                                                                                                   | `Promise<APIResponse<QuoteData>>`    | Get latest quote for a single index                         | [iTick Indices Real-time Quote](https://docs.itick.org/rest-api/indices/indices-quote) |
| `getDepth`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `GB`, etc.)<br>- `code`: `string` (Symbol code, e.g., `DJI`, `SPX`)                                                                                                                                                                   | `Promise<APIResponse<DepthData>>`    | Get latest order book depth for a single index              | [iTick Indices Real-time Depth](https://docs.itick.org/rest-api/indices/indices-depth) |
| `getKline`     | `options`: `GetKlineOptions`<br>- `region`: `string` (Market code)<br>- `code`: `string` (Symbol code)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp)                    | `Promise<APIResponse<KlineData[]>>`  | Get candlestick data for a single index                     | [iTick Indices K-line](https://docs.itick.org/rest-api/indices/indices-kline)          |
| `getTicks`     | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<TickDataMap>>`  | Get latest trade data for multiple indices                  | [iTick Indices Batch Ticks](https://docs.itick.org/rest-api/indices/indices-ticks)     |
| `getQuotes`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<QuoteDataMap>>` | Get latest quotes for multiple indices                      | [iTick Indices Batch Quotes](https://docs.itick.org/rest-api/indices/indices-quotes)   |
| `getDepths`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<DepthDataMap>>` | Get latest order book depth for multiple indices            | [iTick Indices Batch Depths](https://docs.itick.org/rest-api/indices/indices-depths)   |
| `getKlines`     | `options`: `GetKlinesOptions`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp) | `Promise<APIResponse<KlineDataMap>>` | Get candlestick data for multiple indices                   | [iTick Indices Batch K-lines](https://docs.itick.org/rest-api/indices/indices-klines)  |
| `createSocket` | `options`?: `CreateSocketOptions` (Optional, WebSocket connection options)                                                                                                                                                                                                                                 | `SocketClient`                       | Create WebSocket connection for real-time data subscription | [iTick WebSocket Indices](https://docs.itick.org/websocket/indices)                    |

### Futures Module

Access futures market data.

```javascript
import { FutureClient } from "@itick/browser-sdk";

const client = new FutureClient(token);

await client.getQuote({ region: "US", code: "ES" });
await client.getDepth({ region: "US", code: "NQ" });
await client.getKline({ region: "US", code: "CL", interval: "5m", limit: 100 });
```

#### FutureClient Method Reference Table

| Method Name    | Parameters                                                                                                                                                                                                                                                                                                 | Return Type                          | Description                                                 | Details                                                                              |
| :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------- | :---------------------------------------------------------- | :----------------------------------------------------------------------------------- |
| `getTick`      | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `CN`, `HK`, etc.)<br>- `code`: `string` (Symbol code, e.g., `CL`, `GC`)                                                                                                                                                               | `Promise<APIResponse<TickData>>`     | Get latest trade data for a single futures contract         | [iTick Futures Real-time Tick](https://docs.itick.org/rest-api/future/future-tick)   |
| `getQuote`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `CN`, `HK`, etc.)<br>- `code`: `string` (Symbol code, e.g., `CL`, `GC`)                                                                                                                                                               | `Promise<APIResponse<QuoteData>>`    | Get latest quote for a single futures contract              | [iTick Futures Real-time Quote](https://docs.itick.org/rest-api/future/future-quote) |
| `getDepth`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `CN`, `HK`, etc.)<br>- `code`: `string` (Symbol code, e.g., `CL`, `GC`)                                                                                                                                                               | `Promise<APIResponse<DepthData>>`    | Get latest order book depth for a single futures contract   | [iTick Futures Real-time Depth](https://docs.itick.org/rest-api/future/future-depth) |
| `getKline`     | `options`: `GetKlineOptions`<br>- `region`: `string` (Market code)<br>- `code`: `string` (Symbol code)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp)                    | `Promise<APIResponse<KlineData[]>>`  | Get candlestick data for a single futures contract          | [iTick Futures K-line](https://docs.itick.org/rest-api/future/future-kline)          |
| `getTicks`     | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<TickDataMap>>`  | Get latest trade data for multiple futures contracts        | [iTick Futures Batch Ticks](https://docs.itick.org/rest-api/future/future-ticks)     |
| `getQuotes`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<QuoteDataMap>>` | Get latest quotes for multiple futures contracts            | [iTick Futures Batch Quotes](https://docs.itick.org/rest-api/future/future-quotes)   |
| `getDepths`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<DepthDataMap>>` | Get latest order book depth for multiple futures contracts  | [iTick Futures Batch Depths](https://docs.itick.org/rest-api/future/future-depths)   |
| `getKlines`     | `options`: `GetKlinesOptions`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp) | `Promise<APIResponse<KlineDataMap>>` | Get candlestick data for multiple futures contracts         | [iTick Futures Batch K-lines](https://docs.itick.org/rest-api/future/future-klines)  |
| `createSocket` | `options`?: `CreateSocketOptions` (Optional, WebSocket connection options)                                                                                                                                                                                                                                 | `SocketClient`                       | Create WebSocket connection for real-time data subscription | [iTick WebSocket Futures](https://docs.itick.org/websocket/future)                   |

### Funds Module

Access mutual fund and ETF data.

```javascript
import { FundClient } from "@itick/browser-sdk";

const client = new FundClient(token);

await client.getQuote({ region: "US", code: "VOO" });
await client.getDepth({ region: "US", code: "QQQ" });
await client.getKline({
  region: "US",
  code: "SPY",
  interval: "1d",
  limit: 100,
});
```

#### FundClient Method Reference Table

| Method Name    | Parameters                                                                                                                                                                                                                                                                                                 | Return Type                          | Description                                                 | Details                                                                       |
| :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------- | :---------------------------------------------------------- | :---------------------------------------------------------------------------- |
| `getTick`      | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Symbol code, e.g., `SPY`, `QQQ`)                                                                                                                                                                   | `Promise<APIResponse<TickData>>`     | Get latest trade data for a single fund                     | [iTick Fund Real-time Tick](https://docs.itick.org/rest-api/fund/fund-tick)   |
| `getQuote`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Symbol code, e.g., `SPY`, `QQQ`)                                                                                                                                                                   | `Promise<APIResponse<QuoteData>>`    | Get latest quote for a single fund                          | [iTick Fund Real-time Quote](https://docs.itick.org/rest-api/fund/fund-quote) |
| `getDepth`     | `params`: `Object`<br>- `region`: `string` (Market code, e.g., `US`, `HK`, etc.)<br>- `code`: `string` (Symbol code, e.g., `SPY`, `QQQ`)                                                                                                                                                                   | `Promise<APIResponse<DepthData>>`    | Get latest order book depth for a single fund               | [iTick Fund Real-time Depth](https://docs.itick.org/rest-api/fund/fund-depth) |
| `getKline`     | `options`: `GetKlineOptions`<br>- `region`: `string` (Market code)<br>- `code`: `string` (Symbol code)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp)                    | `Promise<APIResponse<KlineData[]>>`  | Get candlestick data for a single fund                      | [iTick Fund K-line](https://docs.itick.org/rest-api/fund/fund-kline)          |
| `getTicks`     | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<TickDataMap>>`  | Get latest trade data for multiple funds                    | [iTick Fund Batch Ticks](https://docs.itick.org/rest-api/fund/fund-ticks)     |
| `getQuotes`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<QuoteDataMap>>` | Get latest quotes for multiple funds                        | [iTick Fund Batch Quotes](https://docs.itick.org/rest-api/fund/fund-quotes)   |
| `getDepths`    | `params`: `Object`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)                                                                                                                                                                                             | `Promise<APIResponse<DepthDataMap>>` | Get latest order book depth for multiple funds              | [iTick Fund Batch Depths](https://docs.itick.org/rest-api/fund/fund-depths)   |
| `getKlines`     | `options`: `GetKlinesOptions`<br>- `region`: `string` (Market code)<br>- `codes`: `string[] \| string` (Symbol code list)<br>- `interval`: `KlineType` (Candlestick period type)<br>- `limit`: `number` (Number of data points returned, max 500)<br>- `et`?: `string \| number` (Optional, end timestamp) | `Promise<APIResponse<KlineDataMap>>` | Get candlestick data for multiple funds                     | [iTick Fund Batch K-lines](https://docs.itick.org/rest-api/fund/fund-klines)  |
| `createSocket` | `options`?: `CreateSocketOptions` (Optional, WebSocket connection options)                                                                                                                                                                                                                                 | `SocketClient`                       | Create WebSocket connection for real-time data subscription | [iTick WebSocket Funds](https://docs.itick.org/websocket/fund)                |

## 🔌 WebSocket Real-time Data

### Supported Data Types

- `quote`: Real-time quote
- `depth`: Order book depth
- `tick`: Latest trade
- `kline@1m` or `kline@1`: 1-minute candlestick
- `kline@5m` or `kline@2`: 5-minute candlestick
- `kline@15m` or `kline@3`: 15-minute candlestick
- `kline@30m` or `kline@4`: 30-minute candlestick
- `kline@1h` or `kline@5`: 1-hour candlestick
- `kline@2h` or `kline@6`: 2-hour candlestick (crypto only)
- `kline@4h` or `kline@7`: 4-hour candlestick (crypto only)
- `kline@1d` or `kline@8`: Daily candlestick
- `kline@1w` or `kline@9`: Weekly candlestick
- `kline@1M` or `kline@10`: Monthly candlestick

### Connection Options

```typescript
const socket = client.createSocket({
  maxReconnectTimes: 10, // Maximum reconnection attempts (0 = unlimited)
  reconnectInterval: 5000, // Reconnection interval (milliseconds)
  pingInterval: 30000, // Ping interval (milliseconds)
  subscribeData: {
    codes: ["AAPL$US", "MSFT$US"],
    types: ["quote", "tick", "kline@1m"],
  },
});
```

### Event Handlers

```javascript
// Connection opened
socket.onSocketOpen(() => {
  console.log("Connected!");
});

// Receive messages
socket.onSocketMessage((data) => {
  console.log("Received data:", data);
});

// Error occurred
socket.onSocketError((error) => {
  console.error("Error:", error);
});

// Connection closed
socket.onSocketClose(() => {
  console.log("Disconnected");
});

// Check connection status
const isConnected = socket.checkSocketConnected();

// Disconnect
socket.disconnectSocket();
```

### Dynamic Subscription

```javascript
// Subscribe after connection
socket.subscribeSocket({
  ac: "subscribe",
  types: ["quote", "depth"],
  codes: ["TSLA$US", "NVDA$US"],
});

// Unsubscribe
socket.subscribeSocket({
  ac: "unsubscribe",
  types: ["tick"],
  codes: ["AAPL$US"],
});
```

## ⚠️ Error Handling

```javascript
try {
  const response = await client.getQuote({ region: "US", code: "AAPL" });

  if (response.code !== 0) {
    console.error("API Error:", response.msg);
    return;
  }

  // Process data
  console.log(response.data);
} catch (error) {
  if (error instanceof Error) {
    console.error("Network Error:", error.message);
  }
}
```

## 📘 TypeScript Support

Full TypeScript support with comprehensive type definitions:

```javascript
import type {
  APIResponse,
  QuoteData,
  SocketKlineData,
  SocketTickData,
  SocketDepthData,
  SocketQuoteData,
} from "@itick/browser-sdk";

// Type-safe response
const response: APIResponse<QuoteData> = await client.getQuote({
  region: "US",
  code: "AAPL",
});

// Type-safe WebSocket messages
socket.onSocketMessage((response) => {
  const { code, data, msg, resAc } = response;
  if (data?.type === "quote") {
    const quoteData: SocketQuoteData = data;
  }
  if (data?.type === "kline@1") {
    const klineData: SocketKlineData = data;
  }
  if (data?.type === "tick") {
    const tickData: SocketTickData = data;
  }
  if (data?.type === "depth") {
    const depthData: SocketDepthData = data;
  }
});
```

## 📖 Documentation

- **[Official API Documentation](https://docs.itick.org)** - Complete API reference
- **[REST API Guide](https://docs.itick.org/rest-api)** - Detailed REST endpoints
- **[WebSocket Guide](https://docs.itick.org/websocket)** - Real-time data streaming
- **[GitHub Repository](https://github.com/itick-org/javascript-sdk)** - Source code and issue tracking

## 📄 License

MIT License - see the [LICENSE](LICENSE) file for details.

## 🤝 Contributing

Contributions are welcome! Feel free to submit a Pull Request.

## 📧 Support

- **Website**: [https://itick.org](https://itick.org)
- **Email**: support@itick.org
- **Issues**: [GitHub Issues](https://github.com/itick-org/javascript-sdk/issues)

---

Made with ❤️ by the iTick Team

[npm-version-img]: https://img.shields.io/npm/v/@itick/browser-sdk
[npm-link]: https://www.npmjs.com/package/@itick/browser-sdk
[cdn-js-img]: https://img.shields.io/npm/v/@itick/browser-sdk?logo=unpkg&label=unpkg
[cdn-js-link]: https://app.unpkg.com/@itick/browser-sdk
[npm-install-size-img]: https://packagephobia.now.sh/badge?p=@itick/browser-sdk
[npm-install-size-link]: https://packagephobia.now.sh/result?p=@itick/browser-sdk
[bundle-size-img]: https://img.shields.io/bundlephobia/minzip/@itick/browser-sdk
[bundle-size-link]: https://bundlephobia.com/package/@itick/browser-sdk@latest
[license-img]: https://img.shields.io/npm/l/@itick/browser-sdk
[license-link]: https://opensource.org/licenses/MIT
