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.