# solari fetch threads posts

> One Threads account's recent posts, read live.

- **CLI**: `solari fetch threads posts`
- **MCP tool**: `solari_fetch_threads_posts`
- **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 account's newest top-level posts, with its profile, by exact username. Each post carries text, hashtags, mentions, links, like, reply, repost, quote, and share counts, the quoted post, and assets with a direct-download asset_url. Threads is fetch-only in SOLARI, so this call is the post listing: there is no catalog step. A handle 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 have an exact Threads handle and want what it posted recently.

**What comes back** — The profile, up to limit top-level posts newest first, and the fetch command to open the newest one with its replies.

## Parameters

- `username` (string, required, ≤ 64 chars) — Threads username, with or without @.
- `limit` (integer, optional, ≥ 1) — How many posts, newest first.
- `refresh` (boolean, optional) — Collect again even if a copy from the last hour exists.

## Response

### `Response`

- `account` (object) — The profile.
- `posts` (object[]) — Top-level posts, newest first.
- `total` (integer) — Posts returned.
- `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: for example a private account.
- `next` (string) — Fetch command to open the newest post with its replies. Only when a post exists.

### `account`

- `account_id` (uuid) — Threads account id. Not interchangeable with Instagram or TikTok.
- `username` (string) — Handle, lowercase, without the @.
- `full_name` (string | null) — Display name.
- `biography` (string | null) — Bio text.
- `follower_count` (integer | null) — Followers at collection time.
- `is_verified` (boolean | null) — Verified badge.
- `is_private` (boolean | null) — Private account. Its posts come back empty.
- `bio_links` (string[]) — Links listed in the bio.
- `profile_pic_url` (string | null) — Profile picture URL, largest size available.
- `url` (string | null) — Public profile URL.

### `posts[]`

- `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 posts username=zuck limit=2
```

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

```json
{
  "account": {
    "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e",
    "username": "zuck",
    "full_name": "Mark Zuckerberg",
    "biography": "Mostly superintelligence and MMA takes",
    "follower_count": 5745085,
    "is_verified": true,
    "is_private": false,
    "bio_links": [],
    "profile_pic_url": "https://scontent-gmp1-1.cdninstagram.com/v/t51.82787-19/825322135_17989325280103224_1252773933700107438_n.jpg?…",
    "url": "https://www.threads.com/@zuck"
  },
  "posts": [
    {
      "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d60",
      "code": "Ddt7cL5EfUG",
      "url": "https://www.threads.com/@zuck/post/Ddt7cL5EfUG",
      "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e",
      "username": "zuck",
      "text": "Agrippa said it's time to get back to work 😎",
      "posted_at": "2026-09-25T16:50:21.000Z",
      "like_count": 4964,
      "reply_count": 477,
      "repost_count": 254,
      "quote_count": 45,
      "reshare_count": 136,
      "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": [
        {
          "asset_url": "https://smr-images.bzine.co/threads/…",
          "media_type": "image",
          "video_duration": null
        },
        {
          "asset_url": "https://smr-images.bzine.co/threads/…",
          "media_type": "image",
          "video_duration": null
        }
      ]
    },
    {
      "post_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d61",
      "code": "Ddpj4YZkd3P",
      "url": "https://www.threads.com/@zuck/post/Ddpj4YZkd3P",
      "account_id": "019f3a5c-2b7e-7c41-9d0e-5a1f2c3b4d5e",
      "username": "zuck",
      "text": "Here's everything I announced at Meta Connect today 👇",
      "posted_at": "2026-09-24T00:07:31.000Z",
      "like_count": 2680,
      "reply_count": 612,
      "repost_count": 164,
      "quote_count": 34,
      "reshare_count": 138,
      "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": []
    }
  ],
  "total": 2,
  "collected_at": "2026-09-28T09:13:55Z",
  "fetched_on_demand": true,
  "stale": false,
  "note": null,
  "next": "solari fetch threads post url=https://www.threads.com/@zuck/post/Ddt7cL5EfUG"
}
```

## As an MCP call

```json
{
  "name": "solari_fetch_threads_posts",
  "arguments": {
    "username": "zuck",
    "limit": 2
  }
}
```

## Notes

- Threads is fetch-only. There is no catalog step: read the posts from this response.
- Only top-level posts are listed, newest first. The account's own replies are not included; fetch threads post reads one post with its replies.
- 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.
- A private account answers its profile with posts empty. Media URLs right after a collection may be temporary, so read them promptly.
- A handle with no Threads profile is an error, not an empty result. Failed calls cost nothing.

## Related tools

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