---
title: "Read Post"
description: "Returns a Reddit post with its nested comment tree and synthesized discussion digest, formatted as JSON, Markdown, or a graph.\n\nReddit hides long threads behind \"load more comments\"; threadapi automatically follows those links until it has collected the requested comments. The digest highlights OP follow-up replies, top-upvoted comments, and controversial discussions.\n"
---

> Documentation Index
> Fetch the complete documentation index at: https://staging.threadapi.dev/llms.txt
> Use this file to discover all available pages before exploring further.

Path: ThreadAPI API › Reddit

`GET /v1/reddit/post`

Returns a Reddit post with its nested comment tree and synthesized discussion digest, formatted as JSON, Markdown, or a graph.

Reddit hides long threads behind "load more comments"; threadapi automatically follows those links until it has collected the requested comments. The digest highlights OP follow-up replies, top-upvoted comments, and controversial discussions.

## Authentication

Requires one of the following:

- `bearerAuth`, http, header `Authorization`
- `apiKeyAuth`, apiKey, in header, header `x-api-key`

## Query parameters

- `url` (`getPost.query.url`; string, optional) — Reddit post URL (any reddit.com, redd.it, or share link) or post ID. Either `url` or `id` is required.
- `id` (`getPost.query.id`; string, optional) — Post ID (e.g. `1x144ok`) or `t3_` fullname. Alternative to `url`.
- `comment` (`getPost.query.comment`; string, optional) — Comment ID to focus on. When set, returns its parent ancestor chain and direct replies.
- `context` (`getPost.query.context`; integer, optional) — Number of ancestor context levels to include above the focused comment.
  - min 0; max 8; default `3`
- `max_comments` (`getPost.query.max_comments`; integer, optional) — Maximum comments to return. Set to `0` to return the post alone.
  - min 0; max 2000; default `200`
- `format` (`getPost.query.format`; string, optional) — Response format: `json` (complete post and digest), `md` (Markdown for LLMs), or `graph` (discussion digest only).
  - one of `"json"`, `"md"`, `"graph"`; default `"json"`

## Code samples

### cURL

```bash
curl --request GET \
  --url https://api.threadapi.dev/v1/reddit/post \
  --header 'Authorization: Bearer <token>'
```

### TypeScript

```typescript
const url = 'https://api.threadapi.dev/v1/reddit/post';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://api.threadapi.dev/v1/reddit/post"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
```

## Responses

### 200

The post.

#### Body (application/json)

