> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xquik.com/llms.txt
> Use this file to discover all available pages before exploring further.

# X news story API with every version of a story

> Get every version X wrote of a news story from Explore, with its time, headline and text, oldest first. 1 credit per request, and unknown stories are free.

<Panel>
  <Tabs defaultTabIndex={0} sync={false}>
    <Tab title="200" id="response-x-news-versions-200">
      ```json theme={null}
      {
        "id": "2110209733533598095",
        "count": 1,
        "versions": [
          {
            "id": "2110211669641105725",
            "createdAt": "2026-10-14T03:30:42.536Z",
            "headline": "Elon Musk Pushes Starlink for India's Remote Areas Amid Regulatory Hurdles",
            "text": "Musk has accused Reliance Industries' Mukesh Ambani of blocking Starlink's entry to protect local telecom giants like Jio, while India's government insists on equal treatment for all applicants, including ongoing security reviews. In Vietnam, Starlink already provides free internet to isolated spots for tourism and disaster response, highlighting its potential for hard-to-reach areas. Yet challengers note India's cheap mobile data from Jio and Airtel covers most needs, raising questions on pricing and national security as Starlink seeks final clearances."
          }
        ]
      }
      ```
    </Tab>

    <Tab title="400" id="response-x-news-versions-400">
      ```json theme={null}
      {
        "error": "invalid_news_id",
        "message": "Send a story ID or link, such as x.com/i/trending/2110209733533598095."
      }
      ```
    </Tab>

    <Tab title="401" id="response-x-news-versions-401">
      ```json theme={null}
      {
        "error": "unauthenticated",
        "message": "Authentication required."
      }
      ```
    </Tab>

    <Tab title="402" id="response-x-news-versions-402">
      ```json theme={null}
      {
        "error": "insufficient_credits",
        "message": "Insufficient credits. Top up or subscribe to continue."
      }
      ```
    </Tab>

    <Tab title="404" id="response-x-news-versions-404">
      ```json theme={null}
      {
        "error": "news_not_found",
        "message": "Story not found. Copy its ID from its x.com/i/trending link."
      }
      ```
    </Tab>

    <Tab title="424" id="response-x-news-versions-424">
      ```json theme={null}
      {
        "error": "x_api_unavailable",
        "message": "X data source temporarily unavailable. Try again later."
      }
      ```
    </Tab>

    <Tab title="429" id="response-x-news-versions-429">
      ```json theme={null}
      {
        "error": "rate_limit_exceeded",
        "message": "Too many requests. Try again later.",
        "retryAfter": 60
      }
      ```
    </Tab>

    <Tab title="502" id="response-x-news-versions-502">
      ```json theme={null}
      {
        "error": "x_api_unavailable",
        "message": "X data source temporarily unavailable. Try again later."
      }
      ```
    </Tab>

    <Tab title="503" id="response-x-news-versions-503">
      ```json theme={null}
      {
        "error": "x_api_unavailable",
        "message": "Xquik is busy right now. Retry shortly."
      }
      ```
    </Tab>
  </Tabs>
</Panel>

<blockquote className="agent-llms-directive">
  For the complete documentation index, see <a href="/llms.txt">llms.txt</a>.
</blockquote>

