# 欢迎

## 欢迎来到Infoway API文档

Infoway 提供全面的 API 套件，涵盖 REST 与 Websocket 接口，充分满足机构级客户的核心需求。我们的 API 解决方案具备高度可扩展性，支持客户便捷获取实时行情数据；同时，其优异的兼容性可实现与客户现有系统及应用的轻松集成，显著简化业务流程。

## 什么是Infoway API

Infoway API专注于提供全球金融市场的实时行情数据，目前已覆盖美股、港股、A 股、商品期货、外汇、加密货币等多类品种，专为交易所、开发者、量化团队、金融科技公司及专业机构量身打造。

## 主要特点

* 全球市场覆盖：包含外汇、股票（含A股、港股、美股）、商品期货及加密货币等全球主流金融交易品种，提供实时数据与历史数据的全面支持。
* 多语言开发支持：配备多编程语言客户端库，助力开发者快速完成接入与集成，提升开发效率。
* 灵活高效接入：支持 WebSocket 与 REST API 双模式接入，保障数据传输的低延迟与高可靠性。
* 数据服务高可靠：依托权威数据源与稳定服务架构，确保数据的准确性、完整性与服务连续性。
* 定制化解决方案：针对专业机构及金融科技公司的个性化需求，提供定制化服务与专属解决方案，精准满足多样化业务场景。

## 适用对象 <a href="#shi-yong-dui-xiang" id="shi-yong-dui-xiang"></a>

* 开发者：专注于构建交易分析工具与市场趋势研判工具的开发者群体。
* 量化团队：致力于量化交易策略研发与算法开发的专业团队。
* 金融科技公司：提供金融科技解决方案及配套服务的企业机构。
* 专业机构：对精准、及时的金融市场数据有持续需求的专业型机构。

## 使用场景 <a href="#shi-yong-chang-jing" id="shi-yong-chang-jing"></a>

* 构建交易分析工具：依托全面数据支持，搭建交易分析工具，助力市场趋势的深度剖析与精准预测。
* 开发量化交易策略：基于实时与历史数据，开展量化交易策略及算法的研发与优化工作。
* 提供金融科技服务：作为金融科技企业，可依托数据能力提供金融数据服务及解决方案，为客户打造定制化金融科技产品。
* 为专业机构提供数据支持：为专业机构供给实时与历史数据，辅助其高效开展市场研究并支撑决策制定。


# A股实时行情接口

Infoway API的A股实时行情接口提供全面的A股市场数据，涵盖沪深两大交易所的5000只股票，帮助用户实时监控市场动态，做出及时决策。

## 1. 获取A股股票清单

Infoway API支持查询A股总计5000只股票。您可以通过以下两种方式获取股票清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取股票清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

{% hint style="info" %}
股票清单将定期更新，新增新上市的股票，并移除已退市的股票。为了确保获取最新的市场信息，建议您定期查看清单。
{% endhint %}

## 2. 查询方式

我们为不同需求的用户提供两种高效的查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway A股实时行情接口提供以下几种数据查询服务：

### 3.1 获取A股实时K线数据

提供实时的A股股票K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

实时K线返回示例如下：

```
{
  "s": "002594.SZ",    //产品代码
  "respList": [
    {
      "t": "1751958000",  //秒时间戳（UTC+8）
      "h": "326.880",    //最高价
      "o": "326.880",    //开盘价
      "l": "326.880",    //最低价
      "c": "326.880",    //收盘价
      "v": "1410",    //成交量
      "vw": "460900.80",    //成交额
      "pc": "0.00%",    //涨跌幅
      "pca": "0.000"    //涨跌额
    }
  ]
}
```

### 3.2 **A股实时成交明细**

查询A股上市公司的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "002594.SZ",    //产品代码
  "t": 1751958000999,    //毫秒时间戳(UTC+8)
  "p": "326.88",    //交易价格
  "v": "1410",    //成交量
  "vw": "460900.80",    //成交额
  "td": 1    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 A股**五档盘口数据**

实时提供五档买卖盘数据，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

A股五档盘口返回示例如下：

```
{
  "s": "002594.SZ",    //产品代码 
  "t": 1751958003335,    //毫秒时间戳(UTC+8)
  "a": [    //买盘
    [
      "326.89",    //买一价
      "326.90",    //买二价
      "326.91",    //买三价
      "326.92",    //买四价
      "326.93"    //买五价
    ],
    [
      "8",    //买一量
      "30",    //买二量
      "10",    //买三量
      "1",    //买四量
      "22"    //买五量
    ]
  ],
  "b": [    //卖盘
    [
      "326.88",    //卖一价
      "326.87",    //卖二价
      "326.86",    //卖三价
      "326.85",    //卖四价
      "326.84"    //卖五价
    ],
    [
      "1452",    //卖一量
      "77",    //卖二量
      "188",    //卖三量
      "37",    //卖四量
      "21"    //卖五量
    ]
  ]
}

```

### 3.4 **A股股票基础信息**

查询A股上市公司的基础信息，包括公司名称、股票代码、上市日期等。详细了解接入步骤，请前往[这个页面](/rest-api/basic-info/get-symbol-basic-info)。

股票基础信息返回示例如下：

```
{
  "symbol": "002594.SZ",
  "market": "CN",
  "name_cn": "比亚迪",
  "name_en": "BYD",
  "name_hk": "比亞迪",
  "exchange": "SZSE",
  "currency": "CNY",
  "lot_size": 100,
  "total_shares": 5494665855,
  "circulating_shares": 1811265855,
  "hk_shares": 0,
  "eps": "7.326077155969296",
  "eps_ttm": "8.1607397398326417",
  "bps": "39.7406007503253353",
  "dividend_yield": "1.6401803563357903",
  "stock_derivatives": "",
  "board": "SZMainConnect"
}

```

### 3.5 **A股市场交易日、交易时间**

查询A股市场的交易日和交易时间，包括开盘时间、收盘时间等，以确保用户了解每个交易日的市场活动周期。查询方法：

* [查询交易时间](/rest-api/basic-info/get-market-trading-hours)
* [查询交易日](/rest-api/basic-info/get-market-trading-days)

交易时间返回示例如下：

```
{
  "market": "CN",
  "remark": "A 股市场",
  "trade_schedules": [
    {
      "begin_time": "09:30:00",
      "end_time": "11:30:00",
      "type": "NormalTrade"
    },
    {
      "begin_time": "13:00:00",
      "end_time": "14:57:00",
      "type": "NormalTrade"
    }
  ]
}

```

交易日返回示例：

```
{
  "trade_days": [
    "20250102",
    "20250103",
    "20250106",
    "20250107",
    "20250108",
    "20250109",
    "20250110",
    "20250113",
    "20250114",
    "20250115"
  ],
  "half_trade_days": []
}

```


# 港股实时行情接口

Infoway API的港股实时行情接口提供全面的港股市场数据，涵盖超过4000只香港上市公司的实时股票行情，帮助用户实时监控市场动态，做出及时决策。

## 1. 获取港股股票清单

Infoway API支持查询港股总计超过4000只股票。您可以通过以下两种方式获取股票清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取股票清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

{% hint style="info" %}
股票清单将定期更新，新增新上市的股票，并移除已退市的股票。为了确保获取最新的市场信息，建议您定期查看清单。
{% endhint %}

## 2. 查询方式

我们为不同需求的用户提供两种高效的查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway 港股实时行情接口提供以下几种数据查询服务：

### 3.1 获取港股实时K线数据

提供实时的港股股票K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

实时K线返回示例如下：

```
{
  "s": "00005.HK",    //产品代码
  "respList": [
    {
      "t": "1752825540",  //秒时间戳（UTC+8）
      "h": "98.250",    //最高价
      "o": "98.200",    //开盘价
      "l": "98.150",    //最低价
      "c": "98.150",    //收盘价
      "v": "44000",    //成交量
      "vw": "4320240.000",    //成交额
      "pc": "-0.05%",    //涨跌幅
      "pca": "-0.050"    //涨跌额
    }
  ]
}
```

### 3.2 港**股实时成交明细**

查询港股上市公司的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "00005.HK",    //产品代码
  "t": 1752826113546,    //毫秒时间戳(UTC+8)
  "p": "98.150",    //交易价格
  "v": "956000",    //成交量
  "vw": "93831400.000",    //成交额
  "td": 0    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 港股十档**盘口数据**

Infoway API提供港股十档盘口查询，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

港股十档档盘口返回示例如下：

```
{
  "s": "00005.HK",    //产品代码 
  "t": 1752826121043,    //毫秒时间戳(UTC+8)
  "a": [    //买盘
    [
      "98.150",    //买一价
      "98.200",    //买二价
      "98.250",    //买三价
      "98.300",    //买四价
      "98.350",    //买五价
      "98.400",    //买六价
      "98.450",    //买七价
      "98.500",    //买八价
      "98.550",    //买九价
      "98.600"    //买十价
    ],
    [
      "13200",    //买一量
      "46400",    //买二量
      "58800",    //买三量
      "220800",    //买四量
      "221600",    //买五量
      "545200",    //买六量
      "162000",    //买七量
      "987600",    //买八量
      "230400",    //买九量
      "495200"    //买十量
    ]
  ],
  "b": [    //卖盘
    [
      "98.100",    //卖一价
      "98.050",    //卖二价
      "98.000",    //卖三价
      "97.950",    //卖四价
      "97.900",    //卖五价
      "97.850",    //卖六价
      "97.800",    //卖七价
      "97.750",    //卖八价
      "97.700",    //卖九价
      "97.650"    //卖十价
    ],
    [
      "128800",    //卖一量
      "112000",    //卖二量
      "178000",    //卖三量
      "126400",    //卖四量
      "223600",    //卖五量
      "83200",    //卖六量
      "194800",    //卖七量
      "69600",    //卖八量
      "80400",    //卖九量
      "198000"    //卖十量
    ]
  ]
}


```

### 3.4 港**股股票基础信息**

查询港股上市公司的基础信息，包括公司名称、股票代码、上市日期等。详细了解接入步骤，请前往[这个页面](/rest-api/basic-info/get-symbol-basic-info)。

股票基础信息返回示例如下：

```
{
  "symbol": "00005.HK",
  "market": "HK",
  "name_cn": "汇丰控股",
  "name_en": "HSBC HOLDINGS",
  "name_hk": "滙豐控股",
  "exchange": "SEHK",
  "currency": "HKD",
  "lot_size": 400,
  "total_shares": 17448265603,
  "circulating_shares": 17448265603,
  "hk_shares": 17448265603,
  "eps": "10.1970581721392237",
  "eps_ttm": "8.7684842825409303",
  "bps": "85.076501878960384",
  "dividend_yield": "5.2748074391180753",
  "stock_derivatives": "Warrant",
  "board": "HKEquity"
}


```

### 3.5 港**股市场交易日和交易时间**

查询港股市场的交易日、交易时间，包括开盘时间、收盘时间等，以确保用户了解每个交易日的市场活动周期。查询方法：

* [查询交易时间](/rest-api/basic-info/get-market-trading-hours)
* [查询交易日](/rest-api/basic-info/get-market-trading-days)

交易时间返回示例：

```
{
  "market": "HK",
  "remark": "港股市场",
  "trade_schedules": [
    {
      "begin_time": "09:30:00",
      "end_time": "12:00:00",
      "type": "NormalTrade"
    },
    {
      "begin_time": "13:00:00",
      "end_time": "16:00:00",
      "type": "NormalTrade"
    }
  ]
}

```

交易日返回示例：

```
{
  "trade_days": [
    "20250102",
    "20250103",
    "20250106",
    "20250107",
    "20250108",
    "20250109",
    "20250110",
    "20250113",
    "20250114",
    "20250115"
  ],
  "half_trade_days": []
}
```


# 美股实时行情接口

Infoway API美股实时行情接口提供全面的美股市场数据，涵盖超过1万只美股的实时行情（包含各类指数），帮助用户实时监控市场动态，做出及时决策。

## 1. 获取美股股票清单

Infoway API支持查询美股总计超过1万只股票。您可以通过以下两种方式获取股票清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取股票清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

{% hint style="info" %}
股票清单将定期更新，新增新上市的股票，并移除已退市的股票。为了确保获取最新的市场信息，建议您定期查看清单。
{% endhint %}

## 2. 查询方式

我们为不同需求的用户提供两种高效的查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway 美股实时行情接口提供以下几种数据查询服务：

### 3.1 获取美股实时K线数据

提供实时的美股股票K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

美股实时K线返回示例如下：

<pre><code>{
  "s": "AMZN.US",    //产品代码
  "respList": [
    {
      "t": "1752868800",  //秒时间戳（UTC+8）
      "h": "226.200",    //最高价
      "o": "226.120",    //开盘价
      "l": "226.110",    //最低价
      "c": "226.110",    //收盘价
      "v": "2284098",    //成交量
      "vw": "516502787.475",    //成交额
      "pc": "0.00%",    //涨跌幅
      "pca": "-0.010"    //涨跌额
<strong>    }
</strong>  ]
}
</code></pre>

### 3.2 美**股实时成交明细**

查询美股上市公司的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "AMZN.US",    //产品代码
  "t": 1752883185720,    //毫秒时间戳(UTC+8)
  "p": "225.975",    //交易价格
  "v": "1",    //成交量
  "vw": "225.975",    //成交额
  "td": 0    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 美股**盘口数据**

Infoway API提供美股买卖盘口查询，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

美股盘口返回示例如下：

```
{
  "s": "AMZN.US",    //产品代码 
  "t": 1753109345315,    //毫秒时间戳(UTC+8)
  "a": [    //买盘
    [
      "227.900"    //买一价
    ],
    [
      "10"    //买一量
    ]
  ],
  "b": [    //卖盘
    [
      "227.890"    //卖一价
    ],
    [
      "375"    //卖一量
    ]
  ]
}
```

### 3.4 美**股股票基础信息**

查询美股上市公司的基础信息，包括公司名称、股票代码、上市日期等。详细了解接入步骤，请前往[这个页面](/rest-api/basic-info/get-symbol-basic-info)。

股票基础信息返回示例如下：

```
{
  "symbol": "AMZN.US",
  "market": "US",
  "name_cn": "亚马逊",
  "name_en": "Amazon.com, Inc.",
  "name_hk": "亞馬遜",
  "exchange": "NASD",
  "currency": "USD",
  "lot_size": 1,
  "total_shares": 10616352407,
  "circulating_shares": 9585066132,
  "hk_shares": 0,
  "eps": "5.5808245363948382",
  "eps_ttm": "6.2115496426549624",
  "bps": "28.8109313136895758",
  "dividend_yield": "0",
  "stock_derivatives": "Option",
  "board": "Unknown"
}
```

### 3.5 美**股市场交易日和交易时间**

查询美股市场的交易日和交易时间，以确保用户了解每个交易日的市场活动周期。查询方法：

* [查询交易时间](/rest-api/basic-info/get-market-trading-hours)
* [查询交易日](/rest-api/basic-info/get-market-trading-days)

美股交易时间返回示例：

```
{
  "market": "US",
  "remark": "美股市场",
  "trade_schedules": [
    {
      "begin_time": "04:00:00",
      "end_time": "09:30:00",
      "type": "PreTrade"
    },
    {
      "begin_time": "09:30:00",
      "end_time": "16:00:00",
      "type": "NormalTrade"
    },
    {
      "begin_time": "16:00:00",
      "end_time": "20:00:00",
      "type": "PostTrade"
    }
  ]
}
```

美股交易日返回示例：

```
{
  "trade_days": [
    "20250102",
    "20250103",
    "20250106",
    "20250107",
    "20250108",
    "20250110",
    "20250113",
    "20250114",
    "20250115"
  ]
}

```


# 外汇实时行情接口

Infoway外汇实时行情接口提供超过40种主流货币对的行情数据，可查询实时和历史K线、买卖盘口等数据。

## 1. 获取外汇货币对清单

Infoway外汇API支持查询40组主流货币对。您可以通过以下两种方式获取货币对清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取外汇清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

## 2. 查询方式

我们为不同需求的用户提供两种高效的外汇行情查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway外汇实时行情接口提供以下几种数据查询服务：

### 3.1 获取外汇实时K线数据

提供实时的外汇K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

以下是USDGBP的实时K线返回示例：

<pre><code>{
  "s": "USDGBP",    //产品代码
  "respList": [
    {
      "t": "1752872400",  //秒时间戳（UTC+8）
      "h": "0.74578",    //最高价
      "o": "0.74527",    //开盘价
      "l": "0.74503",    //最低价
      "c": "0.74503",    //收盘价
      "v": "45.0",    //成交量
      "vw": "33.530460",    //成交额
      "pc": "-0.09%",    //涨跌幅
      "pca": "-0.00065"    //涨跌额
<strong>    }
</strong>  ]
}
</code></pre>

### 3.2 外汇**实时成交明细**

查询外汇最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "USDGBP",    //产品代码
  "t": 1752875078529,    //毫秒时间戳(UTC+8)
  "p": "0.74503",    //交易价格
  "v": "1.0",    //成交量
  "vw": "0.745030",    //成交额
  "td": 0    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 外汇买卖**盘口数据**

Infoway API提供外汇买卖盘口查询，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

外汇盘口返回示例如下：

```
{
  "s": "USDGBP",    //产品代码 
  "t": 1752932303508,    //毫秒时间戳(UTC+8)
  "a": [
    [
      "0.74507"    //买一价
    ],
    [
      "1"    //买一量
    ]
  ],
  "b": [
    [
      "0.74503"    //卖一价
    ],
    [
      "1"    //卖一量
    ]
  ]
}
```


# 加密货币实时行情接口

Infoway加密货币实时行情接口提供超过100种主流虚拟币的行情数据，可查询实时和历史K线、买卖盘口等数据。

## 1. 获取加密货币清单

Infoway加密货币API支持查询100种主流虚拟币。您可以通过以下两种方式获取加密货币清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取产品清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

## 2. 查询方式

我们为不同需求的用户提供两种高效的加密货币行情查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway加密货币实时行情接口提供以下几种数据查询服务：

### 3.1 获取加密货币实时K线数据

提供实时的加密货币K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

以下是BTCUSDT的实时K线返回示例：

```
{
  "s": "BTCUSDT",    //产品代码
  "respList": [
    {
      "t": "1752944400",  //秒时间戳（UTC+8）
      "h": "117984.68000",    //最高价
      "o": "117974.00000",    //开盘价
      "l": "117745.57000",    //最低价
      "c": "117825.75000",    //收盘价
      "v": "119.69276",    //成交量
      "vw": "14107044.9828691",    //成交额
      "pc": "-0.13%",    //涨跌幅
      "pca": "-148.24000"    //涨跌额
    }
  ]
}
```

### 3.2 加密货币**实时成交明细**

查询加密货币的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "BTCUSDT",    //产品代码
  "t": 1752947397177,    //毫秒时间戳(UTC+8)
  "p": "117783.22",    //交易价格
  "v": "0.00048",    //成交量
  "vw": "56.5359456",    //成交额
  "td": 2    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 买卖**盘口数据**

Infoway API提供加密货币买卖盘口查询，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

买卖盘口返回示例如下：

```
{
  "s": "BTCUSDT",    //产品代码 
  "t": 1752947435539,    //毫秒时间戳(UTC+8)
  "a": [
    [
      "117783.22000000",    //买一价
      "36.18406000"    //买二价
    ],
    [
      "117783.23000000",    //买一量
      "0.06819000"    //买二量
    ]
  ],
  "b": [
    [
      "117783.21000000",    //卖一价
      "1.17501000"    //卖二价
    ],
    [
      "117783.20000000",    //卖一量
      "0.07635000"    //卖二量
    ]
  ]
}
```


# 期货实时行情接口

Infoway期货实时行情接口提供超过30种商品/贵金属期货的行情数据，可查询实时和历史K线、买卖盘口等数据。

## 1. 获取商品期货清单

Infoway期货行情API支持查询30种期货产品（包含各类期货指数）。您可以通过以下两种方式获取期货产品清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取期货清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

## 2. 查询方式

我们为不同需求的用户提供两种高效的期货行情查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway期货实时行情接口提供以下几种数据查询服务：

### 3.1 获取期货实时K线

提供实时的期货K线行情数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

以下是白银（XAGUSD）的实时K线返回示例：

<pre><code>{
  "s": "XAGUSD",    //产品代码
  "respList": [
    {
      "t": "1752868800",  //秒时间戳（UTC+8）
      "h": "38.22500",    //最高价
      "o": "38.12555",    //开盘价
      "l": "38.11850",    //最低价
      "c": "38.16500",    //收盘价
      "v": "1003.0",    //成交量
      "vw": "38292.383500",    //成交额
      "pc": "0.12%",    //涨跌幅
      "pca": "0.04450"    //涨跌额
<strong>    }
</strong>  ]
}
</code></pre>

### 3.2 期货**实时成交明细**

查询期货的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "XAGUSD",    //产品代码
  "t": 1752872345319,    //毫秒时间戳(UTC+8)
  "p": "38.165",    //交易价格
  "v": "1.0",    //成交量
  "vw": "38.1650",    //成交额
  "td": 0    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 期货**盘口数据**

Infoway API提供商品期货的买卖盘口查询，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

买卖盘口返回示例如下：

```
{
  "s": "XAGUSD",    //产品代码 
  "t": 1752975504045,    //毫秒时间戳(UTC+8)
  "a": [
    [
      "38.18"    //买一价
    ],
    [
      "1"    //买一量
    ]
  ],
  "b": [
    [
      "38.15"    //卖一价
    ],
    [
      "1"    //卖一量
    ]
  ]
}
```


# 其他股票市场


# 日本股票实时行情接口

Infoway API 日本股票实时行情API提供全面的日本股市市场数据，数据来自东京交易所，涵盖3800只日本股票，帮助用户实时监控市场动态，做出及时决策。

## 1. 获取日本股票清单

Infoway API 支持查询总计约3800只日本股票。您可以通过以下两种方式获取股票清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取股票清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

{% hint style="info" %}
股票清单将定期更新，新增新上市的股票，并移除已退市的股票。为了确保获取最新的市场信息，建议您定期查看清单。
{% endhint %}

## 2. 查询方式

我们为不同需求的用户提供两种高效的查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway日股实时行情接口提供以下几种数据查询服务：

### 3.1 获取日本股票的实时K线数据

提供实时的日股股票K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

日股 (丰田汽车 `7203.JP`)实时K线返回示例如下：

```
{
  "s": "7203.JP",    //股票代码
  "respList": [
    {
      "t": "1773032040",  //秒时间戳（UTC+8）
      "h": "3349.0",    //最高价
      "o": "3348.0",    //开盘价
      "l": "3347.0",    //最低价
      "c": "3349.00",    //收盘价
      "v": "23100.0",    //成交量
      "vw": "77352800.00",    //成交额
      "pc": "0.03%",    //涨跌幅
      "pca": "1.00"    //涨跌额
    }
  ]
}
```

### 3.2 日**股实时成交明细**

查询日股上市公司的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "7203.JP",    //股票代码
  "t": 1773030789341,    //毫秒时间戳(UTC+8)
  "p": "3357.0",    //交易价格
  "v": "2500.0",    //成交量
  "vw": "8392500.00",    //成交额
  "td": 0    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 日股一档**盘口数据**

实时提供一档买卖盘数据，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

日股一档盘口返回示例如下：

```
{
  "s": "7203.JP",    //股票代码 
  "t": 1773031148913,    //毫秒时间戳(UTC+8)
  "a": [    //买盘
    [
      "3356.0",    //买一价
    ],
    [
      "5800.0",    //买一量
    ]
  ],
  "b": [    //卖盘
    [
      "3354.0",    //卖一价
    ],
    [
      "6800.0",    //卖一量
    ]
  ]
}

```

### 3.4 日**股股票基础信息**

查询日股上市公司的基础信息，包括公司名称、股票代码、上市日期等。详细了解接入步骤，请前往[这个页面](/rest-api/basic-info/get-symbol-basic-info)。

日股（丰田汽车 7203.JP）股票基础信息返回示例如下：

```
{
  "ret": 200,
  "msg": "success",
  "traceId": "d9e8f29a-c4f4-411b-b4a6-737a36fb2d37",
  "data": [
    {
      "symbol": "7203.JP",
      "market": "JP",
      "name_cn": "",
      "name_en": "Toyota Motor Corp.",
      "name_hk": "",
      "exchange": "TSE",
      "currency": "JPY",
      "lot_size": null,
      "total_shares": null,
      "circulating_shares": null,
      "hk_shares": null,
      "eps": "283.4305",
      "eps_ttm": null,
      "bps": null,
      "dividend_yield": "0.0272910083309394",
      "stock_derivatives": null,
      "board": "Consumer Durables"
    }
  ]
}
```

### 3.5 日本**股市交易日、交易时间**

查询日本市场的交易日和交易时间，包括开盘时间、收盘时间等，以确保用户了解每个交易日的市场活动周期。查询方法：

* [查询交易时间](/rest-api/basic-info/get-market-trading-hours)
* [查询交易日](/rest-api/basic-info/get-market-trading-days)

交易时间返回示例如下：

```
{
  "market": "JP",
  "remark": "日本股市",
  "trade_schedules": [
    {
      "begin_time": "09:00:00",
      "end_time": "11:30:00",
      "type": "NormalTrade"
    },
    {
      "begin_time": "12:30:00",
      "end_time": "15:00:00",
      "type": "NormalTrade"
    }
  ]
}

```

交易日返回示例：

```
{
  "trade_days": [
    "20260202",
    "20260203",
    "20260204",
    "20260205",
    "20260206",
    "20260209",
    "20260210"
  ],
  "half_trade_days": []
}

```


# 印度股票实时行情接口

Infoway API 印度股票实时行情API提供全面的印度股市市场数据，数据来自印度最大的两家股票交易所：BSE与NSE，涵盖约5800只印度上市股票。

## 1. 获取印度股票清单

Infoway API 支持查询总计约5800只印度股票。您可以通过以下两种方式获取股票清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取股票清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

{% hint style="info" %}
股票清单将定期更新，新增新上市的股票，并移除已退市的股票。为了确保获取最新的市场信息，建议您定期查看清单。
{% endhint %}

## 2. 查询方式

我们为不同需求的用户提供两种高效的查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway印度实时行情接口提供以下几种数据查询服务：

### 3.1 获取印度股票的实时K线数据

提供实时的印度股票K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

&#x20;印度股票 (InfoSys `INFY.IN` )实时K线返回示例如下：

```
{
  "s": "INFY.IN",    //股票代码
  "respList": [
    {
      "t": "1773037920",  //秒时间戳（UTC+8）
      "h": "1303.40",    //最高价
      "o": "1301.50",    //开盘价
      "l": "1301.50",    //最低价
      "c": "1303.00",    //收盘价
      "v": "15615.0",    //成交量
      "vw": "20342210.20",    //成交额
      "pc": "0.15%",    //涨跌幅
      "pca": "1.90"    //涨跌额
    }
  ]
}
```

### 3.2 印度股票**实时成交明细**

查询印度股票的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "INFY.IN",    //股票代码
  "t": 1773037319456,    //毫秒时间戳(UTC+8)
  "p": "1299.00",    //交易价格
  "v": "2.0",    //成交量
  "vw": "2598.00",    //成交额
  "td": 0    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 印度股票一档**盘口数据**

实时提供一档买卖盘数据，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

印度股票 (InfoSys - `INFY.IN` )一档盘口返回示例如下：

```
{
  "s": "INFY.IN",    //股票代码 
  "t": 1773037524808,    //毫秒时间戳(UTC+8)
  "a": [    //买盘
    [
      "1302.0",    //买一价
    ],
    [
      "1.0",    //买一量
    ]
  ],
  "b": [    //卖盘
    [
      "1301.9",    //卖一价
    ],
    [
      "172.0",    //卖一量
    ]
  ]
}

```

### 3.4 印度**股票基础信息**

查询印度上市公司的基础信息，包括公司名称、股票代码、上市日期等。详细了解接入步骤，请前往[这个页面](/rest-api/basic-info/get-symbol-basic-info)。

印度股票（InfoSys - `INFY.IN`）股票基础信息返回示例如下：

```
{
  "ret": 200,
  "msg": "success",
  "traceId": "d9e8f29a-c4f4-411b-b4a6-737a36fb2d37",
  "data": [
    {
      "symbol": "INFY.IN",
      "market": "IN",
      "name_cn": "",
      "name_en": "Infosys Limited",
      "name_hk": "",
      "exchange": "NSE",
      "currency": "INR",
      "lot_size": null,
      "total_shares": null,
      "circulating_shares": null,
      "hk_shares": null,
      "eps": "67.4982",
      "eps_ttm": null,
      "bps": null,
      "dividend_yield": "0.0344854011801671",
      "stock_derivatives": null,
      "board": "Technology Services"
    }
  ]
}
```

### 3.5 印度**股市交易日、交易时间**

查询印度市场的交易日和交易时间，包括开盘时间、收盘时间等，以确保用户了解每个交易日的市场活动周期。查询方法：

* [查询交易时间](/rest-api/basic-info/get-market-trading-hours)
* [查询交易日](/rest-api/basic-info/get-market-trading-days)

交易时间返回示例如下：

```
{
  "market": "IN",
  "remark": "印度股市",
  "trade_schedules": [
    {
      "begin_time": "09:15:00",
      "end_time": "15:30:00",
      "type": "NormalTrade"
    }
  ]
}

```

交易日返回示例：

```
{
  "trade_days": [
    "20260202",
    "20260203",
    "20260204",
    "20260205",
    "20260206",
    "20260209",
    "20260210"
  ],
  "half_trade_days": []
}

```


# 韩国股票实时行情接口

Infoway API 韩国股票实时行情API提供全面的韩国股市市场数据，数据来自韩国KRX股票交易所，涵盖约2600只韩国上市股票。

## 1. 获取韩国股票清单