- `post` (`getPost.response.200.post`; object, optional)
  - `id` (`getPost.response.200.post.id`; string, optional)
  - `name` (`getPost.response.200.post.name`; string, optional)
  - `domain` (`getPost.response.200.post.domain`; string, optional)
  - `is_self` (`getPost.response.200.post.is_self`; boolean, optional)
  - `flair` (`getPost.response.200.post.flair`; string, optional)
  - `spoiler` (`getPost.response.200.post.spoiler`; boolean, optional)
  - `stickied` (`getPost.response.200.post.stickied`; boolean, optional)
  - `locked` (`getPost.response.200.post.locked`; boolean, optional)
  - `removed` (`getPost.response.200.post.removed`; boolean, optional)
  - `subreddit` (`getPost.response.200.post.subreddit`; string, optional)
  - `title` (`getPost.response.200.post.title`; string, optional)
  - `author` (`getPost.response.200.post.author`; string, optional)
  - `score` (`getPost.response.200.post.score`; integer, optional)
  - `upvote_ratio` (`getPost.response.200.post.upvote_ratio`; number, optional)
  - `num_comments` (`getPost.response.200.post.num_comments`; integer, optional)
  - `url` (`getPost.response.200.post.url`; string, optional)
  - `permalink` (`getPost.response.200.post.permalink`; string, optional)
  - `selftext` (`getPost.response.200.post.selftext`; string, optional)
  - `created_at` (`getPost.response.200.post.created_at`; string, optional)
    - format `date-time`
  - `is_video` (`getPost.response.200.post.is_video`; boolean, optional)
  - `over_18` (`getPost.response.200.post.over_18`; boolean, optional)
  - `media` (`getPost.response.200.post.media`; array<object>, optional)
    - `type` (`getPost.response.200.post.media.type`; string, optional)
      - one of `"image"`, `"video"`, `"gallery"`
    - `url` (`getPost.response.200.post.media.url`; string, optional)
    - `width` (`getPost.response.200.post.media.width`; integer, optional)
    - `height` (`getPost.response.200.post.media.height`; integer, optional)
    - `caption` (`getPost.response.200.post.media.caption`; string, optional)
  - `poll` (`getPost.response.200.post.poll`; object, optional)
    - `total_votes` (`getPost.response.200.post.poll.total_votes`; integer, optional)
    - `is_closed` (`getPost.response.200.post.poll.is_closed`; boolean, optional)
    - `options` (`getPost.response.200.post.poll.options`; array<object>, optional)
      - `id` (`getPost.response.200.post.poll.options.id`; string, optional)
      - `text` (`getPost.response.200.post.poll.options.text`; string, optional)
      - `vote_count` (`getPost.response.200.post.poll.options.vote_count`; integer, optional)
  - `crosspost_of` (`getPost.response.200.post.crosspost_of`; object, optional)
    - `id` (`getPost.response.200.post.crosspost_of.id`; string, optional)
    - `subreddit` (`getPost.response.200.post.crosspost_of.subreddit`; string, optional)
    - `title` (`getPost.response.200.post.crosspost_of.title`; string, optional)
    - `author` (`getPost.response.200.post.crosspost_of.author`; string, optional)
    - `permalink` (`getPost.response.200.post.crosspost_of.permalink`; string, optional)
  - `comments` (`getPost.response.200.post.comments`; array<object>, optional)
    - `id` (`getPost.response.200.post.comments.id`; string, optional)
    - `parent_id` (`getPost.response.200.post.comments.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
    - `author` (`getPost.response.200.post.comments.author`; string, optional)
    - `score` (`getPost.response.200.post.comments.score`; integer, optional)
    - `body` (`getPost.response.200.post.comments.body`; string, optional)
    - `created_at` (`getPost.response.200.post.comments.created_at`; string, optional)
      - format `date-time`
    - `depth` (`getPost.response.200.post.comments.depth`; integer, optional)
    - `is_submitter` (`getPost.response.200.post.comments.is_submitter`; boolean, optional) — Written by the original poster.
    - `controversy` (`getPost.response.200.post.comments.controversy`; integer, optional)
    - `replies` (`getPost.response.200.post.comments.replies`; array<object>, optional)
      - `id` (`getPost.response.200.post.comments.replies.id`; string, optional)
      - `parent_id` (`getPost.response.200.post.comments.replies.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
      - `author` (`getPost.response.200.post.comments.replies.author`; string, optional)
      - `score` (`getPost.response.200.post.comments.replies.score`; integer, optional)
      - `body` (`getPost.response.200.post.comments.replies.body`; string, optional)
      - `created_at` (`getPost.response.200.post.comments.replies.created_at`; string, optional)
        - format `date-time`
      - `depth` (`getPost.response.200.post.comments.replies.depth`; integer, optional)
      - `is_submitter` (`getPost.response.200.post.comments.replies.is_submitter`; boolean, optional) — Written by the original poster.
      - `controversy` (`getPost.response.200.post.comments.replies.controversy`; integer, optional)
      - `replies` (`getPost.response.200.post.comments.replies.replies`; array<object>, optional)
- `discussion_graph` (`getPost.response.200.discussion_graph`; object, optional)
  - `post_id` (`getPost.response.200.discussion_graph.post_id`; string, optional)
  - `title` (`getPost.response.200.discussion_graph.title`; string, optional)
  - `author` (`getPost.response.200.discussion_graph.author`; string, optional)
  - `author_followups` (`getPost.response.200.discussion_graph.author_followups`; array<object>, optional) — The original poster's own comments in the thread.
    - `id` (`getPost.response.200.discussion_graph.author_followups.id`; string, optional)
    - `parent_id` (`getPost.response.200.discussion_graph.author_followups.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
    - `author` (`getPost.response.200.discussion_graph.author_followups.author`; string, optional)
    - `score` (`getPost.response.200.discussion_graph.author_followups.score`; integer, optional)
    - `body` (`getPost.response.200.discussion_graph.author_followups.body`; string, optional)
    - `created_at` (`getPost.response.200.discussion_graph.author_followups.created_at`; string, optional)
      - format `date-time`
    - `depth` (`getPost.response.200.discussion_graph.author_followups.depth`; integer, optional)
    - `is_submitter` (`getPost.response.200.discussion_graph.author_followups.is_submitter`; boolean, optional) — Written by the original poster.
    - `controversy` (`getPost.response.200.discussion_graph.author_followups.controversy`; integer, optional)
    - `replies` (`getPost.response.200.discussion_graph.author_followups.replies`; array<object>, optional)
      - `id` (`getPost.response.200.discussion_graph.author_followups.replies.id`; string, optional)
      - `parent_id` (`getPost.response.200.discussion_graph.author_followups.replies.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
      - `author` (`getPost.response.200.discussion_graph.author_followups.replies.author`; string, optional)
      - `score` (`getPost.response.200.discussion_graph.author_followups.replies.score`; integer, optional)
      - `body` (`getPost.response.200.discussion_graph.author_followups.replies.body`; string, optional)
      - `created_at` (`getPost.response.200.discussion_graph.author_followups.replies.created_at`; string, optional)
        - format `date-time`
      - `depth` (`getPost.response.200.discussion_graph.author_followups.replies.depth`; integer, optional)
      - `is_submitter` (`getPost.response.200.discussion_graph.author_followups.replies.is_submitter`; boolean, optional) — Written by the original poster.
      - `controversy` (`getPost.response.200.discussion_graph.author_followups.replies.controversy`; integer, optional)
      - `replies` (`getPost.response.200.discussion_graph.author_followups.replies.replies`; array<object>, optional)
  - `most_upvoted` (`getPost.response.200.discussion_graph.most_upvoted`; array<object>, optional) — Highest-score comments excluding OP, AutoModerator and deleted comments.
    - `id` (`getPost.response.200.discussion_graph.most_upvoted.id`; string, optional)
    - `parent_id` (`getPost.response.200.discussion_graph.most_upvoted.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
    - `author` (`getPost.response.200.discussion_graph.most_upvoted.author`; string, optional)
    - `score` (`getPost.response.200.discussion_graph.most_upvoted.score`; integer, optional)
    - `body` (`getPost.response.200.discussion_graph.most_upvoted.body`; string, optional)
    - `created_at` (`getPost.response.200.discussion_graph.most_upvoted.created_at`; string, optional)
      - format `date-time`
    - `depth` (`getPost.response.200.discussion_graph.most_upvoted.depth`; integer, optional)
    - `is_submitter` (`getPost.response.200.discussion_graph.most_upvoted.is_submitter`; boolean, optional) — Written by the original poster.
    - `controversy` (`getPost.response.200.discussion_graph.most_upvoted.controversy`; integer, optional)
    - `replies` (`getPost.response.200.discussion_graph.most_upvoted.replies`; array<object>, optional)
      - `id` (`getPost.response.200.discussion_graph.most_upvoted.replies.id`; string, optional)
      - `parent_id` (`getPost.response.200.discussion_graph.most_upvoted.replies.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
      - `author` (`getPost.response.200.discussion_graph.most_upvoted.replies.author`; string, optional)
      - `score` (`getPost.response.200.discussion_graph.most_upvoted.replies.score`; integer, optional)
      - `body` (`getPost.response.200.discussion_graph.most_upvoted.replies.body`; string, optional)
      - `created_at` (`getPost.response.200.discussion_graph.most_upvoted.replies.created_at`; string, optional)
        - format `date-time`
      - `depth` (`getPost.response.200.discussion_graph.most_upvoted.replies.depth`; integer, optional)
      - `is_submitter` (`getPost.response.200.discussion_graph.most_upvoted.replies.is_submitter`; boolean, optional) — Written by the original poster.
      - `controversy` (`getPost.response.200.discussion_graph.most_upvoted.replies.controversy`; integer, optional)
      - `replies` (`getPost.response.200.discussion_graph.most_upvoted.replies.replies`; array<object>, optional)
  - `controversial` (`getPost.response.200.discussion_graph.controversial`; array<object>, optional) — Comments with controversiality flag or negative score, excluding OP.
    - `id` (`getPost.response.200.discussion_graph.controversial.id`; string, optional)
    - `parent_id` (`getPost.response.200.discussion_graph.controversial.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
    - `author` (`getPost.response.200.discussion_graph.controversial.author`; string, optional)
    - `score` (`getPost.response.200.discussion_graph.controversial.score`; integer, optional)
    - `body` (`getPost.response.200.discussion_graph.controversial.body`; string, optional)
    - `created_at` (`getPost.response.200.discussion_graph.controversial.created_at`; string, optional)
      - format `date-time`
    - `depth` (`getPost.response.200.discussion_graph.controversial.depth`; integer, optional)
    - `is_submitter` (`getPost.response.200.discussion_graph.controversial.is_submitter`; boolean, optional) — Written by the original poster.
    - `controversy` (`getPost.response.200.discussion_graph.controversial.controversy`; integer, optional)
    - `replies` (`getPost.response.200.discussion_graph.controversial.replies`; array<object>, optional)
      - `id` (`getPost.response.200.discussion_graph.controversial.replies.id`; string, optional)
      - `parent_id` (`getPost.response.200.discussion_graph.controversial.replies.parent_id`; string, optional) — t3_<post id> for a top-level comment, t1_<comment id> for a reply.
      - `author` (`getPost.response.200.discussion_graph.controversial.replies.author`; string, optional)
      - `score` (`getPost.response.200.discussion_graph.controversial.replies.score`; integer, optional)
      - `body` (`getPost.response.200.discussion_graph.controversial.replies.body`; string, optional)
      - `created_at` (`getPost.response.200.discussion_graph.controversial.replies.created_at`; string, optional)
        - format `date-time`
      - `depth` (`getPost.response.200.discussion_graph.controversial.replies.depth`; integer, optional)
      - `is_submitter` (`getPost.response.200.discussion_graph.controversial.replies.is_submitter`; boolean, optional) — Written by the original poster.
      - `controversy` (`getPost.response.200.discussion_graph.controversial.replies.controversy`; integer, optional)
      - `replies` (`getPost.response.200.discussion_graph.controversial.replies.replies`; array<object>, optional)
  - `total_analyzed` (`getPost.response.200.discussion_graph.total_analyzed`; integer, optional)
- `meta` (`getPost.response.200.meta`; object, optional)
  - `comments_returned` (`getPost.response.200.meta.comments_returned`; integer, optional) — Comments in the response.
  - `comments_total` (`getPost.response.200.meta.comments_total`; integer, optional) — Reddit's comment count, deleted and hidden comments included.
  - `has_more` (`getPost.response.200.meta.has_more`; boolean, optional) — A larger max_comments would return more.
  - `max_comments` (`getPost.response.200.meta.max_comments`; integer, optional)
  - `credits_used` (`getPost.response.200.meta.credits_used`; integer, optional)
  - `cache` (`getPost.response.200.meta.cache`; string, optional)
  - `limited_by_balance` (`getPost.response.200.meta.limited_by_balance`; boolean, optional)
  - `focus_comment_id` (`getPost.response.200.meta.focus_comment_id`; string, optional) — Comment ID when a comment permalink was requested.

##### Example

```json
{
  "post": {
    "id": "string",
    "name": "string",
    "domain": "string",
    "is_self": true,
    "flair": "string",
    "spoiler": true,
    "stickied": true,
    "locked": true,
    "removed": true,
    "subreddit": "string",
    "title": "string",
    "author": "string",
    "score": 0,
    "upvote_ratio": 0,
    "num_comments": 0,
    "url": "string",
    "permalink": "string",
    "selftext": "string",
    "created_at": "2019-08-24T14:15:22Z",
    "is_video": true,
    "over_18": true,
    "media": [
      {
        "type": "image",
        "url": "string",
        "width": 0,
        "height": 0,
        "caption": "string"
      }
    ],
    "poll": {
      "total_votes": 0,
      "is_closed": true,
      "options": [
        {
          "id": "string",
          "text": "string",
          "vote_count": 0
        }
      ]
    },
    "crosspost_of": {
      "id": "string",
      "subreddit": "string",
      "title": "string",
      "author": "string",
      "permalink": "string"
    },
    "comments": [
      {
        "id": "string",
        "parent_id": "string",
        "author": "string",
        "score": 0,
        "body": "string",
        "created_at": "2019-08-24T14:15:22Z",
        "depth": 0,
        "is_submitter": true,
        "controversy": 0,
        "replies": [
          {
            "id": "string",
            "parent_id": "string",
            "author": "string",
            "score": 0,
            "body": "string",
            "created_at": "2019-08-24T14:15:22Z",
            "depth": 0,
            "is_submitter": true,
            "controversy": 0,
            "replies": []
          }
        ]
      }
    ]
  },
  "discussion_graph": {
    "post_id": "string",
    "title": "string",
    "author": "string",
    "author_followups": [
      {
        "id": "string",
        "parent_id": "string",
        "author": "string",
        "score": 0,
        "body": "string",
        "created_at": "2019-08-24T14:15:22Z",
        "depth": 0,
        "is_submitter": true,
        "controversy": 0,
        "replies": [
          {
            "id": "string",
            "parent_id": "string",
            "author": "string",
            "score": 0,
            "body": "string",
            "created_at": "2019-08-24T14:15:22Z",
            "depth": 0,
            "is_submitter": true,
            "controversy": 0,
            "replies": []
          }
        ]
      }
    ],
    "most_upvoted": [
      {
        "id": "string",
        "parent_id": "string",
        "author": "string",
        "score": 0,
        "body": "string",
        "created_at": "2019-08-24T14:15:22Z",
        "depth": 0,
        "is_submitter": true,
        "controversy": 0,
        "replies": [
          {
            "id": "string",
            "parent_id": "string",
            "author": "string",
            "score": 0,
            "body": "string",
            "created_at": "2019-08-24T14:15:22Z",
            "depth": 0,
            "is_submitter": true,
            "controversy": 0,
            "replies": []
          }
        ]
      }
    ],
    "controversial": [
      {
        "id": "string",
        "parent_id": "string",
        "author": "string",
        "score": 0,
        "body": "string",
        "created_at": "2019-08-24T14:15:22Z",
        "depth": 0,
        "is_submitter": true,
        "controversy": 0,
        "replies": [
          {
            "id": "string",
            "parent_id": "string",
            "author": "string",
            "score": 0,
            "body": "string",
            "created_at": "2019-08-24T14:15:22Z",
            "depth": 0,
            "is_submitter": true,
            "controversy": 0,
            "replies": []
          }
        ]
      }
    ],
    "total_analyzed": 0
  },
  "meta": {
    "comments_returned": 0,
    "comments_total": 0,
    "has_more": true,
    "max_comments": 0,
    "credits_used": 0,
    "cache": "string",
    "limited_by_balance": true,
    "focus_comment_id": "string"
  }
}
```

#### Body (text/markdown)

##### Example

```text
string
```

### 400

Bad request (invalid parameter or unknown action)

#### Example

```json
{
  "error": "unauthorized: missing or invalid credentials",
  "error_code": "insufficient_credits"
}
```

One of:

- `ErrorResponse`
- `Error`

### 401

Missing or invalid API key or OAuth access token

#### Example

```json
{
  "error": "unauthorized: missing or invalid credentials",
  "error_code": "insufficient_credits"
}
```

One of:

- `ErrorResponse`
- `Error`

### 402

The account has no credits left (`insufficient_credits`).

#### Example

```json
{
  "error": {
    "code": "not_found",
    "message": "string",
    "retryable": true,
    "retry_after": 0
  }
}
```

- `error` (`getPost.response.402.error`; object, required)
  - `code` (`getPost.response.402.error.code`; string, required)
    - example `"not_found"`
  - `message` (`getPost.response.402.error.message`; string, required)
  - `retryable` (`getPost.response.402.error.retryable`; boolean, required)
  - `retry_after` (`getPost.response.402.error.retry_after`; integer, optional) — Seconds to wait before retrying.

### 403

Reddit does not show this content to logged-out readers, e.g. a private or quarantined subreddit (`reddit_refused`).

#### Example

```json
{
  "error": {
    "code": "not_found",
    "message": "string",
    "retryable": true,
    "retry_after": 0
  }
}
```

- `error` (`getPost.response.403.error`; object, required)
  - `code` (`getPost.response.403.error.code`; string, required)
    - example `"not_found"`
  - `message` (`getPost.response.403.error.message`; string, required)
  - `retryable` (`getPost.response.403.error.retryable`; boolean, required)
  - `retry_after` (`getPost.response.403.error.retry_after`; integer, optional) — Seconds to wait before retrying.

### 404

Requested user or resource not found

#### Example

```json
{
  "error": "unauthorized: missing or invalid credentials",
  "error_code": "insufficient_credits"
}
```

One of:

- `ErrorResponse`
- `Error`

### 429

Rate limit or daily request quota exceeded

#### Example

```json
{
  "error": "unauthorized: missing or invalid credentials",
  "error_code": "insufficient_credits"
}
```

One of:

- `ErrorResponse`
- `Error`

### 503

A temporary problem reaching Reddit (`upstream_busy`, `upstream_timeout`, `upstream_error`). Retry shortly; nothing was billed.

#### Example

```json
{
  "error": {
    "code": "not_found",
    "message": "string",
    "retryable": true,
    "retry_after": 0
  }
}
```

- `error` (`getPost.response.503.error`; object, required)
  - `code` (`getPost.response.503.error.code`; string, required)
    - example `"not_found"`
  - `message` (`getPost.response.503.error.message`; string, required)
  - `retryable` (`getPost.response.503.error.retryable`; boolean, required)
  - `retry_after` (`getPost.response.503.error.retry_after`; integer, optional) — Seconds to wait before retrying.


Source: https://staging.threadapi.dev/api/Reddit/getPost/index.md
