> For the complete documentation index, see [llms.txt](https://docscn.jkidata.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docscn.jkidata.com/rest-api-xie-yi-shuo-ming/hang-qing-bao-jia-jie-kou-quote.md).

# 📈 行情报价接口（Quote）

获取一个或多个交易产品的最新行情数据，包括最新价、开盘价、最高价、最低价、成交量、成交额和买卖报价等信息。

### 接口信息

| 项目   | 说明       |
| ---- | -------- |
| 请求方式 | `GET`    |
| 接口路径 | `/quote` |
| 返回格式 | JSON 数组  |
| 字符编码 | UTF-8    |
| 身份认证 | API Key  |
| 批量查询 | 支持       |

### 请求参数

| 参数         | 类型     | 必填 | 说明                |
| ---------- | ------ | -- | ----------------- |
| `exchange` | String | 是  | 交易所代码，例如 `NASDAQ` |
| `symbol`   | String | 是  | 产品代码；多个代码使用英文逗号分隔 |
| `key`      | String | 是  | 用户的 API Key       |

### 单产品请求

获取 Apple Inc.（AAPL）的最新行情：

```
GET /quote?exchange=NASDAQ&symbol=AAPL&key=your_api_key
```

### 多产品请求

一次获取 AAPL 和 AMD 的最新行情：

```
GET /quote?exchange=NASDAQ&symbol=AAPL,AMD&key=your_api_key
```

多个产品代码必须：

* 属于同一个交易所。
* 使用英文逗号 `,` 分隔。
* 不添加空格。

正确格式：

```
AAPL,AMD
```

不推荐：

```
AAPL, AMD
```

### cURL 示例

#### 单产品

```
curl "${JKIDATA_BASE_URL}/quote?exchange=NASDAQ&symbol=AAPL&key=${JKIDATA_API_KEY}"
```

#### 多产品

```
curl "${JKIDATA_BASE_URL}/quote?exchange=NASDAQ&symbol=AAPL,AMD&key=${JKIDATA_API_KEY}"
```

### Python 示例

#### 单产品

```
import requests

params = {
    "exchange": "NASDAQ",
    "symbol": "AAPL",
    "key": "your_api_key",
}

response = requests.get(
    f"{BASE_URL}/quote",
    params=params,
    timeout=30,
)

response.raise_for_status()
quotes = response.json()

print(quotes)
```

#### 多产品

```
import requests

params = {
    "exchange": "NASDAQ",
    "symbol": "AAPL,AMD",
    "key": "your_api_key",
}

response = requests.get(
    f"{BASE_URL}/quote",
    params=params,
    timeout=30,
)

response.raise_for_status()
quotes = response.json()

for item in quotes:
    quote = item["msg"]

    print(
        quote["e"],
        quote["s"],
        quote["p"],
    )
```

将返回数据转换为以产品代码为键的字典：

```
quotes_by_symbol = {
    item["msg"]["s"]: item["msg"]
    for item in quotes
}

apple = quotes_by_symbol.get("AAPL")
amd = quotes_by_symbol.get("AMD")

print(apple)
print(amd)
```

### JavaScript 示例

#### 单产品

```
const params = new URLSearchParams({
  exchange: "NASDAQ",
  symbol: "AAPL",
  key: "your_api_key",
});

const response = await fetch(
  `${BASE_URL}/quote?${params.toString()}`
);

if (!response.ok) {
  throw new Error(`HTTP ${response.status}`);
}

const quotes = await response.json();
console.log(quotes);
```

#### 多产品

```
const params = new URLSearchParams({
  exchange: "NASDAQ",
  symbol: "AAPL,AMD",
  key: "your_api_key",
});

const response = await fetch(
  `${BASE_URL}/quote?${params.toString()}`
);

if (!response.ok) {
  throw new Error(`HTTP ${response.status}`);
}

const quotes = await response.json();

for (const item of quotes) {
  const quote = item.msg;

  console.log(
    quote.e,
    quote.s,
    quote.p
  );
}
```

将结果转换为以产品代码为键的对象：

```
const quotesBySymbol = Object.fromEntries(
  quotes.map((item) => [
    item.msg.s,
    item.msg,
  ])
);

console.log(quotesBySymbol.AAPL);
console.log(quotesBySymbol.AMD);
```

### 响应结构

接口返回 JSON 数组。数组中的每个元素代表一个产品的行情消息。

```
[
  {
    "msg": {
      "e": "NASDAQ",
      "s": "AAPL",
      "p": "319.7"
    },
    "type": "quote"
  },
  {
    "msg": {
      "e": "NASDAQ",
      "s": "AMD",
      "p": "465.58"
    },
    "type": "quote"
  }
]
```

### 完整响应示例

以下内容为 AAPL、AMD 批量请求验证时的行情快照。行情数值会随市场变化。

```
[
  {
    "msg": {
      "average": "319.5134",
      "a": "12",
      "ytdc": "314.58",
      "amount": "12348868284.3856",
      "lastVolume": "100.0",
      "utc": "1787961592",
      "e": "NASDAQ",
      "pchg": "1.628",
      "bidSize": "40",
      "h": "322.37",
      "l": "315.4504",
      "o": "316.845",
      "p": "319.7",
      "s": "AAPL",
      "marketOpen": "2",
      "v": "38648984.0",
      "ask": "320.18",
      "bid": "319.91",
      "askSize": "120",
      "ts": "1787961592,320.126,100,1,"
    },
    "type": "quote"
  },
  {
    "msg": {
      "average": "470.4257",
      "a": "12",
      "ytdc": "476.67",
      "amount": "7231970010.8222",
      "lastVolume": "100.0",
      "utc": "1787961580",
      "e": "NASDAQ",
      "pchg": "-2.327",
      "bidSize": "400",
      "h": "478.75",
      "l": "465.29",
      "o": "472.52",
      "p": "465.58",
      "s": "AMD",
      "marketOpen": "2",
      "v": "15373246.0",
      "ask": "466.05",
      "bid": "466.0",
      "askSize": "100",
      "ts": "1787961580,466.0423,100,1,"
    },
    "type": "quote"
  }
]
```

### 外层字段

| 字段     | 类型     | 说明                   |
| ------ | ------ | -------------------- |
| `type` | String | 消息类型，行情数据通常为 `quote` |
| `msg`  | Object | 当前产品的行情数据            |

### 常用行情字段

| 字段           | 类型     | 说明         |
| ------------ | ------ | ---------- |
| `e`          | String | 交易所代码      |
| `s`          | String | 产品代码       |
| `utc`        | String | 行情 UTC 时间戳 |
| `p`          | String | 最新价格       |
| `o`          | String | 当日开盘价      |
| `h`          | String | 当日最高价      |
| `l`          | String | 当日最低价      |
| `v`          | String | 当日成交量      |
| `amount`     | String | 当日成交额      |
| `pchg`       | String | 涨跌幅        |
| `ytdc`       | String | 昨日收盘价      |
| `average`    | String | 平均成交价格     |
| `bid`        | String | 最优买价       |
| `bidSize`    | String | 最优买量       |
| `ask`        | String | 最优卖价       |
| `askSize`    | String | 最优卖量       |
| `lastVolume` | String | 最近一笔成交量    |
| `marketOpen` | String | 市场开市状态     |
| `ts`         | String | 时间与成交信息    |
| `a`          | String | 扩展行情信息     |

完整字段含义和不同市场的支持情况，请查看“实时报价字段说明”。

### 数据类型说明

当前行情数值主要以字符串形式返回，例如：

```
{
  "p": "319.7",
  "v": "38648984.0",
  "pchg": "1.628"
}
```

如果需要计算，应先进行类型转换。

Python：

```
price = float(quote["p"])
volume = float(quote["v"])
```

JavaScript：

```
const price = Number(quote.p);
const volume = Number(quote.v);
```

转换前应检查字段是否存在、是否为空，以及是否能转换为有效数值。

### 批量响应处理

批量请求返回数组，客户端不应只根据数组位置判断产品。

建议使用以下字段识别每条行情：

```
msg.e + msg.s
```

例如：

```
NASDAQ:AAPL
NASDAQ:AMD
```

客户端还应注意：

* 不同产品支持的行情字段可能不同。
* 某些字段可能不存在或返回空值。
* 不应假设返回数组顺序始终与请求顺序一致。
* 应根据 `msg.s` 将结果与产品代码进行匹配。
* 单个产品暂时无数据时，不应影响其他产品的处理。

### HTTP响应说明

接口返回内容是 JSON 数组，但响应头可能显示为：

```
text/plain; charset=UTF-8
```

客户端应按照 JSON 解析响应正文，不应仅依赖 `Content-Type` 判断数据格式。

### 错误处理

客户端不能只根据 HTTP 状态码判断请求是否成功。

部分业务错误可能仍返回 HTTP `200`，但响应正文中包含错误状态。

认证失败示例：

```
{
  "Cmd": "api",
  "State": -1,
  "Msg": "API Key 无效或已经过期"
}
```

参数缺失示例：

```
{
  "status": 500,
  "message": "Required request parameter is not present",
  "data": null
}
```

客户端应检查：

* HTTP 状态码是否为 `2xx`。
* 响应正文是否为空。
* 响应是否为 JSON。
* 返回值是否为行情数组。
* 是否存在 `State` 或 `status` 错误字段。
* 每个数组元素是否包含 `type` 和 `msg`。
* `msg` 中是否包含 `e`、`s` 等产品标识。

### 使用建议

* 单产品和多产品请求使用同一个接口。
* 多个产品代码使用英文逗号分隔，代码之间不要添加空格。
* 一次请求中的产品应属于同一个交易所。
* 批量数量上限未明确前，不建议一次提交过多产品。
* 高频或持续行情场景建议使用 WebSocket。
* 正式 API Key 不应写入前端代码、公开仓库或公开日志。
* 行情字段应按实际返回结果进行兼容处理。