Infoway API 支持查询总计约2660只韩国股票。您可以通过以下两种方式获取股票清单：

* **下载清单文件**：登录您的账户后台，在底部找到文件下载链接。
* **通过HTTP接口查询**：如需通过接口获取股票清单，请参考[GET查询产品列表](/rest-api/basic-info/get-symbol-list)。

{% hint style="info" %}
股票清单将定期更新，新增新上市的股票，并移除已退市的股票。为了确保获取最新的市场信息，建议您定期查看清单。
{% endhint %}

## 2. 查询方式

我们为不同需求的用户提供两种高效的查询方式：

| 查询方式        | 适用场景                                                               |
| ----------- | ------------------------------------------------------------------ |
| HTTP接口      | 适用于定期或批量查询的用户，支持灵活的查询请求。通过HTTP接口，您可以查询A股上市公司的基础信息、历史行情、实时K线、盘口等数据。 |
| WebSocket订阅 | 适合用于获取快速更新的实时行情数据，确保您获取最低延迟的行情推送。                                  |

{% hint style="info" %}
HTTP或者WebSocket均对查询频率有限制，详细限制说明请见[此页面](/getting-started/api-limitation)。
{% endhint %}

## 3. 支持的数据类型

Infoway韩国实时行情接口提供以下几种数据查询服务：

### 3.1 获取韩国股票的实时K线数据

提供实时的韩国股票K线数据，包括开盘、最高、最低、收盘价格、成交量、成交额、涨跌幅、涨跌额，帮助用户捕捉市场走势。详细了解如何获取K线，请前往

* [HTTP请求K线](/rest-api/http-endpoints/get-candles)
* [WebSocket订阅K线](/websocket-api/subscribe-and-unsubscribe/candles-subscribe)。

&#x20;韩国股票 (005930.KS)实时K线返回示例如下：

```
{
  "s": "005930.KS",    //股票代码
  "respList": [
    {
      "t": "1781481600",  //秒时间戳（UTC+8）
      "h": "344000.00",    //最高价
      "o": "344000.00",    //开盘价
      "l": "340000.00",    //最低价
      "c": "341500.00",    //收盘价
      "v": "972079.00000",    //成交量
      "vw": "333747120093.07000",    //成交额
      "pc": "-0.73%",    //涨跌幅
      "pca": "-2500.00000"    //涨跌额
    }
  ]
}
```

### 3.2 韩国股票**实时成交明细**

查询韩国股票的最新成交明细，确保获取市场的最新交易信息。详细接入方法请前往：

* [GET实时成交明细](/rest-api/http-endpoints/get-trade)
* [WebSocket订阅成交明细](/websocket-api/subscribe-and-unsubscribe/trade-subscribe)

实时成交明细返回示例如下：

```
{
  "s": "005930.KS",    //股票代码
  "t": 1773037319456,    //毫秒时间戳(UTC+8)
  "p": "341500.00",    //交易价格
  "v": "2.0",    //成交量
  "vw": "2598.00",    //成交额
  "td": 0    //交易方向 1：BUY 2：SELL 0：默认值
}
```

### 3.3 韩国股票一档**盘口数据**

实时提供一档买卖盘数据，帮助用户了解市场深度和流动性。详细接入步骤请前往：

* [GET查询盘口数据](/rest-api/http-endpoints/get-depth)
* [WebSocket订阅盘口数据](/websocket-api/subscribe-and-unsubscribe/depth-subscribe)

韩国股票 (InfoSys - `005930.KS` )一档盘口返回示例如下：

```
{
  "s": "005930.KS",    //股票代码 
  "t": 1773037524808,    //毫秒时间戳(UTC+8)
  "a": [    //买盘
    [
      "341500.00",    //买一价
    ],
    [
      "1.0",    //买一量
    ]
  ],
  "b": [    //卖盘
    [
      "341500.00",    //卖一价
    ],
    [
      "172.0",    //卖一量
    ]
  ]
}

```

### 3.4 韩国**股票基础信息**

查询韩国上市公司的基础信息，包括公司名称、股票代码、上市日期等。详细了解接入步骤，请前往[这个页面](/rest-api/basic-info/get-symbol-basic-info)。

韩国股票（InfoSys - `005930.KS`）股票基础信息返回示例如下：

```
{
    "ret": 200,
    "msg": "success",
    "traceId": "1407b1f0-b271-4b39-a905-67e538ce83b9",
    "data": [
        {
            "symbol": "005930.KS",
            "market": "KS",
            "name_cn": "",
            "name_en": "Samsung Electronics Co., Ltd.",
            "name_hk": "",
            "exchange": "KRX",
            "currency": "KRW",
            "lot_size": null,
            "total_shares": null,
            "circulating_shares": null,
            "hk_shares": null,
            "eps": "12475.8691",
            "eps_ttm": null,
            "bps": null,
            "dividend_yield": "0.00471186440677966",
            "stock_derivatives": null,
            "board": "Electronic Technology"
        }
    ]
}
```

### 3.5 韩国**股市交易日、交易时间**

查询韩国市场的交易日和交易时间，包括开盘时间、收盘时间等，以确保用户了解每个交易日的市场活动周期。查询方法：

* [查询交易时间](/rest-api/basic-info/get-market-trading-hours)
* [查询交易日](/rest-api/basic-info/get-market-trading-days)

交易时间返回示例如下：

```
{
    "market": "KS",
    "remark": "韩国股市",
    "trade_schedules": [
        {
            "begin_time": "09:00:00",
            "end_time": "15:30:00",
            "type": "NormalTrade"
        }
    ]
}
```

交易日返回示例：

```
{
  "trade_days": [
    "20260202",
    "20260203",
    "20260204",
    "20260205",
    "20260206",
    "20260209",
    "20260210"
  ],
  "half_trade_days": []
}
```


# 快速开始

{% stepper %}
{% step %}

### 第一步：申请您的API Key（ [申请流程](/getting-started/api-key-application)）

确保可以正确的构造请求并且解析响应数据。

请详细阅读文档，确保不会因为请求头以及响应头格式问题影响正常使用。
{% endstep %}

{% step %}

### 第二步： 熟悉地址以及参数说明（ [地址说明](/getting-started/api-endpoints)）

理解接口的入参以及返回的结果是否满足您的要求。

请仔细阅读接口说明文档，防止使用时候出现一些问题。
{% endstep %}

{% step %}

### 第三步：了解接口的访问限制（[接口限制说明](/getting-started/api-limitation)）

了解HTTP接口以及WebSocket的访问限制。

一切请求请在限制以内使用，超出限制将会导致请求失败，如被系统判定为恶意请求，将会影响您的API Key后续的使用。
{% endstep %}

{% step %}

### 第四步：掌握请求以及响应格式（[请求和响应协议](/getting-started/api-protocols-and-response-formats)）

确保可以正确的构造请求并且解析响应数据。

请详细阅读文档，确保不会因为请求头以及响应头格式问题影响正常使用。
{% endstep %}

{% step %}

### 第五步：选择目标产品 （[获取产品列表](/rest-api/basic-info/get-symbol-list)）

帮助您确定是否有您所需要的产品，以及该如何请求获取产品数据。

请先判断是否有您所需要的产品信息，防止数据返回为空。
{% endstep %}

{% step %}

### 第六步：执行并且获取数据

在完成了上述步骤之后，可以直接获取所需的实时数据。

