{
  "service": "www.cls.cn",
  "page": "https://www.cls.cn/subject/{id}",
  "title": "题材库 - 题材详情 (Subject Detail)",
  "summary": "单个题材详情。一次返回该题材下的 articles（新闻文章流）、plate（关联股票板块行情）、fund（关联主题基金指数）、top_articles（置顶解读）。这是财联社把『新闻 ↔ 板块 ↔ 主题基金』串成闭环的核心接口——投资题材型（人工智能、半导体芯片…）的 plate 与 fund 字段有值，新闻频道型题材（环球市场情报、盘面直播…）这两字段为 null。注意 fund 给的是『主题基金指数』聚合层（CLS 内部代码+涨跌幅），不是可交易 ETF 的代码，详见 caveats。",
  "method": "GET",
  "endpoint": "https://www.cls.cn/api/subject/detail/{id}",
  "signing": {
    "required": true,
    "algorithm": "sign = md5( sha1( urlencode(sorted(params)) ) )，params 先并入固定三件套。注意 {id} 是路径段不是 query 参数，不参与签名",
    "fixed_params": {
      "app": "CailianpressWeb",
      "os": "web",
      "sv": "8.4.6"
    },
    "python": "import hashlib,urllib.parse\nsubject_id=1103\np={'app':'CailianpressWeb','os':'web','sv':'8.4.6'}\nqs=urllib.parse.urlencode(sorted(p.items()))\nsign=hashlib.md5(hashlib.sha1(qs.encode()).hexdigest().encode()).hexdigest()\nurl=f'https://www.cls.cn/api/subject/detail/{subject_id}?{qs}&sign={sign}'"
  },
  "params": {
    "id": {
      "type": "integer",
      "required": true,
      "in": "path",
      "description": "题材 ID（来自 subject-hot-newest），如 1103",
      "example": "1103"
    }
  },
  "response": {
    "envelope": "{ errno:0, data:{ ... } }",
    "data_fields": {
      "id": "题材 ID",
      "name": "题材名称",
      "description": "题材简介",
      "attention_num": "关注人数",
      "articles": "关联文章/新闻数组（article_id, article_title, ...）—— 新闻流",
      "top_articles": "置顶解读文章",
      "plate": "关联股票板块（投资题材有值，新闻频道型为 null）。结构 {plate_id, plate_symbol:cls80xxx, plate_name, plate_change, stocks:[...]}",
      "fund": "关联主题基金指数（投资题材有值，新闻频道型为 null）。结构 {fund_id:cls80xxx, fund_name, change, tag:'主题基金'}。change 是真实独立涨跌（与同题材 plate_change 不同），代表该主题基金篮子的聚合表现",
      "reporter_card": "记者主理人信息"
    },
    "fund_object_fields": {
      "fund_id": "CLS 内部主题基金指数代码（cls80xxx，与同题材股票板块共用题材号，但是另一条指数序列）",
      "fund_name": "主题基金名称（如『人工智能』『芯片产业链』）",
      "change": "★真实涨跌幅（小数）。实测 cls80207：股票板块 +0.64% vs 主题基金 -1.12%，证明是独立标的而非股票篮子",
      "tag": "固定 '主题基金'"
    }
  },
  "example_call": "见 signing.python（subject_id=1103）",
  "related_maps": [
    "www.cls.cn/api/subject/hotAndNewestSubject.json",
    "x-quote.cls.cn/web_quote/plate/stocks.json"
  ],
  "caveats": [
    "必须签名，需带 Referer: https://www.cls.cn/",
    "plate 与 fund 字段仅在投资题材型 subject 下有值；纯新闻频道型题材为 null。如何区分：先调 subject-hot-newest 拿 id，再调本接口看 plate/fund 是否非空",
    "fund 给的是『主题基金指数』聚合层：有 CLS 内部代码（cls80xxx）+ 名称 + 真实涨跌幅，但【不是】可交易 ETF 的产品代码（如 159819）",
    "无法展开为 ETF 清单：用 fund_id（cls80xxx）调 plate-stocks 返回的是个股篮子，不是 ETF；专用基金端点（plate/funds、plate/etf、fund_list 等）实测全部 9004 not found；前端也无 fund 类 XHR",
    "要落到具体 ETF（代码/净值），需用 fund_name 去外部基金库（如东财/天天基金）做一次『主题名 → ETF』匹配，CLS 不提供这层",
    "★『新闻↔指数基金/ETF』信息流：用基金频道 id 调本接口取 articles[] —— 公募基金动态(1349)、易方达指数通(10011)、易方达基金(8478)（基金类目 1110 下还有更多品牌频道）。这些文章把市场事件直接关联到具体 ETF：ETF 名称+代码写在 article_title 文本里（如『科创芯片ETF易方达（589130）』），用正则 [（(](\\d{6})[）)] 提取、按 5x/15x/16x 开头过滤即得 ETF 代码；每篇同时带结构化 stock_list / plate_list / subjects。实测前15篇约11篇含 ETF 代码。这是 CLS 唯一的新闻→ETF 关联（ETF 不在行情系统，只能编辑写进正文）。每篇 articles[] 带 article_time（Unix 秒）= 该 ETF 新闻的发布时间（电报时间）",
    "时段行为：articles（新闻流）7×24 实时更新；plate_change / fund.change 受交易时段约束，盘后实测(15:38)为当日收盘值（冻结，与盘中末值一致）"
  ],
  "confidence": 0.85,
  "auto_discovered": true,
  "last_verified": "2026-06-16"
}