<Callout icon="coins" color="#5c3327">
  **1 credit per request** · [All plans](https://xquik.com/#pricing) from \$0.00012/credit · Supports [guest paid reads](/guides/guest-wallets)
</Callout>

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://xquik.com/api/v1/x/news/2110209733533598095/versions" \
    -H "x-api-key: xq_your_api_key_here" | jq
  ```

  ```javascript Node.js theme={null}
  const storyId = "2110209733533598095";
  const response = await fetch(`https://xquik.com/api/v1/x/news/${storyId}/versions`, {
    headers: { "x-api-key": "xq_your_api_key_here" },
  });
  const body = await response.json();
  if (!response.ok) throw new Error(JSON.stringify(body));

  for (const version of body.versions) {
    console.log(`${version.createdAt} ${version.headline}`);
  }
  ```

  ```python Python theme={null}
  import requests

  story_id = "2110209733533598095"
  response = requests.get(
      f"https://xquik.com/api/v1/x/news/{story_id}/versions",
      headers={"x-api-key": "xq_your_api_key_here"},
  )
  body = response.json()
  if not response.ok:
      raise RuntimeError(body)

  for version in body["versions"]:
      print(version["createdAt"], version["headline"])
  ```
</CodeGroup>

## How did an X news story change?

X writes a news story for each topic under Explore and News, and rewrites it as the topic moves.
Use `GET /x/news/{id}/versions` to read every version of 1 story, oldest first.

* `headline` is the story's headline in that version.
* `text` is the story's text in that version.
* `createdAt` is when X wrote the version, in UTC.

X lists every version at once, so 1 request returns the whole history. A story from 2 hours ago may
have 1 version, and a story that ran all day may have 8 or more.

## Path parameters

<ParamField path="id" type="string" required>
  Story ID, such as `2110209733533598095`. The URL-encoded story link also works, such as
  `x.com/i/trending/2110209733533598095`. Open a story on x.com to copy its link.
</ParamField>

## Query parameters

<ParamField query="fields" type="string">
  Fields to keep in each row, comma-separated, such as `id,text,author.username`. Use dots for nested fields. Case & underscores do not matter. A row that lacks a field leaves it out. Cursors, counts & diagnostics always stay. An unknown name returns `400 unknown_field` with the valid names, before any read. The price stays the same.
</ParamField>

<ParamField query="omit" type="string">
  Fields to drop from each row, comma-separated, such as `entities,media`. It takes the same names as `fields`. With `fields`, it drops from the kept fields.
</ParamField>

## Headers

<ParamField header="x-api-key" type="string">
  Full account key. Sessions and OAuth also work.
</ParamField>

<ParamField header="Authorization" type="string">
  `Bearer xq_your_guest_key_here` for `paid_reads`.
</ParamField>

## Response

### 200 OK

<ResponseField name="id" type="string">
  The story ID the request named.
</ResponseField>

<ResponseField name="count" type="number">
  Versions returned.
</ResponseField>

<ResponseField name="versions" type="object[]">
  The story's versions, oldest first.

  <ResponseField name="id" type="string">
    The version's ID.
  </ResponseField>

  <ResponseField name="createdAt" type="string">
    When X wrote the version, in UTC. Xquik reads it from the version's ID.
  </ResponseField>

  <ResponseField name="headline" type="string">
    The story's headline in this version.
  </ResponseField>

  <ResponseField name="text" type="string">
    The story's text in this version. X writes the time above it in each reader's time zone, so Xquik
    leaves that line out and serves `createdAt`.
  </ResponseField>
</ResponseField>

### 400 Invalid story ID

```json theme={null}
{
  "error": "invalid_news_id",
  "message": "Send a story ID or link, such as x.com/i/trending/2110209733533598095."
}
```

The path named no story. This answer is free.

### 404 Story not found

```json theme={null}
{
  "error": "news_not_found",
  "message": "Story not found. Copy its ID from its x.com/i/trending link."
}
```

X lists no version for the ID. This answer is free.

### 401 Unauthenticated

Anonymous requests get `WWW-Authenticate: Bearer` and a guest wallet checkout action. This is not a Payment challenge.

```json theme={null}
{ "error": "unauthenticated" }
```

### 402 Payment required

Account keys get account options. Guest keys get guest top-up only.
No checkout starts automatically. Confirm any payment action.

### 502 X API unavailable

```json theme={null}
{ "error": "x_api_unavailable" }
```

The read service returned an error. Retry after a short delay.

<Note>
  **Related.** [Get X trends](/api-reference/x/trends) · [Get trends history](/api-reference/x/trends-history) · [Search tweets](/api-reference/x/search-tweets)
</Note>

<div className="related-api-links">
  <Accordion title="Related tweet, reply & media APIs" icon="link">
    * Tweets
      * [Get tweet](/api-reference/x/get-tweet) · [Tweet insights](/api-reference/x/tweet-engagement-insights) · [Batch tweets](/api-reference/x/batch-tweets) · [Tweet thread](/api-reference/x/tweet-thread) · [Hidden replies](/api-reference/x/tweet-hidden-replies) · [Translate tweet](/api-reference/x/tweet-translation) · [Embed tweet](/api-reference/x/tweet-embed) · [Resolve links](/api-reference/x/resolve-links) · [Tweet subtitles](/api-reference/x/tweet-subtitles) · [X Article](/api-reference/x/get-article)
    * Analysis
      * [Sentiment analysis](/api-reference/x/sentiment-analysis) · [Brand mentions](/api-reference/x/brand-monitoring) · [News classification](/api-reference/x/news-classification) · [Market signals](/api-reference/x/market-signals) · [Viral score](/api-reference/x/viral-score) · [Classify posts](/api-reference/x/classify-tweets)
    * Engagement
      * [Tweet replies](/api-reference/x/tweet-replies) · [Quote tweets](/api-reference/x/tweet-quotes) · [Likers](/api-reference/x/favoriters) · [Reposters](/api-reference/x/retweeters) · [Reposter IDs](/api-reference/x/retweeter-ids) · [Check repost](/api-reference/x/tweet-repost-check)
    * Profiles
      * [User tweets](/api-reference/x/user-tweets) · [Batch user tweets](/api-reference/x/batch-user-tweets) · [User replies](/api-reference/x/user-replies) · [User likes](/api-reference/x/user-likes) · [User media](/api-reference/x/user-media) · [User highlights](/api-reference/x/user-highlights) · [User articles](/api-reference/x/user-articles)
    * Feeds
      * [List tweets](/api-reference/x/list-tweets) · [Trends](/api-reference/x/trends) · [Trends history](/api-reference/x/trends-history) · [Top tweets](/api-reference/x/top-tweets) · [Trend locations](/api-reference/x/trend-locations) · [Search Spaces](/api-reference/x/search-spaces) · [Get Space](/api-reference/x/get-space) · [Space replay](/api-reference/x/space-replay) · [Get broadcast](/api-reference/x/get-broadcast) · [User live status](/api-reference/x/user-live-status) · [Notes contributor](/api-reference/x/community-notes-contributor) · [Contributor notes](/api-reference/x/community-notes-contributor-notes) · [Deleted notes](/api-reference/x/community-notes-contributor-deleted-notes) · [Hashflags](/api-reference/x/hashflags) · [Search places](/api-reference/x/search-places) · [Download media](/api-reference/x/download-media)
  </Accordion>
</div>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.