请详细阅读文档，如有疑问，欢迎联系我们的24小时人工客服。（[人工客服](https://t.me/infoway_StrongSickCat))
{% endstep %}
{% endstepper %}

### 官方建议

* **保密**：请保护您的个人API Key，避免泄密给其他人员。
* **监控**：定期检查接口文档是否更新，以便可以及时连接更改或者新增的内容。
* **测试**：在正式使用之前，请用免费套餐进行数据和代码测试。
* **反馈**：如果遇到任何问题，请及时与我们联系，如果是我们的问题影响了您的使用，将会提供额外的有效期作为补偿。


# API Key申请

包含如何申请Apikey，以及续费和升级逻辑

## 1、注册账号

* 完成账号注册（无需实名认证），点击前往 [注册页面](https://infoway.io/create-account)
* 注册完成之后，登录成功会自动跳转到用户[后台界面](https://infoway.io/dashboard)。

![](https://files.readme.io/b2f4158859b25a84398d2d424aa6a956dc06d6e7b1c4349b9bca41d98103fb21-image.png)

## 2、套餐购买

* 同一个账号可以同时拥有多个套餐，不同套餐拥有不重复的API Key
* 套餐购买唯一的入口：[**官网-定价**](https://infoway.io/#pricing)

![](https://files.readme.io/9d1f3831219bba12ec015c6c39b3dd3f587632ad6e495087703c6e3e9f1625a6-image.png)

## 3、套餐升级以及续费

* 免费套餐无法升级和续费
* 所有付费套餐均支持续费操作
* 升级操作必须有更高级的套餐才可以升级（如基础可以升级为高级或专业，高级可以升级为专业，专业无法升级），套餐升级时，用户只需要支付剩余时间的差价（如果升级所需价格低于8USDT，无法升级）。
* 套餐的续费和升级需要在用户后台界面进行操作

![](https://files.readme.io/12d4a27e1834b8c063fe0d7a3b109fb0835de97310fc166d94cb501a2243982d-image.png)

![](https://files.readme.io/d3195ca2822d3cf84798b71a1473488621d05c485d8fc35feb0eeea0899bb576-image.png)


# 接口限制说明


# HTTP接口限制

## 频率限制

| 套餐     | 频率限制说明                                 |
| ------ | -------------------------------------- |
| **免费** | 所有接口，每秒最多1次，一分钟上限60次，一天请求上限86400次      |
| **基础** | 所有接口，每秒最多2次，一分钟上限120次，一天请求上限172800次    |
| **高级** | 所有接口，每秒最多10次，一分钟上限600次，一天请求上限864000次   |
| **专业** | 所有接口，每秒最多20次，一分钟上限1200次，一天请求上限1728000次 |

## IP限制

* 正常的业务接口请求只会对API Key的套餐权限做设置，不会对IP做限制
* 页面接口（如官网的实时数据展示）将会对IP做频率限制。
* 请合理请求接口，如果出现大量请求失败可能会被风控系统自动封禁一段时间，解封请联系Telegram客服人员


# WebSocket限制

### WebSocket连接数限制

| 套餐        | 频率限制说明                                                                                                           |
| --------- | ---------------------------------------------------------------------------------------------------------------- |
| **免费**    | <p>支持1个Websocket连接（不同Websocket订阅地址不单独计为多个连接，详见本页下方说明）</p><p>所有连接的订阅总数不超过 10 个产品</p>                              |
| **基础**    | <p>支持1个Websocket连接（不同Websocket订阅地址不单独计为多个连接，详见本页下方说明）</p><p>所有连接的订阅总数不超过 200 个产品</p>                             |
| **高级**    | <p>支持2个Websocket连接（不同Websocket订阅地址不单独计为多个连接，详见本页下方说明）</p><p>每个连接最多可订阅 600 个不重复产品</p><p>所有连接的订阅总数不超过 800 个产品</p>  |
| **专业**    | <p>支持9个Websocket连接（不同Websocket订阅地址不单独计为多个连接，详见本页下方说明）</p><p>每个连接最多可订阅 600 个不重复产品</p><p>所有连接的订阅总数不超过 5000 个产品</p> |
| **市场套餐**  | 根据市场的产品数确定Websocket连接，每根Websocket连接固定订阅产品数为600，Websocket连接数 = 市场总产品数 / 600向上取整                                   |
| **自定义套餐** | 可以自由选择Api接口的请求频率以及可以订阅的产品总数，Websocket的连接数计算方式同市场套餐                                                               |

### Websocket订阅请求频率限制

* 所有Websocket订阅请求总和，限制为一分钟60次（如K线订阅、实时行情订阅等，包含心跳请求）
* 如果超出订阅请求，将会导致连接断开

### WebSocket订阅总数

WS主要用于订阅交易品种的实时行情，而订阅总数代表您可以通过WS订阅的交易品种的数量上限。100个订阅数可以订阅100个品种。

{% hint style="info" %}
**标准套餐和自定义套餐的WS可以订阅所有支持的品种分类（外汇/股票/期货等）**&#x20;

**股票套餐的WS只能订阅所选的股票市场。比如全A股套餐只能订阅所有A股的股票。**

{% endhint %}

### WebSocket连接数

系统会根据您套餐的订阅总数，分配足够的 WebSocket 连接来承载数据。每条连接最多可承载 600 个订阅。如果您的订阅总数超过 600，系统会自动提供多条连接，以确保数据正常推送。

{% hint style="info" %}
**示例：**

* 订阅总数200 → 系统提供 1 条连接
* 订阅总数800 → 系统提供 2 条连接
* 订阅总数5000 → 系统提供 9 条连接
  {% endhint %}

有多条WS连接的情况下，每条连接的订阅数量可自由分配，只要不超过每个连接600、以及套餐订阅总数的上限即可。

### 订阅不同市场数据不视作多个连接

Infoway API 的WebSocket分为以下市场通道：

* 股票行情：`wss://data.infoway.io/ws?business=stock`
* 加密货币行情：`wss://data.infoway.io/ws?business=crypto`
* 外汇与商品期货：`wss://data.infoway.io/ws?business=common`&#x20;
* 日本行情：`wss://data.infoway.io/ws?business=japan`&#x20;
* 印度行情：`wss://data.infoway.io/ws?business=india`&#x20;
* 韩国行情：`wss://data.infoway.io/ws?business=korea`&#x20;

**即使您同时订阅这三个通道的数据，也只视作1个WS连接。**


# 错误码说明

HTTP错误码以及WEBSOCKET错误码说明


# HTTP错误码

HTTP API接口错误码说明

| 错误码 | 说明                                                |
| --- | ------------------------------------------------- |
| 503 | K线查询数量超出限制                                        |
| 505 | 产品数量超出限制                                          |
| 508 | 查询的产品不存在，或已经退市                                    |
| 401 | 认证错误，API Key不正确，或者未将API Key放置在指定`header`或`query`中 |
| 404 | API接口不存在                                          |
| 429 | 请求频率限制，请求不符合您当前套餐配额                               |
| 499 | 客户端主动中断，通常发生在网络不稳定的地区，请在良好网络环境连接                  |
| 524 | 源服务器连接超时，通常发生在我们加速代理提供商到我们服务器之间不稳定导致，一般很快就能恢复     |


# WebSocket错误码

Websocket错误码说明

| 错误码 | 说明                                                |
| --- | ------------------------------------------------- |
| 500 | 服务异常                                              |
| 501 | 请求频率超出一分钟限制                                       |
| 505 | 产品数量超出限制                                          |
| 506 | 参数缺失                                              |
| 515 | 参数不是json格式                                        |
| 513 | WebSocket心跳超时                                     |
| 401 | 认证错误，API Key不正确，或者未将API Key放置在指定`header`或`query`中 |
| 404 | API接口不存在                                          |
| 427 | WebSocket连接数量超过套餐配额                               |
| 429 | 请求频率限制，请求不符合您当前套餐配额                               |
| 499 | 客户端主动中断，通常发生在网络不稳定的地区，请在良好网络环境连接                  |
| 524 | 源服务器连接超时，通常发生在我们加速代理提供商到我们服务器之间不稳定导致，一般很快就能恢复     |


# 行情地址说明

包含HTTP以及WebSocket的URL地址说明

## HTTP接口地址

### 1、批量查询K线接口( [接口文档](/rest-api/http-endpoints/get-candles))

**股票（包括美股、港股、A股）K线查询接口（POST）**：

```
data.infoway.io/stock/v2/batch_kline
```

**加密货币K线查询接口（POST）**：

```
data.infoway.io/crypto/v2/batch_kline
```

**外汇商品期货K线查询接口（POST）**：

```
data.infoway.io/common/v2/batch_kline 
```

**日本K线查询接口（POST）**：

```
data.infoway.io/japan/v2/batch_kline
```

**印度K线查询接口（POST）**：

```
data.infoway.io/india/v2/batch_kline
```

**韩国K线查询接口（POST）**：

```
data.infoway.io/korea/v2/batch_kline
```

### 2、批量查询成交明细接口( [接口文档](/rest-api/http-endpoints/get-trade))

**股票（包括美股、港股、A股）成交明细查询接口（GET）**：

```
data.infoway.io/stock/batch_trade/{codes}
```

**加密货币成交明细查询接口（GET）**：

```
data.infoway.io/crypto/batch_trade/{codes}
```

**外汇商品期货成交明细查询接口（GET）**：

```
data.infoway.io/common/batch_trade/{codes}
```

**日本成交明细查询接口（GET）**：

```
data.infoway.io/japan/batch_trade/{codes}
```

**印度成交明细查询接口（GET）**：

```
data.infoway.io/india/batch_trade/{codes}
```

**韩国成交明细查询接口（GET）**：

```
data.infoway.io/korea/batch_trade/{codes}
```

### 3、批量查询盘口接口( [接口文档](/rest-api/http-endpoints/get-depth))

**股票（包括美股、港股、A股）盘口查询接口（GET）**：

```
data.infoway.io/stock/batch_depth/{codes}
```

**加密货币盘口查询接口（GET）**：

```
data.infoway.io/crypto/batch_depth/{codes}
```

**外汇商品期货盘口查询接口（GET）**：

```
data.infoway.io/common/batch_depth/{codes}
```

**日本盘口查询接口（GET）**：

```
data.infoway.io/japan/batch_depth/{codes}
```

**印度盘口查询接口（GET）**：

```
data.infoway.io/india/batch_depth/{codes}
```

**韩国盘口查询接口（GET）**：

```
data.infoway.io/korea/batch_depth/{codes}
```

### 4、获取产品code列表

[产品列表接口文档](/rest-api/basic-info/get-symbol-list)

### 5、获取产品的基础信息

[产品基础信息接口文档](/rest-api/basic-info/get-symbol-basic-info)

### 6、获取市场的交易日以及交易时间段信息

[交易时间段接口文档](/rest-api/basic-info/get-market-trading-hours)

[市场交易日接口文档](/rest-api/basic-info/get-market-trading-days)

## Websocket请求地址

[文档地址](/websocket-api/endpoints)


# 请求协议以及响应格式

包括HTTP请求以及WEBSOCKET请求

## 1、HTTP请求协议以及响应协议

### 1.1、请求头

所有HTTP接口均为`GET`请求，需要在请求头`Headers`里面固定设置您的API Key

![](https://files.readme.io/ff7c58f896427ad7a1bd2684d02dcea12ed386fabbfdd945f10eb77582234548-image.png)

### 1.2、响应格式

```
{
    "ret": 200,
    "msg": "success",
    "traceId": "698f920a-c53b-401c-bfac-4ea46b9b8f12",
    "data": [
        
    ]
}
```

| 字段        | 描述                                                                         |
| --------- | -------------------------------------------------------------------------- |
| `ret`     | 响应码。`200`为正常响应（[错误码](https://infoway.readme.io/reference/http-error-code)） |
| `msg`     | success                                                                    |
| `tradeId` | 由系统生成的唯一ID                                                                 |
| `data`    | 响应数据返回                                                                     |

## 2、Websocket

所有类型的WebSocket连接，地址相同，仅参数不同，详情请看[Websocket订阅地址说明](/websocket-api/endpoints)和[Websocket代码示例](/websocket-api/code-examples)。


# HTTP请求示例

{% tabs %}
{% tab title="Go" %}

```go
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    apiUrl := "https://data.infoway.io/stock/batch_kline/1/10/002594.SZ%2C00285.HK%2CTSLA.US"

    // 创建HTTP客户端
    client := &http.Client{}

    // 创建GET请求
    req, err := http.NewRequest("GET", apiUrl, nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }

    // 设置请求头
    req.Header.Set("User-Agent", "Mozilla/5.0")
    req.Header.Set("Accept", "application/json")
    req.Header.Set("apiKey", "yourApikey")

    // 发送请求
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }
    defer resp.Body.Close()

    // 读取响应内容
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    // 输出结果
    fmt.Printf("HTTP code:", resp.StatusCode)
    fmt.Printf("message:", string(body))
}
```

{% endtab %}

{% tab title="Java" %}

```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpExample {
    public static void main(String[] args) {
        try {
            // 定义请求URL
            String apiUrl = "https://data.infoway.io/stock/batch_kline/1/10/002594.SZ%2C00285.HK%2CTSLA.US";
            URL url = new URL(apiUrl);

            // 创建HTTP连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 设置请求方法为GET
            connection.setRequestMethod("GET");

            // 设置请求头（可选）
            connection.setRequestProperty("User-Agent", "Mozilla/5.0");
            connection.setRequestProperty("Accept", "application/json");

            connection.setRequestProperty("apiKey","yourApikey");

            // 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("HTTP code: " + responseCode);

            // 读取响应内容
            BufferedReader reader;
            if (responseCode == HttpURLConnection.HTTP_OK) {
                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            } else {
                reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
            }

            String line;
            StringBuilder response = new StringBuilder();

            while ((line = reader.readLine()) != null) {
                response.append(line);
            }

            reader.close();

            // 打印响应内容
            System.out.println("message: " + response);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
$apiUrl = 'https://data.infoway.io/stock/batch_kline/1/10/002594.SZ%2C00285.HK%2CTSLA.US';

// 初始化cURL会话
$ch = curl_init();

// 设置URL和其他选项
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'User-Agent: Mozilla/5.0',
    'Accept: application/json',
    'apiKey: yourApikey'
]);

// 执行请求并获取响应
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// 关闭cURL资源
curl_close($ch);

// 输出结果
echo "HTTP code: $httpCode";
echo "message: $response";
?>
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

api_url = 'https://data.infoway.io/stock/batch_kline/1/10/002594.SZ%2C00285.HK%2CTSLA.US'

# 设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0',
    'Accept': 'application/json',
    'apiKey': 'yourApikey'
}

# 发送GET请求
response = requests.get(api_url, headers=headers)

# 输出结果
print(f"HTTP code: {response.status_code}")
print(f"message: {response.text}")
```

{% endtab %}
{% endtabs %}


# 基础信息查询

包含查询产品列表、产品的基本信息、市场信息（交易日、交易时间）


# GET查询产品列表

查询不同市场的产品列表，支持条件查询

## 接口说明

该接口是获取不同市场的产品列表，方便您确认是否包含您所需的产品数据

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

* 基本路径：`/common/basic/symbols`
* 完整路径：`https://data.infoway.io  /common/basic/symbols`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## Request param入参说明

| 参数名       | 类型     | 必填 | 描述                                               | 示例值                |
| --------- | ------ | -- | ------------------------------------------------ | ------------------ |
| `type`    | String | 是  | 标的类型，参考下面<mark style="color:blue;">type类型</mark> | `STOCK_US`         |
| `symbols` | String | 否  | 标的列表，多个用,隔开                                      | `.DJI.US,.IXIC.US` |

#### type说明

| 类型代码       | 描述   |
| ---------- | ---- |
| `STOCK_US` | 美股   |
| `STOCK_CN` | A股   |
| `STOCK_HK` | 港股   |
| `FUTURES`  | 期货   |
| `FOREX`    | 外汇   |
| `ENERGY`   | 能源   |
| `METAL`    | 金属   |
| `CRYPTO`   | 加密货币 |
| `STOCK_IN` | 印股   |
| `STOCK_JP` | 日股   |
| `STOCK_KS` | 韩股   |
| `INDICES`  | 指数   |

## 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "ed8a84d9-4575-4077-bc1c-31b17d0c8977",
  "data": [
    {
      "symbol": ".DJI.US",
      "name_cn": "道琼斯指数",
      "name_hk": "道瓊斯指數",
      "name_en": "Dow Jones Industrial Average",
      "index": true
    },
    {
      "symbol": ".IXIC.US",
      "name_cn": "纳斯达克综合指数",
      "name_hk": "納斯達克綜合指數",
      "name_en": "NASDAQ Composite Index",
      "index": true
    }
  ]
}
```

| 字段名       | 类型     | 必填 | 描述   | 示例值          |
| --------- | ------ | -- | ---- | ------------ |
| `symbol`  | String | 是  | 标的代码 | `AAPL.US`    |
| `name_cn` | String | 否  | 中文名称 | `苹果`         |
| `name_hk` | String | 否  | 繁体名称 | `蘋果`         |
| `name_en` | String | 否  | 英文名称 | `Apple Inc.` |
| `index`   | String | 否  | 是否指数 | `true`       |


# GET获取产品的基础信息

## 接口说明

该接口是获取不同产品的基础信息，包括名称、交易所、币种、股数等数据

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

* 基本路径：`/common/basic/symbols/info`
* 完整路径：`https://data.infoway.io/common/basic/symbols/info`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## Request param入参说明

| 参数名       | 类型     | 必填 | 描述                                               | 示例值                  |
| --------- | ------ | -- | ------------------------------------------------ | -------------------- |
| `type`    | String | 是  | 标的类型，参考下面<mark style="color:blue;">type类型</mark> | `STOCK_US`           |
| `symbols` | String | 是  | 标的列表，多个用,隔开，最大支持500个                             | `000001.SZ,00076.HK` |

#### Type说明

| 类型代码       | 描述   |
| ---------- | ---- |
| `STOCK_US` | 美股   |
| `STOCK_CN` | A股   |
| `STOCK_HK` | 港股   |
| `FUTURES`  | 期货   |
| `FOREX`    | 外汇   |
| `ENERGY`   | 能源   |
| `METAL`    | 金属   |
| `CRYPTO`   | 加密货币 |
| `STOCK_IN` | 印股   |
| `STOCK_JP` | 日股   |
| `STOCK_KS` | 韩股   |
| `INDEX`    | 指数   |

## 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "52327ed3-e96a-4e9a-a591-e910a0fcc563",
  "data": [
    {
      "symbol": "000001.SZ",
      "market": "CN",
      "name_cn": "平安银行",
      "name_en": "PAB",
      "name_hk": "平安銀行",
      "exchange": "SZSE",
      "currency": "CNY",
      "lot_size": 100,
      "total_shares": 19405918198,
      "circulating_shares": 19405762053,
      "hk_shares": 0,
      "eps": "2.2935271367158012",
      "eps_ttm": "2.2504474951615995",
      "bps": "22.4755662447835698",
      "dividend_yield": "0.9649999999963929",
      "stock_derivatives": "",
      "board": "SZMainConnect"
    },
    {
      "symbol": "000002.SZ",
      "market": "CN",
      "name_cn": "万科A",
      "name_en": "Vanke",
      "name_hk": "萬科A",
      "exchange": "SZSE",
      "currency": "CNY",
      "lot_size": 100,
      "total_shares": 11930709471,
      "circulating_shares": 9724196533,
      "hk_shares": 0,
      "eps": "-4.147148946357911",
      "eps_ttm": "-4.6403502137102706",
      "bps": "16.4892858366243256",
      "dividend_yield": "0",
      "stock_derivatives": "",
      "board": "SZMainConnect"
    }
  ]
}
```

| 字段名                  | 类型     | 必填 | 描述         | 示例值/可选值                                                      |
| -------------------- | ------ | -- | ---------- | ------------------------------------------------------------ |
| `symbol`             | string | 是  | 标的代码       | `AAPL.US`                                                    |
| `name_cn`            | string | 否  | 中文简体标的名称   | `苹果`                                                         |
| `name_en`            | string | 否  | 英文标的名称     | `Apple`                                                      |
| `name_hk`            | string | 否  | 中文繁体标的名称   | `蘋果`                                                         |
| `exchange`           | string | 否  | 标的所属交易所    | `NASD`, `SSE`, `SZSE`, `SEHK`, `NYSE`, `AMEX`, `OTC`, `NYSD` |
| `currency`           | string | 否  | 交易币种       | `USD`, `CNY`, `HKD`, `EUR`, `SGD`, `JPY`, `AUD`, `GBP`       |
| `lot_size`           | int32  | 否  | 每手股数       | `100`                                                        |
| `total_shares`       | int64  | 否  | 总股本        | `1000000000`                                                 |
| `circulating_shares` | int64  | 否  | 流通股本       | `800000000`                                                  |
| `hk_shares`          | int64  | 否  | 港股股本 (仅港股) | `500000000`                                                  |
| `eps`                | string | 否  | 每股盈利       | `5.25`                                                       |
| `eps_ttm`            | string | 否  | 每股盈利 (TTM) | `5.50`                                                       |
| `bps`                | string | 否  | 每股净资产      | `120.50`                                                     |
| `dividend_yield`     | string | 否  | 股息         | `3.5`                                                        |
| `board`              | string | 否  | 标的所属板块     | 参考下面的说明                                                      |

### Board

| 板块代码               | 描述                  |
| ------------------ | ------------------- |
| `USMain`           | 美股主板                |
| `USPink`           | 粉单市场                |
| `USDJI`            | 道琼斯指数               |
| `USNSDQ`           | 纳斯达克指数              |
| `USSector`         | 美股行业概念              |
| `USOption`         | 美股期权                |
| `USOptionS`        | 美股特殊期权（收盘时间为 16:15） |
| `HKEquity`         | 港股股本证券              |
| `HKPreIPO`         | 港股暗盘                |
| `HKWarrant`        | 港股轮证                |
| `HKHS`             | 恒生指数                |
| `HKSector`         | 港股行业概念              |
| `SHMainConnect`    | 上证主板 - 互联互通         |
| `SHMainNonConnect` | 上证主板 - 非互联互通        |
| `SHSTAR`           | 科创板                 |
| `CNIX`             | 沪深指数                |
| `CNSector`         | 沪深行业概念              |
| `SZMainConnect`    | 深证主板 - 互联互通         |
| `SZMainNonConnect` | 深证主板 - 非互联互通        |
| `SZGEMConnect`     | 创业板 - 互联互通          |
| `SZGEMNonConnect`  | 创业板 - 非互联互通         |


# GET获取产品的复权因子

获取产品的复权因子

## 接口说明

该接口是获取产品的复权因子

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

* 基本路径：`/common/basic/symbols/adjustment_factors`
* 完整路径：`https://data.infoway.io/common/basic/symbols/adjustment_factors`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## Request param入参说明

| 参数名        | 类型     | 必填 | 描述                                | 示例值         |
| ---------- | ------ | -- | --------------------------------- | ----------- |
| `symbol`   | String | 是  | 标的代码                              | `000001.SZ` |
| `market`   | String | 是  | 市场: `US`,`CN`,`JP`,`IN`,`HK`,`KS` | `US`        |
| `beginDay` | String | 是  | 开始时间，格式`YYYYMMDD`                 | `20260323`  |
| `endDay`   | String | 是  | 结束时间，格式`YYYYMMDD`                 | `20260324`  |

## 返回示例

```json
{
    "ret": 200,
    "msg": "success",
    "traceId": "a50ecfd7-decf-4c80-8ee0-798ede935794",
    "data": [
        {
            "symbol": "000001.SZ",
            "market": "CN",
            "trade_date": "19910102",
            "forward_factor": 0.6399030867
        },
        {
            "symbol": "000001.SZ",
            "market": "CN",
            "trade_date": "19910103",
            "forward_factor": 0.6399029351
        }
    ]
}
```

<table><thead><tr><th>字段名</th><th>类型</th><th>必填</th><th>描述</th><th width="152">示例值</th></tr></thead><tbody><tr><td><code>symbol</code></td><td>String</td><td>是</td><td>标的代码</td><td><code>000001.SZ</code></td></tr><tr><td><code>market</code></td><td>String</td><td>是</td><td>市场：<code>US</code>,<code>CN</code>,<code>JP</code>,<code>IN</code>,<code>HK</code>,<code>KS</code></td><td><code>US</code></td></tr><tr><td><code>trade_date</code></td><td>String</td><td>是</td><td>交易日期，格式<code>YYYYMMDD</code></td><td><code>19910103</code></td></tr><tr><td><code>forward_factor</code></td><td>BigDecimal</td><td>是</td><td>前复权因子</td><td><code>0.6499029351</code></td></tr></tbody></table>


# GET获取市场的交易日信息

获取不同市场的交易日信息，包含全天交易日以及半天交易日

## 接口说明

该接口是获取不同市场的交易日信息，包含全天交易日以及半天交易日

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 股票市场

### 接口地址

* 基本路径：`/common/basic/markets/trading_days`
* 完整路径：`https://data.infoway.io  /common/basic/markets/trading_days`

### 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

### Request param入参说明

<table><thead><tr><th>参数名</th><th width="111.333251953125">类型</th><th width="98.3333740234375">必填</th><th>描述</th><th>示例值</th></tr></thead><tbody><tr><td><code>market</code></td><td>String</td><td>是</td><td>市场</td><td><code>US</code>, <code>HK</code>, <code>CN</code>, <code>JP</code>, <code>IN</code>, <code>KS</code></td></tr><tr><td><code>beginDay</code></td><td>String</td><td>是</td><td>开始日期，使用 <code>YYYYMMDD</code> 格式</td><td><code>20230101</code></td></tr><tr><td><code>endDay</code></td><td>String</td><td>是</td><td>结束时间，使用 <code>YYYYMMDD</code> 格式</td><td><code>20230301</code></td></tr></tbody></table>

### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "46fbf427-a30e-48ff-8760-9fb20025c667",
  "data": {
    "trade_days": [
      "20230221",
      "20230222",
      "20230223",
      "20230224",
      "20230227",
      "20230228",
      "20230301"
    ],
    "half_trade_days": []
  }
}
```

| 字段名               | 类型   | 必填 | 描述                  | 示例值        |
| ----------------- | ---- | -- | ------------------- | ---------- |
| `trade_days`      | List | 否  | 交易日，使用 `YYYMMDD` 格式 | `20230101` |
| `half_trade_days` | List | 否  | 半日市，使用 `YYYMMDD` 格式 | `20230101` |

## 其他市场

### 接口地址

* 基本路径：`/common/basic/markets/trading_schedule`
* 完整路径：`https://data.infoway.io  /common/basic/markets/trading_schedule`

### 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

### Request param入参说明

<table><thead><tr><th>参数名</th><th width="111.333251953125">类型</th><th width="98.3333740234375">必填</th><th>描述</th><th>示例值</th></tr></thead><tbody><tr><td><code>type</code></td><td>String</td><td>否</td><td>类型（不传查所有）</td><td><code>ENERGY</code>, <code>FOREX</code>, <code>FUTURES</code>, <code>METAL</code>，<code>INDICES</code></td></tr></tbody></table>

### 返回示例

```json
{
    "ret": 200,
    "msg": "success",
    "traceId": "9ae7a566-0a08-4ecb-b0ed-da0d90c1e88c",
    "data": [
        {
            "symbol": "XAGEUR",
            "type": "METAL",
            "name": "白银/欧元",
            "timezone": "America/New_York",
            "session": "1700-1700",
            "holidays": {
                "summary": "",
                "dates": []
            },
            "symbol_code": "OANDA:XAGEUR",
            "is_24_7": false,
            "trading_hours": {
                "summary": "（GMT 0）\n夏令时（每年3月第2个周日开始）周日至周五（连续 24 小时）\n冬令时（每年11月第1个周日开始）周日至周五（连续 24 小时）\nSummer Time (from the 2nd Sunday of March) Sunday-Friday (24h continuous)\nWinter Time (from the 1st Sunday of November) Sunday-Friday (24h continuous)",
                "segments": [
                    {
                        "days": "周日至周五",
                        "overnight": true,
                        "gmt0": {
                            "summer": {
                                "start": "21:00",
                                "end": "21:00"
                            },
                            "winter": {
                                "start": "22:00",
                                "end": "22:00"
                            }
                        },
                        "days_en": "Sunday-Friday",
                        "continuous_24h": true,
                        "native": {
                            "start": "17:00",
                            "end": "17:00"
                        }
                    }
                ],
                "is_dst": true
            },
            "break_time": {
                "summary": "",
                "windows": []
            }
        }
    ]
}
```

| 字段名             | 类型      | 必填 | 描述                            | 示例                   |
| --------------- | ------- | -- | ----------------------------- | -------------------- |
| `symbol`        | string  | 是  | 交易品种代码（不含数据源前缀）               | `"XAGEUR"`           |
| `type`          | string  | 是  | 品种类别（METAL/FX/STOCK 等）        | `"METAL"`            |
| `name`          | string  | 是  | 品种名称                          | `"白银/欧元"`            |
| `timezone`      | string  | 是  | 品种原生报价所采用的时区（IANA 时区名）        | `"America/New_York"` |
| `session`       | string  | 是  | 原生交易时段区间，格式 `HHMM-HHMM`       | `"1700-1700"`        |
| `holidays`      | object  | 是  | 休市（节假日）信息容器                   | 见 二、holidays         |
| `symbol_code`   | string  | 是  | 含数据源前缀的完整品种标识（TradingView 格式） | `"OANDA:XAGEUR"`     |
| `is_24_7`       | boolean | 是  | 是否为 7×24 小时不间断交易品种            | `false`              |
| `trading_hours` | object  | 是  | 交易时段信息容器                      | 见 三、trading\_hours   |
| `break_time`    | object  | 否  | 盘中休息（集合竞价/午休）窗口容器             | 见 四、break\_time      |

### holidays

| 字段名                | 类型             | 必填 | 描述                                 | 示例   |
| ------------------ | -------------- | -- | ---------------------------------- | ---- |
| `holidays.summary` | string         | 否  | 休市说明的简短文字（无休市时为空串）                 | `""` |
| `holidays.dates`   | array\<string> | 否  | 休市日期列表（通常为 `YYYY-MM-DD` 或 `MM/DD`） | `[]` |

### trading\_hours

| 字段名                      | 类型             | 必填 | 描述                   | 示例                |
| ------------------------ | -------------- | -- | -------------------- | ----------------- |
| `trading_hours.summary`  | string         | 否  | 交易时段的中文/英文汇总说明（多行文本） | `"（GMT 0）\n夏令时…"` |
| `trading_hours.segments` | array\<object> | 是  | 交易时段分段列表，每段描述一组交易日规则 | 见 五、segments\[]   |
| `trading_hours.is_dst`   | boolean        | 是  | 当前是否处于夏令时（影响显示与计算）   | `true`            |

### break\_time

| 字段名                  | 类型             | 必填 | 描述                          | 示例   |
| -------------------- | -------------- | -- | --------------------------- | ---- |
| `break_time.summary` | string         | 否  | 盘中休息说明文字（无休息时为空串）           | `""` |
| `break_time.windows` | array\<object> | 否  | 盘中休息时段列表（结构与 `segments` 类似） | `[]` |

### trading\_hours.segments\[]

每个数组元素描述一组交易日规则：

| 字段名                            | 类型      | 必填 | 描述                       | 示例                                     |
| ------------------------------ | ------- | -- | ------------------------ | -------------------------------------- |
| `segments[].days`              | string  | 是  | 该分段适用的交易星期（中文）           | `"周日至周五"`                              |
| `segments[].days_en`           | string  | 否  | 适用的交易星期（英文）              | `"Sunday-Friday"`                      |
| `segments[].overnight`         | boolean | 是  | 是否跨夜（结束时间在次日）            | `true`                                 |
| `segments[].continuous_24h`    | boolean | 否  | 是否为连续 24 小时交易            | `true`                                 |
| `segments[].native`            | object  | 否  | 原生时区下的起止时间容器             | `{ "start": "17:00", "end": "17:00" }` |
| `segments[].native.start`      | string  | 否  | 原生时区开盘时间 `HH:MM`         | `"17:00"`                              |
| `segments[].native.end`        | string  | 否  | 原生时区收盘时间 `HH:MM`         | `"17:00"`                              |
| `segments[].gmt0`              | object  | 是  | GMT 0 时区下的起止时间容器（分夏/冬令时） | `{ "summer": {...}, "winter": {...} }` |
| `segments[].gmt0.summer`       | object  | 否  | 夏令时下 GMT 0 的起止时间         | `{ "start": "21:00", "end": "21:00" }` |
| `segments[].gmt0.summer.start` | string  | 否  | 夏令时 GMT 0 开盘 `HH:MM`     | `"21:00"`                              |
| `segments[].gmt0.summer.end`   | string  | 否  | 夏令时 GMT 0 收盘 `HH:MM`     | `"21:00"`                              |
| `segments[].gmt0.winter`       | object  | 否  | 冬令时下 GMT 0 的起止时间         | `{ "start": "22:00", "end": "22:00" }` |
| `segments[].gmt0.winter.start` | string  | 否  | 冬令时 GMT 0 开盘 `HH:MM`     | `"22:00"`                              |
| `segments[].gmt0.winter.end`   | string  | 否  | 冬令时 GMT 0 收盘 `HH:MM`     | `"22:00"`                              |


# GET获取市场的交易时间

获取不同市场的基本交易时间

## 接口说明

该接口是获取不同市场的基本交易时间

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

* 基本路径：`/common/basic/markets`
* 完整路径：`https://data.infoway.io/common/basic/markets`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "7b32f9db-852b-4234-aafb-5766f9ba385e",
  "data": [
    {
      "market": "CN",
      "remark": "A 股市场",
      "trade_schedules": [
        {
          "begin_time": "09:30:00",
          "end_time": "11:30:00",
          "type": "NormalTrade"
        },
        {
          "begin_time": "13:00:00",
          "end_time": "14:57:00",
          "type": "NormalTrade"
        }
      ]
    },
    {
      "market": "HK",
      "remark": "港股市场",
      "trade_schedules": [
        {
          "begin_time": "09:30:00",
          "end_time": "12:00:00",
          "type": "NormalTrade"
        },
        {
          "begin_time": "13:00:00",
          "end_time": "16:00:00",
          "type": "NormalTrade"
        }
      ]
    },
    {
      "market": "US",
      "remark": "美股市场",
      "trade_schedules": [
        {
          "begin_time": "04:00:00",
          "end_time": "09:30:00",
          "type": "PreTrade"
        },
        {
          "begin_time": "09:30:00",
          "end_time": "16:00:00",
          "type": "NormalTrade"
        },
        {
          "begin_time": "16:00:00",
          "end_time": "20:00:00",
          "type": "PostTrade"
        }
      ]
    }
  ]
}
```

<table><thead><tr><th>字段名</th><th>类型</th><th>必填</th><th>描述</th><th>示例值</th></tr></thead><tbody><tr><td><code>market</code></td><td>String</td><td>是</td><td>市场</td><td><code>US</code></td></tr><tr><td><code>remark</code></td><td>String</td><td>是</td><td>备注</td><td>美股市场</td></tr><tr><td><code>trade_schedules</code></td><td>arr</td><td>是</td><td>交易时间集合</td><td></td></tr><tr><td><code>>begin_time</code></td><td>String</td><td>是</td><td>开始时间</td><td><pre><code>04:00:00
</code></pre></td></tr><tr><td><code>>end_time</code></td><td>String</td><td>是</td><td>结束时间</td><td><pre><code>09:30:00
</code></pre></td></tr><tr><td><code>type</code></td><td>String</td><td>是</td><td>时间类型</td><td><pre><code>PreTrade:盘前
</code></pre></td></tr></tbody></table>


# GET获取个股的详细信息

## 接口说明

该接口是获取不同产品的详细信息，包括名称、交易所、币种、股数、logo、公司介绍等数据

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

* 基本路径：`/common/basic/stock/detail`
* 完整路径：`https://data.infoway.io/common/basic/stock/detail`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## Request param入参说明

| 参数名      | 类型     | 必填 | 描述                                               | 示例值         |
| -------- | ------ | -- | ------------------------------------------------ | ----------- |
| `type`   | String | 是  | 标的类型，参考下面<mark style="color:blue;">type类型</mark> | `STOCK_CN`  |
| `symbol` | String | 是  | 标的代码                                             | `000001.SZ` |

#### Type说明

| 类型代码       | 描述 |
| ---------- | -- |
| `STOCK_US` | 美股 |
| `STOCK_CN` | A股 |
| `STOCK_HK` | 港股 |
| `STOCK_IN` | 印股 |
| `STOCK_JP` | 日股 |
| `STOCK_KS` | 韩股 |

## 返回示例

```json
{
    "ret": 200,
    "msg": "success",
    "traceId": "43b4d6df-708e-4a07-b550-e2455608c23c",
    "data": {
        "symbol": "1STCUS.IN",
        "market": "IN",
        "name_cn": "",
        "name_en": "First Custodian Fund India Ltd.",
        "name_hk": "",
        "exchange": "BSE",
        "currency": "INR",
        "lot_size": null,
        "total_shares": null,
        "circulating_shares": null,
        "hk_shares": null,
        "eps": "-1.438",
        "eps_ttm": null,
        "bps": null,
        "dividend_yield": "0.0123563573458544",
        "stock_derivatives": null,
        "board": "Finance",
        "sector": "Finance",
        "curr_logo": "https://logo.infoway.io/logos/country/IN.svg",
        "exc_logo": "https://logo.infoway.io/logos/exchange/bse.svg",
        "logo": "https://logo.infoway.io/logos/stock/fi/first-custodian-fund-india-l.svg",
        "market_cap": 114270000.00,
        "figi_composite": "BBG000CR6526",
        "figi_exchange": "BBG000CR65S8",
        "isin": "INE609B01018",
        "ceo": "Giriraj Kumar Dammani",
        "total_employees": 6,
        "founded": 1985,
        "website": "http://firstcustodianfund.in",
        "headquarters": "Mumbai",
        "industry": "Investment Banks/Brokers",
        "has_bonds": 0
    }
}
```

| 字段名                  | 类型         | 必填 | 描述          | 示例值/可选值                                                      |
| -------------------- | ---------- | -- | ----------- | ------------------------------------------------------------ |
| `symbol`             | string     | 是  | 标的代码        | `AAPL.US`                                                    |
| `name_cn`            | string     | 否  | 中文简体标的名称    | `苹果`                                                         |
| `name_en`            | string     | 否  | 英文标的名称      | `Apple`                                                      |
| `name_hk`            | string     | 否  | 中文繁体标的名称    | `蘋果`                                                         |
| `exchange`           | string     | 否  | 标的所属交易所     | `NASD`, `SSE`, `SZSE`, `SEHK`, `NYSE`, `AMEX`, `OTC`, `NYSD` |
| `currency`           | string     | 否  | 交易币种        | `USD`, `CNY`, `HKD`, `EUR`, `SGD`, `JPY`, `AUD`, `GBP`       |
| `lot_size`           | int32      | 否  | 每手股数        | `100`                                                        |
| `total_shares`       | int64      | 否  | 总股本         | `1000000000`                                                 |
| `circulating_shares` | int64      | 否  | 流通股本        | `800000000`                                                  |
| `hk_shares`          | int64      | 否  | 港股股本 (仅港股)  | `500000000`                                                  |
| `eps`                | string     | 否  | 每股盈利        | `5.25`                                                       |
| `eps_ttm`            | string     | 否  | 每股盈利 (TTM)  | `5.50`                                                       |
| `bps`                | string     | 否  | 每股净资产       | `120.50`                                                     |
| `dividend_yield`     | string     | 否  | 股息          | `3.5`                                                        |
| `stock_derivatives`  | int32\[]   | 否  | 可提供的衍生品行情类型 | `[1, 2]` (1 - 期权, 2 - 轮证)                                    |
| `board`              | string     | 否  | 标的所属板块      | 参考下面的说明                                                      |
| `sector`             | string     | 否  | 行业分类        |                                                              |
| `curr_logo`          | string     | 否  | 国家logo链接    |                                                              |
| `exc_logo`           | string     | 否  | 交易所Logo链接   |                                                              |
| `logo`               | string     | 否  | 公司Logo链接    |                                                              |
| `market_cap`         | BigDecimal | 否  | 市值          |                                                              |
| `figi_composite`     | string     | 否  | FIGI标识符     |                                                              |
| `figi_exchange`      | string     | 否  | 交易所FIGI标识符  |                                                              |
| `isin`               | string     | 否  | 国际证券识别码     |                                                              |
| `ceo`                | string     | 否  | 首席执行官       |                                                              |
| `total_employees`    | int64      | 否  | 员工总数        |                                                              |
| `founded`            | string     | 否  | 成立年份        |                                                              |
| `website`            | string     | 否  | 官网网址        |                                                              |
| `headquarters`       | string     | 否  | 总部所在地       |                                                              |
| `industry`           | string     | 否  | 所属行业        |                                                              |
| `has_bonds`          | string     | 否  | 是否有债券       |                                                              |

### Borad

| 板块代码               | 描述                  |
| ------------------ | ------------------- |
| `USMain`           | 美股主板                |
| `USPink`           | 粉单市场                |
| `USDJI`            | 道琼斯指数               |
| `USNSDQ`           | 纳斯达克指数              |
| `USSector`         | 美股行业概念              |
| `USOption`         | 美股期权                |
| `USOptionS`        | 美股特殊期权（收盘时间为 16:15） |
| `HKEquity`         | 港股股本证券              |
| `HKPreIPO`         | 港股暗盘                |
| `HKWarrant`        | 港股轮证                |
| `HKHS`             | 恒生指数                |
| `HKSector`         | 港股行业概念              |
| `SHMainConnect`    | 上证主板 - 互联互通         |
| `SHMainNonConnect` | 上证主板 - 非互联互通        |
| `SHSTAR`           | 科创板                 |
| `CNIX`             | 沪深指数                |
| `CNSector`         | 沪深行业概念              |
| `SZMainConnect`    | 深证主板 - 互联互通         |
| `SZMainNonConnect` | 深证主板 - 非互联互通        |
| `SZGEMConnect`     | 创业板 - 互联互通          |
| `SZGEMNonConnect`  | 创业板 - 非互联互通         |


# GET获取个股的财务数据

## 接口说明

提供股票财务数据查询能力，包含损益表、收入明细、现金流量表、资产负债表、估值统计指标、股息指标、派息记录、财报数据共 8 类财务数据。

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 请求头 <a href="#qing-qiu-tou" id="qing-qiu-tou"></a>

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## 接口地址

### 1. 财报发布状态

#### 接口地址

基本路径：`/common/basic/financial/earning_status` 完整路径：`https://data.infoway.io/common/basic/financial/earning_status`

#### 请求参数

| 参数名    | 类型     | 必填 | 描述                                                                         | 示例值       |
| ------ | ------ | -- | -------------------------------------------------------------------------- | --------- |
| symbol | String | 是  | 标的代码                                                                       | AAPL.US   |
| type   | String | 是  | 标的类型：STOCK\_US / STOCK\_CN / STOCK\_HK / STOCK\_JP / STOCK\_IN / STOCK\_KS | STOCK\_US |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/earning_status?symbol=AAPL.US&type=STOCK_US
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "403a9a4c-5409-408b-9c57-5e633c8652c4",
  "data": {
    "symbol": "AAPL.US",
    "latestReportedPeriod": "2026-Q2",
    "latestReportedTime": "2026-07-08T16:05:16",
    "latestEpsActual": 2.0100,
    "latestRevenueActual": 111184000000.00,
    "nextPeriod": "2026-Q3",
    "nextEpsEstimate": 1.8522,
    "nextRevenueEstimate": 106233517738.00
  }
}
```

#### 返回字段说明

| 字段名                  | 类型      | 描述                                                        |
| -------------------- | ------- | --------------------------------------------------------- |
| symbol               | string  | 标的代码（用户传入格式）                                              |
| latestReportedPeriod | string  | 最新已发布的报告期，如 `2026-Q1`；港股等半年报市场可能为 `2025-H2`；无已发布记录时为 null |
| latestReportedTime   | string  | 最新一期财报的发布检测时间（系统检测到发布并落库的时间，最多滞后一个同步周期，非交易所公告时间）          |
| latestEpsActual      | decimal | 最新已发布期的 EPS 实际值                                           |
| latestRevenueActual  | decimal | 最新已发布期的收入实际值                                              |
| nextPeriod           | string  | 下一期待发布的报告期，如 `2026-Q2`；无待发布记录时为 null                      |
| nextEpsEstimate      | decimal | 下一期的 EPS 市场预期值                                            |
| nextRevenueEstimate  | decimal | 下一期的收入市场预期值                                               |

#### 说明

* 报告期到期次粒度（如 `2026-Q3`），不提供具体发布日期。
* 判断"某标的财报是否已发布"：比较 `latestReportedPeriod` 是否为关注的报告期。
* 标的不存在或无任何财报数据时 `data` 为 null。

### 2. 损益表（利润表）

查询公司的收入、成本、利润等经营数据。

#### 接口地址

基本路径：`/common/basic/financial/income_statement` 完整路径：`https://data.infoway.io/common/basic/financial/income_statement`

#### 请求参数

| 参数名          | 类型     | 必填 | 描述                                  | 示例值       |
| ------------ | ------ | -- | ----------------------------------- | --------- |
| symbol       | String | 是  | 标的代码                                | 000001.SZ |
| type         | String | 是  | 标的类型                                | STOCK\_CN |
| period\_type | String | 否  | 报告周期：`fq`=季度、`fy`=年度、`fh`=半年，不传返回全部 | fq        |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/income_statement?symbol=000001.SZ&type=STOCK_CN&period_type=fq
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "000001.SZ",
      "periodType": "fq",
      "periodDate": "2025-12-31",
      "itemId": "total_revenue",
      "itemName": "Total_revenue",
      "itemGroup": "Income Statement",
      "itemValue": 54032000000,
      "ttm": 210000000000,
      "parentItemId": ""
    }
  ]
}
```

#### 返回字段说明

| 字段名          | 类型      | 描述                           |
| ------------ | ------- | ---------------------------- |
| symbol       | string  | 标的代码（用户传入格式）                 |
| periodType   | string  | 报告周期：`fq`=季度、`fy`=年度、`fh`=半年 |
| periodDate   | string  | 报告期，如 `2025-12-31`           |
| itemId       | string  | 科目 ID                        |
| itemName     | string  | 科目名称                         |
| itemGroup    | string  | 分组                           |
| itemValue    | decimal | 数值                           |
| ttm          | decimal | TTM 滚动合计                     |
| parentItemId | string  | 父科目 ID（子科目时非空）               |

#### 常见科目（itemId）

| itemId              | 说明   |
| ------------------- | ---- |
| total\_revenue      | 总收入  |
| cost\_of\_goods     | 营业成本 |
| gross\_profit       | 毛利润  |
| operating\_expenses | 运营费用 |
| operating\_income   | 营业利润 |
| net\_income         | 净利润  |

***

### 3. 收入明细

查询收入按业务板块或地区的拆分明细。

#### 接口地址

基本路径：`/common/basic/financial/revenue` 完整路径：`https://data.infoway.io/common/basic/financial/revenue`

#### 请求参数

| 参数名          | 类型     | 必填 | 描述                      | 示例值       |
| ------------ | ------ | -- | ----------------------- | --------- |
| symbol       | String | 是  | 标的代码                    | AAPL.US   |
| type         | String | 是  | 标的类型                    | STOCK\_US |
| period\_type | String | 否  | 报告周期：`fy`=年度（主要），不传返回全部 | fy        |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/revenue?symbol=AAPL.US&type=STOCK_US
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "AAPL.US",
      "periodType": "fy",
      "periodDate": "2024",
      "itemId": "product_iphone",
      "itemName": "Product_iphone",
      "itemGroup": "Revenue by business",
      "itemValue": 200583000000,
      "ttm": null
    }
  ]
}
```

#### 返回字段说明

| 字段名        | 类型      | 描述                                          |
| ---------- | ------- | ------------------------------------------- |
| symbol     | string  | 标的代码（用户传入格式）                                |
| periodType | string  | 报告周期                                        |
| periodDate | string  | 报告期                                         |
| itemId     | string  | 项目 ID                                       |
| itemName   | string  | 项目名称                                        |
| itemGroup  | string  | 分组（Revenue by business / Revenue by region） |
| itemValue  | decimal | 数值                                          |
| ttm        | decimal | TTM                                         |

***

### 4. 现金流量表

查询经营/投资/筹资三大现金流数据。

#### 接口地址

基本路径：`/common/basic/financial/cash_flow` 完整路径：`https://data.infoway.io/common/basic/financial/cash_flow`

#### 请求参数

| 参数名          | 类型     | 必填 | 描述                          | 示例值       |
| ------------ | ------ | -- | --------------------------- | --------- |
| symbol       | String | 是  | 标的代码                        | 000001.SZ |
| type         | String | 是  | 标的类型                        | STOCK\_CN |
| period\_type | String | 否  | 报告周期：`fq`=季度、`fy`=年度，不传返回全部 | fq        |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/cash_flow?symbol=000001.SZ&type=STOCK_CN&period_type=fq
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "000001.SZ",
      "periodType": "fq",
      "periodDate": "2025-12-31",
      "itemId": "cf_oper",
      "itemName": "Cf_oper",
      "itemGroup": "Cash Flow Statement",
      "itemValue": 25000000000,
      "ttm": null
    }
  ]
}
```

#### 返回字段说明

| 字段名        | 类型      | 描述           |
| ---------- | ------- | ------------ |
| symbol     | string  | 标的代码（用户传入格式） |
| periodType | string  | 报告周期         |
| periodDate | string  | 报告期          |
| itemId     | string  | 科目 ID        |
| itemName   | string  | 科目名称         |
| itemGroup  | string  | 分组           |
| itemValue  | decimal | 数值           |
| ttm        | decimal | TTM          |

#### 常见科目（itemId）

| itemId               | 说明      |
| -------------------- | ------- |
| cf\_oper             | 经营活动现金流 |
| cf\_invest           | 投资活动现金流 |
| cf\_finance          | 筹资活动现金流 |
| cf\_free\_cash\_flow | 自由现金流   |

***

### 5. 资产负债表

查询资产、负债、股东权益等时点数据。

#### 接口地址

基本路径：`/common/basic/financial/balance_sheet` 完整路径：`https://data.infoway.io/common/basic/financial/balance_sheet`

#### 请求参数

| 参数名          | 类型     | 必填 | 描述                          | 示例值       |
| ------------ | ------ | -- | --------------------------- | --------- |
| symbol       | String | 是  | 标的代码                        | 000001.SZ |
| type         | String | 是  | 标的类型                        | STOCK\_CN |
| period\_type | String | 否  | 报告周期：`fq`=季度、`fy`=年度，不传返回全部 | fq        |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/balance_sheet?symbol=000001.SZ&type=STOCK_CN&period_type=fy
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "000001.SZ",
      "periodType": "fy",
      "periodDate": "2025-12-31",
      "itemId": "total_assets",
      "itemName": "Total_assets",
      "itemGroup": "Balance Sheet",
      "itemValue": 255000000000,
      "ttm": null
    }
  ]
}
```

#### 返回字段说明

| 字段名        | 类型      | 描述           |
| ---------- | ------- | ------------ |
| symbol     | string  | 标的代码（用户传入格式） |
| periodType | string  | 报告周期         |
| periodDate | string  | 报告期          |
| itemId     | string  | 科目 ID        |
| itemName   | string  | 科目名称         |
| itemGroup  | string  | 分组           |
| itemValue  | decimal | 数值           |
| ttm        | decimal | TTM          |

#### 常见科目（itemId）

| itemId             | 说明     |
| ------------------ | ------ |
| total\_assets      | 总资产    |
| total\_liabilities | 总负债    |
| total\_equity      | 股东权益合计 |
| cash\_and\_equiv   | 现金及等价物 |
| total\_debt        | 总债务    |

***

### 6. 估值与统计指标

查询 PE、PB、ROE 等估值与财务比率。

#### 接口地址

基本路径：`/common/basic/financial/statistics` 完整路径：`https://data.infoway.io/common/basic/financial/statistics`

