NewTimeSpace API
NewTimeSpace API

NewTimeSpace API Get article details

When to use this endpoint

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:

  • Read the full text of an article by a known article_id;
  • Batch-fetch full text by ID (up to 10 per request);
  • Switch the language version of an article (zh-cn / zh-hk / en).

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

ParameterTypeRequiredDescriptionDefault
article_idsstringYesArticle 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''
languagestringNoOutput language: zh-cn (Simplified, default), zh-hk (Traditional), en (English). Unknown values fall back to zh-cnzh-cn
apikeystringNoCaller identifier, used for request logging''

Response structure (data is always an array)

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:

CasedataBehavior
1 hitarray with one item [{…}]Iterate it directly; there is no object form
Multiple hitsarray […]Sorted by publish time in descending order; the input order of IDs is not preserved
None existempty array []HTTP 200 + status=success; "not found" is not an error, do not retry
Invalid IDs mixed inarray of matched itemsInvalid IDs are skipped; only matched articles are returned

Each item in data contains six fields:

FieldDescription
article_idArticle ID
titleTitle
authorAuthor
publish_timePublish time, ISO-8601 Beijing time (GMT+8), e.g. 2026-09-22T10:00:00+08:00
contentFull text as cleaned minimal Markdown (not HTML); ready to read or to feed an LLM
word_countCharacter 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).

Response example

{
  "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 is always an array: iterate it directly (for a in data["data"]); there is no object/array dual shape;
  • content: cleaned minimal Markdown (not HTML); headings become ###, images become [image: alt], list items become -;
  • publish_time: ISO-8601 Beijing time (GMT+8), already carrying the offset; do not add 8 hours;
  • word_count: UTF-8 character count;
  • Invalid / nonexistent IDs: return 200 with "data": []; handle as "not found" and do not retry.

Errors and rate limits

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."
}
TriggerHTTPerror_code
article_ids missing or empty400INVALID_PARAMETER
more than 10 IDs in one request400PARAMETER_EXCEEDED_LIMIT
more than 60 requests per IP per 60 seconds429RATE_LIMIT_EXCEEDED (carries Retry-After; wait accordingly)
unexpected server failure500INTERNAL_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.

Notes for agents

  • data is always an array: whatever the hit count, data is an array — iterate it directly; no object/array dual shape.
  • content is Markdown: content is cleaned minimal Markdown (not HTML), ready to read or to use as LLM context.
  • No BOM: responses are standard UTF-8 JSON; call json.loads directly — no need for utf-8-sig.
  • Invalid IDs are not errors: they return 200 with "data": []; handle as "not found" and do not retry.
  • article_id must come from real list results — never construct or guess one.
  • language falls back to zh-cn for unsupported values, without an error; not every article has an English/Traditional version — when the en text is missing it falls back to Simplified Chinese and a warning is added, so an empty data after switching languages is normal.
  • Up to 10 per request: more than that returns 400 (PARAMETER_EXCEEDED_LIMIT); split into batches.
  • Rate limit: 60 requests per IP per 60 seconds; no remaining-quota headers are returned, so count request frequency yourself.

Complete example (batch fetch + reading the full text)

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])