Vexaloom Labs

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.

FieldTypeRequiredDescription
tweetUrlsarrayrequiredPaste 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).
includeRepliesbooleanoptionalCollect the replies X shows for each post, walked forward from the post's publication time.
maxRepliesintegeroptionalHow 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
FieldTypeRequiredDescription
tweetUrlsarrayrequiredPaste 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).
includeRepliesbooleanoptionalCollect the replies X shows for each post, walked forward from the post's publication time.
maxRepliesintegeroptionalHow 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.
includeQuotesbooleanoptionalCollect the posts that quote each requested post, with their text, author and engagement counts.
maxQuotesintegeroptionalHow many quote posts to collect for each requested post (0-500).
includeRetweetersbooleanoptionalCollect 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.
maxRetweetersintegeroptionalHow many retweeter handles to collect for each post (0-500).
includeQuotedTweetbooleanoptionalWhen a collected post quotes another post, attach the quoted post's text, author and metrics.
includeParentTweetbooleanoptionalWhen a collected post is a reply, attach the post it answers under parentTweet.
includeThreadAncestorsbooleanoptionalWhen 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).
includeMediabooleanoptionalInclude image links, video links and video variants for each post.
includeAuthorProfilebooleanoptionalAttach 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.

FieldTypeRequiredDescription
tweetsstringoptionalAll 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.com and twitter.com links, x.com/i/web/status links, 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 profile row 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 a status row 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 ID
  • url — direct post URL
  • text — full post text, multi-line and links intact
  • createdAt — ISO 8601 post time
  • language — post language code when X provides it
  • replyCount, 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 zero
  • isReply, isQuote, isRetweet, isNoteTweet — post type flags
  • conversationId — the thread root of the post
  • threadRootId, threadPosition — position of the row inside the collected thread
  • inReplyToTweetId, inReplyToUserId, inReplyToUsername — where a reply points
  • hashtags, mentions, urls, cashtags — entities found in the text
  • media — photo/video/GIF objects
  • poll — poll choices and status
  • card — link-preview card (title, description, domain, url, thumbnail)
  • quotedTweet, quotedTweetId — the quoted post when the input post quotes another (removed, together with isQuote, when includeQuotedTweet is off)
  • parentTweet — the post being replied to when the input post is a reply
  • threadAncestors — the chain of posts above a reply, root first (when includeThreadAncestors is on)
  • author — author profile snapshot
  • authorProfile — fuller author profile attached to every row
  • possiblySensitive, place, postedFrom — extra labels when X exposes them
  • type, 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, website
  • joinedAt, birthDate — when public
  • followers, following, postCount, mediaCount, listedCount, likesGiven — the last three when X publishes them
  • isBlueVerified, verified, verifiedType, isProtected
  • avatarUrl, bannerUrl
  • url — profile URL
  • type: "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, rateLimited or error
  • tweetUrl and tweetId (post inputs) or profileUrl (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.

Open the step-by-step Python guide →

Source build 44rnh640txthNj7fH. Documentation is regenerated from the default published build; private drafts are not included.