# solari fetch threads post

> One Threads post with its first replies, read live.

- **CLI**: `solari fetch threads post`
- **MCP tool**: `solari_fetch_threads_post`
- **Access**: `solari:read` — Available on any SOLARI plan, including the trial. One credit per successful call.
- **Plans**: Any paid plan or trial
- **Credit**: 1

Read one Threads post by its public URL or permalink code, with its author and the first batch of direct replies, most liked first. Threads is fetch-only in SOLARI, so this call is the post reader: there is no catalog step. A post SOLARI has never seen is collected live, which takes 5 to 30 seconds; within an hour the stored copy is reused unless refresh=true.

**When to use it** — When you were given a Threads post link or code and want the post, its author, or what people replied.

**What comes back** — The post, up to replies_limit direct replies most liked first, and the fetch command to read the author's profile.

## Parameters

- `url` (string, optional, ≤ 512 chars) — Public post URL on threads.com or threads.net. Provide this or code.
- `code` (string, optional, pattern ^[A-Za-z0-9_-]{5,40}$) — Permalink code, the segment after /post/ in the URL. Provide this or url.
- `replies_limit` (integer, optional, ≥ 0) — How many direct replies, most liked first. 0 skips them.
- `refresh` (boolean, optional) — Collect again even if a copy from the last hour exists.

## Response

### `Response`

- `item` (object) — The post, with its author's handle.
- `replies` (object[]) — Direct replies, most liked first. The first batch only.
- `collected_at` (timestamp | null) — When this copy was collected.
- `fetched_on_demand` (boolean) — true if this call collected it live.
- `stale` (boolean) — true if live collection failed and an older copy is returned. collected_at says how old.
- `note` (string | null) — Caveat, when there is one.
- `next` (string) — Fetch command to read the author's profile.

### `item · replies[]`

- `post_id` (uuid) — Threads post id. Not interchangeable with Instagram or TikTok.
- `code` (string | null) — Permalink code, the segment after /post/ in the URL.
- `url` (string | null) — Public permalink.
- `account_id` (uuid | null) — Author account_id.
- `username` (string | null) — Author handle.
- `text` (string | null) — Post text.
- `posted_at` (timestamp | null) — Published at (UTC).
- `like_count` (integer | null) — Likes.
- `reply_count` (integer | null) — Replies on Threads. Can exceed the replies returned.
- `repost_count` (integer | null) — Reposts.
- `quote_count` (integer | null) — Quotes.
- `reshare_count` (integer | null) — Shares.
- `counts_hidden` (boolean | null) — true if the author hides engagement counts.
- `hashtags` (string[]) — Hashtags without the #.
- `mentions` (string[]) — Handles mentioned, without the @.
- `link_urls` (string[]) — Links attached to the post.
- `is_reply` (boolean | null) — true for a reply to another post.
- `reply_to_username` (string | null) — Handle this post replies to. Null for top-level posts.
- `is_paid_partnership` (boolean | null) — Paid partnership label.
- `topic` (string | null) — Topic tag, when Threads sets one.
- `language` (string | null) — Language code of the text.
- `quoted_post` (object | null) — The quoted post: username, text, like_count, posted_at, url. Null unless this is a quote.
- `assets` (object[]) — Media files in order. Each has asset_url, media_type, and video_duration.
- `assets[].asset_url` (string | null) — Direct download link to the full-size image or video. Null when no file is stored.

## Example

```console
$ solari fetch threads post url=https://www.threads.com/@zuck/post/Ddt7cL5EfUG replies_limit=2
```

_Long strings and repeated array entries are trimmed for readability._

```json
{
  "item": {
    "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d66",
    "code": "DdU1-6okapE",
    "url": "https://www.threads.com/@zuck/post/DdU1-6okapE",
    "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e",
    "username": "zuck",
    "text": "Last month I wrote about how we can build a positive and safe future for everyone: meta.com/thefutureisforeveryone \n\nEvery lab has the responsibility and incentive to move at the pace required to train its models safely,…",
    "posted_at": "2026-09-15T23:01:39.000Z",
    "like_count": 1639,
    "reply_count": 412,
    "repost_count": 136,
    "quote_count": 30,
    "reshare_count": 112,
    "counts_hidden": false,
    "hashtags": [],
    "mentions": [],
    "link_urls": [],
    "is_reply": false,
    "reply_to_username": null,
    "is_paid_partnership": false,
    "topic": null,
    "language": null,
    "quoted_post": null,
    "assets": []
  },
  "replies": [
    {
      "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d62",
      "code": "DdU1-7_kb4B",
      "url": "https://www.threads.com/@zuck/post/DdU1-7_kb4B",
      "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e",
      "username": "zuck",
      "text": "The reality is:\n\n- People won't want to use agents that are misaligned with them and that don't do what they ask, so labs have a strong natural incentive to make their models more aligned.\n\nThere is a lot of debate about…",
      "posted_at": "2026-09-15T23:01:39.000Z",
      "like_count": 663,
      "reply_count": 77,
      "repost_count": 27,
      "quote_count": 4,
      "reshare_count": 10,
      "counts_hidden": false,
      "hashtags": [],
      "mentions": [],
      "link_urls": [],
      "is_reply": true,
      "reply_to_username": "zuck",
      "is_paid_partnership": false,
      "topic": null,
      "language": null,
      "quoted_post": null,
      "assets": []
    },
    {
      "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d63",
      "code": "DdU1-7tEf-q",
      "url": "https://www.threads.com/@zuck/post/DdU1-7tEf-q",
      "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e",
      "username": "zuck",
      "text": "- Labs face significant liability if their models cause harm, so they have a strong incentive to prevent this as well. \n\nMeta delayed shipping Muse for several months to focus on safety and security. We didn't call for e…",
      "posted_at": "2026-09-15T23:01:39.000Z",
      "like_count": 230,
      "reply_count": 11,
      "repost_count": 3,
      "quote_count": 0,
      "reshare_count": 2,
      "counts_hidden": false,
      "hashtags": [],
      "mentions": [],
      "link_urls": [],
      "is_reply": true,
      "reply_to_username": "zuck",
      "is_paid_partnership": false,
      "topic": null,
      "language": null,
      "quoted_post": null,
      "assets": []
    }
  ],
  "collected_at": "2026-09-28T09:13:55Z",
  "fetched_on_demand": true,
  "stale": false,
  "note": null,
  "next": "solari fetch threads account username=zuck"
}
```

## As an MCP call

```json
{
  "name": "solari_fetch_threads_post",
  "arguments": {
    "url": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG",
    "replies_limit": 2
  }
}
```

## Notes

- Pass url or code, not both. threads.com and threads.net URLs both work.
- Replies are the first batch only, so reply_count on the post can exceed the replies returned. replies_limit=0 skips them.
- A first collection takes 5 to 30 seconds (fetched_on_demand=true). Repeat calls within an hour return the stored copy unless refresh=true.
- stale=true means the live collection failed and an older copy came back. collected_at says how old it is.
- Media URLs right after a collection may be temporary. Read them promptly.
- A reference with no public post is an error, not an empty result. Failed calls cost nothing.

## Related tools

- [`solari_fetch_threads_post_search`](https://solari.sh/docs/tools/fetch-threads-post-search.md)
- [`solari_fetch_threads_account`](https://solari.sh/docs/tools/fetch-threads-account.md)
- [`solari_fetch_threads_posts`](https://solari.sh/docs/tools/fetch-threads-posts.md)
