{
  "data": {
    "id": "44rnh640txthNj7fH",
    "actId": "cMnafsv5dV5zfAsHX",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-19T20:52:03.523Z",
    "finishedAt": "2026-10-19T20:52:14.380Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 10778,
      "runTimeSecs": 10.778,
      "computeUnits": 0.011975555555555555,
      "imageSizeBytes": 1329552384
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"X Post, Reply & Profile Lookup input\",\n  \"description\": \"Paste X post links, post IDs or profile handles. Choose whether to include replies, quote posts and author details.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"tweetUrls\": {\n      \"title\": \"Post links, post IDs or profile handles\",\n      \"type\": \"array\",\n      \"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).\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://x.com/NASA/status/2107095768821576019\"\n      ],\n      \"example\": [\n        \"https://x.com/elonmusk/status/1519480761749016577\",\n        \"2106665276758491194\",\n        \"NASA\"\n      ]\n    },\n    \"includeReplies\": {\n      \"title\": \"Include replies\",\n      \"type\": \"boolean\",\n      \"description\": \"Collect the replies X shows for each post, walked forward from the post's publication time.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"maxReplies\": {\n      \"title\": \"Maximum replies per post\",\n      \"type\": \"integer\",\n      \"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.\",\n      \"default\": 20,\n      \"prefill\": 3,\n      \"minimum\": 0,\n      \"maximum\": 500\n    },\n    \"includeQuotes\": {\n      \"title\": \"Include quote posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Collect the posts that quote each requested post, with their text, author and engagement counts.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxQuotes\": {\n      \"title\": \"Maximum quote posts per post\",\n      \"type\": \"integer\",\n      \"description\": \"How many quote posts to collect for each requested post (0-500).\",\n      \"default\": 50,\n      \"minimum\": 0,\n      \"maximum\": 500\n    },\n    \"includeRetweeters\": {\n      \"title\": \"Include retweeter handles\",\n      \"type\": \"boolean\",\n      \"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.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxRetweeters\": {\n      \"title\": \"Maximum retweeters per post\",\n      \"type\": \"integer\",\n      \"description\": \"How many retweeter handles to collect for each post (0-500).\",\n      \"default\": 50,\n      \"minimum\": 0,\n      \"maximum\": 500\n    },\n    \"includeQuotedTweet\": {\n      \"title\": \"Include the post each result quotes\",\n      \"type\": \"boolean\",\n      \"description\": \"When a collected post quotes another post, attach the quoted post's text, author and metrics.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeParentTweet\": {\n      \"title\": \"Include the post being replied to\",\n      \"type\": \"boolean\",\n      \"description\": \"When a collected post is a reply, attach the post it answers under parentTweet.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeThreadAncestors\": {\n      \"title\": \"Include the full thread above a reply\",\n      \"type\": \"boolean\",\n      \"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).\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeMedia\": {\n      \"title\": \"Include images and videos\",\n      \"type\": \"boolean\",\n      \"description\": \"Include image links, video links and video variants for each post.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeAuthorProfile\": {\n      \"title\": \"Include author profile details\",\n      \"type\": \"boolean\",\n      \"description\": \"Attach the author's public profile details (followers, bio, verification) to every post, reply and quote row under author and authorProfile.\",\n      \"default\": true,\n      \"prefill\": true\n    }\n  },\n  \"required\": [\n    \"tweetUrls\"\n  ]\n}",
    "readme": "# X Post, Reply & Profile Lookup by Link or ID\n\nGive 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.\n\n## What this actor does\n\n- **Posts by link or ID:** accepts `x.com` and `twitter.com` links, `x.com/i/web/status` links, bare post IDs, profile links and bare handles\n- **Replies:** walks the replies X exposes to logged-out visitors, starting from the post's publication time, and de-duplicates them by reply ID\n- **Quotes:** optionally collects the posts that quote the requested post, each with its text, author and metrics (off by default)\n- **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)\n- **Rich nested data:** optional parent post, quoted post, poll, link-preview card, photo/video variants and the author's public profile on every row\n- **Profile input:** a profile link or handle returns one `profile` row with that account's public bio and counters\n- **Honest rows:** every row carries a `type` (`post`, `reply`, `quote`, `profile`, `status`); deleted, protected or rate-limited links produce a `status` row with a message instead of failing the run\n- **Empty fields are omitted** — the dataset never contains `null`, `\"\"`, `[]` or `{}`\n\n## Output per post or reply\n\nEach row describes one post. `type` is `post` for requested posts and `reply` for replies collected from the conversation.\n\n- `id` — post ID\n- `url` — direct post URL\n- `text` — full post text, multi-line and links intact\n- `createdAt` — ISO 8601 post time\n- `language` — post language code when X provides it\n- `replyCount`, `retweetCount`, `likeCount`, `quoteCount`, `bookmarkCount`, `viewCount` — engagement metrics (views when X exposes them)\n- `engagementRate` — derived `(likes + retweets + replies + quotes) / followers`; present only when the author's follower count is known and greater than zero\n- `isReply`, `isQuote`, `isRetweet`, `isNoteTweet` — post type flags\n- `conversationId` — the thread root of the post\n- `threadRootId`, `threadPosition` — position of the row inside the collected thread\n- `inReplyToTweetId`, `inReplyToUserId`, `inReplyToUsername` — where a reply points\n- `hashtags`, `mentions`, `urls`, `cashtags` — entities found in the text\n- `media` — photo/video/GIF objects\n- `poll` — poll choices and status\n- `card` — link-preview card (`title`, `description`, `domain`, `url`, `thumbnail`)\n- `quotedTweet`, `quotedTweetId` — the quoted post when the input post quotes another (removed, together with `isQuote`, when `includeQuotedTweet` is off)\n- `parentTweet` — the post being replied to when the input post is a reply\n- `threadAncestors` — the chain of posts above a reply, root first (when `includeThreadAncestors` is on)\n- `author` — author profile snapshot\n- `authorProfile` — fuller author profile attached to every row\n- `possiblySensitive`, `place`, `postedFrom` — extra labels when X exposes them\n- `type`, `collectedAt`\n\n**Media item:** `type` (`photo` / `video` / `gif`), `url`, `previewImageUrl`, `width`, `height`, `durationSeconds`, `viewCount`, `altText`, `variants` (each variant has `url`, `contentType`, `bitrate`).\n\n**Poll:** `choices` (label + votes), `countsAreFinal`, `endsAt`, `durationMinutes`.\n\n**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.\n\n### Sample record\n\n```json\n{\n  \"type\": \"post\",\n  \"id\": \"1519480761749016577\",\n  \"url\": \"https://x.com/i/status/1519480761749016577\",\n  \"text\": \"Next I'm buying Coca-Cola to put the cocaine back in\",\n  \"createdAt\": \"2022-04-28T00:56:58+00:00\",\n  \"language\": \"en\",\n  \"replyCount\": 4056,\n  \"retweetCount\": 4151,\n  \"likeCount\": 91599,\n  \"quoteCount\": 762,\n  \"viewCount\": 246037082,\n  \"isReply\": false,\n  \"isRetweet\": false,\n  \"isQuote\": false,\n  \"conversationId\": \"1519480761749016577\",\n  \"threadRootId\": \"1519480761749016577\",\n  \"threadPosition\": 1,\n  \"author\": { \"username\": \"elonmusk\", \"name\": \"Elon Musk\", \"followers\": 241741247 },\n  \"collectedAt\": \"2026-10-06T00:00:00+00:00\"\n}\n```\n\n## Output per quote row\n\nWhen 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.\n\n## Output per retweet row\n\nWhen 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.\n\n## Output per profile row\n\nWhen you pass a profile link or handle instead of a post, the actor emits one `profile` row:\n\n- `id`, `username`, `name`, `bio`, `bioLinks`, `bioEmails`, `location`, `website`\n- `joinedAt`, `birthDate` — when public\n- `followers`, `following`, `postCount`, `mediaCount`, `listedCount`, `likesGiven` — the last three when X publishes them\n- `isBlueVerified`, `verified`, `verifiedType`, `isProtected`\n- `avatarUrl`, `bannerUrl`\n- `url` — profile URL\n- `type: \"profile\"`, `collectedAt`\n\n## Output per status row\n\nA `status` row is emitted instead of data when a link cannot be collected. It always has a `message`:\n\n- `type: \"status\"`\n- `status` — `noInput`, `invalidLink`, `notFound`, `rateLimited` or `error`\n- `tweetUrl` and `tweetId` (post inputs) or `profileUrl` (profile inputs)\n- `collectedAt`\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `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. |\n| `includeReplies` | boolean | `true` | Also collect the replies X exposes under each post. Turn off for the post only. |\n| `maxReplies` | integer | `20` | Replies to collect per post (0–500). Very large threads can return fewer. |\n| `includeQuotes` | boolean | `false` | Also collect the posts that quote each requested post, as `quote` rows. |\n| `maxQuotes` | integer | `50` | Quote posts to collect per post (0–500). |\n| `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. |\n| `maxRetweeters` | integer | `50` | Retweeter handles to collect per post (0–500). |\n| `includeQuotedTweet` | boolean | `true` | Include the quoted post's text, author and metrics. |\n| `includeParentTweet` | boolean | `true` | When a collected post is a reply, attach the post it answers under `parentTweet`. |\n| `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. |\n| `includeMedia` | boolean | `true` | Include image links, video links and video variants. |\n| `includeAuthorProfile` | boolean | `true` | Attach the author's public profile details to every post, reply and quote row under `author` and `authorProfile`. |\n\n### Example: one post with its replies\n\n```json\n{\n  \"tweetUrls\": [\"https://x.com/NASA/status/2107095768821576019\"],\n  \"includeReplies\": true,\n  \"maxReplies\": 100\n}\n```\n\n### Example: quotes and retweeters of a post\n\n```json\n{\n  \"tweetUrls\": [\"https://x.com/elonmusk/status/1519480761749016577\"],\n  \"includeReplies\": false,\n  \"includeQuotes\": true,\n  \"maxQuotes\": 100,\n  \"includeRetweeters\": true,\n  \"maxRetweeters\": 100\n}\n```\n\n### Example: quotes of a post, no replies\n\n```json\n{\n  \"tweetUrls\": [\"https://x.com/elonmusk/status/1519480761749016577\"],\n  \"includeReplies\": false,\n  \"includeQuotes\": true,\n  \"maxQuotes\": 100\n}\n```\n\n### Example: exact reply cap and no media\n\n```json\n{\n  \"tweetUrls\": [\"2106665276758491194\"],\n  \"includeReplies\": true,\n  \"maxReplies\": 500,\n  \"includeMedia\": false,\n  \"includeAuthorProfile\": false\n}\n```\n\n### Example: mix posts, IDs and a profile\n\n```json\n{\n  \"tweetUrls\": [\n    \"https://x.com/elonmusk/status/1519480761749016577\",\n    \"2106665276758491194\"\n  ],\n  \"includeParentTweet\": true\n}\n```\n\n## Use cases\n\n- **Brand and crisis monitoring** — collect a post, its replies and the posts quoting it to follow a conversation\n- **Journalism and research** — archive exact text, timestamps, authors and metrics for citations\n- **Social listening** — feed post, reply and quote text into sentiment or topic models\n- **Customer support** — pull replies to your own posts for response triage\n- **Dataset enrichment** — resolve a list of post IDs into structured records with author profiles\n- **Compliance** — keep immutable evidence rows for posts you may need to reference later\n\n## FAQ\n\n**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.\n\n**Do I need an X account, login or developer key?**  No. There is no login step and no credential input at all.\n\n**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.\n\n**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.\n\n**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.\n\n**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.\n\n**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.\n\n**How fresh is the data?**  Live — every run reads X at request time. Schedule the actor for hourly or daily refreshes.\n\n**Is this affiliated with X?**  No. This is a third-party actor that reads publicly available post and profile pages.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "x-post-reply-and-profile-lookup-by-link-or-id",
      "title": "X Post, Reply & Profile Lookup by Link or ID",
      "description": "Resolve X post links or IDs into text, author, media, polls, quoted/parent posts, engagement metrics, replies, quote posts and retweeter handles, or resolve a handle into that account's public profile.",
      "seoTitle": "Twitter (X) Tweet Scraper — Posts & Replies",
      "seoDescription": "Scrape any public X post or tweet by link or ID: text, author, media, polls, engagement metrics and replies. No login required.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# X Post, Reply & Profile Lookup by Link or ID\n\nGive 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.\n\n## What this actor does\n\n- **Posts by link or ID:** accepts `x.com` and `twitter.com` links, `x.com/i/web/status` links, bare post IDs, profile links and bare handles\n- **Replies:** walks the replies X exposes to logged-out visitors, starting from the post's publication time, and de-duplicates them by reply ID\n- **Quotes:** optionally collects the posts that quote the requested post, each with its text, author and metrics (off by default)\n- **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)\n- **Rich nested data:** optional parent post, quoted post, poll, link-preview card, photo/video variants and the author's public profile on every row\n- **Profile input:** a profile link or handle returns one `profile` row with that account's public bio and counters\n- **Honest rows:** every row carries a `type` (`post`, `reply`, `quote`, `profile`, `status`); deleted, protected or rate-limited links produce a `status` row with a message instead of failing the run\n- **Empty fields are omitted** — the dataset never contains `null`, `\"\"`, `[]` or `{}`\n\n## Output per post or reply\n\nEach row describes one post. `type` is `post` for requested posts and `reply` for replies collected from the conversation.\n\n- `id` — post ID\n- `url` — direct post URL\n- `text` — full post text, multi-line and links intact\n- `createdAt` — ISO 8601 post time\n- `language` — post language code when X provides it\n- `replyCount`, `retweetCount`, `likeCount`, `quoteCount`, `bookmarkCount`, `viewCount` — engagement metrics (views when X exposes them)\n- `engagementRate` — derived `(likes + retweets + replies + quotes) / followers`; present only when the author's follower count is known and greater than zero\n- `isReply`, `isQuote`, `isRetweet`, `isNoteTweet` — post type flags\n- `conversationId` — the thread root of the post\n- `threadRootId`, `threadPosition` — position of the row inside the collected thread\n- `inReplyToTweetId`, `inReplyToUserId`, `inReplyToUsername` — where a reply points\n- `hashtags`, `mentions`, `urls`, `cashtags` — entities found in the text\n- `media` — photo/video/GIF objects\n- `poll` — poll choices and status\n- `card` — link-preview card (`title`, `description`, `domain`, `url`, `thumbnail`)\n- `quotedTweet`, `quotedTweetId` — the quoted post when the input post quotes another (removed, together with `isQuote`, when `includeQuotedTweet` is off)\n- `parentTweet` — the post being replied to when the input post is a reply\n- `threadAncestors` — the chain of posts above a reply, root first (when `includeThreadAncestors` is on)\n- `author` — author profile snapshot\n- `authorProfile` — fuller author profile attached to every row\n- `possiblySensitive`, `place`, `postedFrom` — extra labels when X exposes them\n- `type`, `collectedAt`\n\n**Media item:** `type` (`photo` / `video` / `gif`), `url`, `previewImageUrl`, `width`, `height`, `durationSeconds`, `viewCount`, `altText`, `variants` (each variant has `url`, `contentType`, `bitrate`).\n\n**Poll:** `choices` (label + votes), `countsAreFinal`, `endsAt`, `durationMinutes`.\n\n**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.\n\n### Sample record\n\n```json\n{\n  \"type\": \"post\",\n  \"id\": \"1519480761749016577\",\n  \"url\": \"https://x.com/i/status/1519480761749016577\",\n  \"text\": \"Next I'm buying Coca-Cola to put the cocaine back in\",\n  \"createdAt\": \"2022-04-28T00:56:58+00:00\",\n  \"language\": \"en\",\n  \"replyCount\": 4056,\n  \"retweetCount\": 4151,\n  \"likeCount\": 91599,\n  \"quoteCount\": 762,\n  \"viewCount\": 246037082,\n  \"isReply\": false,\n  \"isRetweet\": false,\n  \"isQuote\": false,\n  \"conversationId\": \"1519480761749016577\",\n  \"threadRootId\": \"1519480761749016577\",\n  \"threadPosition\": 1,\n  \"author\": { \"username\": \"elonmusk\", \"name\": \"Elon Musk\", \"followers\": 241741247 },\n  \"collectedAt\": \"2026-10-06T00:00:00+00:00\"\n}\n```\n\n## Output per quote row\n\nWhen 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.\n\n## Output per retweet row\n\nWhen 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.\n\n## Output per profile row\n\nWhen you pass a profile link or handle instead of a post, the actor emits one `profile` row:\n\n- `id`, `username`, `name`, `bio`, `bioLinks`, `bioEmails`, `location`, `website`\n- `joinedAt`, `birthDate` — when public\n- `followers`, `following`, `postCount`, `mediaCount`, `listedCount`, `likesGiven` — the last three when X publishes them\n- `isBlueVerified`, `verified`, `verifiedType`, `isProtected`\n- `avatarUrl`, `bannerUrl`\n- `url` — profile URL\n- `type: \"profile\"`, `collectedAt`\n\n## Output per status row\n\nA `status` row is emitted instead of data when a link cannot be collected. It always has a `message`:\n\n- `type: \"status\"`\n- `status` — `noInput`, `invalidLink`, `notFound`, `rateLimited` or `error`\n- `tweetUrl` and `tweetId` (post inputs) or `profileUrl` (profile inputs)\n- `collectedAt`\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `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. |\n| `includeReplies` | boolean | `true` | Also collect the replies X exposes under each post. Turn off for the post only. |\n| `maxReplies` | integer | `20` | Replies to collect per post (0–500). Very large threads can return fewer. |\n| `includeQuotes` | boolean | `false` | Also collect the posts that quote each requested post, as `quote` rows. |\n| `maxQuotes` | integer | `50` | Quote posts to collect per post (0–500). |\n| `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. |\n| `maxRetweeters` | integer | `50` | Retweeter handles to collect per post (0–500). |\n| `includeQuotedTweet` | boolean | `true` | Include the quoted post's text, author and metrics. |\n| `includeParentTweet` | boolean | `true` | When a collected post is a reply, attach the post it answers under `parentTweet`. |\n| `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. |\n| `includeMedia` | boolean | `true` | Include image links, video links and video variants. |\n| `includeAuthorProfile` | boolean | `true` | Attach the author's public profile details to every post, reply and quote row under `author` and `authorProfile`. |\n\n### Example: one post with its replies\n\n```json\n{\n  \"tweetUrls\": [\"https://x.com/NASA/status/2107095768821576019\"],\n  \"includeReplies\": true,\n  \"maxReplies\": 100\n}\n```\n\n### Example: quotes and retweeters of a post\n\n```json\n{\n  \"tweetUrls\": [\"https://x.com/elonmusk/status/1519480761749016577\"],\n  \"includeReplies\": false,\n  \"includeQuotes\": true,\n  \"maxQuotes\": 100,\n  \"includeRetweeters\": true,\n  \"maxRetweeters\": 100\n}\n```\n\n### Example: quotes of a post, no replies\n\n```json\n{\n  \"tweetUrls\": [\"https://x.com/elonmusk/status/1519480761749016577\"],\n  \"includeReplies\": false,\n  \"includeQuotes\": true,\n  \"maxQuotes\": 100\n}\n```\n\n### Example: exact reply cap and no media\n\n```json\n{\n  \"tweetUrls\": [\"2106665276758491194\"],\n  \"includeReplies\": true,\n  \"maxReplies\": 500,\n  \"includeMedia\": false,\n  \"includeAuthorProfile\": false\n}\n```\n\n### Example: mix posts, IDs and a profile\n\n```json\n{\n  \"tweetUrls\": [\n    \"https://x.com/elonmusk/status/1519480761749016577\",\n    \"2106665276758491194\"\n  ],\n  \"includeParentTweet\": true\n}\n```\n\n## Use cases\n\n- **Brand and crisis monitoring** — collect a post, its replies and the posts quoting it to follow a conversation\n- **Journalism and research** — archive exact text, timestamps, authors and metrics for citations\n- **Social listening** — feed post, reply and quote text into sentiment or topic models\n- **Customer support** — pull replies to your own posts for response triage\n- **Dataset enrichment** — resolve a list of post IDs into structured records with author profiles\n- **Compliance** — keep immutable evidence rows for posts you may need to reference later\n\n## FAQ\n\n**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.\n\n**Do I need an X account, login or developer key?**  No. There is no login step and no credential input at all.\n\n**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.\n\n**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.\n\n**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.\n\n**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.\n\n**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.\n\n**How fresh is the data?**  Live — every run reads X at request time. Schedule the actor for hourly or daily refreshes.\n\n**Is this affiliated with X?**  No. This is a third-party actor that reads publicly available post and profile pages.\n",
      "input": {
        "title": "X Post, Reply & Profile Lookup input",
        "description": "Paste X post links, post IDs or profile handles. Choose whether to include replies, quote posts and author details.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "tweetUrls": {
            "title": "Post links, post IDs or profile handles",
            "type": "array",
            "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",
            "prefill": [
              "https://x.com/NASA/status/2107095768821576019"
            ],
            "example": [
              "https://x.com/elonmusk/status/1519480761749016577",
              "2106665276758491194",
              "NASA"
            ]
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Collect the replies X shows for each post, walked forward from the post's publication time.",
            "default": true,
            "prefill": true
          },
          "maxReplies": {
            "title": "Maximum replies per post",
            "type": "integer",
            "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.",
            "default": 20,
            "prefill": 3,
            "minimum": 0,
            "maximum": 500
          },
          "includeQuotes": {
            "title": "Include quote posts",
            "type": "boolean",
            "description": "Collect the posts that quote each requested post, with their text, author and engagement counts.",
            "default": false,
            "prefill": false
          },
          "maxQuotes": {
            "title": "Maximum quote posts per post",
            "type": "integer",
            "description": "How many quote posts to collect for each requested post (0-500).",
            "default": 50,
            "minimum": 0,
            "maximum": 500
          },
          "includeRetweeters": {
            "title": "Include retweeter handles",
            "type": "boolean",
            "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.",
            "default": false,
            "prefill": false
          },
          "maxRetweeters": {
            "title": "Maximum retweeters per post",
            "type": "integer",
            "description": "How many retweeter handles to collect for each post (0-500).",
            "default": 50,
            "minimum": 0,
            "maximum": 500
          },
          "includeQuotedTweet": {
            "title": "Include the post each result quotes",
            "type": "boolean",
            "description": "When a collected post quotes another post, attach the quoted post's text, author and metrics.",
            "default": true,
            "prefill": true
          },
          "includeParentTweet": {
            "title": "Include the post being replied to",
            "type": "boolean",
            "description": "When a collected post is a reply, attach the post it answers under parentTweet.",
            "default": true,
            "prefill": true
          },
          "includeThreadAncestors": {
            "title": "Include the full thread above a reply",
            "type": "boolean",
            "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).",
            "default": false,
            "prefill": false
          },
          "includeMedia": {
            "title": "Include images and videos",
            "type": "boolean",
            "description": "Include image links, video links and video variants for each post.",
            "default": true,
            "prefill": true
          },
          "includeAuthorProfile": {
            "title": "Include author profile details",
            "type": "boolean",
            "description": "Attach the author's public profile details (followers, bio, verification) to every post, reply and quote row under author and authorProfile.",
            "default": true,
            "prefill": true
          }
        },
        "required": [
          "tweetUrls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "X Post, Reply & Profile Lookup by Link or ID Output",
        "description": "X posts, replies, and profile rows resolved from the links, IDs, or handles you supplied.",
        "type": "object",
        "properties": {
          "tweets": {
            "type": "string",
            "title": "Tweets",
            "description": "All collected posts, replies and status rows.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "categories": [
        "SOCIAL_MEDIA"
      ],
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Tweets",
              "transformation": {
                "fields": [
                  "type",
                  "text",
                  "author.username",
                  "createdAt",
                  "likeCount",
                  "retweetCount",
                  "replyCount",
                  "viewCount",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "92d13374a0ae05f7920643cbba60aa6f9c058c7b9d7420cae8035d1e3b1234f1",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.011975555555555555
    }
  }
}