> 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/shi-chang-gu-piao-lie-biao-jie-kou-product.md).

# 📊 市场股票列表接口（Product）

获取指定交易所下所有可用的交易产品。返回的产品代码可用于实时报价、历史 K 线和 WebSocket 行情订阅。

### 接口信息

| 项目   | 说明         |
| ---- | ---------- |
| 请求方式 | `GET`      |
| 接口路径 | `/product` |
| 返回格式 | CSV        |
| 字符编码 | UTF-8      |
| 身份认证 | API Key    |

### 请求参数

| 参数         | 类型     | 必填 | 说明                |
| ---------- | ------ | -- | ----------------- |
| `exchange` | String | 是  | 交易所代码，例如 `NASDAQ` |
| `key`      | String | 是  | 用户的 API Key       |

### 请求示例

```
GET /product?exchange=NASDAQ&key=your_api_key
```

### cURL 示例

```
curl "${JKIDATA_BASE_URL}/product?exchange=NASDAQ&key=${JKIDATA_API_KEY}"
```

### Python 示例

```
import requests

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

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

response.raise_for_status()
print(response.text)
```

### JavaScript 示例

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

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

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

const csvText = await response.text();
console.log(csvText);
```

### 返回格式

接口返回 CSV 文本。第一行为字段名称，后续每一行代表一个交易产品。

```
exchange,symbol,name,data type
NASDAQ,AAPL,"Apple Inc.",null
NASDAQ,AMD,"Advanced Micro Devices",null
```

响应头可能显示为：

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

但响应正文应按照 CSV 格式解析。

### 返回字段

| 字段          | 类型            | 说明                      |
| ----------- | ------------- | ----------------------- |
| `exchange`  | String        | 产品所属交易所代码               |
| `symbol`    | String        | 交易产品代码                  |
| `name`      | String        | 产品名称                    |
| `data type` | String / Null | 产品数据类型；暂无数据时可能返回 `null` |

### Python CSV 解析示例

```
import csv
import io
import requests

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

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

response.raise_for_status()

products = list(
    csv.DictReader(io.StringIO(response.text))
)

for product in products:
    print(
        product["exchange"],
        product["symbol"],
        product["name"],
    )
```

查找 AAPL：

```
apple = next(
    (
        product
        for product in products
        if product["symbol"] == "AAPL"
    ),
    None,
)

print(apple)
```

### JavaScript CSV 解析示例

生产环境建议使用成熟的 CSV 解析库，以正确处理引号、逗号和空值。

下面的代码仅展示基本读取流程：

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

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

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

const csvText = await response.text();
const lines = csvText.trim().split(/\r?\n/);

const header = lines[0];
const rows = lines.slice(1);

console.log(header);
console.log(`产品数量：${rows.length}`);
```

### 错误处理

客户端不能只根据 HTTP 状态码判断请求是否成功，还应检查响应正文是否符合 CSV 格式。

以下情况应视为请求失败：

* HTTP 状态码不是 `2xx`。
* API Key 无效或已经过期。
* 缺少 `exchange` 参数。
* 响应正文为空。
* CSV 响应缺少预期表头。
* 返回结构与接口约定不一致。

建议至少验证以下表头字段：

```
exchange,symbol,name,data type
```

### 使用建议

* 产品列表适合在系统初始化时获取并缓存在本地。
* 不建议频繁重复请求完整的交易所产品列表。
* 产品代码应直接使用 `symbol` 字段，不要根据产品名称推断。
* CSV 内容可能包含引号、逗号、中文或空值，应使用标准 CSV 解析器。
* 正式 API Key 不应写入前端代码、公开仓库或公开日志。
* 获取一个或多个产品的最新行情，请继续查看下一页“行情报价接口（Quote）”。
