NewTimeSpace API
The list endpoint (Get articles) returns only a short summary for each article. Call the details endpoint whenever you need the full text — it returns cleaned minimal Markdown (not HTML), for up to 10 articles per request:
Full address (Base URL: https://www.newtimespace.com); no authentication. Both GET and POST are supported (POST may send a JSON body). This endpoint is JSON only:
# Single article
GET /api/v1/article/detail?article_ids=1445593
# Multiple articles (comma-separated, up to 10 per request)
GET /api/v1/article/detail?article_ids=1445593,1445506
# Switch language version (article_id works across languages)
GET /api/v1/article/detail?article_ids=1445593&language=en
| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
article_ids | string | Yes | Article IDs, comma-separated (both , and , accepted, e.g. 1024,1025), up to 10 per request; legacy alias articleIds is accepted, POST may also send a JSON array | '' |
language | string | No | Output language: zh-cn (Simplified, default), zh-hk (Traditional), en (English). Unknown values fall back to zh-cn | zh-cn |
apikey | string | No | Caller identifier, used for request logging | '' |
The response body carries status, data, request_id, server_time, applied_filters and warnings; there is no pagination. data is always an array — regardless of how many articles are matched:
| Case | data | Behavior |
|---|---|---|
| 1 hit | array with one item [{…}] | Iterate it directly; there is no object form |
| Multiple hits | array […] | Sorted by publish time in descending order; the input order of IDs is not preserved |
| None exist | empty array [] | HTTP 200 + status=success; "not found" is not an error, do not retry |
| Invalid IDs mixed in | array of matched items | Invalid IDs are skipped; only matched articles are returned |
Each item in data contains six fields:
| Field | Description |
|---|---|
article_id | Article ID |
title | Title |
author | Author |
publish_time | Publish time, ISO-8601 Beijing time (GMT+8), e.g. 2026-09-22T10:00:00+08:00 |
content | Full text as cleaned minimal Markdown (not HTML); ready to read or to feed an LLM |
word_count | Character count (UTF-8) |
The details endpoint does not return url, category or summary. For a citation link, use the url field from the list endpoint (Get articles).
{
"status": "success",
"data": [
{
"article_id": "1024",
"title": "Xiaomi unveils next-generation smart cockpit",
"author": "NewTimeSpace Research",
"publish_time": "2026-09-22T10:00:00+08:00",
"content": "### Key points Xiaomi today unveiled its next-generation smart cockpit solution... (cleaned into minimal Markdown)",
"word_count": 1280
}
],
"request_id": "a1b2c3d4e5f60718",
"server_time": "2026-09-23T09:30:00+08:00",
"applied_filters": { "language": "en", "article_ids": [1024] },
"warnings": []
}
Field notes
"data": []; handle as "not found" and do not retry.Errors use RFC 7807 (Content-Type: application/problem+json) with a standard HTTP status code; this endpoint always returns JSON. Example (missing article_ids):
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Missing required parameter: article_ids. Please provide at least one integer ID.",
"error_code": "INVALID_PARAMETER",
"request_id": "a1b2c3d4e5f60718",
"instance": "/api/v1/article/detail",
"code": 400,
"message": "Missing required parameter: article_ids. Please provide at least one integer ID."
}
| Trigger | HTTP | error_code |
|---|---|---|
| article_ids missing or empty | 400 | INVALID_PARAMETER |
| more than 10 IDs in one request | 400 | PARAMETER_EXCEEDED_LIMIT |
| more than 60 requests per IP per 60 seconds | 429 | RATE_LIMIT_EXCEEDED (carries Retry-After; wait accordingly) |
| unexpected server failure | 500 | INTERNAL_SERVER_ERROR |
Split batches larger than 10 IDs (e.g. 25 into 10 + 10 + 5); fix parameter errors before re-requesting rather than retrying the same bad parameters.
"data": []; handle as "not found" and do not retry.import json, urllib.request
BASE = "https://www.newtimespace.com/api/v1/article/detail"
def fetch(ids):
# batch fetch, splits into chunks of 10, returns a list of article objects
out = []
for i in range(0, len(ids), 10):
url = BASE + "?article_ids=" + ",".join(map(str, ids[i:i+10]))
raw = urllib.request.urlopen(url).read()
data = json.loads(raw.decode("utf-8"))
out += data["data"] # data is always an array; merge directly
return out
for a in fetch(["1445593", "1445506", "99999999999"]): # invalid IDs are skipped
print(a["article_id"], a["publish_time"], a["title"])
print(" words:", a["word_count"])
print(" content (Markdown):", a["content"][:120])