#### 请求参数

| 参数名          | 类型     | 必填 | 描述          | 示例值       |
| ------------ | ------ | -- | ----------- | --------- |
| symbol       | String | 是  | 标的代码        | 000001.SZ |
| type         | String | 是  | 标的类型        | STOCK\_CN |
| period\_type | String | 否  | 报告周期，不传返回全部 | fq        |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/statistics?symbol=000001.SZ&type=STOCK_CN
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "000001.SZ",
      "periodType": "fq",
      "periodDate": "2025-12-31",
      "itemId": "pe_ratio",
      "itemName": "Pe_ratio",
      "itemGroup": "Valuation ratios",
      "itemValue": 25.5,
      "ttmStr": "24.8",
      "currentValue": 26.1
    }
  ]
}
```

#### 返回字段说明

| 字段名          | 类型      | 描述               |
| ------------ | ------- | ---------------- |
| symbol       | string  | 标的代码（用户传入格式）     |
| periodType   | string  | 报告周期             |
| periodDate   | string  | 报告期              |
| itemId       | string  | 指标 ID            |
| itemName     | string  | 指标名称             |
| itemGroup    | string  | 分组               |
| itemValue    | decimal | 数值               |
| ttmStr       | string  | TTM 值（可能为 `"-"`) |
| currentValue | decimal | 当前值              |

#### 指标分组（itemGroup）

| itemGroup            | 说明                |
| -------------------- | ----------------- |
| Key stats            | 市值、股本、营收等核心指标     |
| Valuation ratios     | PE、PB、PS 等估值比率    |
| Profitability ratios | 毛利率、净利率、ROE 等盈利指标 |
| Liquidity ratios     | 流动比率、速动比率         |
| Solvency ratios      | 资产负债率、利息保障倍数      |

***

### 7. 股息指标

查询每股股息、股息率、派息率等指标。

#### 接口地址

基本路径：`/common/basic/financial/dividend` 完整路径：`https://data.infoway.io/common/basic/financial/dividend`

#### 请求参数

| 参数名          | 类型     | 必填 | 描述                          | 示例值       |
| ------------ | ------ | -- | --------------------------- | --------- |
| symbol       | String | 是  | 标的代码                        | 00700.HK  |
| type         | String | 是  | 标的类型                        | STOCK\_HK |
| period\_type | String | 否  | 报告周期：`fq`=季度、`fy`=年度，不传返回全部 | fy        |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/dividend?symbol=00700.HK&type=STOCK_HK
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "00700.HK",
      "periodType": "fy",
      "periodDate": "2025-12-31",
      "itemId": "dividend_yield",
      "itemName": "Dividend_yield",
      "itemGroup": "Dividend",
      "itemValue": 1.25,
      "ttmStr": "1.30",
      "currentValue": 1.28
    }
  ]
}
```

#### 返回字段说明

| 字段名          | 类型      | 描述           |
| ------------ | ------- | ------------ |
| symbol       | string  | 标的代码（用户传入格式） |
| periodType   | string  | 报告周期         |
| periodDate   | string  | 报告期          |
| itemId       | string  | 指标 ID        |
| itemName     | string  | 指标名称         |
| itemGroup    | string  | 分组           |
| itemValue    | decimal | 数值           |
| ttmStr       | string  | TTM 值        |
| currentValue | decimal | 当前值          |

***

### 8. 历史派息记录

查询每次派息的除权日、金额、类型。

#### 接口地址

基本路径：`/common/basic/financial/dividend_payout` 完整路径：`https://data.infoway.io/common/basic/financial/dividend_payout`

#### 请求参数

| 参数名    | 类型     | 必填 | 描述   | 示例值       |
| ------ | ------ | -- | ---- | --------- |
| symbol | String | 是  | 标的代码 | AAPL.US   |
| type   | String | 是  | 标的类型 | STOCK\_US |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/dividend_payout?symbol=AAPL.US&type=STOCK_US
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "AAPL.US",
      "exDate": 1747267200000,
      "recordDate": 1747353600000,
      "paymentDate": 1747948800000,
      "amount": 0.26,
      "type": "quarterly"
    }
  ]
}
```

#### 返回字段说明

| 字段名         | 类型      | 描述                                     |
| ----------- | ------- | -------------------------------------- |
| symbol      | string  | 标的代码（用户传入格式）                           |
| exDate      | int64   | 除权日（Unix 毫秒时间戳）                        |
| recordDate  | int64   | 登记日（Unix 毫秒时间戳）                        |
| paymentDate | int64   | 派息日（Unix 毫秒时间戳）                        |
| amount      | decimal | 派息金额                                   |
| type        | string  | 类型：`quarterly` / `interim` / `special` |

***

### 9. 财报数据（EPS/Revenue Beat）

查询 EPS 和 Revenue 的实际值与预期值（Beat/Miss）。

#### 接口地址

基本路径：`/common/basic/financial/earnings` 完整路径：`https://data.infoway.io/common/basic/financial/earnings`

#### 请求参数

| 参数名          | 类型     | 必填 | 描述                          | 示例值       |
| ------------ | ------ | -- | --------------------------- | --------- |
| symbol       | String | 是  | 标的代码                        | AAPL.US   |
| type         | String | 是  | 标的类型                        | STOCK\_US |
| period\_type | String | 否  | 报告周期：`fq`=季度、`fy`=年度，不传返回全部 | fq        |

#### 请求示例

```
GET https://data.infoway.io/common/basic/financial/earnings?symbol=AAPL.US&type=STOCK_US&period_type=fq
```

