Vexaloom Labs

Use X Post, Reply & Profile Lookup by Link or ID with Python

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.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "includeAuthorProfile": true,
  "includeMedia": true,
  "includeParentTweet": true,
  "includeQuotedTweet": true,
  "includeQuotes": false,
  "includeReplies": true,
  "includeRetweeters": false,
  "includeThreadAncestors": false,
  "maxReplies": 3,
  "tweetUrls": [
    "https://x.com/NASA/status/2107095768821576019"
  ]
}

Download input.example.json and save your reviewed copy as input.json.

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.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/cMnafsv5dV5zfAsHX/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

X posts, replies, and profile rows resolved from the links, IDs, or handles you supplied.

Questions before you run

Which inputs are required?

The published required fields are tweetUrls

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build 44rnh640txthNj7fH and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.