---
title: "Read an X Article"
method: GET
path: "/v1/x/posts/{id}/article"
tags: ["X"]
---

# Read an X Article

`GET /v1/x/posts/{id}/article`

## Request

- Base URL: `https://api.weirapp.io`
- URL: `https://api.weirapp.io/v1/x/posts/{id}/article`
- Auth: HTTP bearer

Returns the X Article a post carries: title, cover image, and the full body as plain text, Markdown, and X's own blocks (headings, lists, quotes, code, links, images, and embedded posts), with every image and video in it. Pass the id of the post that shares the Article — the number in its x.com/…/status/ link; an x.com/i/article/ link carries the Article's own id, which is not a post id. A post that carries an Article has only a link as its text, so use this, or `article` on the post, to read it. 404 when the post does not exist or is not an Article.

## Path parameters

- `id` string, required: Numeric post id: the digits after `/status/` in a post's URL.

## Response `200`

The Article, with the post and author that carry it.

- object
  - `data` object, required
    - `id` string, required: The Article's own id, distinct from the id of the post carrying it.
    - `url` string, required
    - `title` string, required
    - `previewText` string, nullable, required: The opening lines X shows in a feed.
    - `coverImage` object, nullable, required
      - `id` string, required: X's media id; blocks refer to media by this id.
      - `type` 'photo' | 'video' | 'animated_gif', required: X's own media type names.
      - `url` string, nullable, required: The original image for a photo; the highest-bitrate MP4 for a video or GIF. Null when X offers only a stream.
      - `width` integer, nullable, required
      - `height` integer, nullable, required
    - `publishedAt` string, date-time, nullable, required
    - `updatedAt` string, date-time, nullable, required
    - `text` string, nullable, required: The full body as plain text. Null in lists of posts, where X sends only the preview: get the post, or its article, for the body.
    - `markdown` string, nullable, required: The full body as Markdown — headings, emphasis, lists, quotes, code, links, images, and embedded posts — for reading or for a model. Null wherever `text` is.
    - `blocks` object[], nullable, required: The body in X's own block structure. Null wherever `text` is.
      - `type` string, required: X's block type: `unstyled` (paragraph), `header-one`, `header-two`, `header-three`, `unordered-list-item`, `ordered-list-item`, `blockquote`, `code-block`, or `atomic` (an embed: see `entities`).
      - `text` string, required
      - `depth` integer, required: Nesting level for list items; 0 otherwise.
      - `styles` object[], required: Inline styles over spans of `text`.
        - `offset` integer, required: Start, in UTF-16 code units of `text`.
        - `length` integer, required
        - `style` string, required: X's inline style name: `Bold`, `Italic`, `Strikethrough`, …
      - `entities` object[], required: Links and embeds attached to spans of `text`.
        - `offset` integer, required: Start, in UTF-16 code units of `text`.
        - `length` integer, required
        - `type` string, required: X's entity type: `LINK`, `MEDIA`, `TWEET` (an embedded post), `DIVIDER`, `MARKDOWN` (a code or formatted snippet), or another X adds later.
        - `url` string, nullable, required: The target of a `LINK`.
        - `mediaIds` string[], required: For `MEDIA`: ids into the Article's `media` list, in display order.
        - `postId` string, nullable, required: For `TWEET`: the embedded post's id.
        - `markdown` string, nullable, required: For `MARKDOWN`: the snippet's source.
    - `media` object[], required: Images and videos in the body, in order. Empty in lists of posts.
      - `id` string, required: X's media id; blocks refer to media by this id.
      - `type` 'photo' | 'video' | 'animated_gif', required: X's own media type names.
      - `url` string, nullable, required: The original image for a photo; the highest-bitrate MP4 for a video or GIF. Null when X offers only a stream.
      - `width` integer, nullable, required
      - `height` integer, nullable, required
    - `postId` string, required: The post that carries the Article.
    - `postUrl` string, required
    - `author` object, required
      - `id` string, required
      - `username` string, required
      - `name` string, required
      - `verified` boolean, required
      - `followersCount` integer, required
      - `profileImageUrl` string, nullable, required
  - `meta` object, required
    - `requestId` string, required
    - `nextCursor` string, nullable

## Other responses

- `400`: The request failed validation.
- `401`: The API key is missing, malformed, expired, or revoked.
- `402`: The account is out of credit. Not retryable: this cannot clear until the billing period resets or the plan changes.
- `403`: The API key does not carry the scope this route requires.
- `404`: The requested resource does not exist.
- `429`: The per-minute rate limit is exhausted. Retryable: wait for Retry-After and try again.
- `500`: An unexpected error occurred.
- `503`: The source is temporarily unavailable. The request is safe to retry.

---

[API](https://skmtc.dev/weirapp/apis/weir-api.md) · [All operations](https://skmtc.dev/weirapp/apis/weir-api/llms.txt) · [OpenAPI document](https://skmtc.dev/weirapp/apis/weir-api/revisions/4c6a9ae0bfca?raw)
