新时空 API
新时空 API

新时空 API 资讯列表查询

快速开始:

完整请求(Base URL:https://www.newtimespace.com):

GET https://www.newtimespace.com/api/v1/article/getArticles?language=zh-cn&format=json

无需认证,支持 GET 与 POST(POST 可传 JSON body)。最简形式/api/v1/article/getArticles即可返回最新 10 条简体中文资讯。列表仅返回摘要 summary,不含正文全文;阅读全文需再调「资讯详情查询」接口。响应示例:

{
  "status": "success",
  "articles": [
    {
      "article_id": "1445506",
      "title": "华夏纳指(03086.HK)盘中涨0.20%,平均价60.389港元",
      "summary": "截至2026年9月9日13:51,华夏纳指(03086.HK)上涨0.20%,报60.400港元。",
      "publish_time": "2026-09-09T14:54:55+08:00",
      "url": "https://www.newtimespace.com/zh-cn/etf/1445506.html",
      "category": "ETF"
    }
  ],
  "pagination": { "page": 1, "limit": 10, "total": 28775, "total_pages": 2878 },
  "request_id": "a1b2c3d4e5f60718",
  "server_time": "2026-09-23T09:30:00+08:00",
  "applied_filters": {
    "q": "", "category": "", "category_ids": [], "language": "zh-cn",
    "start_date": "", "end_date": "", "sort": "publish_time", "order": "desc",
    "format": "json", "fields": []
  },
  "warnings": []
}

解析响应

响应为标准 UTF-8 JSON(不带 BOM),Content-Type: application/json,可直接 json.loads 解析。每条响应都带 request_id(与响应头 X-Request-Id 同值),排障或反馈问题时请一并提供。

import json, urllib.request

raw = urllib.request.urlopen(
    "https://www.newtimespace.com/api/v1/article/getArticles?format=json"
).read()
data = json.loads(raw.decode("utf-8"))
for a in data["articles"]:
    print(a["article_id"], a["publish_time"], a["title"])
print(data["pagination"])  # {'page': 1, 'limit': 10, 'total': 28775, 'total_pages': 2878}

请求参数

参数类型必填描述默认值
qstring否检索关键词,模糊匹配「标题」与「摘要」;建议仅传单个核心词(如「小米」),避免空格与 AND/OR/NOT 运算符''
categorystring否分类名称精确匹配,区分大小写,须与 language 配对(见下)''
languagestring否zh-cn / zh-hk / en,其他值回退 zh-cnzh-cn
start_datestring否起始日期 YYYY-MM-DD(含当天 00:00:00)''
end_datestring否结束日期 YYYY-MM-DD(含当天 23:59:59)''
pageinteger否页码,从 1 开始。超出总页数返回空数组,不报错1
limitinteger否每页数量,1–100;越界返回 HTTP 400(PARAMETER_OUT_OF_RANGE)。建议 10-20 以节省 Token10
sortstring否排序字段:publish_time(发布时间)或 id;兼容旧参数 sortBy(date→publish_time、id→id)publish_time
orderstring否排序方向:desc(倒序)或 asc(升序)desc
fieldsstring否稀疏字段集(逗号分隔),裁剪列表输出以节省 Token。可选 article_id,title,summary,publish_time,url,category;article_id 恒返回;留空返回全部''
formatstring否json / xml,其他值按 json 返回。Accept 请求头不影响格式,请始终显式传json

向后兼容:旧参数 title 会并入 q;旧参数 date 视作单日区间(start_date=end_date=date);旧参数 sortBy 等价于 sort(date→publish_time)。

category 可用值(须与 language 配对)

language可用 category
zh-cnETF、财经、新股、科技、出海、新时空研究院
zh-hkETF、新股、科技、出海。财经、新时空研究院 在 zh-hk 下返回空结果(简体、繁体写法均如此)
enETF、Finance、IPO、Research、Tech、Overseas

不匹配的组合(如 zh-cn 配 IPO)返回 HTTP 200 + 空数组,不报错;分类值不存在时同样返回空数组,并在 warnings 中列出该 language 下的合法分类供自我修正。注意:zh-hk 的列表结果中存在 category 为 财经 / 新时空研究院 的文章,但按这两个值筛选 zh-hk 时返回空数组——需要这两类繁体内容时,请用 language=zh-hk 不带 category 拉取后再按 category 字段自行过滤。

响应字段与信封

articles 数组中每篇文章仅含以下 6 个精简字段(为节省 Token 已去除正文全文与冗余元数据):

字段类型说明
article_idstring文章唯一 ID;调「资讯详情查询」接口时使用此 ID
titlestring标题(已按 language 本地化,zh-hk 自动转繁体)
summarystring摘要/描述,非全文;阅读全文需调详情接口
publish_timestringISO-8601 发布时间,北京时间(GMT+8),如 2026-09-09T14:54:55+08:00
urlstring文章绝对 URL;引用原文直接使用,勿自行拼接
categorystring分类名称(已按 language 本地化)

顶层信封字段:

字段说明
status恒为 "success"(错误响应见下节 RFC 7807 结构)
articles文章数组(见上)
pagination分页对象 { page, limit, total, total_pages }
request_id本次请求追踪 ID(与响应头 X-Request-Id 同值),排障时提供
server_time服务器时间(ISO-8601)
applied_filters服务端实际生效的过滤/排序条件回显(q、category、category_ids、language、start_date、end_date、sort、order、format、fields),供校验参数是否被正确识别
warnings非致命自愈提示数组(如分类未命中列出合法分类、en 摘要缺失回退简体、q 含空格/布尔词建议)
message可选,附加提示(如“未找到符合条件的新闻数据。”)

当 format=xml 时返回文章列表 XML(Content-Type: text/xml),各字段以 CDATA 包裹;注意 XML 仅含文章节点,不含 pagination 与信封字段:

<?xml version="1.0" encoding="UTF-8"?>
<articles>
  <article>
    <article_id><![CDATA[1445506]]></article_id>
    <title><![CDATA[华夏纳指(03086.HK)盘中涨0.20%,平均价60.389港元]]></title>
    <summary><![CDATA[截至2026年9月9日13:51,华夏纳指(03086.HK)上涨0.20%,报60.400港元。]]></summary>
    <publish_time><![CDATA[2026-09-09T14:54:55+08:00]]></publish_time>
    <url><![CDATA[https://www.newtimespace.com/zh-cn/etf/1445506.html]]></url>
    <category><![CDATA[ETF]]></category>
  </article>
</articles>

分页

pagination 包含 page(当前页)、limit(每页数量)、total(符合条件总数)、total_pages(总页数)。示例: {"page": 1, "limit": 10, "total": 28775, "total_pages": 2878}。

终止条件用 total_pages,不要等空数组。页码超出总页数时接口返回 HTTP 200 + 空数组、不报错,靠“返回空数组”判断结束会浪费请求,应以 page >= total_pages 停止翻页。

空结果与错误

搜索无结果 / 组合不匹配 / 页码越界时,返回 HTTP 200 + 空数组,按正常结果处理,不要重试:

{ "status": "success", "articles": [], "pagination": { "page": 1, "limit": 10, "total": 0, "total_pages": 0 }, "warnings": [] }

参数错误返回 HTTP 400,错误响应遵循 RFC 7807(Content-Type: application/problem+json),并保留 code/message 兼容旧客户端:

{
  "type": "about:blank",
  "title": "Bad Request",
  "status": 400,
  "detail": "limit 参数越界:每页数量必须在 1-100 之间。",
  "error_code": "PARAMETER_OUT_OF_RANGE",
  "request_id": "a1b2c3d4e5f60718",
  "instance": "/api/v1/article/getArticles?limit=200",
  "code": 400,
  "message": "limit 参数越界:每页数量必须在 1-100 之间。"
}
触发条件HTTPerror_code
limit 不在 1–100400PARAMETER_OUT_OF_RANGE
超过每 IP 每 60 秒 60 次429RATE_LIMIT_EXCEEDED(响应携带 Retry-After,按其等待)
服务器内部错误500INTERNAL_SERVER_ERROR

参数错误请修正后再请求,不要对相同错误参数反复重试;429 时按 Retry-After 等待后重试。

Agent 注意事项

  • 列表仅含摘要:articles 每项只有 summary(摘要),不含正文全文。需要阅读全文时,用列表返回的 article_id 调「资讯详情查询」接口(返回清洗后的极简 Markdown 正文,见 资讯详情查询)。
  • 时间字段为北京时间(GMT+8):publish_time 为 ISO-8601(如 2026-09-09T14:54:55+08:00),已含时区偏移,可直接解析比较。
  • 日期区间过滤:start_date / end_date 为闭区间(含当天);格式错误时该条件失效、返回全部。旧参数 date 等价于 start_date=end_date 的单日过滤。
  • article_id 从结果中读取:使用返回结果中的真实 article_id,不要自行构造。
  • 用 applied_filters 自检:响应回显服务端实际生效的过滤条件,可据此确认参数是否被正确识别(如 category 未命中会返回空数组并在 warnings 列出合法分类)。
  • 限速:每 IP 每 60 秒 60 次;响应不含剩余额度计数头,需自行统计频率;429 时按 Retry-After 等待后重试。
  • 请求方法:支持 GET 与 POST(POST 可传 JSON body);已开放 CORS(Access-Control-Allow-Origin: *),OPTIONS 预检返回 204。
  • 响应不带 BOM:为标准 UTF-8 JSON,直接 json.loads 即可,无需用 utf-8-sig 剥离 BOM。

完整调用示例(搜索 + 翻页 + 取详情读全文)

import json, urllib.request, urllib.parse
BASE = "https://www.newtimespace.com/api/v1/article/getArticles"
def search(keyword, max_pages=3):
    results = []
    for page in range(1, max_pages + 1):
        url = BASE + "?" + urllib.parse.urlencode(
            {"q": keyword, "language": "zh-cn", "format": "json", "page": page})
        raw = urllib.request.urlopen(url).read()
        data = json.loads(raw.decode("utf-8"))
        results += data["articles"]
        if page >= data["pagination"]["total_pages"]:   # 以 total_pages 为终止条件
            break
    return results

for a in search("人工智能"):
    print(a["publish_time"], a["title"])     # publish_time 为 ISO-8601(GMT+8)
    print("  摘要:", a["summary"][:60])       # 列表仅含摘要,非全文
    print("  原文:", a["url"])                # 引用时使用该 url
    # 读全文:用 article_id 调详情接口(返回清洗后的极简 Markdown)
    # GET /api/v1/article/detail?article_ids=%s&format=json" % a["article_id"]