X Post, Reply & Profile Lookup by Link or ID
Resolve X post links or IDs into text, author, media, polls, quoted/parent posts, engagement metrics and replies, or resolve a handle into that account's public profile.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
tweetUrls | array | required | Paste the posts you want to collect. You can also paste post IDs, x.com/i/web/status links, twitter.com links, profile links or bare handles (a profile input returns that profile's public details). |
includeReplies | boolean | optional | Collect the replies X shows for each post, walked forward from the post's publication time. |
maxReplies | integer | optional | How many replies to collect for each post (0-500). Posts with very large threads may return fewer because X does not expose every reply to logged-out visitors. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
tweetUrls | array | required | Paste the posts you want to collect. You can also paste post IDs, x.com/i/web/status links, twitter.com links, profile links or bare handles (a profile input returns that profile's public details). |
includeReplies | boolean | optional | Collect the replies X shows for each post, walked forward from the post's publication time. |
maxReplies | integer | optional | How many replies to collect for each post (0-500). Posts with very large threads may return fewer because X does not expose every reply to logged-out visitors. |
includeQuotes | boolean | optional | Collect the posts that quote each requested post, with their text, author and engagement counts. |
maxQuotes | integer | optional | How many quote posts to collect for each requested post (0-500). |
includeRetweeters | boolean | optional | Collect the handles of accounts that reposted each requested post. X only exposes a search-index sample of visible reposts, so this is an approximate, recent-biased list. |
maxRetweeters | integer | optional | How many retweeter handles to collect for each post (0-500). |
includeQuotedTweet | boolean | optional | When a collected post quotes another post, attach the quoted post's text, author and metrics. |
includeParentTweet | boolean | optional | When a collected post is a reply, attach the post it answers under parentTweet. |
includeThreadAncestors | boolean | optional | When a requested post is a reply, walk up to 10 posts back to the start of the thread and attach them under threadAncestors (root first). |
includeMedia | boolean | optional | Include image links, video links and video variants for each post. |
includeAuthorProfile | boolean | optional | Attach the author's public profile details (followers, bio, verification) to every post, reply and quote row under author and authorProfile. |
Download the published input schema
View complete JSON
{
"description": "Paste X post links, post IDs or profile handles. Choose whether to include replies, quote posts and author details.",
"properties": {
"includeAuthorProfile": {
"default": true,
"description": "Attach the author's public profile details (followers, bio, verification) to every post, reply and quote row under author and authorProfile.",
"prefill": true,
"title": "Include author profile details",
"type": "boolean"
},
"includeMedia": {
"default": true,
"description": "Include image links, video links and video variants for each post.",
"prefill": true,
"title": "Include images and videos",
"type": "boolean"
},
"includeParentTweet": {
"default": true,
"description": "When a collected post is a reply, attach the post it answers under parentTweet.",
"prefill": true,
"title": "Include the post being replied to",
"type": "boolean"
},
"includeQuotedTweet": {
"default": true,
"description": "When a collected post quotes another post, attach the quoted post's text, author and metrics.",
"prefill": true,
"title": "Include the post each result quotes",
"type": "boolean"
},
"includeQuotes": {
"default": false,
"description": "Collect the posts that quote each requested post, with their text, author and engagement counts.",
"prefill": false,
"title": "Include quote posts",
"type": "boolean"
},
"includeReplies": {
"default": true,
"description": "Collect the replies X shows for each post, walked forward from the post's publication time.",
"prefill": true,
"title": "Include replies",
"type": "boolean"
},
"includeRetweeters": {
"default": false,
"description": "Collect the handles of accounts that reposted each requested post. X only exposes a search-index sample of visible reposts, so this is an approximate, recent-biased list.",
"prefill": false,
"title": "Include retweeter handles",
"type": "boolean"
},
"includeThreadAncestors": {
"default": false,
"description": "When a requested post is a reply, walk up to 10 posts back to the start of the thread and attach them under threadAncestors (root first).",
"prefill": false,
"title": "Include the full thread above a reply",
"type": "boolean"
},
"maxQuotes": {
"default": 50,
"description": "How many quote posts to collect for each requested post (0-500).",
"maximum": 500,
"minimum": 0,
"title": "Maximum quote posts per post",
"type": "integer"
},
"maxReplies": {
"default": 20,
"description": "How many replies to collect for each post (0-500). Posts with very large threads may return fewer because X does not expose every reply to logged-out visitors.",
"maximum": 500,
"minimum": 0,
"prefill": 3,
"title": "Maximum replies per post",
"type": "integer"
},
"maxRetweeters": {
"default": 50,
"description": "How many retweeter handles to collect for each post (0-500).",
"maximum": 500,
"minimum": 0,
"title": "Maximum retweeters per post",
"type": "integer"
},
"tweetUrls": {
"description": "Paste the posts you want to collect. You can also paste post IDs, x.com/i/web/status links, twitter.com links, profile links or bare handles (a profile input returns that profile's public details).",
"editor": "stringList",
"example": [
"https://x.com/elonmusk/status/1519480761749016577",
"2106665276758491194",
"NASA"
],
"prefill": [
"https://x.com/NASA/status/2107095768821576019"
],
"title": "Post links, post IDs or profile handles",
"type": "array"
}
},
"required": [
"tweetUrls"
],
"schemaVersion": 1,
"title": "X Post, Reply & Profile Lookup input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
tweets | string | optional | All collected posts, replies and status rows. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "X posts, replies, and profile rows resolved from the links, IDs, or handles you supplied.",
"properties": {
"tweets": {
"description": "All collected posts, replies and status rows.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Tweets",
"type": "string"
}
},
"title": "X Post, Reply & Profile Lookup by Link or ID Output",
"type": "object"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Tweets",
"transformation": {
"fields": [
"type",
"text",
"author.username",
"createdAt",
"likeCount",
"retweetCount",
"replyCount",
"viewCount",
"url"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
X Post, Reply & Profile Lookup by Link or ID
Give this actor a post link, a bare post ID, or a profile handle and it returns structured public data: the post's full text, author, media, poll, quoted and parent posts, engagement counts and replies — or that account's public profile. Optional quote collection turns a single post into the conversation around it. No login at any point.
What this actor does
- Posts by link or ID: accepts
x.comandtwitter.comlinks,x.com/i/web/statuslinks, bare post IDs, profile links and bare handles - Replies: walks the replies X exposes to logged-out visitors, starting from the post's publication time, and de-duplicates them by reply ID
- Quotes: optionally collects the posts that quote the requested post, each with its text, author and metrics (off by default)
- Retweeters: optionally collects the handles of accounts that reposted the requested post (off by default; X exposes only a search-index sample of visible reposts)
- Rich nested data: optional parent post, quoted post, poll, link-preview card, photo/video variants and the author's public profile on every row
- Profile input: a profile link or handle returns one
profilerow with that account's public bio and counters - Honest rows: every row carries a
type(post,reply,quote,profile,status); deleted, protected or rate-limited links produce astatusrow with a message instead of failing the run - Empty fields are omitted — the dataset never contains
null,"",[]or{}
Output per post or reply
Each row describes one post. type is post for requested posts and reply for replies collected from the conversation.
id— post IDurl— direct post URLtext— full post text, multi-line and links intactcreatedAt— ISO 8601 post timelanguage— post language code when X provides itreplyCount,retweetCount,likeCount,quoteCount,bookmarkCount,viewCount— engagement metrics (views when X exposes them)engagementRate— derived(likes + retweets + replies + quotes) / followers; present only when the author's follower count is known and greater than zeroisReply,isQuote,isRetweet,isNoteTweet— post type flagsconversationId— the thread root of the postthreadRootId,threadPosition— position of the row inside the collected threadinReplyToTweetId,inReplyToUserId,inReplyToUsername— where a reply pointshashtags,mentions,urls,cashtags— entities found in the textmedia— photo/video/GIF objectspoll— poll choices and statuscard— link-preview card (title,description,domain,url,thumbnail)quotedTweet,quotedTweetId— the quoted post when the input post quotes another (removed, together withisQuote, whenincludeQuotedTweetis off)parentTweet— the post being replied to when the input post is a replythreadAncestors— the chain of posts above a reply, root first (whenincludeThreadAncestorsis on)author— author profile snapshotauthorProfile— fuller author profile attached to every rowpossiblySensitive,place,postedFrom— extra labels when X exposes themtype,collectedAt
Media item: type (photo / video / gif), url, previewImageUrl, width, height, durationSeconds, viewCount, altText, variants (each variant has url, contentType, bitrate).
Poll: choices (label + votes), countsAreFinal, endsAt, durationMinutes.
Author: id, username, name, bio, bioLinks, bioEmails, website, location, followers, following, postCount, mediaCount, likesGiven, listedCount, isBlueVerified, verified, verifiedType, label, isProtected, profileImageUrl, bannerUrl, createdAt. The last five counters are included when X publishes them for the account.
Sample record
{
"type": "post",
"id": "1519480761749016577",
"url": "https://x.com/i/status/1519480761749016577",
"text": "Next I'm buying Coca-Cola to put the cocaine back in",
"createdAt": "2022-04-28T00:56:58+00:00",
"language": "en",
"replyCount": 4056,
"retweetCount": 4151,
"likeCount": 91599,
"quoteCount": 762,
"viewCount": 246037082,
"isReply": false,
"isRetweet": false,
"isQuote": false,
"conversationId": "1519480761749016577",
"threadRootId": "1519480761749016577",
"threadPosition": 1,
"author": { "username": "elonmusk", "name": "Elon Musk", "followers": 241741247 },
"collectedAt": "2026-10-06T00:00:00+00:00"
}
Output per quote row
When quote collection is on, each post that quotes the requested post is emitted as its own row with type: "quote" and the same fields as a post row. quotedTweetId points at the requested post, so quote rows are easy to separate from replies.
Output per retweet row
When retweeter collection is on, each reposting account is emitted as a row with type: "retweet". The row carries the retweeter's id, url, createdAt and author (with the public profile snapshot), and retweetedTweetId points at the post you requested. This list is an approximation: X only exposes a search-index sample of recent, visible reposts, so a post with many reposts can return far fewer handles than its repost count.
Output per profile row
When you pass a profile link or handle instead of a post, the actor emits one profile row:
id,username,name,bio,bioLinks,bioEmails,location,websitejoinedAt,birthDate— when publicfollowers,following,postCount,mediaCount,listedCount,likesGiven— the last three when X publishes themisBlueVerified,verified,verifiedType,isProtectedavatarUrl,bannerUrlurl— profile URLtype: "profile",collectedAt
Output per status row
A status row is emitted instead of data when a link cannot be collected. It always has a message:
type: "status"status—noInput,invalidLink,notFound,rateLimitedorerrortweetUrlandtweetId(post inputs) orprofileUrl(profile inputs)collectedAt
Input
| Field | Type | Default | Description |
|---|---|---|---|
tweetUrls |
array | – | Required. Post links, x.com/i/web/status links, bare post IDs, or profile links/handles. x.com and twitter.com are both accepted. |
includeReplies |
boolean | true |
Also collect the replies X exposes under each post. Turn off for the post only. |
maxReplies |
integer | 20 |
Replies to collect per post (0–500). Very large threads can return fewer. |
includeQuotes |
boolean | false |
Also collect the posts that quote each requested post, as quote rows. |
maxQuotes |
integer | 50 |
Quote posts to collect per post (0–500). |
includeRetweeters |
boolean | false |
Also collect handles of accounts that reposted each post, as retweet rows. Approximate: X exposes only a search-index sample of visible reposts. |
maxRetweeters |
integer | 50 |
Retweeter handles to collect per post (0–500). |
includeQuotedTweet |
boolean | true |
Include the quoted post's text, author and metrics. |
includeParentTweet |
boolean | true |
When a collected post is a reply, attach the post it answers under parentTweet. |
includeThreadAncestors |
boolean | false |
When a requested post is a reply, walk up to 10 posts back to the thread root and attach them under threadAncestors, root first. |
includeMedia |
boolean | true |
Include image links, video links and video variants. |
includeAuthorProfile |
boolean | true |
Attach the author's public profile details to every post, reply and quote row under author and authorProfile. |
Example: one post with its replies
{
"tweetUrls": ["https://x.com/NASA/status/2107095768821576019"],
"includeReplies": true,
"maxReplies": 100
}
Example: quotes and retweeters of a post
{
"tweetUrls": ["https://x.com/elonmusk/status/1519480761749016577"],
"includeReplies": false,
"includeQuotes": true,
"maxQuotes": 100,
"includeRetweeters": true,
"maxRetweeters": 100
}
Example: quotes of a post, no replies
{
"tweetUrls": ["https://x.com/elonmusk/status/1519480761749016577"],
"includeReplies": false,
"includeQuotes": true,
"maxQuotes": 100
}
Example: exact reply cap and no media
{
"tweetUrls": ["2106665276758491194"],
"includeReplies": true,
"maxReplies": 500,
"includeMedia": false,
"includeAuthorProfile": false
}
Example: mix posts, IDs and a profile
{
"tweetUrls": [
"https://x.com/elonmusk/status/1519480761749016577",
"2106665276758491194"
],
"includeParentTweet": true
}
Use cases
- Brand and crisis monitoring — collect a post, its replies and the posts quoting it to follow a conversation
- Journalism and research — archive exact text, timestamps, authors and metrics for citations
- Social listening — feed post, reply and quote text into sentiment or topic models
- Customer support — pull replies to your own posts for response triage
- Dataset enrichment — resolve a list of post IDs into structured records with author profiles
- Compliance — keep immutable evidence rows for posts you may need to reference later
FAQ
What data does this actor read? The same public post, profile and thread data any visitor sees on X without signing in. Nothing private is accessed.
Do I need an X account, login or developer key? No. There is no login step and no credential input at all.
Why do I get fewer replies than maxReplies or fewer than the post's reply counter? X only exposes part of a conversation to logged-out visitors, and some replies are deleted, protected or hidden. The actor collects everything public it can find, de-duplicated by reply ID, and never invents replies to fill the cap. Setting a larger cap and running again later can pick up more.
Do quote rows include the post that was quoted? Yes. Each quote row is a normal post row, and its quotedTweetId points at the post you requested, so you can group quotes by target.
Why are some profile counters missing? X does not publish every counter for every account on the logged-out profile view. The actor merges media, like and list counters from X's public profile widget when they are available; anything the source still omits stays absent rather than being filled with zero.
Can I get the list of accounts that reposted or liked a post? Reposts: yes, approximately. With includeRetweeters the actor searches X for visible reposts of the post and returns their handles; X exposes only a recent search-index sample, so the list can be much shorter than the repost count. Likers: no — X does not publish who liked a post to logged-out visitors; the like count is returned instead.
What happens with deleted, protected or hidden posts? You get a status row with "status": "notFound" and a message instead of data. The rest of the input is still processed.
How fresh is the data? Live — every run reads X at request time. Schedule the actor for hourly or daily refreshes.
Is this affiliated with X? No. This is a third-party actor that reads publicly available post and profile pages.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build 44rnh640txthNj7fH. Documentation is regenerated from the default published build; private drafts are not included.