---
title: "Tweet with article content"
method: GET
path: "/tweet/{tweetId}/article"
tags: ["Tweets"]
---

# Tweet with article content

`GET /tweet/{tweetId}/article`

## Request

- Base URL: `https://api.twittrapi.com`
- URL: `https://api.twittrapi.com/tweet/{tweetId}/article`
- Auth: API key in header `X-API-KEY`

Like /tweet/{tweetId}, but also asks X for the full content of an X Article attached to the tweet.

Paginated: pass the bottom cursor of one page as cursor to get the next. Each page is one billed call.

Reference: https://www.twittrapi.com/docs/reference/tweet-tweetid-article

## Path parameters

- `tweetId` string, required

## Query parameters

- `rankingMode` 'Relevance' | 'Recency' | 'Likes'
- `includePromotedContent` boolean
- `cursor` string
- `format` 'raw' | 'simple'

## Response `200`

Raw JSON of X's TweetDetail query with the article fields turned on. For a tweet without an X Article the response is the same as /tweet/{tweetId}.

With format=simple: Collection of Tweet objects: {data: [Tweet], nextCursor, previousCursor, hasNextPage}. Like the tweet detail; the article is in the tweet's article field (id, title, previewText, coverImageUrl, publishedAt, text).

- union: format=simple: the simple-format schema. Default (raw): X's JSON, passthrough.
  - TweetPage: Simple format: a page of tweets
    - `data` Tweet[], required
      - `id` string, required
      - `url` string, required: https://x.com/<username>/status/<id>
      - `text` string, required: Full text, t.co links replaced by their targets
      - `createdAt` string, date-time, nullable, required
      - `lang` string, nullable, required
      - `author` User, required
        - `id` string, required
        - `username` string, required: Handle without @
        - `name` string, required: Display name
        - `description` string, required: Bio, t.co links expanded
        - `location` string, required
        - `url` string, nullable, required: Website, expanded
        - `createdAt` string, date-time, nullable, required
        - `avatarUrl` string, nullable, required
        - `bannerUrl` string, nullable, required
        - `verified` boolean, required: Blue check
        - `verifiedType` string, nullable, required: e.g. Business or Government
        - `protected` boolean, required: Private account
        - `counts` object, required
          - `followers` integer, required
          - `following` integer, required
          - `tweets` integer, required
          - `likes` integer, required
          - `media` integer, required
          - `listed` integer, required
        - `pinnedTweetIds` string[], required
        - `isAutomated` boolean, required
      - `counts` object, required
        - `likes` integer, required
        - `retweets` integer, required
        - `replies` integer, required
        - `quotes` integer, required
        - `bookmarks` integer, required
        - `views` integer, nullable, required
      - `media` Media[], required
        - `type` 'photo' | 'video' | 'gif', required
        - `url` string, required: Photos: the image. Videos and GIFs: the MP4 with the highest bitrate.
        - `previewUrl` string, required: The image (poster frame for videos)
        - `width` integer, required
        - `height` integer, required
        - `altText` string, nullable, required
        - `durationMs` integer, nullable, required: Videos only
      - `urls` string[], required
      - `hashtags` string[], required
      - `mentions` object[], required
        - `id` string, required
        - `username` string, required
      - `replyTo` object, nullable, required
        - `tweetId` string, required
        - `userId` string, required
        - `username` string, required
      - `quoted` union, required
        - Tweet (recursive)
        - UnavailableTweet: A tweet X did not return (deleted, suspended author, withheld).
          - `id` string, required
          - `unavailable` true, required
      - `retweetOf` Tweet, required (recursive)
      - `conversationId` string, nullable, required
      - `isPinned` boolean, required
      - `source` string, nullable, required
      - `article` Article, required
        - `id` string, required
        - `title` string, required
        - `previewText` string, nullable, required
        - `coverImageUrl` string, nullable, required
        - `publishedAt` string, nullable, required
        - `text` string, nullable, required
    - `nextCursor` string, nullable, required: Pass as cursor for the next page; null on the last page
    - `previousCursor` string, nullable, required: X's top cursor, for polling newer items
    - `hasNextPage` boolean, required
  - RawPassthrough: X's own JSON (raw format, the default), passed through unchanged. The shape is X's and can change; see https://www.twittrapi.com/docs/response-format.

## Other responses

- `401`: Missing or unknown API key. Not charged.
- `402`: No balance left, or the trial expired. Not charged. Top up in the dashboard.
- `403`: Key deactivated, or the endpoint is not in your plan (trial keys and account actions). Not charged.
- `404`: X reports the tweet as not found.
- `422`: tweetId is not numeric.
- `429`: Rate limit for your key exceeded. Not charged. No Retry-After header: back off exponentially.
- `500`: Something failed on our side or between us and X. Refunded (400, 407, 408, 409 or a 5xx error are refunded). Retry with backoff.

---

[API](https://skmtc.dev/twittrapi/apis/twittrapi-api.md) · [All operations](https://skmtc.dev/twittrapi/apis/twittrapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/twittrapi/apis/twittrapi-api/revisions/0618e38b54c2?raw)