#### 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "xxx",
  "data": [
    {
      "symbol": "AAPL.US",
      "periodType": "fq",
      "periodKey": "2026-Q1",
      "epsActual": 1.65,
      "epsEstimate": 1.62,
      "epsPercentage": 1.85,
      "revenueActual": 124300000000,
      "revenueEstimate": 122500000000,
      "revenuePercentage": 1.47
    }
  ]
}
```

#### 返回字段说明

| 字段名               | 类型      | 描述                        |
| ----------------- | ------- | ------------------------- |
| symbol            | string  | 标的代码（用户传入格式）              |
| periodType        | string  | 报告周期                      |
| periodKey         | string  | 报告期（如 `2026-Q1` 或 `2025`） |
| epsActual         | decimal | EPS 实际值                   |
| epsEstimate       | decimal | EPS 预期值                   |
| epsPercentage     | decimal | EPS 偏差 %                  |
| revenueActual     | decimal | 收入实际值                     |
| revenueEstimate   | decimal | 收入预期值                     |
| revenuePercentage | decimal | 收入偏差 %                    |

***

### 通用说明

#### type 类型

| 值         | 描述   |
| --------- | ---- |
| STOCK\_US | 美股   |
| STOCK\_CN | A股   |
| STOCK\_HK | 港股   |
| STOCK\_IN | 印度股票 |
| STOCK\_JP | 日本股票 |
| STOCK\_KS | 韩国股票 |

#### symbol 格式

| 市场 | 格式                | 示例          |
| -- | ----------------- | ----------- |
| A股 | `{code}.{suffix}` | 000001.SZ   |
| 港股 | `{code}.HK`       | 00700.HK    |
| 美股 | `{ticker}.US`     | AAPL.US     |
| 印度 | `{ticker}.IN`     | RELIANCE.IN |
| 日本 | `{code}.JP`       | 7203.JP     |
| 韩国 | `{code}.KS`       | 005930.KS   |


# GET个股基本面数据

估值时序、机构评级、公司概览、全景数据、概念标签、公司大事、关键驱动分析

### 接口说明

该系列接口提供个股的基本面信息，包括估值历史、机构评级、公司概览、行业排名、概念标签、公司大事日历及AI关键驱动分析。

### 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考 [接口限制说明](https://docs.infoway.io/getting-started/api-limitation)

### 错误码说明

参考 [HTTP错误码说明](https://docs.infoway.io/getting-started/error-codes/http)

### 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

### 多语言支持 (I18n)

本系列所有接口（个股、市场、板块）均支持多语言返回，您可以通过追加 Query 参数 `lang` 来控制主要名称的语言：

* `lang=en`：返回英文结果（默认）
* `lang=zh-CN`：返回简体中文结果

> \[!TIP] 例如请求 `?lang=zh-CN` 时，板块名称会返回 `安防与报警服务`，而加上 `?lang=en` 时则会返回原生对应的 `Security and Alarm Services`。缓存相互独立，互不影响。

### 标的代码格式

| 市场    | 格式        | 示例          |
| ----- | --------- | ----------- |
| 港股    | `{代码}.HK` | `700.HK`    |
| 美股    | `{代码}.US` | `AAPL.US`   |
| A股上交所 | `{代码}.SH` | `600519.SH` |
| A股深交所 | `{代码}.SZ` | `000001.SZ` |

***

#### 估值时序

获取标的PE/PB历史数据，可用于画估值走势图。

**接口地址**

* 基本路径：`/common/v2/basic/stock/valuation/{symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/stock/valuation/{symbol}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值       |
| -------- | ------ | -- | ---- | --------- |
| `symbol` | String | 是  | 标的代码 | `AAPL.US` |

**返回示例**

```json
{
  "symbol": "AAPL.US",
  "data": {
    "kline_type": "day",
    "pe_list": [
      {"timestamp": "1743177600", "pe": "34.04", "eps": "", "last_done": ""},
      {"timestamp": "1743264000", "pe": "33.81", "eps": "", "last_done": ""}
    ],
    "pb_list": [
      {"timestamp": "1743177600", "pb": "51.20", "bps": "", "last_done": ""}
    ]
  }
}
```

| 字段名           | 类型     | 描述       |
| ------------- | ------ | -------- |
| `kline_type`  | String | K线类型     |
| `pe_list`     | Array  | PE历史数据列表 |
| `> timestamp` | String | 时间戳      |
| `> pe`        | String | 市盈率      |
| `pb_list`     | Array  | PB历史数据列表 |
| `> timestamp` | String | 时间戳      |
| `> pb`        | String | 市净率      |

***

#### 机构评级

获取机构买入/增持/持有/减持/卖出评级家数统计趋势。

**接口地址**

* 基本路径：`/common/v2/basic/stock/ratings/{symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/stock/ratings/{symbol}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值      |
| -------- | ------ | -- | ---- | -------- |
| `symbol` | String | 是  | 标的代码 | `700.HK` |

**返回示例**

```json
{
  "symbol": "700.HK",
  "data": {
    "elist": [
      {
        "buy": "33", "over": "11", "hold": "3",
        "under": "0", "sell": "0", "total": "49",
        "date": "1517328000"
      }
    ]
  }
}
```

| 字段名       | 类型     | 描述     |
| --------- | ------ | ------ |
| `elist`   | Array  | 评级数据列表 |
| `> buy`   | String | 买入家数   |
| `> over`  | String | 增持家数   |
| `> hold`  | String | 持有家数   |
| `> under` | String | 减持家数   |
| `> sell`  | String | 卖出家数   |
| `> total` | String | 总评级家数  |
| `> date`  | String | 日期时间戳  |

***

#### 公司概览

获取公司简介、高管信息、行业分类等基础信息。

**接口地址**

* 基本路径：`/common/v2/basic/stock/company/{symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/stock/company/{symbol}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值      |
| -------- | ------ | -- | ---- | -------- |
| `symbol` | String | 是  | 标的代码 | `700.HK` |

**返回示例**

```json
{
  "symbol": "700.HK",
  "data": {
    "company_name": "腾讯控股",
    "industry": "互联网内容与信息",
    "description": "腾讯控股有限公司是一家主要从事增值服务及网络广告业务的投资控股公司...",
    "executives": [...]
  }
}
```

***

#### 全景数据

获取个股所属行业及行业内排名、所属概念板块列表。

**接口地址**

* 基本路径：`/common/v2/basic/stock/panorama/{symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/stock/panorama/{symbol}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值      |
| -------- | ------ | -- | ---- | -------- |
| `symbol` | String | 是  | 标的代码 | `700.HK` |

**返回示例**

```json
{
  "symbol": "700.HK",
  "data": {
    "belonged_industry": {
      "counter_id": "BK/HK/IN20232",
      "name": "互联网内容与信息",
      "rank": 1,
      "stock_num": 24
    },
    "concepts": {
      "list": [
        {"counter_id": "BK/HK/CP20064", "name": "北水核心资产", "stock_num": 56},
        {"counter_id": "BK/HK/CP20024", "name": "游戏", "stock_num": 30}
      ]
    }
  }
}
```

| 字段名                 | 类型      | 描述      |
| ------------------- | ------- | ------- |
| `belonged_industry` | Object  | 所属行业信息  |
| `> counter_id`      | String  | 行业板块ID  |
| `> name`            | String  | 行业名称    |
| `> rank`            | Integer | 行业内排名   |
| `> stock_num`       | Integer | 行业内股票数量 |
| `concepts.list`     | Array   | 概念板块列表  |
| `> counter_id`      | String  | 概念板块ID  |
| `> name`            | String  | 概念名称    |
| `> stock_num`       | Integer | 概念内股票数量 |

***

#### 概念标签

获取个股所属的所有概念板块标签。

**接口地址**

* 基本路径：`/common/v2/basic/stock/concepts/{symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/stock/concepts/{symbol}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值      |
| -------- | ------ | -- | ---- | -------- |
| `symbol` | String | 是  | 标的代码 | `700.HK` |

**返回示例**

```json
{
  "symbol": "700.HK",
  "data": {
    "concept": {
      "tags": [
        {"name": "游戏", "counter_id": "BK/HK/CP20024", "chg": "-0.336"},
        {"name": "云计算", "counter_id": "BK/HK/CP20062", "chg": "-0.408"}
      ]
    }
  }
}
```

| 字段名            | 类型     | 描述     |
| -------------- | ------ | ------ |
| `concept.tags` | Array  | 概念标签列表 |
| `> name`       | String | 概念名称   |
| `> counter_id` | String | 概念板块ID |
| `> chg`        | String | 涨跌幅    |

***

#### 公司大事

获取公司财报日期、分红日期等事件日历。

**接口地址**

* 基本路径：`/common/v2/basic/stock/events/{symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/stock/events/{symbol}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值      |
| -------- | ------ | -- | ---- | -------- |
| `symbol` | String | 是  | 标的代码 | `700.HK` |

**Request param入参说明**

| 参数名     | 类型      | 必填 | 描述              | 示例值  |
| ------- | ------- | -- | --------------- | ---- |
| `limit` | Integer | 否  | 返回条数，1-100，默认20 | `20` |

**返回示例**

```json
{
  "symbol": "700.HK",
  "data": {
    "items": [
      {
        "event_type": "earnings",
        "event_date": "1774000000",
        "description": "2024年度业绩公告"
      }
    ]
  }
}
```

***

#### 关键驱动分析

获取AI生成的业务驱动因素分析。

**接口地址**

* 基本路径：`/common/v2/basic/stock/drivers/{symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/stock/drivers/{symbol}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值      |
| -------- | ------ | -- | ---- | -------- |
| `symbol` | String | 是  | 标的代码 | `700.HK` |

**返回示例**

```json
{
  "symbol": "700.HK",
  "data": {
    "drivers": [
      {
        "name": "游戏业务",
        "children": [
          {"name": "国内游戏收入", "impact": "high"},
          {"name": "海外游戏收入", "impact": "medium"}
        ]
      }
    ]
  }
}
```


# GET市场概况数据

市场温度、涨跌家数、全球指数、领涨行业、排行榜配置

### 接口说明

该系列接口提供市场维度的概况数据，包括市场温度（估值/情绪）、涨跌家数分布、全球指数列表、领涨行业及排行榜配置。

### 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考 [接口限制说明](https://docs.infoway.io/getting-started/api-limitation)

### 错误码说明

参考 [HTTP错误码说明](https://docs.infoway.io/getting-started/error-codes/http)

### 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

### 支持的市场代码

`HK`（港股）、`US`（美股）、`CN`（A股）

***

#### 市场温度

获取市场估值温度和情绪温度（0-100），可用于判断市场冷热。

**接口地址**

* 基本路径：`/common/v2/basic/market/temperature`
* 完整路径：`https://data.infoway.io/common/v2/basic/market/temperature`

**Request param入参说明**

| 参数名      | 类型     | 必填 | 描述                     | 示例值     |
| -------- | ------ | -- | ---------------------- | ------- |
| `market` | String | 否  | 市场代码，逗号分隔，默认`HK,US,CN` | `HK,US` |

**返回示例**

```json
{
  "markets": ["HK", "US"],
  "data": {
    "list": [
      {
        "market": "HK",
        "temp": "69",
        "temp_intro": "温度适宜并逐渐上升中",
        "valuation": "80",
        "sentiment": "58"
      },
      {
        "market": "US",
        "temp": "36",
        "valuation": "54",
        "sentiment": "18"
      }
    ]
  }
}
```

| 字段名          | 类型     | 描述               |
| ------------ | ------ | ---------------- |
| `market`     | String | 市场代码             |
| `temp`       | String | 综合温度（0-100，越高越热） |
| `temp_intro` | String | 温度描述             |
| `valuation`  | String | 估值温度             |
| `sentiment`  | String | 情绪温度             |

***

#### 涨跌家数

获取市场涨跌家数分布统计。

**接口地址**

* 基本路径：`/common/v2/basic/market/breadth/{market}`
* 完整路径：`https://data.infoway.io/common/v2/basic/market/breadth/{market}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值  |
| -------- | ------ | -- | ---- | ---- |
| `market` | String | 是  | 市场代码 | `HK` |

**返回示例**

```json
{
  "market": "HK",
  "data": {
    "flatline": 928,
    "rise_less_than_three": 816,
    "rise_three_to_five": 200,
    "rise_five_to_seven": 110,
    "rise_more_than_seven": 128,
    "fall_less_than_three": 686,
    "fall_three_to_five": 154,
    "fall_five_to_seven": 69,
    "fall_more_than_seven": 88
  }
}
```

| 字段名                    | 类型      | 描述        |
| ---------------------- | ------- | --------- |
| `flatline`             | Integer | 平盘家数      |
| `rise_less_than_three` | Integer | 涨幅<3%家数   |
| `rise_three_to_five`   | Integer | 涨幅3%-5%家数 |
| `rise_five_to_seven`   | Integer | 涨幅5%-7%家数 |
| `rise_more_than_seven` | Integer | 涨幅>7%家数   |
| `fall_less_than_three` | Integer | 跌幅<3%家数   |
| `fall_three_to_five`   | Integer | 跌幅3%-5%家数 |
| `fall_five_to_seven`   | Integer | 跌幅5%-7%家数 |
| `fall_more_than_seven` | Integer | 跌幅>7%家数   |

***

#### 全球指数

获取全球主要指数列表。

**接口地址**

* 基本路径：`/common/v2/basic/market/indexes`
* 完整路径：`https://data.infoway.io/common/v2/basic/market/indexes`

**返回示例**

```json
{
  "data": {
    "indexes": [
      {"counter_id": "IX/US/.DJI", "name": "道琼斯", "market": "US"},
      {"counter_id": "IX/US/.IXIC", "name": "纳斯达克", "market": "US"},
      {"counter_id": "IX/US/.SPX", "name": "标普 500", "market": "US"},
      {"counter_id": "IX/HK/HSI", "name": "恒生指数", "market": "HK"},
      {"counter_id": "IX/HK/HSTECH", "name": "恒生科技", "market": "HK"},
      {"counter_id": "IX/SH/000001", "name": "上证指数", "market": "CN"},
      {"counter_id": "IX/SZ/399001", "name": "深证成指", "market": "CN"},
      {"counter_id": "IX/SZ/399006", "name": "创业板指", "market": "CN"}
    ]
  }
}
```

| 字段名          | 类型     | 描述   |
| ------------ | ------ | ---- |
| `counter_id` | String | 指数ID |
| `name`       | String | 指数名称 |
| `market`     | String | 所属市场 |

***

#### 领涨行业

获取当日领涨行业及龙头股。

**接口地址**

* 基本路径：`/common/v2/basic/market/leaders/{market}`
* 完整路径：`https://data.infoway.io/common/v2/basic/market/leaders/{market}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值  |
| -------- | ------ | -- | ---- | ---- |
| `market` | String | 是  | 市场代码 | `HK` |

**Request param入参说明**

| 参数名     | 类型      | 必填 | 描述              | 示例值  |
| ------- | ------- | -- | --------------- | ---- |
| `limit` | Integer | 否  | 返回行业数，1-50，默认10 | `10` |

**返回示例**

```json
{
  "market": "HK",
  "data": {
    "lists": [
      {
        "counter_id": "BK/HK/IN20351",
        "name": "保险经纪公司",
        "chg": "0.1535",
        "leading_name": "众淼控股",
        "leading_last_done": "40.400",
        "leading_chg": "0.1717",
        "rise_num": 2,
        "fall_num": 0
      }
    ]
  }
}
```

| 字段名                 | 类型      | 描述     |
| ------------------- | ------- | ------ |
| `counter_id`        | String  | 行业板块ID |
| `name`              | String  | 行业名称   |
| `chg`               | String  | 行业涨跌幅  |
| `leading_name`      | String  | 龙头股名称  |
| `leading_last_done` | String  | 龙头股最新价 |
| `leading_chg`       | String  | 龙头股涨跌幅 |
| `rise_num`          | Integer | 上涨家数   |
| `fall_num`          | Integer | 下跌家数   |

***


# GET板块数据

行业板块列表、概念板块列表、板块成分股、行业介绍

### 接口说明

该系列接口提供板块维度的数据，包括行业板块列表、概念板块列表、板块成分股查询及行业AI分析介绍。

### 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考 [接口限制说明](https://docs.infoway.io/getting-started/api-limitation)

### 错误码说明

参考 [HTTP错误码说明](https://docs.infoway.io/getting-started/error-codes/http)

### 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

### 板块代码格式

| 类型   | 格式            | 示例                    |
| ---- | ------------- | --------------------- |
| 行业板块 | `IN{数字}.{市场}` | `IN20293.HK`（多元化银行）   |
| 概念板块 | `CP{数字}.{市场}` | `CP20027.HK`（生物医药B类股） |

### 支持的市场代码

`HK`（港股）、`US`（美股）、`CN`（A股）

***

#### 行业板块列表

获取指定市场的所有行业板块。

**接口地址**

* 基本路径：`/common/v2/basic/plate/industry/{market}`
* 完整路径：`https://data.infoway.io/common/v2/basic/plate/industry/{market}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值  |
| -------- | ------ | -- | ---- | ---- |
| `market` | String | 是  | 市场代码 | `HK` |

**Request param入参说明**

| 参数名     | 类型      | 必填 | 描述               | 示例值   |
| ------- | ------- | -- | ---------------- | ----- |
| `limit` | Integer | 否  | 返回数量，1-300，默认200 | `200` |

**返回示例**

```json
{
  "market": "HK",
  "count": 5,
  "data": [
    {
      "symbol": "IN20335.HK",
      "counter_id": "BK/HK/IN20335",
      "name": "安防与报警服务",
      "type": "industry",
      "chg": "0.0615",
      "last_done": "490.292",
      "change": "28.417",
      "rise": "1",
      "fall": "0",
      "total_amount": "3740100",
      "market_cap": "715513802"
    }
  ]
}
```

| 字段名            | 类型     | 描述          |
| -------------- | ------ | ----------- |
| `symbol`       | String | 板块代码        |
| `counter_id`   | String | 板块内部追溯ID    |
| `name`         | String | 板块名称        |
| `type`         | String | 板块分类        |
| `chg`          | String | 整体涨跌幅百分比    |
| `last_done`    | String | 当前板块点位（最新价） |
| `change`       | String | 变动点数        |
| `rise`         | String | 上涨家数        |
| `fall`         | String | 下跌家数        |
| `total_amount` | String | 成交额         |
| `market_cap`   | String | 板块总市值       |

***

#### 概念板块列表

获取指定市场的概念/热门板块(暂不支持A股)。

**接口地址**

* 基本路径：`/common/v2/basic/plate/concept/{market}`
* 完整路径：`https://data.infoway.io/common/v2/basic/plate/concept/{market}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值  |
| -------- | ------ | -- | ---- | ---- |
| `market` | String | 是  | 市场代码 | `HK` |

**Request param入参说明**

| 参数名     | 类型      | 必填 | 描述               | 示例值   |
| ------- | ------- | -- | ---------------- | ----- |
| `limit` | Integer | 否  | 返回数量，1-100，默认100 | `100` |

**返回示例**

```json
{
  "market": "HK",
  "count": 3,
  "data": [
    {
      "symbol": "CP20027.HK",
      "counter_id": "BK/HK/CP20027",
      "name": "生物医药 B 类股",
      "chg": "0.0736",
      "intro": "符合港交所B类股上市规则的生物科技企业"
    }
  ]
}
```

| 字段名          | 类型     | 描述   |
| ------------ | ------ | ---- |
| `symbol`     | String | 板块代码 |
| `counter_id` | String | 板块ID |
| `name`       | String | 概念名称 |
| `chg`        | String | 涨跌幅  |
| `intro`      | String | 概念简介 |

***

#### 板块成分股

获取指定行业或概念板块下的所有成分股，支持分页。

**接口地址**

* 基本路径：`/common/v2/basic/plate/members/{plate_symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/plate/members/{plate_symbol}`

**路径参数**

| 参数名            | 类型     | 必填 | 描述   | 示例值          |
| -------------- | ------ | -- | ---- | ------------ |
| `plate_symbol` | String | 是  | 板块代码 | `IN20293.HK` |

**Request param入参说明**

| 参数名      | 类型      | 必填 | 描述             | 示例值  |
| -------- | ------- | -- | -------------- | ---- |
| `offset` | Integer | 否  | 分页偏移，默认0       | `0`  |
| `limit`  | Integer | 否  | 每页数量，1-50，默认50 | `50` |

**返回示例**

```json
{
  "plate": "IN20293.HK",
  "counter_id": "BK/HK/IN20293",
  "data": {
    "total": 18,
    "offset": 0,
    "limit": 50,
    "members": [
      {"symbol": "1988.HK", "name": "民生银行", "last_done": "3.870", "chg": "0.0104"},
      {"symbol": "1658.HK", "name": "邮储银行", "last_done": "4.960", "chg": "0.0102"},
      {"symbol": "939.HK", "name": "建设银行", "last_done": "8.090", "chg": "0.0100"}
    ]
  }
}
```

| 字段名           | 类型      | 描述     |
| ------------- | ------- | ------ |
| `total`       | Integer | 成分股总数  |
| `offset`      | Integer | 当前偏移   |
| `limit`       | Integer | 当前每页数量 |
| `members`     | Array   | 成分股列表  |
| `> symbol`    | String  | 标的代码   |
| `> name`      | String  | 股票名称   |
| `> last_done` | String  | 最新价    |
| `> chg`       | String  | 涨跌幅    |

***

#### 行业介绍

获取行业的AI分析报告。

**接口地址**

* 基本路径：`/common/v2/basic/plate/intro/{plate_symbol}`
* 完整路径：`https://data.infoway.io/common/v2/basic/plate/intro/{plate_symbol}`

**路径参数**

| 参数名            | 类型     | 必填 | 描述   | 示例值          |
| -------------- | ------ | -- | ---- | ------------ |
| `plate_symbol` | String | 是  | 板块代码 | `IN20293.HK` |

**返回示例**

```json
{
  "plate": "IN20293.HK",
  "intro": "「多元化银行」包括提供广泛金融服务的大型银行机构。这些银行通常在香港及国际上拥有广泛的分行网络..."
}
```

| 字段名     | 类型     | 描述          |
| ------- | ------ | ----------- |
| `plate` | String | 板块代码        |
| `intro` | String | AI生成的行业分析介绍 |

***

#### 板块热力行情图 (Chart)

专用于前端渲染板块 Heatmap 或板块气泡分布图，拉平返回每个板块在该市场的权重占比 (Weight) 以及市值。

**接口地址**

* 基本路径：`/common/v2/basic/plate/chart/{market}`
* 完整路径：`https://data.infoway.io/common/v2/basic/plate/chart/{market}`

**路径参数**

| 参数名      | 类型     | 必填 | 描述   | 示例值  |
| -------- | ------ | -- | ---- | ---- |
| `market` | String | 是  | 市场代码 | `HK` |

**Request param入参说明**

| 参数名     | 类型      | 必填 | 描述         | 示例值   |
| ------- | ------- | -- | ---------- | ----- |
| `limit` | Integer | 否  | 返回数量，默认500 | `200` |

**返回示例**

```json
{
  "market": "HK",
  "count": 2,
  "data": [
    {
      "symbol": "IN20293.HK",
      "counter_id": "BK/HK/IN20293",
      "name": "多元化银行",
      "type": "industry",
      "chg": "0.0064",
      "market_cap": "14777418247285",
      "market_weight": "0.1952"
    }
  ]
}
```

| 字段名             | 类型     | 描述                       |
| --------------- | ------ | ------------------------ |
| `symbol`        | String | 板块代码                     |
| `name`          | String | 板块名称                     |
| `chg`           | String | 板块整体涨跌幅                  |
| `market_cap`    | String | 整体市值                     |
| `market_weight` | String | 该板块市值占整个市场市值的权重系数（0-1之间） |


# 行情数据查询


# GET获取产品的实时成交明细(Trade)

获取股票、加密货币、外汇、能源、商品等所有产品的实时成交明细

## 接口说明

该接口是获取股票、加密货币、外汇、能源、商品等所有产品的实时成交明细

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

### 股票接口（包含美股、港股、A股）：

* 基本路径：`/stock/batch_trade/{codes}`
* 完整路径：`https://data.infoway.io  /stock/batch_trade/{codes}`

### 日本股接口：

* 基本路径：`/japan/batch_trade/{codes}`
* 完整路径：`https://data.infoway.io  /japan/batch_trade/{codes}`

### 印度股接口：

* 基本路径：`/india/batch_trade/{codes}`
* 完整路径：`https://data.infoway.io  /india/batch_trade/{codes}`

### 韩国股接口：

* 基本路径：`/korea/batch_trade/{codes}`
* 完整路径：`https://data.infoway.io  /korea/batch_trade/{codes}`

### 加密货币接口：

* 基本路径：`/crypto/batch_trade/{codes}`
* 完整路径：`https://data.infoway.io/crypto/batch_trade/{codes}`

### 外汇、新能源、商品、贵金属、期货等产品接口：

* 基本路径：`/common/batch_trade/{codes}`
* 完整路径：`https://data.infoway.io  /common/batch_trade/{codes}`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## 入参说明

| 参数名     | 类型     | 必填 | 描述                                                                              | 示例值               |
| ------- | ------ | -- | ------------------------------------------------------------------------------- | ----------------- |
| `codes` | String | 是  | 查询的产品代码，多个之间用,分隔。可参考[产品列表](/rest-api/basic-info/get-symbol-list)，最多支持100个产品一起查询 | `TSLA.US,AAPL.US` |

## 返回示例

```json
{
  "ret": 200,
  "msg": "success",
  "traceId": "27bdafb1-c735-4499-aad1-553820284895",
  "data": [
    {
      "s": "XAUAUD",
      "t": 1750177346523,
      "p": "5188.211",
      "v": "3.0",
      "vw": "15564.6330",
      "td": 0
    },
    {
      "s": "USDCNY",
      "t": 1750175583124,
      "p": "7.184",
      "v": "1.0",
      "vw": "7.1840",
      "td": 0
    }
  ]
}
```

| 字段名  | 类型     | 必填 | 描述   | 示例值                         |
| ---- | ------ | -- | ---- | --------------------------- |
| `s`  | String | 是  | 标的名称 | `USDCNY`                    |
| `t`  | Long   | 是  | 交易时间 | `1747382898892`             |
| `p`  | String | 是  | 价格   | `34.650`                    |
| `v`  | String | 是  | 成交量  | `439000`                    |
| `vw` | String | 是  | 成交额  | `15211350.000`              |
| `td` | Int    | 是  | 交易方向 | `[0,1,2]`0为默认值，1为Buy，2为SELL |


# GET获取产品的实时买卖盘口(Depth)

获取股票、加密货币、外汇、能源、商品等所有产品的实时买卖盘口

## 接口说明

该接口是获取股票、加密货币、外汇、能源、商品等所有产品的实时买卖盘口

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

### 股票接口（包括美股、港股、A股）：

* 基本路径：`/stock/batch_depth/{codes}`
* 完整路径：`https://data.infoway.io  /stock/batch_depth/{codes}`

### 日本股接口：

* 基本路径：`/japan/batch_depth/{codes}`
* 完整路径：`https://data.infoway.io  /japan/batch_depth/{codes}`

### 印度股接口：

* 基本路径：`/india/batch_depth/{codes}`
* 完整路径：`https://data.infoway.io  /india/batch_depth/{codes}`

### 韩国股接口：

* 基本路径：`/korea/batch_depth/{codes}`
* 完整路径：`https://data.infoway.io  /korea/batch_depth/{codes}`

### 加密货币接口：

* 基本路径：`/crypto/batch_depth/{codes}`
* 完整路径：`https://data.infoway.io/crypto/batch_depth/{codes}`

### 外汇、新能源、商品、贵金属、期货等产品接口：

* 基本路径：`/common/batch_depth/{codes}`
* 完整路径：`https://data.infoway.io  /common/batch_depth/{codes}`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## 入参说明

| 参数名     | 类型     | 必填 | 描述                                                                              | 示例值               |
| ------- | ------ | -- | ------------------------------------------------------------------------------- | ----------------- |
| `codes` | String | 是  | 查询的产品代码，多个之间用,分隔。可参考[产品列表](/rest-api/basic-info/get-symbol-list)，最多支持100个产品一起查询 | `TSLA.US,AAPL.US` |

## 返回示例

```json
{
    "ret": 200,
    "msg": "success",
    "traceId": "81688452-dd7c-4de7-b423-b5e39d18e298",
    "data": [
        {
            "s": "01810.HK",
            "t": 1769760489943,
            "a": [
                [
                    "35.520",
                    "35.540",
                    "35.560",
                    "35.580",
                    "35.600",
                    "35.620",
                    "35.640",
                    "35.660",
                    "35.680",
                    "35.700"
                ],
                [
                    "3031600",
                    "134600",
                    "475600",
                    "754400",
                    "1225600",
                    "946800",
                    "1173800",
                    "689000",
                    "805200",
                    "2437200"
                ]
            ],
            "b": [
                [
                    "35.500",
                    "35.480",
                    "35.460",
                    "35.440",
                    "35.420",
                    "35.400",
                    "35.380",
                    "35.360",
                    "35.340",
                    "35.320"
                ],
                [
                    "433800",
                    "858400",
                    "784400",
                    "1018200",
                    "1118600",
                    "1969200",
                    "1167200",
                    "883200",
                    "1298400",
                    "420800"
                ]
            ]
        }
    ]
}
```

| 字段名 | 类型     | 必填 | 描述                                     | 示例值                           |
| --- | ------ | -- | -------------------------------------- | ----------------------------- |
| `s` | String | 是  | 标的代码                                   | `00285.HK`                    |
| `t` | Long   | 是  | 交易时间                                   | `1747382898892`               |
| `a` | Array  | 是  | 卖盘(第一个数组表示价格 第二个数组表示成交股数，用下标对应 这里表示五档) | `[[1,2,3,4,5],[4,5,6,7,8,9]]` |
| `b` | Array  | 是  | 买盘(第一个数组表示价格 第二个数组表示成交股数，用下标对应 这里表示五档) | `[[1,2,3,4,5],[4,5,6,7,8,9]]` |


# POST 获取产品的历史/实时K线(Candles)

获取股票、加密货币、外汇、能源、商品等所有产品的实时买卖盘口

## 接口说明

该接口是获取股票、加密货币、外汇、能源、商品等所有产品的历史/实时K线(Candles)

## 请求频率

跟其他接口请求频率使用同一个频率限制。具体每秒请求次数根据套餐决定。可以参考[接口限制说明](/getting-started/api-limitation)

## 错误码说明

参考[HTTP错误码说明](/getting-started/error-codes/http)

## 接口地址

### 股票接口（包括美股、港股、A股）(不复权)：

* 基本路径：`/stock/v2/batch_kline`
* 完整路径：`https://data.infoway.io/stock/v2/batch_kline`

### 日本股接口( 不复权)：

* 基本路径：`/japan/v2/batch_kline`
* 完整路径：`https://data.infoway.io/japan/v2/batch_kline`

### 印度股接口(不复权)：

* 基本路径：`/india/v2/batch_kline`
* 完整路径：`https://data.infoway.io/india/v2/batch_kline`

### 韩国股接口(不复权)：

* 基本路径：`/korea/v2/batch_kline`
* 完整路径：`https://data.infoway.io/korea/v2/batch_kline`

### 加密货币接口：

* 基本路径：`/crypto/v2/batch_kline`
* 完整路径：`https://data.infoway.io/crypto/v2/batch_kline`

### 外汇、新能源、商品、贵金属、期货等产品接口：

* 基本路径：`/common/v2/batch_kline`
* 完整路径：`https://data.infoway.io/common/v2/batch_kline`

## 请求头

| 参数       | 类型     | 必填 | 描述           |
| -------- | ------ | -- | ------------ |
| `apiKey` | String | 是  | 您套餐中的API Key |

## Request Body入参说明（JSON）

## 入参示例

```json
{
    "klineType":1, //kline类型
    "klineNum":10, //k线数量
    "codes":"TSLA.US,AAPL.US", //查询产品，逗号分隔
    "timestamp":1758553860 //最近截止时间戳（不传默认查询当前最新k）
}
```

<table><thead><tr><th>参数名</th><th>类型</th><th width="111">必填</th><th width="229">描述</th><th>示例值</th></tr></thead><tbody><tr><td><code>klineType</code></td><td>int</td><td>是</td><td>kline类型。1：1分钟k；2：5分钟k；3：15分钟k；4：30分钟k；5：1小时k；6：2小时k；7：4小时k；8：日k；9：周k；10：月k；11：季k；12：年k</td><td><code>1</code></td></tr><tr><td><code>klineNum</code></td><td>int</td><td>是</td><td>查询k线的数量（单产品最大可以查询500根K线；<strong>多产品同时查询只能查询不同产品最近2根k</strong>）</td><td><code>500</code></td></tr><tr><td><code>codes</code></td><td>String</td><td>是</td><td>查询的产品代码，多个之间用逗号分隔(<strong>最多可同时查询100个产品K线</strong>)。可参考<a href="/pages/bgp21aAl0tBowlIEj795">产品列表</a></td><td><code>TSLA.US,AAPL.US</code></td></tr><tr><td><code>timestamp</code></td><td>long</td><td>否</td><td><strong>只针对分钟K以及小时K限制，日K及以上类型不限制</strong><br><strong>秒时间戳</strong>，支持根据秒时间戳向前<strong>查询历史kline</strong>，不传默认查询最近的kline（可查询范围根据套餐权限决定）</td><td>1727007864</td></tr></tbody></table>

## 返回示例

```json
{
    "ret": 200,
    "msg": "success",
    "traceId": "19814db2-42f7-4788-9b51-b2001bf17953",
    "data": [
        {
            "s": "TSLA.US",
            "respList": [
                {
                    "t": "1751372340",
                    "h": "298.620",
                    "o": "298.439",
                    "l": "298.100",
                    "c": "298.310",
                    "v": "24329",
                    "vw": "7259092.235",
                    "pc": "-0.02%",
                    "pca": "-0.070"
                },
                {
                    "t": "1751372280",
                    "h": "298.450",
                    "o": "298.090",
                    "l": "298.000",
                    "c": "298.380",
                    "v": "32214",
                    "vw": "9607344.900",
                    "pc": "0.10%",
                    "pca": "0.290"
                }
            ]
        },
        {
            "s": "01810.HK",
            "respList": [
                {
                    "t": "1751270400",
                    "h": "59.950",
                    "o": "59.950",
                    "l": "59.950",
                    "c": "59.950",
                    "v": "23669600",
                    "vw": "1418992520.000",
                    "pc": "0.50%",
                    "pca": "0.300"
                },
                {
                    "t": "1751270340",
                    "h": "59.700",
                    "o": "59.650",
                    "l": "59.650",
                    "c": "59.650",
                    "v": "829002",
                    "vw": "49466778.300",
                    "pc": "-0.08%",
                    "pca": "-0.050"
                }
            ]
        }
    ]
}
```

| 字段名        | 类型     | 必填 | 描述   | 示例值           |
| ---------- | ------ | -- | ---- | ------------- |
| `s`        | String | 是  | 标的代码 | `USDCNY`      |
| `respList` | Array  | 是  | k线列表 | 参考下面的respList |

### respList

| 字段名   | 类型     | 必填 | 描述                  | 示例值          |
| ----- | ------ | -- | ------------------- | ------------ |
| `t`   | String | 是  | 成交时间（秒时间戳，顺序从大到小排列） | `1751270340` |
| `h`   | String | 是  | 最高价                 | `18.01`      |
| `o`   | String | 是  | 开盘价                 | `18.01`      |
| `l`   | String | 是  | 最低价                 | `18.01`      |
| `c`   | String | 是  | 收盘价                 | `18.01`      |
| `v`   | String | 是  | 成交量                 | `18000`      |
| `vw`  | String | 是  | 成交额                 | `20000`      |
| `pc`  | String | 是  | 涨跌幅                 | `0.12%`      |
| `pca` | String | 是  | 涨跌额                 | `0.11`       |


# Websocket订阅地址说明

### Websocket地址

股票产品（包括美股、港股、A股）订阅地址：

```
wss://data.infoway.io/ws?business=stock&apikey=YourAPIKey
```

日本股产品订阅地址：

```
wss://data.infoway.io/ws?business=japan&apikey=YourAPIKey
```

印度股产品订阅地址：

```
wss://data.infoway.io/ws?business=india&apikey=YourAPIKey
```

韩国股产品订阅地址：

```
wss://data.infoway.io/ws?business=korea&apikey=YourAPIKey
```

数字币产品订阅地址：

```
wss://data.infoway.io/ws?business=crypto&apikey=YourAPIKey
```

外汇、期货等产品订阅地址：

```
wss://data.infoway.io/ws?business=common&apikey=YourAPIKey
```

[代码示例](/websocket-api/code-examples)


# Websocket代码示例

WebSocket代码示例，获取实时成交明细、盘口、k线。包括自动重连，心跳检测机制。

{% tabs %}
{% tab title="Java" %}

```java
package com.ws.server;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.websocket.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URI;
import java.util.concurrent.*;

@ClientEndpoint
@Slf4j
@Component
public class WebsocketExample {

    // 本地session通道（使用volatile保证多线程可见性）
    private volatile Session session;

    // wss连接地址 business可以为stock、crypto、common；apikey为您的凭证
    private static final String WS_URL = "wss://data.infoway.io/ws?business=crypto&apikey=yourApikey";

    // 定时任务池（统一管理，避免创建多个线程池）
    private ScheduledExecutorService scheduledExecutorService;

    // 心跳定时任务（全局仅保留一份，重连前须取消）
    private volatile ScheduledFuture<?> heartbeatFuture;

    @PostConstruct
    public void connectAll() {
        // 初始化线程池（核心线程1个，避免资源浪费）
        scheduledExecutorService = Executors.newScheduledThreadPool(1);

        try {
            // 建立WEBSOCKET连接
            connect(WS_URL);
            // 开启自动重连（延迟1秒启动，每10秒检查一次）
            startReconnection(WS_URL);
        } catch (Exception e) {
            log.error("初始化WebSocket连接失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 自动重连机制
     * @param wsUrl WebSocket连接地址
     */
    private void startReconnection(String wsUrl) {
        Runnable reconnectTask = () -> {
            if (session == null || !session.isOpen()) {
                log.warn("WebSocket连接已断开，开始重连...");
                connect(wsUrl);
            }
        };
        // 延迟1秒启动，每10秒执行一次重连检查
        scheduledExecutorService.scheduleAtFixedRate(reconnectTask, 1, 10, TimeUnit.SECONDS);
    }

    /**
     * 建立WEBSOCKET连接具体实现
     * @param wsUrl 连接地址
     */
    private void connect(String wsUrl) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();

            cancelHeartbeatTask();

            // 关闭旧连接（防止连接泄露）
            if (session != null && session.isOpen()) {
                session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "重新连接"));
            }
            // 建立新连接
            session = container.connectToServer(this, URI.create(wsUrl));
            log.info("WebSocket连接成功，sessionId: {}", session.getId());
        } catch (DeploymentException | IOException e) {
            log.error("WebSocket连接失败: {}", e.getMessage(), e);
            // 连接失败时清空session，触发下次重连
            session = null;
        }
    }

    /**
     * WebSocket连接建立成功后触发
     */
    @OnOpen
    public void onOpen(Session session) {
        // 更新全局session
        this.session = session;
        log.info("Connection opened: {}", session.getId());

        // 异步发送订阅请求（避免阻塞OnOpen线程）
        scheduledExecutorService.submit(() -> {
            try {
                // 1. 订阅实时成交明细（协议号10000）
                sendTradeSubscribe(session);
                TimeUnit.MILLISECONDS.sleep(5000); // 间隔5秒

                // 2. 订阅实时盘口数据（协议号10003）
                sendDepthSubscribe(session);
                TimeUnit.MILLISECONDS.sleep(5000); // 间隔5秒

                // 3. 订阅1分钟K线数据（协议号10006）
                sendKlineSubscribe(session);

                // 4. 启动心跳任务（30秒一次，绑定当前 session）
                startHeartbeatTask(session);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // 恢复中断状态
                log.error("发送订阅请求时线程被中断: {}", e.getMessage());
            } catch (IOException e) {
                log.error("发送订阅请求失败: {}", e.getMessage(), e);
            }
        });
    }

    /**
     * 发送实时成交明细订阅请求
     */
    private void sendTradeSubscribe(Session session) throws IOException {
        JSONObject tradeSendObj = new JSONObject();
        tradeSendObj.put("code", 10000); // 订阅成交明细协议号
        tradeSendObj.put("trace", generateTraceId()); // 自定义traceId
        JSONObject data = new JSONObject();
        data.put("codes", "BTCUSDT"); // 订阅BTCUSDT
        tradeSendObj.put("data", data);
        session.getBasicRemote().sendText(tradeSendObj.toJSONString());
        log.info("发送成交明细订阅请求: {}", tradeSendObj);
    }

    /**
     * 发送实时盘口数据订阅请求
     */
    private void sendDepthSubscribe(Session session) throws IOException {
        JSONObject depthSendObj = new JSONObject();
        depthSendObj.put("code", 10003); // 订阅盘口协议号
        depthSendObj.put("trace", generateTraceId());
        JSONObject data = new JSONObject();
        data.put("codes", "BTCUSDT");
        depthSendObj.put("data", data);
        session.getBasicRemote().sendText(depthSendObj.toJSONString());
        log.info("发送盘口数据订阅请求: {}", depthSendObj);
    }

    /**
     * 发送实时K线数据订阅请求
     */
    private void sendKlineSubscribe(Session session) throws IOException {
        JSONObject klineSendObj = new JSONObject();
        klineSendObj.put("code", 10006); // 订阅K线协议号
        klineSendObj.put("trace", generateTraceId());

        JSONObject klineData = new JSONObject();
        JSONArray klineDataArray = new JSONArray();

        JSONObject kline1minObj = new JSONObject();
        kline1minObj.put("type", 1); // 1分钟K线
        kline1minObj.put("codes", "BTCUSDT");
        klineDataArray.add(kline1minObj);
        klineData.put("arr", klineDataArray);

        klineSendObj.put("data", klineData);
        session.getBasicRemote().sendText(klineSendObj.toJSONString());
        log.info("发送K线数据订阅请求: {}", klineSendObj);
    }

    /**
     * 取消心跳定时任务
     */
    private void cancelHeartbeatTask() {
        ScheduledFuture<?> future = heartbeatFuture;
        if (future != null) {
            future.cancel(false);
            heartbeatFuture = null;
        }
    }

    /**
     * 启动心跳保活任务（重连时会先取消旧任务，保证全局只有一个心跳调度）
     */
    private void startHeartbeatTask(Session activeSession) {
        cancelHeartbeatTask();

        Runnable heartbeatTask = () -> {
            try {
                if (activeSession.isOpen() && activeSession == this.session) {
                    JSONObject pingObj = new JSONObject();
                    pingObj.put("code", 10010); // 心跳协议号
                    pingObj.put("trace", generateTraceId());
                    activeSession.getBasicRemote().sendText(pingObj.toJSONString());
                    log.debug("发送心跳包: {}", pingObj);
                }
            } catch (IOException e) {
                log.error("发送心跳包失败: {}", e.getMessage(), e);
            }
        };
        // 延迟30秒启动，每30秒发送一次心跳
        heartbeatFuture = scheduledExecutorService.scheduleAtFixedRate(heartbeatTask, 30, 30, TimeUnit.SECONDS);
    }

    /**
     * 接收服务端推送的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("收到服务端消息: {}", message);
        // 这里可以解析消息并处理业务逻辑
        // 示例：解析JSON消息
        try {
            JSONObject msgObj = JSONObject.parseObject(message);
            Integer code = msgObj.getInteger("code");
            String trace = msgObj.getString("trace");
            JSONObject data = msgObj.getJSONObject("data");

            // 根据协议号区分消息类型
            switch (code) {
                case 10000: // 成交明细数据
                    handleTradeData(data);
                    break;
                case 10003: // 盘口数据
                    handleDepthData(data);
                    break;
                case 10006: // K线数据
                    handleKlineData(data);
                    break;
                case 10010: // 心跳响应
                    log.debug("收到心跳响应，trace: {}", trace);
                    break;
                default:
                    log.warn("未知协议号的消息: {}", code);
            }
        } catch (Exception e) {
            log.error("解析消息失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 处理成交明细数据
     */
    private void handleTradeData(JSONObject data) {
        // 实现业务逻辑，比如入库、推送前端等
        log.info("处理成交明细数据: {}", data);
    }

    /**
     * 处理盘口数据
     */
    private void handleDepthData(JSONObject data) {
        // 实现业务逻辑
        log.info("处理盘口数据: {}", data);
    }

    /**
     * 处理K线数据
     */
    private void handleKlineData(JSONObject data) {
        // 实现业务逻辑
        log.info("处理K线数据: {}", data);
    }

    /**
     * 连接关闭时触发
     */
    @OnClose
    public void onClose(Session session, CloseReason reason) {
        log.info("Connection closed: {}, reason: {}", session.getId(), reason);
        cancelHeartbeatTask();
        // 清空session，触发重连
        this.session = null;
    }

    /**
     * 连接出错时触发
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("WebSocket错误，sessionId: {}", session.getId(), error);
        cancelHeartbeatTask();
        // 清空session，触发重连
        this.session = null;
    }

    /**
     * 生成唯一traceId（示例实现，可替换为UUID）
     */
    private String generateTraceId() {
        return java.util.UUID.randomUUID().toString();
    }

    /**
     * 销毁Bean时关闭线程池和连接
     */
    @PreDestroy
    public void destroy() {
        log.info("销毁WebSocket客户端，关闭资源...");
        cancelHeartbeatTask();
        // 关闭session
        if (session != null && session.isOpen()) {
            try {
                session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "应用关闭"));
            } catch (IOException e) {
                log.error("关闭session失败", e);
            }
        }
        // 关闭线程池
        if (scheduledExecutorService != null) {
            scheduledExecutorService.shutdown();
            try {
                if (!scheduledExecutorService.awaitTermination(5, TimeUnit.SECONDS)) {
                    scheduledExecutorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                scheduledExecutorService.shutdownNow();
            }
        }
    }
}
```

{% endtab %}

{% tab title="Python" %}

```python
import os
import asyncio
import json
import uuid
import logging
from typing import Optional

import websockets
from websockets.asyncio.client import ClientConnection
from websockets.exceptions import ConnectionClosed

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    handlers=[logging.StreamHandler()]
)
logger = logging.getLogger("websocket-client")

# --- 协议号 -----------------------------------------------------------------
# 服务端遵循 “请求码 +1 = 订阅确认，请求码 +2 = 数据推送” 的约定。
# 订阅请求码（由客户端发送）：
REQ_TRADE = 10000   # 实时成交明细
REQ_DEPTH = 10003   # 盘口 / 深度
REQ_KLINE = 10006   # K线
REQ_HEARTBEAT = 10010

# 数据推送码（由服务端发送）：
PUSH_CONNECTED = 200     # 连接建立成功
PUSH_TRADE = 10002       # 成交数据
PUSH_DEPTH = 10005       # 盘口数据
PUSH_KLINE = 10008       # K线数据
# 订阅确认码（10001 / 10004 / 10007）仅表示订阅成功。
ACK_CODES = {10001, 10004, 10007}


class CryptoWebsocketClient:
    """加密货币行情 WebSocket 客户端（兼容 websockets >= 14）。

    单连接设计：由一个主循环统一管理连接生命周期
    （连接 -> 订阅 -> 监听），断开后按指数退避重连。
    不再有并行的重连任务，避免重复开启连接（这是触发服务端
    429 限流的根因之一）。
    """

    def __init__(self, api_key: str, business: str = "crypto"):
        # WebSocket 连接配置
        self.ws_url = f"wss://data.infoway.io/ws?business={business}&apikey={api_key}"
        # 核心状态
        self.ws: Optional[ClientConnection] = None
        self.running = True
        # 重连退避配置（秒）
        self.reconnect_base = 5
        self.reconnect_max = 60
        # 心跳
        self.heartbeat_interval = 30  # 秒
        self.heartbeat_task: Optional[asyncio.Task] = None

    @staticmethod
    def _generate_trace_id() -> str:
        """生成唯一 trace ID（对等 Java 的 UUID）。"""
        return str(uuid.uuid4())

    # --- 订阅 ---------------------------------------------------------------
    async def _send(self, msg: dict) -> None:
        """序列化并通过当前连接发送消息。"""
        assert self.ws is not None
        await self.ws.send(json.dumps(msg))

    async def _send_all_subscribe_requests(self) -> None:
        """发送所有订阅请求（成交明细、盘口、K线）。"""
        # 1. 实时成交明细（协议号 10000）
        await self._send({
            "code": REQ_TRADE,
            "trace": self._generate_trace_id(),
            "data": {"codes": "BTCUSDT"},
        })
        logger.info("发送成交明细订阅 (code=%s)", REQ_TRADE)

        # 2. 实时盘口数据（协议号 10003）
        await self._send({
            "code": REQ_DEPTH,
            "trace": self._generate_trace_id(),
            "data": {"codes": "BTCUSDT"},
        })
        logger.info("发送盘口数据订阅 (code=%s)", REQ_DEPTH)

        # 3. 1 分钟 K 线（协议号 10006，type=1 表示 1 分钟）
        await self._send({
            "code": REQ_KLINE,
            "trace": self._generate_trace_id(),
            "data": {"arr": [{"type": 1, "codes": "BTCUSDT"}]},
        })
        logger.info("发送K线数据订阅 (code=%s)", REQ_KLINE)

    # --- 心跳 ---------------------------------------------------------------
    def _start_heartbeat_task(self) -> None:
        """为当前连接启动后台心跳任务。"""
        self._cancel_heartbeat_task()

        async def heartbeat_loop():
            try:
                while True:
                    await asyncio.sleep(self.heartbeat_interval)
                    if self.ws is None or self.ws.close_code is not None:
                        break
                    await self._send({
                        "code": REQ_HEARTBEAT,
                        "trace": self._generate_trace_id(),
                    })
                    logger.debug("发送心跳包")
            except (ConnectionClosed, asyncio.CancelledError):
                pass
            except Exception as e:
                logger.error("心跳任务异常: %s", e)

        self.heartbeat_task = asyncio.create_task(heartbeat_loop())

    def _cancel_heartbeat_task(self) -> None:
        """取消正在运行的心跳任务（如果有）。"""
        if self.heartbeat_task and not self.heartbeat_task.done():
            self.heartbeat_task.cancel()
        self.heartbeat_task = None

    # --- 消息处理 -----------------------------------------------------------
    def _handle_received_message(self, message) -> None:
        """按协议号分发处理收到的消息。

        ``message`` 可能是 ``str`` 或 ``bytes``，取决于帧类型。
        """
        try:
            msg_data = json.loads(message)
        except json.JSONDecodeError:
            logger.error("消息格式错误，无法解析 JSON: %s", message)
            return

        code = msg_data.get("code")
        trace = msg_data.get("trace")
        data = msg_data.get("data", {})

        if code == PUSH_CONNECTED:
            logger.info("连接建立成功: %s", msg_data.get("msg"))
        elif code == PUSH_TRADE:
            logger.info("成交数据: %s", data)
        elif code == PUSH_DEPTH:
            logger.info("盘口数据: %s", data)
        elif code == PUSH_KLINE:
            logger.info("K线数据: %s", data)
        elif code in ACK_CODES:
            logger.info("订阅确认 [code=%s, trace=%s]: %s",
                        code, trace, msg_data.get("msg"))
        elif code == REQ_HEARTBEAT:
            logger.debug("收到心跳响应 [trace=%s]", trace)
        else:
            logger.warning("未处理的消息 [code=%s]: %s", code, message)

    # --- 连接生命周期 -------------------------------------------------------
    async def _connect_once(self) -> None:
        """建立一次连接，完成订阅，并监听直到连接关闭。"""
        async with websockets.connect(self.ws_url) as ws:
            self.ws = ws
            logger.info("WebSocket 连接成功，地址: %s", self.ws_url)

            await self._send_all_subscribe_requests()
            self._start_heartbeat_task()

            try:
                # 持续迭代直到连接关闭（会抛出 ConnectionClosed）
                async for message in ws:
                    self._handle_received_message(message)
            finally:
                self._cancel_heartbeat_task()
                self.ws = None

    async def start(self) -> None:
        """启动客户端，并以指数退避保持连接。"""
        backoff = self.reconnect_base
        try:
            while self.running:
                try:
                    await self._connect_once()
                    # 服务端正常结束流；重置退避。
                    backoff = self.reconnect_base
                    logger.warning("连接被服务端关闭")
                except ConnectionClosed as e:
                    logger.warning("连接已关闭: %s", e)
                    backoff = self.reconnect_base
                except Exception as e:
                    logger.error("连接异常: %s", e)

                if not self.running:
                    break

                logger.info("将在 %s 秒后重连...", backoff)
                await asyncio.sleep(backoff)
                # 指数退避，上限为 reconnect_max。
                backoff = min(backoff * 2, self.reconnect_max)
        finally:
            self.running = False
            self._cancel_heartbeat_task()
            if self.ws is not None and self.ws.close_code is None:
                await self.ws.close()
            logger.info("WebSocket 客户端已停止")

    def stop(self) -> None:
        """通知客户端停止重连。"""
        self.running = False


async def main():
    """主函数。"""
    # API Key 从环境变量读取，请勿将真实 Key 硬编码到代码中：
    #   export INFOWAY_API_KEY="你的API Key"
    api_key = os.environ.get("INFOWAY_API_KEY", "YOUR_API_KEY")
    if api_key == "YOUR_API_KEY":
        logger.warning("未设置 INFOWAY_API_KEY 环境变量，请填入你的真实 API Key")
    client = CryptoWebsocketClient(api_key=api_key)
    await client.start()


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        logger.info("用户中断，退出客户端")
    except Exception as e:
        logger.error("客户端运行异常: %s", e)

```

{% endtab %}

{% tab title="Go" %}

```go
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"math/rand"
	"net/url"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/google/uuid"
	"github.com/gorilla/websocket"
)

// CryptoWebsocketClient 加密货币行情WebSocket客户端
type CryptoWebsocketClient struct {
	apiKey            string
	business          string
	wsURL             string
	conn              *websocket.Conn
	isConnected       bool
	reconnectInterval time.Duration
	heartbeatInterval time.Duration
	done              chan struct{}
	connCancel        context.CancelFunc // 取消当前连接关联的后台任务（心跳/监听/订阅）
}

// NewCryptoWebsocketClient 创建客户端实例
func NewCryptoWebsocketClient(apiKey, business string) *CryptoWebsocketClient {
	params := url.Values{}
	params.Set("business", business)
	params.Set("apikey", apiKey)
	wsURL := fmt.Sprintf("wss://data.infoway.io/ws?%s", params.Encode())

	return &CryptoWebsocketClient{
		apiKey:            apiKey,
		business:          business,
		wsURL:             wsURL,
		reconnectInterval: 10 * time.Second,
		heartbeatInterval: 30 * time.Second,
		done:              make(chan struct{}),
	}
}

func (c *CryptoWebsocketClient) generateTraceID() string {
	return uuid.New().String()
}

// stopConnectionTasks 停止当前连接的所有后台 goroutine，防止重连后心跳任务累积
func (c *CryptoWebsocketClient) stopConnectionTasks() {
	if c.connCancel != nil {
		c.connCancel()
		c.connCancel = nil
	}
}

func wait(ctx context.Context, d time.Duration) bool {
	timer := time.NewTimer(d)
	defer timer.Stop()
	select {
	case <-ctx.Done():
		return false
	case <-timer.C:
		return true
	}
}

func (c *CryptoWebsocketClient) connect() error {
	c.stopConnectionTasks()

	if c.conn != nil {
		c.conn.Close()
		c.conn = nil
	}

	conn, _, err := websocket.DefaultDialer.Dial(c.wsURL, nil)
	if err != nil {
		c.isConnected = false
		return fmt.Errorf("连接失败: %w", err)
	}

	ctx, cancel := context.WithCancel(context.Background())
	c.connCancel = cancel
	c.conn = conn
	c.isConnected = true
	log.Printf("WebSocket连接成功: %s", c.wsURL)

	go c.sendAllSubscribeRequests(ctx)
	go c.startHeartbeat(ctx)
	go c.listenMessages(ctx)

	return nil
}

func (c *CryptoWebsocketClient) sendAllSubscribeRequests(ctx context.Context) {
	if !c.isConnected || c.conn == nil {
		log.Println("连接未建立，无法发送订阅请求")
		return
	}

	if err := c.sendTradeSubscribe(); err != nil {
		log.Printf("发送成交明细订阅失败: %v", err)
		return
	}
	if !wait(ctx, 5*time.Second) {
		return
	}

	if err := c.sendDepthSubscribe(); err != nil {
		log.Printf("发送盘口订阅失败: %v", err)
		return
	}
	if !wait(ctx, 5*time.Second) {
		return
	}

	if err := c.sendKlineSubscribe(); err != nil {
		log.Printf("发送K线订阅失败: %v", err)
	}
}

func (c *CryptoWebsocketClient) sendTradeSubscribe() error {
	msg := map[string]interface{}{
		"code":  10000,
		"trace": c.generateTraceID(),
		"data": map[string]string{
			"codes": "BTCUSDT",
		},
	}
	return c.sendJSONMessage(msg)
}

func (c *CryptoWebsocketClient) sendDepthSubscribe() error {
	msg := map[string]interface{}{
		"code":  10003,
		"trace": c.generateTraceID(),
		"data": map[string]string{
			"codes": "BTCUSDT",
		},
	}
	return c.sendJSONMessage(msg)
}

func (c *CryptoWebsocketClient) sendKlineSubscribe() error {
	msg := map[string]interface{}{
		"code":  10006,
		"trace": c.generateTraceID(),
		"data": map[string]interface{}{
			"arr": []map[string]interface{}{
				{
					"type":  1,
					"codes": "BTCUSDT",
				},
			},
		},
	}
	return c.sendJSONMessage(msg)
}

func (c *CryptoWebsocketClient) sendHeartbeat() error {
	msg := map[string]interface{}{
		"code":  10010,
		"trace": c.generateTraceID(),
	}
	return c.sendJSONMessage(msg)
}

func (c *CryptoWebsocketClient) sendJSONMessage(msg interface{}) error {
	if !c.isConnected || c.conn == nil {
		return fmt.Errorf("连接已断开")
	}

	data, err := json.Marshal(msg)
	if err != nil {
		return fmt.Errorf("消息序列化失败: %w", err)
	}

	if err := c.conn.WriteMessage(websocket.TextMessage, data); err != nil {
		c.isConnected = false
		return fmt.Errorf("发送消息失败: %w", err)
	}

	log.Printf("发送消息: %s", string(data))
	return nil
}

func (c *CryptoWebsocketClient) startHeartbeat(ctx context.Context) {
	ticker := time.NewTicker(c.heartbeatInterval)
	defer ticker.Stop()

	for {
		select {
		case <-ctx.Done():
			return
		case <-c.done:
			return
		case <-ticker.C:
			if err := c.sendHeartbeat(); err != nil {
				log.Printf("发送心跳失败: %v", err)
				return
			}
			log.Printf("发送心跳包成功")
		}
	}
}

func (c *CryptoWebsocketClient) listenMessages(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			return
		case <-c.done:
			return
		default:
		}

		if !c.isConnected || c.conn == nil {
			return
		}

		_, msgData, err := c.conn.ReadMessage()
		if err != nil {
			c.isConnected = false
			log.Printf("读取消息失败/连接断开: %v", err)
			return
		}

		log.Printf("收到服务端消息: %s", string(msgData))
		c.handleReceivedMessage(msgData)
	}
}

func (c *CryptoWebsocketClient) handleReceivedMessage(msgData []byte) {
	var msg map[string]interface{}
	if err := json.Unmarshal(msgData, &msg); err != nil {
		log.Printf("解析消息失败: %v", err)
		return
	}

	code := int(msg["code"].(float64))
	trace := msg["trace"].(string)
	data := msg["data"]

	switch code {
	case 10000:
		log.Printf("处理成交明细数据 [trace=%s]: %+v", trace, data)
	case 10003:
		log.Printf("处理盘口数据 [trace=%s]: %+v", trace, data)
	case 10006:
		log.Printf("处理K线数据 [trace=%s]: %+v", trace, data)
	case 10010:
		log.Printf("收到心跳响应 [trace=%s]", trace)
	default:
		log.Printf("未知协议号消息 [code=%d]: %s", code, string(msgData))
	}
}

func (c *CryptoWebsocketClient) startReconnectLoop() {
	for {
		select {
		case <-c.done:
			return
		default:
			if !c.isConnected {
				log.Printf("尝试重连WebSocket（间隔%v）...", c.reconnectInterval)
				time.Sleep(time.Duration(rand.Intn(3)) * time.Second)
				if err := c.connect(); err != nil {
					log.Printf("重连失败: %v", err)
					time.Sleep(c.reconnectInterval)
					continue
				}
			}
			time.Sleep(1 * time.Second)
		}
	}
}

func (c *CryptoWebsocketClient) Start() {
	go c.startReconnectLoop()

	if err := c.connect(); err != nil {
		log.Printf("首次连接失败: %v", err)
	}

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan

	log.Println("收到退出信号，关闭客户端...")
	close(c.done)
	c.stopConnectionTasks()
	if c.conn != nil {
		c.conn.Close()
	}
	c.isConnected = false
}

func main() {
	apiKey := "yourApikey"
	business := "crypto"

	client := NewCryptoWebsocketClient(apiKey, business)
	client.Start()
}

```

{% endtab %}

{% tab title="Php" %}

```php
<?php

require_once __DIR__ . '/vendor/autoload.php';

use WebSocket\Client;
use WebSocket\ConnectionException;

/**
 * 加密货币行情WebSocket客户端
 */
class CryptoWebsocketClient
{
    // 配置项
    private $apiKey;             // 认证API Key
    private $business;           // 业务类型：stock/crypto/common
    private $wsUrl;              // WebSocket连接地址
    private $reconnectInterval;  // 重连间隔（秒）
    private $heartbeatInterval;  // 心跳间隔（秒）
    
    // 运行状态
    private $client;             // WebSocket客户端实例
    private $isConnected = false;// 连接状态
    private $running = true;     // 客户端运行状态

    /**
     * 构造函数
     * @param string $apiKey API密钥
     * @param string $business 业务类型
     */
    public function __construct(string $apiKey, string $business = 'crypto')
    {
        $this->apiKey = $apiKey;
        $this->business = $business;
        // 构建WS URL
        $this->wsUrl = sprintf(
            'wss://data.infoway.io/ws?business=%s&apikey=%s',
            urlencode($business),
            urlencode($apiKey)
        );
        $this->reconnectInterval = 10;  // 10秒重连间隔
        $this->heartbeatInterval = 30;  // 30秒心跳间隔
    }

    /**
     * 生成唯一Trace ID
     * @return string
     */
    private function generateTraceId(): string
    {
        return sprintf(
            '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0x0fff) | 0x4000,
            mt_rand(0, 0x3fff) | 0x8000,
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff)
        );
    }

    /**
     * 建立WebSocket连接
     * @return bool
     */
    private function connect(): bool
    {
        try {
            // 关闭旧连接
            if ($this->client) {
                try {
                    $this->client->close();
                } catch (Exception $e) {
                    // 忽略关闭异常
                }
                $this->client = null;
            }

            // 创建新连接
            $this->client = new Client($this->wsUrl, [
                'timeout' => 30,
                'fragment_size' => 8192,
            ]);
            $this->isConnected = true;
            echo date('Y-m-d H:i:s') . " - WebSocket连接成功: {$this->wsUrl}\n";
            
            // 发送所有订阅请求
            $this->sendAllSubscribeRequests();
            
            return true;
        } catch (ConnectionException $e) {
            $this->isConnected = false;
            echo date('Y-m-d H:i:s') . " - WebSocket连接失败: {$e->getMessage()}\n";
            return false;
        } catch (Exception $e) {
            $this->isConnected = false;
            echo date('Y-m-d H:i:s') . " - 连接异常: {$e->getMessage()}\n";
            return false;
        }
    }

    /**
     * 发送所有订阅请求
     */
    private function sendAllSubscribeRequests(): void
    {
        if (!$this->isConnected || !$this->client) {
            echo date('Y-m-d H:i:s') . " - 连接未建立，无法发送订阅请求\n";
            return;
        }

        try {
            // 1. 订阅实时成交明细（协议号10000）
            $this->sendTradeSubscribe();
            sleep(5); // 间隔5秒

            // 2. 订阅实时盘口数据（协议号10003）
            $this->sendDepthSubscribe();
            sleep(5); // 间隔5秒

            // 3. 订阅1分钟K线数据（协议号10006）
            $this->sendKlineSubscribe();
        } catch (Exception $e) {
            echo date('Y-m-d H:i:s') . " - 发送订阅请求失败: {$e->getMessage()}\n";
            $this->isConnected = false;
        }
    }

    /**
     * 发送成交明细订阅请求
     */
    private function sendTradeSubscribe(): void
    {
        $msg = [
            'code'  => 10000,
            'trace' => $this->generateTraceId(),
            'data'  => ['codes' => 'BTCUSDT']
        ];
        $this->sendJsonMessage($msg);
    }

    /**
     * 发送盘口数据订阅请求
     */
    private function sendDepthSubscribe(): void
    {
        $msg = [
            'code'  => 10003,
            'trace' => $this->generateTraceId(),
            'data'  => ['codes' => 'BTCUSDT']
        ];
        $this->sendJsonMessage($msg);
    }

    /**
     * 发送K线数据订阅请求
     */
    private function sendKlineSubscribe(): void
    {
        $msg = [
            'code'  => 10006,
            'trace' => $this->generateTraceId(),
            'data'  => [
                'arr' => [
                    ['type' => 1, 'codes' => 'BTCUSDT'] // 1分钟K线
                ]
            ]
        ];
        $this->sendJsonMessage($msg);
    }

    /**
     * 发送心跳包
     */
    private function sendHeartbeat(): void
    {
        $msg = [
            'code'  => 10010,
            'trace' => $this->generateTraceId()
        ];
        $this->sendJsonMessage($msg);
    }

    /**
     * 发送JSON格式消息
     * @param array $msg 消息数组
     */
    private function sendJsonMessage(array $msg): void
    {
        if (!$this->isConnected || !$this->client) {
            return;
        }

        try {
            $jsonStr = json_encode($msg, JSON_UNESCAPED_UNICODE);
            $this->client->send($jsonStr);
            echo date('Y-m-d H:i:s') . " - 发送消息: {$jsonStr}\n";
        } catch (ConnectionException $e) {
            $this->isConnected = false;
            echo date('Y-m-d H:i:s') . " - 发送消息失败: {$e->getMessage()}\n";
        } catch (Exception $e) {
            echo date('Y-m-d H:i:s') . " - 消息序列化失败: {$e->getMessage()}\n";
        }
    }

    /**
     * 监听服务端消息
     */
    private function listenMessages(): void
    {
        if (!$this->isConnected || !$this->client) {
            return;
        }

        try {
            // 设置非阻塞读取（避免卡死）
            $socket = $this->client->getSocket();
            stream_set_blocking($socket, false);

            $message = $this->client->receive();
            if ($message !== '') {
                echo date('Y-m-d H:i:s') . " - 收到消息: {$message}\n";
                $this->handleReceivedMessage($message);
            }
        } catch (ConnectionException $e) {
            $this->isConnected = false;
            echo date('Y-m-d H:i:s') . " - 连接断开/读取消息失败: {$e->getMessage()}\n";
        } catch (Exception $e) {
            // 忽略非阻塞读取的空消息异常
            if (strpos($e->getMessage(), 'no data received') === false) {
                echo date('Y-m-d H:i:s') . " - 监听消息异常: {$e->getMessage()}\n";
            }
        }
    }

    /**
     * 处理接收到的消息
     * @param string $message 原始消息字符串
     */
    private function handleReceivedMessage(string $message): void
    {
        try {
            $msg = json_decode($message, true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                echo date('Y-m-d H:i:s') . " - 解析消息失败: 格式错误\n";
                return;
            }

            $code = $msg['code'] ?? 0;
            $trace = $msg['trace'] ?? '';
            $data = $msg['data'] ?? [];

            switch ($code) {
                case 10000:
                    echo date('Y-m-d H:i:s') . " - 处理成交明细 [trace={$trace}]: " . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n";
                    break;
                case 10003:
                    echo date('Y-m-d H:i:s') . " - 处理盘口数据 [trace={$trace}]: " . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n";
                    break;
                case 10006:
                    echo date('Y-m-d H:i:s') . " - 处理K线数据 [trace={$trace}]: " . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n";
                    break;
                case 10010:
                    echo date('Y-m-d H:i:s') . " - 收到心跳响应 [trace={$trace}]\n";
                    break;
                default:
                    echo date('Y-m-d H:i:s') . " - 未知协议号 [code={$code}]: {$message}\n";
            }
        } catch (Exception $e) {
            echo date('Y-m-d H:i:s') . " - 处理消息异常: {$e->getMessage()}\n";
        }
    }

    /**
     * 启动心跳任务
     * @param int $lastHeartbeatTime 上次心跳时间戳引用
     */
    private function checkHeartbeat(&$lastHeartbeatTime): void
    {
        $currentTime = time();
        if ($currentTime - $lastHeartbeatTime >= $this->heartbeatInterval) {
            $this->sendHeartbeat();
            $lastHeartbeatTime = $currentTime;
        }
    }

    /**
     * 启动客户端
     */
    public function start(): void
    {
        echo date('Y-m-d H:i:s') . " - 启动WebSocket客户端...\n";
        
        // 注册退出信号处理
        pcntl_async_signals(true);
        pcntl_signal(SIGINT, function () {
            echo "\n" . date('Y-m-d H:i:s') . " - 收到退出信号，停止客户端...\n";
            $this->running = false;
            if ($this->client) {
                $this->client->close();
            }
            exit(0);
        });

        $lastHeartbeatTime = 0;
        $reconnectDelay = 0;

        // 主循环
        while ($this->running) {
            // 处理重连逻辑
            if (!$this->isConnected) {
                if ($reconnectDelay <= 0) {
                    $this->connect();
                    $reconnectDelay = $this->reconnectInterval;
                    $lastHeartbeatTime = time();
                } else {
                    $reconnectDelay--;
                    echo date('Y-m-d H:i:s') . " - 等待重连... ({$reconnectDelay}秒)\n";
                }
            } else {
                // 监听消息
                $this->listenMessages();
                // 检查心跳
                $this->checkHeartbeat($lastHeartbeatTime);
            }

            // 主循环延迟（避免CPU占用过高）
            usleep(100000); // 100毫秒
        }

        // 清理资源
        if ($this->client) {
            $this->client->close();
        }
        echo date('Y-m-d H:i:s') . " - 客户端已停止\n";
    }

    /**
     * 析构函数
     */
    public function __destruct()
    {
        if ($this->client) {
            try {
                $this->client->close();
            } catch (Exception $e) {
                // 忽略
            }
        }
    }
}

// 主程序入口
if (php_sapi_name() !== 'cli') {
    die("该脚本仅支持CLI模式运行！");
}

// 配置（替换为你的实际API Key）
$apiKey = 'yourApikey';
$business = 'crypto';

// 创建并启动客户端
$client = new CryptoWebsocketClient($apiKey, $business);
$client->start();
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
/**
 * 加密货币行情WebSocket客户端（JS通用版）
 * 支持浏览器/Node.js环境（Node.js需确保版本≥10.0.0）
 */
class CryptoWebsocketClient {
  /**
   * 构造函数
   * @param {string} apiKey - 认证API Key
   * @param {string} business - 业务类型：stock/crypto/common
   */
  constructor(apiKey, business = 'crypto') {
    // 配置项
    this.apiKey = apiKey;
    this.business = business;
    this.wsUrl = `wss://data.infoway.io/ws?business=${encodeURIComponent(business)}&apikey=${encodeURIComponent(apiKey)}`;
    this.reconnectInterval = 10000; // 重连间隔（10秒，单位ms）
    this.heartbeatInterval = 30000; // 心跳间隔（30秒，单位ms）

    // 运行状态
    this.ws = null; // WebSocket实例
    this.isConnected = false; // 连接状态
    this.heartbeatTimer = null; // 心跳定时器
    this.reconnectTimer = null; // 重连定时器
    this.subscribeSent = false; // 订阅请求是否已发送

    // 绑定方法上下文（避免回调中this丢失）
    this.onOpen = this.onOpen.bind(this);
    this.onMessage = this.onMessage.bind(this);
    this.onClose = this.onClose.bind(this);
    this.onError = this.onError.bind(this);
    this.sendHeartbeat = this.sendHeartbeat.bind(this);
  }

  /**
   * 生成唯一Trace ID（模拟UUID）
   * @returns {string}
   */
  generateTraceId() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
      const r = Math.random() * 16 | 0;
      const v = c === 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  }

  /**
   * 建立WebSocket连接
   */
  connect() {
    // 清理旧连接
    if (this.ws) {
      try {
        this.ws.close(1000, 'Reconnecting');
      } catch (e) {
        console.error('关闭旧连接失败:', e);
      }
      this.ws = null;
    }

    try {
      // 创建新连接
      this.ws = new WebSocket(this.wsUrl);
      // 注册事件回调
      this.ws.onopen = this.onOpen;
      this.ws.onmessage = this.onMessage;
      this.ws.onclose = this.onClose;
      this.ws.onerror = this.onError;
      console.log(`[${new Date().toLocaleString()}] 正在连接WebSocket: ${this.wsUrl}`);
    } catch (e) {
      this.isConnected = false;
      console.error(`[${new Date().toLocaleString()}] 连接失败:`, e);
      this.scheduleReconnect();
    }
  }

  /**
   * 连接成功回调
   */
  onOpen() {
    this.isConnected = true;
    this.subscribeSent = false;
    console.log(`[${new Date().toLocaleString()}] WebSocket连接成功`);

    // 清理重连定时器
    if (this.reconnectTimer) {
      clearTimeout(this.reconnectTimer);
      this.reconnectTimer = null;
    }

    // 发送订阅请求
    this.sendAllSubscribeRequests();

    // 启动心跳
    this.startHeartbeat();
  }

  /**
   * 发送所有订阅请求
   */
  sendAllSubscribeRequests() {
    if (this.subscribeSent || !this.isConnected) return;
    this.subscribeSent = true;

    // 1. 订阅实时成交明细（协议号10000）
    this.sendTradeSubscribe();
    
    // 间隔5秒发送盘口订阅
    setTimeout(() => {
      if (this.isConnected) {
        this.sendDepthSubscribe();
      }
    }, 5000);

    // 间隔10秒发送K线订阅（5+5）
    setTimeout(() => {
      if (this.isConnected) {
        this.sendKlineSubscribe();
      }
    }, 10000);
  }

  /**
   * 发送成交明细订阅请求
   */
  sendTradeSubscribe() {
    const msg = {
      code: 10000,
      trace: this.generateTraceId(),
      data: { codes: 'BTCUSDT' }
    };
    this.sendJsonMessage(msg);
  }

  /**
   * 发送盘口数据订阅请求
   */
  sendDepthSubscribe() {
    const msg = {
      code: 10003,
      trace: this.generateTraceId(),
      data: { codes: 'BTCUSDT' }
    };
    this.sendJsonMessage(msg);
  }

  /**
   * 发送K线数据订阅请求
   */
  sendKlineSubscribe() {
    const msg = {
      code: 10006,
      trace: this.generateTraceId(),
      data: {
        arr: [{ type: 1, codes: 'BTCUSDT' }] // 1分钟K线
      }
    };
    this.sendJsonMessage(msg);
  }

  /**
   * 发送心跳包
   */
  sendHeartbeat() {
    const msg = {
      code: 10010,
      trace: this.generateTraceId()
    };
    this.sendJsonMessage(msg);
  }

  /**
   * 发送JSON格式消息
   * @param {object} msg - 消息对象
   */
  sendJsonMessage(msg) {
    if (!this.isConnected || !this.ws || this.ws.readyState !== WebSocket.OPEN) {
      console.warn(`[${new Date().toLocaleString()}] 连接未就绪，跳过消息发送`);
      return;
    }

    try {
      const jsonStr = JSON.stringify(msg);
      this.ws.send(jsonStr);
      console.log(`[${new Date().toLocaleString()}] 发送消息:`, jsonStr);
    } catch (e) {
      console.error(`[${new Date().toLocaleString()}] 发送消息失败:`, e);
      this.isConnected = false;
      this.scheduleReconnect();
    }
  }

  /**
   * 接收消息回调
   * @param {MessageEvent} event - 消息事件
   */
  onMessage(event) {
    const message = event.data;
    console.log(`[${new Date().toLocaleString()}] 收到消息:`, message);
    this.handleReceivedMessage(message);
  }

  /**
   * 处理接收到的消息
   * @param {string} message - 原始消息字符串
   */
  handleReceivedMessage(message) {
    try {
      const msg = JSON.parse(message);
      const code = msg.code || 0;
      const trace = msg.trace || '';
      const data = msg.data || {};

      switch (code) {
        case 10000:
          console.log(`[${new Date().toLocaleString()}] 处理成交明细 [trace=${trace}]:`, JSON.stringify(data));
          break;
        case 10003:
          console.log(`[${new Date().toLocaleString()}] 处理盘口数据 [trace=${trace}]:`, JSON.stringify(data));
          break;
        case 10006:
          console.log(`[${new Date().toLocaleString()}] 处理K线数据 [trace=${trace}]:`, JSON.stringify(data));
          break;
        case 10010:
          console.log(`[${new Date().toLocaleString()}] 收到心跳响应 [trace=${trace}]`);
          break;
        default:
          console.warn(`[${new Date().toLocaleString()}] 未知协议号 [code=${code}]:`, message);
      }
    } catch (e) {
      console.error(`[${new Date().toLocaleString()}] 处理消息失败:`, e);
    }
  }

  /**
   * 连接关闭回调
   * @param {CloseEvent} event - 关闭事件
   */
  onClose(event) {
    this.isConnected = false;
    this.subscribeSent = false;
    console.log(`[${new Date().toLocaleString()}] 连接关闭: 代码=${event.code}, 原因=${event.reason}`);
    
    // 清理心跳定时器
    this.stopHeartbeat();
    
    // 触发重连
    this.scheduleReconnect();
  }

  /**
   * 错误回调
   * @param {Event} error - 错误事件
   */
  onError(error) {
    console.error(`[${new Date().toLocaleString()}] WebSocket错误:`, error);
    this.isConnected = false;
    this.scheduleReconnect();
  }

  /**
   * 启动心跳任务
   */
  startHeartbeat() {
    // 清理旧定时器
    this.stopHeartbeat();
    
    // 立即发送一次心跳，然后定时发送
    this.sendHeartbeat();
    this.heartbeatTimer = setInterval(() => {
      if (this.isConnected) {
        this.sendHeartbeat();
      }
    }, this.heartbeatInterval);
  }

  /**
   * 停止心跳任务
   */
  stopHeartbeat() {
    if (this.heartbeatTimer) {
      clearInterval(this.heartbeatTimer);
      this.heartbeatTimer = null;
    }
  }

  /**
   * 调度重连
   */
  scheduleReconnect() {
    if (this.reconnectTimer) return;
    
    console.log(`[${new Date().toLocaleString()}] ${this.reconnectInterval/1000}秒后尝试重连...`);
    this.reconnectTimer = setTimeout(() => {
      this.reconnectTimer = null;
      this.connect();
    }, this.reconnectInterval);
  }

  /**
   * 启动客户端
   */
  start() {
    console.log(`[${new Date().toLocaleString()}] 启动WebSocket客户端...`);
    this.connect();

    // Node.js环境下监听退出信号
    if (typeof process !== 'undefined' && process.on) {
      process.on('SIGINT', () => {
        console.log(`\n[${new Date().toLocaleString()}] 收到退出信号，关闭客户端...`);
        this.stop();
        process.exit(0);
      });
    }
  }

  /**
   * 停止客户端
   */
  stop() {
    this.isConnected = false;
    this.subscribeSent = false;
    
    // 清理定时器
    this.stopHeartbeat();
    if (this.reconnectTimer) {
      clearTimeout(this.reconnectTimer);
      this.reconnectTimer = null;
    }

    // 关闭连接
    if (this.ws) {
      this.ws.close(1000, 'Client stopped');
      this.ws = null;
    }

    console.log(`[${new Date().toLocaleString()}] 客户端已停止`);
  }
}

// ==================== 运行示例 ====================
// 浏览器环境：直接在控制台执行以下代码
// Node.js环境：直接运行该脚本

// 替换为你的实际API Key
const API_KEY = 'yourApikey';
const BUSINESS = 'crypto';

// 创建并启动客户端
const client = new CryptoWebsocketClient(API_KEY, BUSINESS);
client.start();

// 如需停止客户端，执行：client.stop();
```

{% endtab %}
{% endtabs %}


# Websocket 订阅方法

包括所有Websocket的订阅以及取消订阅的入参、出餐


# 实时成交明细（Trade）订阅

## API说明

该Websocket是获取成交明细的实时推送           &#x20;

## 请求频率

同一个Websocket连接，所有的请求（订阅、取消订阅、心跳）限制为**1分钟60次**，如果超出请求频率限制将会自动断连。如果断连次数过多被系统判定为恶意请求将会封禁apikey。请在使用过程中注意调用逻辑。

## 错误码说明

参考[Websocket错误码说明](/getting-started/error-codes/websocket)

## 接口地址

请参考[Websocket订阅地址](/websocket-api/endpoints)

## 请求数量

不同的套餐对应的单Websocket订阅的产品数量不一样，具体参考[Websocket限制说明](/getting-started/api-limitation/websocket)

## 请求（协议号：10000）

```json
{
    "code": 10000,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "data": {
        "codes": "BTCUSDT",
        "includeTy": false
    }
}
```

| 参数名          | 类型      | 必填 | 描述                                        | 示例值                                |
| ------------ | ------- | -- | ----------------------------------------- | ---------------------------------- |
| `code`       | Integer | 是  | 请求的协议号                                    | 实时成交明细订阅协议号：`10000`                |
| `trace`      | String  | 是  | 可追溯ID（随机字符串）                              | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `data`       | JSON    | 是  | 订阅数据                                      |                                    |
| `<codes`     | String  | 是  | 订阅产品，多个用逗号分隔（一个websocket连接支持同时订阅最多600个产品） | `BTCUSDT`                          |
| `<includeTy` | Boolean | 否  | 是否推送trade类型。不传或者传false不推送                 | false                              |

## 应答（协议号：10001）

```json
{
    "code": 10001,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok"
}
```

| 字段名     | 类型      | 必填 | 描述          | 示例值                                |
| ------- | ------- | -- | ----------- | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号       | 订阅实时成交明细响应协议号：`10001`              |
| `trace` | String  | 是  | 订阅传入参数可追溯id | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应          | `ok`                               |

## 推送（协议号：10002）

```json
{
    "code": 10002,
    "data": {
        "p": "103482.94",
        "s": "BTCUSDT",
        "t": 1747552358393,
        "td": 2,
        "v": "0.00096",
        "vw": "99.3436224"
    }
}
```

| 字段名    | 类型      | 必填 | 描述       | 示例值                       |
| ------ | ------- | -- | -------- | ------------------------- |
| `code` | Integer | 是  | 推送协议号    | 实时成交明细推送协议号：`10002`       |
| `data` | JSON    | 是  | 推送数据实体   |                           |
| `<s`   | String  | 是  | 标的名称     | `BTCUSDT`                 |
| `<p`   | String  | 是  | 当前价格     | `103482.94`               |
| `<t`   | Long    | 是  | Trade时间戳 | `1747552358393`           |
| `<td`  | Integer | 是  | 交易方向     | `交易方向：0为默认值，1为Buy，2为SELL` |
| `<v`   | String  | 是  | 成交量      | `0.00096`                 |
| `<vw`  | String  | 是  | 成交额      | `99.3436224`              |
| `<ty`  | String  | 否  | 交易类型     | 参考下面交易类型说明                |

**交易类型**

港股

* `*` - 场外交易
* `D` - 碎股交易
* `M` - 非自动对盘
* `P` - 开市前成交盘
* `U` - 竞价交易
* `X` - 同一券商非自动对盘
* `Y` - 同一券商自动对盘
* \- 自动对盘

美股

* \- 自动对盘
* `A` - 收购
* `B` - 批量交易
* `D` - 分配
* `F` - 跨市扫盘单
* `G` - 批量卖出
* `H` - 离价交易
* `I` - 碎股交易
* `K` - 第 155 条交易（纽交所规则）
* `M` - 交易所收盘价
* `P` - 前参考价
* `Q` - 交易所开盘价
* `S` - 拆单交易
* `V` - 附属交易
* `W` - 平均价成交
* `X` - 跨市场交易
* `1` - 停售股票（常规交易）


# 实时新闻（News）订阅

### API说明

该 Websocket 用于获取新闻的实时推送。

连接成功后，客户端按 **语言（lang）** 订阅：

* `data.lang` 必填，单一语言（不区分大小写，服务端会归一化为小写），取值见下方语言枚举
* 同一连接再次订阅会**覆盖**上一次的 `lang`
* 套餐需开通新闻权限（`newsFlag=1`），否则握手失败
* 每个 `apikey` **仅允许一个**连接；已有连接时新连接会被拒绝

### 语言枚举

订阅时 `lang` 仅支持以下取值。右侧为国家/市场代码（`en` 对应全球，国家代码为空）：

| lang      | 国家/市场代码 | 说明   |
| --------- | ------- | ---- |
| `en`      | （空）     | 英语   |
| `zh-Hans` | `CN`    | 简体中文 |
| `zh-Hant` | `HK`    | 繁体中文 |
| `ja`      | `JP`    | 日语   |
| `ko`      | `KR`    | 韩语   |
| `de`      | `DE`    | 德语   |
| `fr`      | `FR`    | 法语   |
| `es`      | `ES`    | 西班牙语 |
| `pt`      | `BR`    | 葡萄牙语 |
| `ru`      | `RU`    | 俄语   |
| `tr`      | `TR`    | 土耳其语 |

### 请求频率

请保持心跳，建议每 **30 秒**发送一次心跳（协议号 `10010`）。若服务端超过 **60 秒**未收到心跳（业务心跳或 WebSocket Ping），将自动断连。

### 错误码说明

参考Websocket错误码说明

常见握手/连接相关错误：

| code  | 说明                             |
| ----- | ------------------------------ |
| `200` | 握手成功                           |
| `507` | 参数缺失（如缺少 `data` / `data.lang`） |
| `513` | 心跳超时                           |
| `514` | WebSocket 路径错误                 |
| `515` | 请求不是 JSON                      |
| `517` | 握手失败：缺少 apikey                 |
| `518` | 握手失败：apikey 不存在                |
| `519` | 握手失败：无新闻权限（newsFlag!=1）        |
| `520` | 握手失败：该 apikey 已有连接             |
| `521` | 握手失败：服务器连接数已满                  |

### 接口地址

```
wss://data.infoway.io/news?apikey=YourAPIKey
```

> 路径必须为 `/news`，并通过 query 传入 `apikey`。

### 请求数量

同一 Websocket 连接同时仅保留 **一份**订阅（再次订阅覆盖旧订阅）。每个 `apikey` 同时仅允许 **一个**连接。

### 请求（协议号：10020）

```json
{
    "code": 10020,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "data": {
        "lang": "en"
    }
}
```

| 参数名     | 类型      | 必填 | 描述                        | 示例值                                |
| ------- | ------- | -- | ------------------------- | ---------------------------------- |
| `code`  | Integer | 是  | 请求的协议号                    | 实时新闻订阅协议号：`10020`                  |
| `trace` | String  | 是  | 可追溯ID（随机字符串）              | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `data`  | JSON    | 是  | 订阅数据                      |                                    |
| `＜lang` | String  | 是  | 订阅语言（单一语言，不区分大小写），见上方语言枚举 | `en`                               |

### 应答（协议号：10021）

```json
{
    "code": 10021,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok",
    "data": {
        "lang": "en"
    }
}
```

| 字段名     | 类型      | 必填 | 描述              | 示例值                                |
| ------- | ------- | -- | --------------- | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号           | 订阅实时新闻响应协议号：`10021`                |
| `trace` | String  | 是  | 订阅传入参数可追溯 id    | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应              | `ok`                               |
| `data`  | JSON    | 是  | 当前生效的订阅条件       |                                    |
| `＜lang` | String  | 是  | 已订阅语言（归一化后的小写值） | `en`                               |

### 推送（协议号：10022）

```json
{
    "code": 10022,
    "data": {
        "dk": "a1b2c3d4e5f6...",
        "country": "US",
        "lang": "en",
        "route": "lang",
        "title": "Apple raises full-year revenue forecast",
        "published": 1747552358,
        "urgency": 2,
        "provider": "reuters",
        "symbols": ["AAPL"],
        "link": "https://www.example.com/article/123",
        "content": "Apple Inc said on Monday it expects...",
        "sd": "Apple raises full-year outlook on strong iPhone demand"
    }
}
```

| 字段名          | 类型      | 必填 | 描述                        | 示例值                                       |
| ------------ | ------- | -- | ------------------------- | ----------------------------------------- |
| `code`       | Integer | 是  | 推送协议号                     | 实时新闻推送协议号：`10022`                         |
| `data`       | JSON    | 是  | 推送数据实体                    |                                           |
| `＜dk`        | String  | 是  | 去重键（md5(title + content)） | `a1b2c3d4e5f6...`                         |
| `＜country`   | String  | 否  | 国家（全球流可能为空）               | `US`                                      |
| `＜lang`      | String  | 是  | 语言                        | `en` / `zh-Hans`                          |
| `＜route`     | String  | 是  | 采集路线                      | `country` / `lang`                        |
| `＜title`     | String  | 是  | 标题                        | `Apple raises full-year revenue forecast` |
| `＜published` | Long    | 是  | 发布时间戳（Unix 秒级）            | `1747552358`                              |
| `＜urgency`   | Integer | 是  | 紧急程度，越小越紧急                | `2`                                       |
| `＜provider`  | String  | 是  | 新闻源                       | `reuters` / `gelonghui`                   |
| `＜symbols`   | Array   | 否  | 关联标的列表                    | `["AAPL"]`                                |
| `＜link`      | String  | 否  | 外部链接（快讯类新闻）               | `https://www.example.com/article/123`     |
| `＜content`   | String  | 否  | 正文纯文本                     |                                           |
| `＜sd`        | String  | 否  | 摘要（shortDescription）      |                                           |

### 心跳（协议号：10010）

```json
{
    "code": 10010,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0"
}
```

服务端收到后刷新活跃时间，**不回业务应答**。也可使用 WebSocket 标准 `Ping` / `Pong` 保活。


# 实时K线（Candles）订阅

## API说明

该WebSocket是获取K线的实时推送           &#x20;

## 请求频率

同一个Websocket连接，所有的请求（订阅、取消订阅、心跳）限制为**1分钟60次**，如果超出请求频率限制将会自动断连。如果断连次数过多被系统判定为恶意请求，将会封禁API Key。请在使用过程中注意调用逻辑。

## 错误码说明

参考[Websocket错误码说明](/getting-started/error-codes/websocket)

## 接口地址

请参考[Websocket订阅地址](/websocket-api/endpoints)

## 请求数量

不同的套餐对应的单WebSocket订阅的产品数量不一样，具体参考[Websocket限制说明](/getting-started/api-limitation/websocket)

## 请求（协议号：10006）

```json
{
    "code": 10006,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "data": {
        "arr": [
            {
                "type": 1,
                "codes": "BTCUSDT"
            }
        ]
    }
}
```

<table><thead><tr><th width="115">参数名</th><th width="130">类型</th><th width="103">必填</th><th>描述</th><th>示例值</th></tr></thead><tbody><tr><td><code>code</code></td><td>Integer</td><td>是</td><td>请求的协议号</td><td>K线请求协议号：<code>10006</code></td></tr><tr><td><code>trace</code></td><td>String</td><td>是</td><td>可追溯ID（随机字符串）</td><td><code>423afec425004bd8a5e02e1ba5f9b2b0</code></td></tr><tr><td><code>data</code></td><td>JsonObject</td><td>是</td><td>订阅数据</td><td></td></tr><tr><td><code>&#x3C;arr</code></td><td>JsonArray</td><td>是</td><td>多个订阅实体类</td><td></td></tr><tr><td><code>&#x3C;&#x3C;type</code></td><td>Integer</td><td>是</td><td>kline类型：1:一分钟，2:五分钟，3:十五分钟，4:三十分钟，5:一小时，6:二小时，7:四小时，8:一日，9:一周，10:一月，11:一季，12:一年</td><td><code>1</code></td></tr><tr><td><code>&#x3C;&#x3C;codes</code></td><td>String</td><td>是</td><td>订阅产品，多个用逗号分隔（一个websocket连接支持同时订阅最多600个产品）</td><td><code>BTCUSDT</code></td></tr></tbody></table>

## 应答（协议号：10007）

```json
{
    "code": 10007,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok"
}
```

| 字段名     | 类型      | 必填 | 描述          | 示例值                                |
| ------- | ------- | -- | ----------- | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号       | 订阅成功响应协议号：`10007`                  |
| `trace` | String  | 是  | 订阅传入参数可追溯id | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应          | `ok`                               |

## 推送（协议号：10008）

```json
{
    "code": 10008,
    "data": {
        "c": "103478.27",
        "h": "103478.27",
        "l": "103478.26",
        "o": "103478.26",
        "pca": "0.00",
        "pfr": "0.00%",
        "s": "BTCUSDT",
        "t": 1747550640,
        "ty": 1,
        "v": "0.34716",
        "vw": "35923.5149678"
    }
}
```

| 字段名    | 类型      | 必填 | 描述          | 示例值             |
| ------ | ------- | -- | ----------- | --------------- |
| `code` | Integer | 是  | Kline线推送协议号 | 10008           |
| `data` | JSON    | 是  | Kline线推送实体  |                 |
| `<s`   | String  | 是  | 标的名称        | `BTCUSDT`       |
| `<c`   | String  | 是  | 收盘价         | `103478.27`     |
| `<h`   | String  | 是  | 最高价         | `103478.27`     |
| `<l`   | String  | 是  | 最低价         | `103478.26`     |
| `<o`   | String  | 是  | 开盘价         | `103478.26`     |
| `<pca` | String  | 是  | 涨跌额         | `0.00`          |
| `<pfr` | String  | 是  | 涨跌幅         | `0.00%`         |
| `<t`   | Long    | 是  | K线时间（秒时间戳）  | `1747550640`    |
| `<ty`  | Integer | 是  | K线类型，参考入参   | `1`             |
| `<v`   | String  | 是  | 成交量         | `0.34716`       |
| `<vw`  | String  | 是  | 成交额         | `35923.5149678` |


# 实时买卖盘口（Depth）订阅

## API说明

该WebSocket是获取买卖盘口的实时推送           &#x20;

## 请求频率

同一个WebSocket连接，所有的请求（订阅、取消订阅、心跳）限制为**1分钟60次**，如果超出请求频率限制将会自动断连。如果断连次数过多被系统判定为恶意请求将会封禁API Key。请在使用过程中注意调用逻辑。

## 错误码说明

参考[Websocket错误码说明](/getting-started/error-codes/websocket)

## 接口地址

请参考[Websocket订阅地址](/websocket-api/endpoints)

## 请求数量

不同的套餐对应的单Websocket订阅的产品数量不一样，具体参考[Websocket限制说明](/getting-started/api-limitation/websocket)

## 请求（协议号：10003）

```json
{
    "code": 10003,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "data": {
        "codes": "BTCUSDT"
    }
}
```

| 参数名      | 类型         | 必填 | 描述                                        | 示例值                                |
| -------- | ---------- | -- | ----------------------------------------- | ---------------------------------- |
| `code`   | Integer    | 是  | 请求的协议号                                    | 盘口订阅协议号：`10003`                    |
| `trace`  | String     | 是  | 可追溯ID（随机字符串）                              | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `data`   | JsonObject | 是  | 订阅数据                                      |                                    |
| `<codes` | String     | 是  | 订阅产品，多个用逗号分隔（一个websocket连接支持同时订阅最多600个产品） | `BTCUSDT`                          |

## 应答（协议号：10004）

```json
{
    "code": 10004,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok"
}
```

| 字段名     | 类型      | 必填 | 描述          | 示例值                                |
| ------- | ------- | -- | ----------- | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号       | 盘口响应协议号：`10004`                    |
| `trace` | String  | 是  | 订阅传入参数可追溯id | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应          | `ok`                               |

## 推送（协议号：10005）

```json
{
    "code": 10005,
    "data": {
        "a": [
            [
                "103594.12000000",
                "103594.13000000",
                "103594.38000000",
                "103594.39000000",
                "103594.40000000"
            ],
            [
                "3.50039000",
                "0.00016000",
                "0.00006000",
                "0.00006000",
                "0.00006000"
            ]
        ],
        "b": [
            [
                "103594.11000000",
                "103594.10000000",
                "103594.09000000",
                "103594.08000000",
                "103594.07000000"
            ],
            [
                "3.55117000",
                "0.05942000",
                "0.00006000",
                "0.00006000",
                "0.00006000"
            ]
        ],
        "s": "BTCUSDT",
        "t": 1747553102161
    }
}
```

<table><thead><tr><th width="97">字段名</th><th width="101">类型</th><th width="93">必填</th><th width="147">描述</th><th>示例值</th></tr></thead><tbody><tr><td><code>code</code></td><td>Integer</td><td>是</td><td>推送协议号</td><td>实时买卖盘口推送协议号：<code>10005</code></td></tr><tr><td><code>data</code></td><td>JSON</td><td>是</td><td>推送数据实体</td><td></td></tr><tr><td><code>&#x3C;s</code></td><td>String</td><td>是</td><td>标的名称</td><td><code>BTCUSDT</code></td></tr><tr><td><code>&#x3C;t</code></td><td>Long</td><td>是</td><td>Depth时间戳</td><td><code>1747552358393</code></td></tr><tr><td><code>&#x3C;a</code></td><td>JsonArray</td><td>是</td><td>卖盘，两个数组，分别是价格数组和成交量数组</td><td></td></tr><tr><td><code>&#x3C;a[0]</code></td><td>JsonArray</td><td>是</td><td>卖盘价格集合（通过下标跟卖盘成交量对应）</td><td><code>["103594.12000000","103594.13000000" ,"103594.38000000","103594.39000000" ,"103594.40000000" ]</code></td></tr><tr><td><code>&#x3C;a[1]</code></td><td>JsonArray</td><td>是</td><td>卖盘成交量集合（通过下标跟卖盘价格对应）</td><td><code>["3.50039000","0.00016000" ,"0.00006000","0.00006000" ,"0.00006000" ]</code></td></tr><tr><td><code>&#x3C;b</code></td><td>JsonArray</td><td>是</td><td>买盘，两个数组，分别是价格数组和成交量数组</td><td></td></tr><tr><td><code>&#x3C;b[0]</code></td><td>JsonArray</td><td>是</td><td>买盘价格集合（通过下标跟卖盘成交量对应）</td><td><code>["103594.11000000","103594.10000000" ,"103594.09000000","103594.08000000" ,"103594.07000000" ]</code></td></tr><tr><td><code>&#x3C;b[1]</code></td><td>JsonArray</td><td>是</td><td>买盘成交量集合（通过下标跟卖盘价格对应）</td><td><code>["3.55117000","0.05942000" ,"0.00006000","0.00006000" ,"0.00006000" ]</code></td></tr></tbody></table>


# Websocket取消订阅

该文档描述了如果通过Websocket参数取消实时成交明细、盘口、K线的订阅请求


# 实时成交明细（Trade）取消订阅

## API说明

展示如何在不断开Websocket连接的情况下，**全量取消**或者**只取消一部分**产品订阅           &#x20;

## 请求频率

同一个Websocket连接，所有的请求（订阅、取消订阅、心跳）限制为**1分钟60次**，如果超出请求频率限制将会自动断连。如果断连次数过多被系统判定为恶意请求将会封禁apikey。请在使用过程中注意调用逻辑。

## 错误码说明

参考[Websocket错误码说明](/getting-started/error-codes/websocket)

## 接口地址

请参考[Websocket订阅地址](/websocket-api/endpoints)

## 请求（协议号：11000）

```json
{
    "code": 11000,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "data": {
        "codes": "BTCUSDT"
    }
}
```

***解释：入参data或者codes可以为null或者空。***

***如果获取不到codes的值，会进行全量取消，也就是说如果订阅了100个产品对的成交明细都会清除订阅数据，不会再进行推送；如果传了codes值，会根据所传的产品单独清除订阅数据，不会影响其他产品的数据推送***

| 参数名      | 类型      | 必填 | 描述             | 示例值                                |
| -------- | ------- | -- | -------------- | ---------------------------------- |
| `code`   | Integer | 是  | 请求的协议号         | 实时成交明细取消订阅协议号：`11000`              |
| `trace`  | String  | 是  | 可追溯ID（随机字符串）   | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `data`   | JSON    | 否  | 取消订阅数据         |                                    |
| `＜codes` | String  | 否  | 取消订阅产品，多个用逗号分隔 | `BTCUSDT`                          |

## 应答（协议号：11010）

```json
{
    "code": 11010,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok"
}
```

| 字段名     | 类型      | 必填 | 描述          | 示例值                                |
| ------- | ------- | -- | ----------- | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号       | 取消订阅实时成交明细响应协议号：`11010`            |
| `trace` | String  | 是  | 订阅传入参数可追溯id | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应          | `ok`                               |


# 实时新闻（News）取消订阅

### API说明

展示如何在不断开 Websocket 连接的情况下，取消当前连接上的新闻订阅。取消后将不再推送新闻，直到再次发起订阅。

新闻连接同一时刻仅保留一份订阅，取消即为**全量取消**当前订阅条件。

### 请求频率

请保持心跳，建议每 **30 秒**发送一次心跳（协议号 `10010`）。若服务端超过 **60 秒**未收到心跳（业务心跳或 WebSocket Ping），将自动断连。

### 错误码说明

参考Websocket错误码说明

### 接口地址

```
wss://data.infoway.io/news?apikey=YourAPIKey
```

### 请求（协议号：11020）

```json
{
    "code": 11020,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0"
}
```

| 参数名     | 类型      | 必填 | 描述           | 示例值                                |
| ------- | ------- | -- | ------------ | ---------------------------------- |
| `code`  | Integer | 是  | 请求的协议号       | 实时新闻取消订阅协议号：`11020`                |
| `trace` | String  | 是  | 可追溯ID（随机字符串） | `423afec425004bd8a5e02e1ba5f9b2b0` |

### 应答（协议号：11010）

```json
{
    "code": 11010,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok"
}
```

| 字段名     | 类型      | 必填 | 描述           | 示例值                                |
| ------- | ------- | -- | ------------ | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号        | 取消订阅响应协议号：`11010`                  |
| `trace` | String  | 是  | 订阅传入参数可追溯 id | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应           | `ok`                               |


# 实时买卖盘口（Depth）取消订阅

Depth

## API说明

展示如何在不断开Websocket连接的情况下，**全量取消**或者**只取消一部分**产品订阅           &#x20;

## 请求频率

同一个Websocket连接，所有的请求（订阅、取消订阅、心跳）限制为**1分钟60次**，如果超出请求频率限制将会自动断连。如果断连次数过多被系统判定为恶意请求将会封禁apikey。请在使用过程中注意调用逻辑。

## 错误码说明

参考[Websocket错误码说明](/getting-started/error-codes/websocket)

## 接口地址

请参考[Websocket订阅地址](/websocket-api/endpoints)

## 请求（协议号：11001）

```json
{
    "code": 11001,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "data": {
        "codes": "BTCUSDT"
    }
}
```

***解释：入参data或者codes可以为null或者空。***

***如果获取不到codes的值，会进行全量取消，也就是说如果订阅了100个产品对的成交明细都会清除订阅数据，不会再进行推送；如果传了codes值，会根据所传的产品单独清除订阅数据，不会影响其他产品的数据推送***

| 参数名      | 类型      | 必填 | 描述             | 示例值                                |
| -------- | ------- | -- | -------------- | ---------------------------------- |
| `code`   | Integer | 是  | 请求的协议号         | 实时买卖盘口取消订阅协议号：`11001`              |
| `trace`  | String  | 是  | 可追溯ID（随机字符串）   | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `data`   | JSON    | 否  | 取消订阅数据         |                                    |
| `＜codes` | String  | 否  | 取消订阅产品，多个用逗号分隔 | `BTCUSDT`                          |

## 应答（协议号：11010）

```json
{
    "code": 11010,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok"
}
```

| 字段名     | 类型      | 必填 | 描述          | 示例值                                |
| ------- | ------- | -- | ----------- | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号       | 取消订阅实时买卖盘口响应协议号：`11010`            |
| `trace` | String  | 是  | 订阅传入参数可追溯id | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应          | `ok`                               |


# 实时K线（Candles）取消订阅

展示如何在不断开Websocket连接的情况下，全量取消或者只取消一部分产品订阅

## API说明

展示如何在不断开Websocket连接的情况下，**全量取消**或者**只取消一部分**产品订阅           &#x20;

## 请求频率

同一个Websocket连接，所有的请求（订阅、取消订阅、心跳）限制为**1分钟60次**，如果超出请求频率限制将会自动断连。如果断连次数过多被系统判定为恶意请求将会封禁apikey。请在使用过程中注意调用逻辑。

## 错误码说明

参考[Websocket错误码说明](/getting-started/error-codes/websocket)

## 接口地址

请参考[Websocket订阅地址](/websocket-api/endpoints)

## 请求（协议号：11002）

```json
{
    "code": 11002,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "data": {
        "codes": "BTCUSDT",
        "klineTypes": "1,2,4"
    }
}
```

***解释：入参data或者codes、***&#x6B;lineType&#x73;***可以为null或者空。***

***如果获取不到codes的值，会进行全量取消，也就是说如果订阅了100个产品对的成交明细都会清除订阅数据，不会再进行推送；如果传了codes值，会根据所传的产品单独清除订阅数据，不会影响其他产品的数据推送***

***如果获取不到klineTypes的值，会清除所需产品的所有Kline类型（1分钟至1年k）；如果传了klineTypes值，会根据所传的k线类型清除对应的类型数据推送***

***例如：假设订阅了产品A、B的1分钟k和5分钟k，入参codes="A"，klineTypes="1"，则只会取消产品A的1分钟k线推送，不会影响产品A的5分钟k推送以及产品B的1分钟和5分钟k推送***

| 参数名           | 类型      | 必填 | 描述                  | 示例值                                |
| ------------- | ------- | -- | ------------------- | ---------------------------------- |
| `code`        | Integer | 是  | 请求的协议号              | 实时K线取消订阅协议号：`11002`                |
| `trace`       | String  | 是  | 可追溯ID（随机字符串）        | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `data`        | JSON    | 否  | 取消订阅数据              |                                    |
| `＜codes`      | String  | 否  | 取消订阅产品，多个用逗号分隔      | `BTCUSDT`                          |
| `＜klineTypes` | String  | 否  | 取消订阅产品的k线类型，多个用逗号分隔 | 1,2                                |

## 应答（协议号：11010）

```json
{
    "code": 11010,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0",
    "msg": "ok"
}
```

| 字段名     | 类型      | 必填 | 描述          | 示例值                                |
| ------- | ------- | -- | ----------- | ---------------------------------- |
| `code`  | Integer | 是  | 响应协议号       | 取消订阅实时k线响应协议号：`11010`              |
| `trace` | String  | 是  | 订阅传入参数可追溯id | `423afec425004bd8a5e02e1ba5f9b2b0` |
| `msg`   | String  | 是  | 响应          | `ok`                               |


# 心跳机制

## API说明

该文档描述了如何对WebSocket连接发送心跳续期，用户需要主动发起心跳续期请求，如果服务端判断WebSocket连接在1分钟内没有发送过心跳请求，将会判定该连接为不活跃连接，并且断开连接请求。请用户合理设计心跳续期逻辑，可以参考[代码示例](/websocket-api/code-examples)。

## 请求频率

同一个WebSocket连接，所有的请求（订阅、取消订阅、心跳）限制为**1分钟60次**，如果超出请求频率限制将会自动断连。如果断连次数过多被系统判定为恶意请求将会封禁API Key。请在使用过程中注意调用逻辑。

## 错误码说明

参考[Websocket错误码说明](/getting-started/error-codes/websocket)

## 接口地址

请参考[Websocket订阅地址](/websocket-api/endpoints)

## 请求（协议号：10010）

```json
{
    "code": 10010,
    "trace": "423afec425004bd8a5e02e1ba5f9b2b0"
}
```

| 参数名     | 类型      | 必填 | 描述           | 示例值                                |
| ------- | ------- | -- | ------------ | ---------------------------------- |
| `code`  | Integer | 是  | 请求的协议号       | 心跳请求协议号：`10010`                    |
| `trace` | String  | 是  | 可追溯ID（随机字符串） | `423afec425004bd8a5e02e1ba5f9b2b0` |


# SDK & 开发者工具

Infoway 提供多语言官方 SDK、AI 集成工具及量化示例，帮助开发者快速接入实时金融数据。

### 官方 SDK

| 语言                   | 包名                       | 安装                        | 源码                                                          |
| -------------------- | ------------------------ | ------------------------- | ----------------------------------------------------------- |
| Python               | `infoway-sdk`            | `pip install infoway-sdk` | [GitHub](https://github.com/infoway-api/infoway-sdk-python) |
| Node.js / TypeScript | `infoway-sdk`            | `npm install infoway-sdk` | [GitHub](https://github.com/infoway-api/infoway-sdk-nodejs) |
| Java                 | `io.infoway:infoway-sdk` | Maven / Gradle            | [GitHub](https://github.com/infoway-api/infoway-sdk-java)   |

所有 SDK 均覆盖 REST API 和 WebSocket 实时推送，支持美股、港股、A股、日本、印度、加密货币及外汇市场。

* Python SDK: REST + WebSocket，Python 3.9+
* Node.js SDK: REST + WebSocket，TypeScript 全类型支持，Node.js 18+
* Java SDK: REST + WebSocket，Builder 模式，Java 17+

### AI 工具

* MCP Server: 为 Claude Desktop / Cursor 提供 17 个金融数据工具，一行命令安装
* AI 投资顾问: 基于 Claude 的智能投资顾问，Streamlit Web UI + CLI

### 示例与模板

* 量化入门示例: 6 个 Python 量化交易入门示例 + Jupyter Notebook
* 交易所工具箱: 面向交易所运营的参考实现（Python + Java）


# Python SDK

### 概述

Infoway 官方 Python SDK，提供 REST API 和 WebSocket 实时推送接口，覆盖股票、加密货币、外汇等多市场数据。

| 项目        | 说明                                                                                  |
| --------- | ----------------------------------------------------------------------------------- |
| PyPI      | [`infoway-sdk`](https://pypi.org/project/infoway-sdk/)                              |
| Python 版本 | 3.9+                                                                                |
| 协议        | MIT                                                                                 |
| GitHub    | [infoway-api/infoway-sdk-python](https://github.com/infoway-api/infoway-sdk-python) |

### 安装

```bash
pip install infoway-sdk
```

### 快速开始

```python
from infoway import InfowayClient, KlineType

client = InfowayClient(api_key="YOUR_API_KEY")

# 实时行情
trades = client.stock.get_trade("AAPL.US")

# 加密货币日K线
klines = client.crypto.get_kline("BTCUSDT", kline_type=KlineType.DAY, count=30)

# 市场温度
temp = client.market.get_temperature(market="HK,US")

# 行业板块排名
plates = client.plate.get_industry("HK", limit=10)
```

### 配置

可以直接传入 `api_key`，也可以通过环境变量设置：

```bash
export INFOWAY_API_KEY="YOUR_API_KEY"
```

```python
# 自动读取环境变量 INFOWAY_API_KEY
client = InfowayClient()
```

#### 客户端选项

```python
client = InfowayClient(
    api_key="YOUR_API_KEY",
    base_url="https://data.infoway.io",  # 默认值
    timeout=15.0,                         # 请求超时（秒）
    max_retries=3,                        # 失败重试次数
)
```

### REST API 模块

| 模块         | 访问方式                | 说明                    |
| ---------- | ------------------- | --------------------- |
| Stock      | `client.stock`      | 港股、美股、A股 — 行情、盘口、K线   |
| Crypto     | `client.crypto`     | 加密货币 — 行情、盘口、K线       |
| Japan      | `client.japan`      | 日本市场 — 行情、盘口、K线       |
| India      | `client.india`      | 印度市场 — 行情、盘口、K线       |
| Common     | `client.common`     | 跨市场通用 — 行情、盘口、K线      |
| Basic      | `client.basic`      | 品种列表、交易日、交易时间、复权因子    |
| Market     | `client.market`     | 市场温度、涨跌统计、全球指数、领涨行业   |
| Plate      | `client.plate`      | 行业/概念板块、成分股、热力图       |
| Stock Info | `client.stock_info` | 基本面 — 估值、评级、公司概览、全景数据 |

#### 行情数据方法（stock / crypto / japan / india / common）

| 方法                                    | 说明            |
| ------------------------------------- | ------------- |
| `get_trade(codes)`                    | 获取实时成交数据      |
| `get_depth(codes)`                    | 获取买卖盘口深度      |
| `get_kline(codes, kline_type, count)` | 获取K线（OHLCV）数据 |

#### 基础信息方法

```python
client.basic.get_symbols("US")             # 品种列表
client.basic.get_symbol_info("AAPL.US")    # 品种详情
client.basic.get_trading_days("US")        # 交易日历
client.basic.get_trading_hours("US")       # 交易时间
client.basic.get_adjustment_factors("AAPL.US")  # 复权因子
```

#### 市场概览方法

```python
client.market.get_temperature("HK,US")    # 市场温度/情绪
client.market.get_breadth("US")            # 涨跌统计
client.market.get_indexes()                # 全球主要指数
client.market.get_leaders("US", limit=10)  # 领涨行业
client.market.get_rank_config("US")        # 排行榜配置
```

#### 板块方法

```python
client.plate.get_industry("HK", limit=200)         # 行业板块列表
client.plate.get_concept("HK", limit=100)           # 概念板块列表
client.plate.get_members("IN20293.HK")              # 板块成分股
client.plate.get_intro("IN20293.HK")                # 行业介绍
client.plate.get_chart("HK", limit=50)              # 板块热力图
```

#### 个股基本面方法

```python
client.stock_info.get_valuation("AAPL.US")   # 估值数据
client.stock_info.get_ratings("AAPL.US")     # 机构评级
client.stock_info.get_company("AAPL.US")     # 公司概览
client.stock_info.get_panorama("AAPL.US")    # 全景数据
client.stock_info.get_concepts("AAPL.US")    # 概念标签
client.stock_info.get_events("AAPL.US", limit=20)  # 公司大事
client.stock_info.get_drivers("AAPL.US")     # 关键驱动分析
```

### WebSocket 实时推送

```python
import asyncio
from infoway.ws import InfowayWebSocket

async def main():
    ws = InfowayWebSocket(api_key="YOUR_API_KEY", business="stock")

    async def on_trade(msg):
        print(f"成交: {msg}")

    ws.on_trade = on_trade
    await ws.subscribe_trade("AAPL.US,TSLA.US")
    await ws.connect()

asyncio.run(main())
```

#### WebSocket 特性

* **自动重连**：指数退避策略（1秒 → 30秒上限）
* **心跳保活**：每30秒自动发送心跳包
* **自动重订阅**：重连后自动恢复之前的订阅
* 事件回调：`on_trade`、`on_depth`、`on_kline`、`on_error`、`on_reconnect`、`on_disconnect`

#### WebSocket 消息码

客户端 → 服务器（订阅 / 心跳）：

| 码值    | 名称           | 说明                                               |
| ----- | ------------ | ------------------------------------------------ |
| 10000 | SUB\_TRADE   | 订阅成交数据                                           |
| 10003 | SUB\_DEPTH   | 订阅盘口数据                                           |
| 10006 | SUB\_KLINE   | 订阅K线数据（`data.arr=[{codes, type}]`，type 见下方 K线类型） |
| 10010 | HEARTBEAT    | 心跳保活                                             |
| 11000 | UNSUB\_TRADE | 取消订阅成交                                           |
| 11001 | UNSUB\_DEPTH | 取消订阅盘口                                           |
| 11002 | UNSUB\_KLINE | 取消订阅K线                                           |

服务器 → 客户端（确认 / 推送）：

| 码值    | 名称              | 说明         |
| ----- | --------------- | ---------- |
| 10001 | SUB\_TRADE\_ACK | 成交订阅确认     |
| 10002 | PUSH\_TRADE     | **实时成交推送** |
| 10004 | SUB\_DEPTH\_ACK | 盘口订阅确认     |
| 10005 | PUSH\_DEPTH     | **实时盘口推送** |
| 10007 | SUB\_KLINE\_ACK | K线订阅确认     |
| 10008 | PUSH\_KLINE     | **实时K线推送** |
| 11010 | UNSUB\_ACK      | 取消订阅确认     |

#### K线类型

| 枚举值                      | 周期   |
| ------------------------ | ---- |
| `KlineType.MIN_1` (1)    | 1分钟  |
| `KlineType.MIN_5` (2)    | 5分钟  |
| `KlineType.MIN_15` (3)   | 15分钟 |
| `KlineType.MIN_30` (4)   | 30分钟 |
| `KlineType.HOUR_1` (5)   | 1小时  |
| `KlineType.HOUR_2` (6)   | 2小时  |
| `KlineType.HOUR_4` (7)   | 4小时  |
| `KlineType.DAY` (8)      | 日线   |
| `KlineType.WEEK` (9)     | 周线   |
| `KlineType.MONTH` (10)   | 月线   |
| `KlineType.QUARTER` (11) | 季线   |
| `KlineType.YEAR` (12)    | 年线   |

### 错误处理

```python
from infoway import InfowayClient, InfowayAPIError, InfowayAuthError, InfowayTimeoutError

client = InfowayClient(api_key="YOUR_API_KEY")

try:
    trades = client.stock.get_trade("AAPL.US")
except InfowayAuthError:
    print("API Key 无效")
except InfowayTimeoutError:
    print("请求超时")
except InfowayAPIError as e:
    print(f"API 错误 [{e.ret}]: {e.msg}")
```

***


# Node.js SDK

### 概述

Infoway 官方 Node.js/TypeScript SDK，提供完整的 REST API 和 WebSocket 实时推送接口，全面的 TypeScript 类型定义。

| 项目         | 说明                                                                                  |
| ---------- | ----------------------------------------------------------------------------------- |
| npm        | [`infoway-sdk`](https://www.npmjs.com/package/infoway-sdk)                          |
| Node.js 版本 | 18+                                                                                 |
| 协议         | MIT                                                                                 |
| GitHub     | [infoway-api/infoway-sdk-nodejs](https://github.com/infoway-api/infoway-sdk-nodejs) |

### 安装

```bash
npm install infoway-sdk
# 或
yarn add infoway-sdk
# 或
pnpm add infoway-sdk
```

### 快速开始

```typescript
import { InfowayClient, KlineType } from "infoway-sdk";

const client = new InfowayClient({ apiKey: "YOUR_API_KEY" });

// 股票实时行情
const trades = await client.stock.getTrade("AAPL.US");

// 多个标的同时查询
const multiTrades = await client.stock.getTrade("AAPL.US,TSLA.US,GOOGL.US");

// 买卖盘口
const depth = await client.stock.getDepth("AAPL.US");

// K线数据
const klines = await client.stock.getKline("AAPL.US", KlineType.DAY, 100);

// 加密货币
const btc = await client.crypto.getTrade("BTCUSDT");

// 市场温度
const temp = await client.market.getTemperature("HK,US");

// 个股基本面
const valuation = await client.stockInfo.getValuation("AAPL.US");

// 板块数据
const industries = await client.plate.getIndustry("HK");
```

### 配置

```bash
export INFOWAY_API_KEY="YOUR_API_KEY"
```

```typescript
// 自动读取环境变量 INFOWAY_API_KEY
const client = new InfowayClient();
```

### REST API 客户端

| 客户端                | 说明             |
| ------------------ | -------------- |
| `client.stock`     | 港股、美股、A股行情     |
| `client.crypto`    | 加密货币行情         |
| `client.japan`     | 日本股市行情         |
| `client.india`     | 印度股市行情         |
| `client.common`    | 跨市场通用行情        |
| `client.basic`     | 品种列表、交易日、交易时间  |
| `client.market`    | 市场温度、涨跌统计、全球指数 |
| `client.plate`     | 行业/概念板块分析      |
| `client.stockInfo` | 估值、评级、公司概览     |

#### 行情数据方法（stock / crypto / japan / india / common）

| 方法                                  | 说明       |
| ----------------------------------- | -------- |
| `getTrade(codes)`                   | 获取实时成交数据 |
| `getDepth(codes)`                   | 获取买卖盘口深度 |
| `getKline(codes, klineType, count)` | 获取K线数据   |

### WebSocket 实时推送

```typescript
import { InfowayWebSocket, Business } from "infoway-sdk";

const ws = new InfowayWebSocket({
  apiKey: "YOUR_API_KEY",
  business: Business.STOCK,
});

ws.onTrade = (msg) => {
  console.log("成交:", msg);
};

ws.onDepth = (msg) => {
  console.log("盘口:", msg);
};

ws.onKline = (msg) => {
  console.log("K线:", msg);
};

ws.onDisconnect = () => {
  console.log("连接断开，正在重连...");
};

ws.onReconnect = () => {
  console.log("已重连！");
};

await ws.subscribeTrade("AAPL.US,TSLA.US");
await ws.subscribeDepth("AAPL.US");
await ws.connect();
```

#### 加密货币 WebSocket

```typescript
const ws = new InfowayWebSocket({
  apiKey: "YOUR_API_KEY",
  business: Business.CRYPTO,
});

ws.onTrade = (msg) => console.log("加密货币成交:", msg);
await ws.subscribeTrade("BTCUSDT,ETHUSDT");
await ws.connect();
```

### K线类型

| 枚举值                      | 周期   |
| ------------------------ | ---- |
| `KlineType.MIN_1` (1)    | 1分钟  |
| `KlineType.MIN_5` (2)    | 5分钟  |
| `KlineType.MIN_15` (3)   | 15分钟 |
| `KlineType.MIN_30` (4)   | 30分钟 |
| `KlineType.HOUR_1` (5)   | 1小时  |
| `KlineType.HOUR_2` (6)   | 2小时  |
| `KlineType.HOUR_4` (7)   | 4小时  |
| `KlineType.DAY` (8)      | 日线   |
| `KlineType.WEEK` (9)     | 周线   |
| `KlineType.MONTH` (10)   | 月线   |
| `KlineType.QUARTER` (11) | 季线   |
| `KlineType.YEAR` (12)    | 年线   |

### 错误处理

```typescript
import { InfowayAPIError, InfowayAuthError, InfowayTimeoutError } from "infoway-sdk";

try {
  const data = await client.stock.getTrade("AAPL.US");
} catch (err) {
  if (err instanceof InfowayAuthError) {
    console.error("认证失败，请检查 API Key");
  } else if (err instanceof InfowayTimeoutError) {
    console.error("请求超时");
  } else if (err instanceof InfowayAPIError) {
    console.error(`API 错误 [${err.ret}]: ${err.msg}`);
  }
}
```

***


# Java SDK

### 概述

Infoway 官方 Java SDK，采用 Builder 模式设计，提供 REST API 和 WebSocket 实时推送接口。

| 项目            | 说明                                                                                 |
| ------------- | ---------------------------------------------------------------------------------- |
| Maven Central | [`io.infoway:infoway-sdk`](https://repo1.maven.org/maven2/io/infoway/infoway-sdk/) |
| Java 版本       | 17+                                                                                |
| 依赖            | OkHttp 4.x、Gson、SLF4J                                                              |
| 协议            | MIT                                                                                |
| GitHub        | [infoway-api/infoway-sdk-java](https://github.com/infoway-api/infoway-sdk-java)    |

### 安装

#### Maven

```xml
<dependency>
    <groupId>io.infoway</groupId>
    <artifactId>infoway-sdk</artifactId>
    <version>0.1.0</version>
</dependency>
```

#### Gradle

```groovy
implementation 'io.infoway:infoway-sdk:0.1.0'
```

### 快速开始

```java
import io.infoway.sdk.InfowayClient;
import io.infoway.sdk.KlineType;
import com.google.gson.JsonElement;

// 创建客户端
InfowayClient client = InfowayClient.builder()
    .apiKey("YOUR_API_KEY")
    .build();

// 实时行情
JsonElement trades = client.stock().getTrade("AAPL.US");

// 加密货币K线
JsonElement klines = client.crypto().getKline("BTCUSDT", KlineType.DAY, 100);

// 市场温度
JsonElement temp = client.market().getTemperature("HK,US");

// 行业板块
JsonElement industry = client.plate().getIndustry("HK", 10);

// 公司概览
JsonElement company = client.stockInfo().getCompany("AAPL.US");

// 关闭客户端
client.close();
```

### 配置

| Builder 方法      | 默认值                       | 说明      |
| --------------- | ------------------------- | ------- |
| `apiKey(key)`   | 环境变量 `INFOWAY_API_KEY`    | API 密钥  |
| `baseUrl(url)`  | `https://data.infoway.io` | 基础 URL  |
| `timeout(secs)` | `15`                      | 请求超时（秒） |
| `maxRetries(n)` | `3`                       | 最大重试次数  |

### REST API 客户端

#### 行情数据（stock / crypto / japan / india / common）

| 方法                             | 说明     |
| ------------------------------ | ------ |
| `getTrade(codes)`              | 实时成交数据 |
| `getDepth(codes)`              | 买卖盘口深度 |
| `getKline(codes, type, count)` | K线数据   |

#### 基础信息

```java
client.basic().getSymbols("US");                    // 品种列表
client.basic().getSymbolInfo("AAPL.US");            // 品种详情
client.basic().getTradingDays("US");                // 交易日历
client.basic().getTradingHours("US");               // 交易时间
client.basic().getAdjustmentFactors("AAPL.US");     // 复权因子
```

#### 市场概览

```java
client.market().getTemperature("HK,US");   // 市场温度
client.market().getBreadth("US");          // 涨跌统计
client.market().getIndexes();              // 全球指数
client.market().getLeaders("US", 10);      // 领涨行业
client.market().getRankConfig("US");       // 排行榜配置
```

#### 板块分析

```java
client.plate().getIndustry("HK", 200);              // 行业板块列表
client.plate().getConcept("HK", 100);               // 概念板块列表
client.plate().getMembers("IN20293.HK", 0, 50);     // 板块成分股
client.plate().getIntro("IN20293.HK");              // 行业介绍
client.plate().getChart("HK", 50);                  // 板块热力图
```

#### 个股基本面

```java
client.stockInfo().getValuation("AAPL.US");  // 估值数据
client.stockInfo().getRatings("AAPL.US");    // 机构评级
client.stockInfo().getCompany("AAPL.US");    // 公司概览
client.stockInfo().getPanorama("AAPL.US");    // 全景数据
client.stockInfo().getConcepts("AAPL.US");    // 概念标签
client.stockInfo().getEvents("AAPL.US", 20);  // 公司大事
client.stockInfo().getDrivers("AAPL.US");     // 关键驱动
```

### WebSocket 实时推送

```java
import io.infoway.sdk.InfowayWebSocket;

InfowayWebSocket ws = InfowayWebSocket.builder()
    .apiKey("YOUR_API_KEY")
    .business("stock")
    .onTrade(msg -> System.out.println("成交: " + msg))
    .onDepth(msg -> System.out.println("盘口: " + msg))
    .onKline(msg -> System.out.println("K线: " + msg))
    .onError(err -> System.err.println("错误: " + err.getMessage()))
    .onReconnect(() -> System.out.println("已重连"))
    .build();

ws.connect();
ws.subscribeTrade("AAPL.US,TSLA.US");
ws.subscribeDepth("AAPL.US");

// 取消订阅
ws.unsubscribeTrade("TSLA.US");
// 关闭连接
ws.close();
```

### K线类型

| 枚举值          | 周期   |
| ------------ | ---- |
| MIN\_1 (1)   | 1分钟  |
| MIN\_5 (2)   | 5分钟  |
| MIN\_15 (3)  | 15分钟 |
| MIN\_30 (4)  | 30分钟 |
| HOUR\_1 (5)  | 1小时  |
| HOUR\_2 (6)  | 2小时  |
| HOUR\_4 (7)  | 4小时  |
| DAY (8)      | 日线   |
| WEEK (9)     | 周线   |
| MONTH (10)   | 月线   |
| QUARTER (11) | 季线   |
| YEAR (12)    | 年线   |

### 错误处理

```java
import io.infoway.sdk.exception.*;

try {
    client.stock().getTrade("AAPL.US");
} catch (InfowayAuthException e) {
    System.err.println("认证失败: " + e.getMsg());
} catch (InfowayApiException e) {
    System.err.println("API 错误 [" + e.getRet() + "]: " + e.getMsg());
    System.err.println("Trace ID: " + e.getTraceId());
} catch (InfowayTimeoutException e) {
    System.err.println("请求超时: " + e.getMessage());
}
```

***


# MCP Server

### 概述

Infoway MCP Server 是基于 [Model Context Protocol](https://modelcontextprotocol.io/) 的金融数据服务器，让 Claude Desktop、Cursor 等 AI 助手可以直接在对话中查询实时金融数据。

| 项目        | 说明                                                                                  |
| --------- | ----------------------------------------------------------------------------------- |
| PyPI      | [`infoway-mcp-server`](https://pypi.org/project/infoway-mcp-server/)                |
| ClawHub   | [`infoway-financial-data`](https://clawhub.ai/infoway-api/infoway-financial-data)   |
| Python 版本 | 3.10+                                                                               |
| 传输方式      | stdio                                                                               |
| 工具数量      | 17 个                                                                                |
| GitHub    | [infoway-api/infoway-mcp-server](https://github.com/infoway-api/infoway-mcp-server) |

### 功能特点

* **17 个金融数据工具**，涵盖实时行情、K线图、市场概览、板块分析和个股基本面
* **多市场支持**：美股、港股、A股、新加坡、日本、印度 + 加密货币 + 外汇
* **零配置**：只需添加 API Key 即可开始使用
* 支持 Claude Desktop、Cursor 及所有兼容 MCP 协议的客户端

### 安装

```bash
# 使用 uvx（推荐）
uvx infoway-mcp-server

# 使用 pip
pip install infoway-mcp-server
```

### 配置

#### Claude Desktop

将以下内容添加到 Claude Desktop 配置文件：

* macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
* Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "infoway": {
      "command": "uvx",
      "args": ["infoway-mcp-server"],
      "env": {
        "INFOWAY_API_KEY": "你的API密钥"
      }
    }
  }
}
```

#### Cursor

添加到 Cursor MCP 配置文件（`.cursor/mcp.json`）：

```json
{
  "mcpServers": {
    "infoway": {
      "command": "uvx",
      "args": ["infoway-mcp-server"],
      "env": {
        "INFOWAY_API_KEY": "你的API密钥"
      }
    }
  }
}
```

#### Claude Code

添加到 Claude Code 配置文件（`.claude/settings.json`）：

```json
{
  "mcpServers": {
    "infoway": {
      "command": "uvx",
      "args": ["infoway-mcp-server"],
      "env": {
        "INFOWAY_API_KEY": "你的API密钥"
      }
    }
  }
}
```

### 工具列表

#### 实时行情（3个）

| 工具名                  | 说明                              |
| -------------------- | ------------------------------- |
| `get_realtime_trade` | 获取股票、加密货币、外汇的实时成交数据（价格、成交量、涨跌幅） |
| `get_market_depth`   | 获取标的买卖盘口深度数据                    |
| `get_kline`          | 获取K线（OHLCV）蜡烛图数据，支持1分钟到年线共12种周期 |

#### 市场概览（4个）

| 工具名                      | 说明                                 |
| ------------------------ | ---------------------------------- |
| `get_market_temperature` | 获取市场温度/情绪指标（0-100）                 |
| `get_market_breadth`     | 获取市场涨跌家数分布统计                       |
| `get_global_indexes`     | 获取全球主要股指实时数据（道琼斯、标普500、纳斯达克、恒生指数等） |
| `get_leading_industries` | 获取当日领涨行业板块排名                       |

#### 板块分析（4个）

| 工具名                 | 说明                        |
| ------------------- | ------------------------- |
| `get_industry_list` | 获取行业板块完整列表及涨跌数据           |
| `get_concept_list`  | 获取概念/主题板块列表（AI、新能源车、元宇宙等） |
| `get_plate_members` | 获取指定板块内的所有成分股             |
| `get_plate_heatmap` | 获取板块热力图数据，用于可视化展示         |

#### 个股基本面（5个）

| 工具名                    | 说明                            |
| ---------------------- | ----------------------------- |
| `get_company_overview` | 获取公司简介、高管、总部等基本信息             |
| `get_stock_valuation`  | 获取估值指标：PE、PB、EV/EBITDA、股息率、市值 |
| `get_stock_ratings`    | 获取分析师评级：买入/卖出/持有家数、目标价        |
| `get_stock_panorama`   | 获取个股全景数据概览                    |
| `get_stock_drivers`    | 获取影响股价的关键驱动因素分析               |

#### 工具类（1个）

| 工具名              | 说明                 |
| ---------------- | ------------------ |
| `search_symbols` | 搜索和查询可用交易品种，可按市场过滤 |

### 支持的标的格式

| 市场    | 格式        | 示例          |
| ----- | --------- | ----------- |
| 美股    | `{代码}.US` | `AAPL.US`   |
| 港股    | `{代码}.HK` | `700.HK`    |
| A股上交所 | `{代码}.SH` | `600519.SH` |
| A股深交所 | `{代码}.SZ` | `000001.SZ` |
| 加密货币  | `{交易对}`   | `BTCUSDT`   |
| 外汇    | `{货币对}`   | `USDJPY`    |

### 对话示例

> **"苹果和特斯拉现在什么价格？"** Claude 会调用 `get_realtime_trade`，标的 `AAPL.US,TSLA.US`

> **"看一下比特币最近30天的日K线"** Claude 会调用 `get_kline`，标的 `BTCUSDT`，market\_type `crypto`

> **"今天美股表现怎么样？哪些板块领涨？"** Claude 会调用 `get_market_temperature` 和 `get_leading_industries`

> **"帮我全面分析一下腾讯"** Claude 会组合调用 `get_company_overview`、`get_stock_valuation`、`get_stock_ratings`、`get_stock_drivers`

> **"对比一下英伟达和 AMD 的估值"** Claude 会分别调用 `get_stock_valuation` 查询 `NVDA.US` 和 `AMD.US`

***


# AI 投资顾问

### 概述

基于 Claude 大语言模型的智能投资顾问，将 Claude 的分析能力与 Infoway 实时金融数据相结合。支持自然语言对话、预设分析模板和 Web 可视化界面。

| 项目        | 说明                                                                                  |
| --------- | ----------------------------------------------------------------------------------- |
| Python 版本 | 3.10+                                                                               |
| 依赖        | `infoway-sdk`、`anthropic`、`streamlit`                                               |
| GitHub    | [infoway-api/infoway-ai-advisor](https://github.com/infoway-api/infoway-ai-advisor) |

### 功能特点

* **自然语言交互**：用日常语言提问即可获取专业金融分析
* **10 个内置数据工具**：自动调用 Infoway API 获取实时数据
* **3 个预设分析模板**：每日市场简报、个股诊断、板块轮动分析
* **Streamlit Web UI**：可视化交互界面
* **CLI 命令行**：适合自动化和脚本调用

### 安装

```bash
git clone https://github.com/infoway-api/infoway-ai-advisor.git
cd infoway-ai-advisor
pip install -r requirements.txt
```

#### 环境变量

```bash
export ANTHROPIC_API_KEY="你的 Anthropic API Key"
export INFOWAY_API_KEY="你的 Infoway API Key"
```

### Web UI

```bash
streamlit run web/app.py
```

启动后在浏览器中打开，可以：

* 在左侧配置 API Key
* 使用预设按钮一键生成分析报告
* 自由输入问题进行对话

### CLI 示例

#### 每日市场简报

```bash
python examples/daily_briefing.py
```

生成港股和美股的每日市场概况，包括市场温度、领涨行业、指数表现等。

#### 个股诊断

```bash
python examples/stock_diagnosis.py AAPL.US
```

对单只股票进行深度分析，包括估值评估、机构评级、关键驱动因素等。

#### 板块轮动分析

```bash
python examples/sector_rotation.py HK
```

分析指定市场的板块轮动模式，识别资金流向和热门概念。

### 内置数据工具

| 工具   | 说明              |
| ---- | --------------- |
| 实时行情 | 获取标的最新成交价、量、涨跌幅 |
| K线数据 | 获取历史K线用于趋势分析    |
| 市场温度 | 获取市场整体情绪和估值水平   |
| 涨跌统计 | 获取市场涨跌家数分布      |
| 全球指数 | 获取全球主要指数行情      |
| 领涨行业 | 获取当日表现最佳的行业板块   |
| 行业列表 | 获取完整行业板块列表      |
| 板块成分 | 获取指定板块内的成分股     |
| 公司概览 | 获取公司基本信息        |
| 估值数据 | 获取估值指标（PE/PB等）  |

### 项目结构

```
ai-advisor/
├── advisor/
│   ├── agent.py       # Claude 工具调用循环（最多15轮）
│   ├── tools.py       # 10个工具定义 + 分发器
│   ├── analysis.py    # 预设分析模板
│   └── report.py      # Markdown 报告格式化
├── web/
│   └── app.py         # Streamlit Web UI
└── examples/
    ├── daily_briefing.py      # 每日简报
    ├── stock_diagnosis.py     # 个股诊断
    └── sector_rotation.py     # 板块轮动
```

***


# 量化入门示例

### 概述

面向量化交易初学者的教学示例集，包含 6 个由浅入深的 Python 示例和一个 Jupyter Notebook 交互教程。所有示例基于 Infoway Python SDK 构建。

| 项目        | 说明                                                                                        |
| --------- | ----------------------------------------------------------------------------------------- |
| Python 版本 | 3.9+                                                                                      |
| 依赖        | `infoway-sdk`、`pandas`、`matplotlib`、`jupyter`                                             |
| GitHub    | [infoway-api/infoway-quant-starter](https://github.com/infoway-api/infoway-quant-starter) |

### 安装

```bash
git clone https://github.com/infoway-api/infoway-quant-starter.git
cd infoway-quant-starter
pip install -r requirements.txt
```

### 示例列表

#### 01 — 实时行情监控

```bash
python examples/01_realtime_monitor.py
```

通过 WebSocket 实时接收并展示成交数据，学习：

* WebSocket 连接与事件回调
* 实时数据流处理
* 终端实时展示

#### 02 — K线数据下载

```bash
python examples/02_kline_download.py
```

批量下载 K 线历史数据并导出为 CSV，学习：

* REST API 批量请求
* 数据清洗与格式化
* CSV 文件导出

#### 03 — 均线交叉策略

```bash
python examples/03_moving_average.py
```

经典双均线交叉回测策略，学习：

* 移动平均线计算
* 交易信号生成
* 收益率与最大回撤计算
* matplotlib 图表绘制

#### 04 — 加密货币套利扫描

```bash
python examples/04_crypto_arbitrage.py
```

跨报价货币的价差扫描器，学习：

* 多品种同时监控
* 价差计算与套利机会检测
* 实时数据对比分析

#### 05 — 市场热力图

```bash
python examples/05_market_heatmap.py
```

板块热力图可视化，学习：

* 板块数据获取与处理
* 终端彩色热力展示
* matplotlib 热力图绘制

#### 06 — 多市场扫描器

```bash
python examples/06_multi_market_scanner.py
```

多市场温度异常检测，学习：

* 多市场数据并行获取
* 温度/情绪指标分析
* 异常信号识别

#### Jupyter Notebook 入门教程

```bash
jupyter notebook notebooks/getting_started.ipynb
```

交互式教程，涵盖：

* SDK 安装与客户端创建
* 实时行情获取
* K线数据查询与图表绘制
* 市场温度分析

***


# 交易所工具箱

### 概述

面向交易所运营人员的参考实现集合，提供 Python 和 Java 两种语言的生产级示例，覆盖数据网关、缓存服务、盘口聚合和数据仓库等场景。

| 项目        | 说明                                                                                              |
| --------- | ----------------------------------------------------------------------------------------------- |
| Python 版本 | 3.10+                                                                                           |
| Java 版本   | 17+                                                                                             |
| GitHub    | [infoway-api/infoway-exchange-toolkit](https://github.com/infoway-api/infoway-exchange-toolkit) |

### 安装

```bash
git clone https://github.com/infoway-api/infoway-exchange-toolkit.git
cd infoway-exchange-toolkit
pip install -r requirements.txt  # Python 示例
```

### Python 示例

#### 多市场 WebSocket 网关

```bash
python examples/market_data_gateway/gateway.py
```

统一的多市场实时数据网关：

* 同时连接股票、加密货币、通用市场 WebSocket
* 统一的成交数据聚合处理
* 运行时统计（每秒成交笔数、运行时长、各市场分别统计）
* 信号处理，支持优雅关闭

#### 板块数据服务

```bash
python examples/plate_data_service/service.py
```

带缓存的板块数据查询服务：

* 内存缓存 + 后台自动刷新
* 线程安全（RLock）
* 可配置 TTL
* 支持行业、概念、成分股查询

#### 盘口聚合器

```bash
python examples/orderbook_aggregator/aggregator.py
```

多标的盘口数据聚合与分析：

* 聚合多个标的的买卖盘口
* 计算买卖价差、中间价、盘口不平衡度、总量
* 跨标的分析（最宽/最窄价差、最活跃标的、最大不平衡度）
* 支持股票、加密货币、通用三种市场类型

#### K线数据仓库

```bash
python examples/kline_data_warehouse/warehouse.py
```

基于 SQLite 的K线数据本地仓库：

* SQLite 存储，`(symbol, timestamp)` 主键
* 增量同步（仅获取新数据）
* 批量同步 + 频率限制保护
* 按日期范围查询

### Java 示例

#### WebSocket 网关

```bash
cd java-examples
mvn compile exec:java -Dexec.mainClass="WebSocketGateway"
```

Java 版多市场 WebSocket 网关，支持股票和加密货币实时数据接入。

#### 行情数据服务

```bash
cd java-examples
mvn compile exec:java -Dexec.mainClass="MarketDataService"
```

基于 Infoway Java SDK 的 REST 行情数据查询服务。


