read:posts_by_user

Reads somebody else's posts, by their numeric id. It is the same endpoint as read:posts_by_me pointed at another account, and a separate operation because it is a different subject, a different price and a different thing to grant.

Fields

id Required. X's own numeric id of the user, as a string. Never a handle
max how many to return, 5 to 100. This is what the call costs
cursor the next from the page before
since_id, until_id only posts newer, or older, than that id
since_time, until_time the same window in time, ISO 8601 UTC
include_replies, include_reposts send false to leave replies, or reposts, out of the page. Left out, everything comes back
With include_replies false, X reaches back through only the account's latest 800 posts, not 3,200
profile the account to read as. Optional when the agent has one
reason Required over MCP. One short sentence, in the agent's own words, for the person

It takes an id and refuses a handle

X's endpoint is by id, so this operation is by id. A handle is refused rather than resolved, because resolving one is a second call to X and the read would then cost twice what it was quoted. Turn a handle into an id with read:user first, and keep the id.

Pointing it at the acting account's own id is refused too, with read:posts_by_me named: that is the operation for the account's own posts.

X will not return fewer than five

A max below five is raised to five before the call leaves, and the answer says so.

What comes back

{ "status": "done",
  "ref": "2D8KQ5WR",
  "page": { "next": "7140w5gefhslx3",
            "newest_id": "1832000000000000044",
            "oldest_id": "1832000000000000019" },
  "data": {
    "data": [
      { "id": "1832000000000000044",
        "text": "Shipping the new build tonight.",
        "created_at": "2026-09-15T16:40:02.000Z",
        "author_id": "1400000000000000044",
        "conversation_id": "1832000000000000044",
        "edit_history_post_ids": ["1832000000000000044"],
        "lang": "en",
        "public_metrics": {
          "repost_count": 11, "reply_count": 4, "like_count": 96,
          "quote_count": 2, "bookmark_count": 8, "impression_count": 5120
        } }
    ],
    "meta": { "result_count": 5,
              "newest_id": "1832000000000000044",
              "oldest_id": "1832000000000000019",
              "next_token": "7140w5gefhslx3" }
  } }

A protected account, or one that has blocked yours, comes back as a 200 with no posts rather than an error.