{"name":"x-post-context","id":"sfoln/x-post-context","title":"Tweet Thread Context API – Replies & Author","description":"Turn any X (Twitter) post URL into one context record: the post with engagement, the author's profile, the newest replies with conversation stats and optional quote posts. $30 per 1,000 posts with 20 replies included; extra replies $0.001 each, up to 100 per post.","version":"0.1","status":"ready","family":{"id":"social-media-data","name":"Social media data","description":"Profiles, posts, comments, followers and account audits from X, Instagram, TikTok, YouTube, Reddit, Threads, LinkedIn, Facebook, Bluesky, Telegram, Hacker News and Substack.","actors":31},"categories":["SOCIAL_MEDIA","NEWS","LEAD_GENERATION"],"availability":"on_request","seoTitle":"Tweet Thread Context API – $30 per 1,000 posts","seoDescription":"Tweet thread API: one record per X (Twitter) post with author profile, newest replies, reply stats and quote posts. $0.03 per post, 20 replies included.","summary":"Tweet Thread Context API – Replies & Author turns any X (Twitter) post URL into a complete context package in one record: the normalized post with its engagement snapshot, the author's full profile, the newest replies (20 included, up to 100) with conversation statistics (unique repliers, top repliers, share of verified repliers, the author's own replies, reply likes, languages, hashtags, mentions and linked domains) and, optionally, up to 20 quote posts. Built for social listening, crisis monitoring, PR and campaign reporting, community management and research workflows that need \"what is this post and how are people reacting\" without stitching four API calls together.","pricing":{"model":"pay-per-event","currency":"USD","billedBy":"Apify","freePlanMaxItemsPerRun":10,"events":[{"name":"x-post-context","title":"X post context package","description":"Charged once per post: the normalized post, its author's profile, up to 20 replies with conversation stats and (optionally) up to 20 quote posts.","priceUsd":0.03},{"name":"x-context-extra-reply","title":"Extra reply","description":"Charged per reply delivered beyond the 20 included in x-post-context (only when maxReplies > 20).","priceUsd":0.001}]},"input":{"description":"List X (Twitter) post URLs or ids. Each post produces one dataset record with the post, its author, replies and conversation stats.","required":["posts"],"fields":[{"name":"posts","title":"Post URLs or ids","type":"array","required":true,"description":"X / Twitter post URLs (https://x.com/user/status/123…) or numeric post ids, one per line. Duplicates are removed. Use the first post of a thread for the full conversation. Accounts on the Apify free plan can process up to 10 posts per run.","prefill":["https://x.com/jack/status/20"],"editor":"stringList"},{"name":"maxReplies","title":"Max replies per post","type":"integer","required":false,"description":"Newest replies to include (0–100). The first 20 are included in the x-post-context price; each further reply is charged as x-context-extra-reply.","default":20,"minimum":0,"maximum":100},{"name":"includeAuthor","title":"Include author profile","type":"boolean","required":false,"description":"Add the author's full profile (followers, bio, verification, creation date…).","default":true},{"name":"includeQuotes","title":"Include quote posts","type":"boolean","required":false,"description":"Add up to 20 of the newest posts quoting this post (included in the package price).","default":false},{"name":"maxItems","title":"Max posts","type":"integer","required":false,"description":"Safety cap on how many posts are processed in this run.","default":1000,"minimum":1,"maximum":10000},{"name":"concurrency","title":"Concurrency","type":"integer","required":false,"description":"Posts processed in parallel (1–5).","default":3,"minimum":1,"maximum":5},{"name":"itemTimeoutSecs","title":"Per-post timeout (seconds)","type":"integer","required":false,"description":"Time limit per post; reply paging stops early when it is near.","default":300,"minimum":60,"maximum":1800},{"name":"includeRaw","title":"Include raw upstream response","type":"boolean","required":false,"description":"Attach the unmodified post, author, reply and quote payloads under `raw` (larger output).","default":false}]},"exampleInput":{"posts":["https://x.com/jack/status/20"]},"outputFields":[{"name":"input","type":"string | object","title":"Input","description":"The input item this record corresponds to."},{"name":"status","type":"string","title":"Status","description":"ok (post found, charged x-post-context) | not_found (deleted / protected / unknown post, not charged) | error | skipped_invalid | skipped_budget | skipped_free_plan","example":"ok"},{"name":"charged","type":"boolean","title":"Charged","description":"Whether this record incurred a pay-per-event charge."},{"name":"chargedEvent","type":"string","title":"Charged event","description":"Pay-per-event event charged for this record."},{"name":"source","type":"string","title":"Source","description":"Upstream data source (twitterapi = TwitterAPI.io)."},{"name":"fetchedAt","type":"string","title":"Fetched at","description":"ISO timestamp."},{"name":"error","type":"object","title":"Error","description":"code / message when status is not ok (or a partial failure)."},{"name":"warnings","type":"array","title":"Warnings","description":"Non-fatal notes (partial data, stopped early, free-plan caps)."},{"name":"found","type":"boolean | null","title":"Found","description":"Post exists and was returned."},{"name":"postId","type":"string | null","title":"Post id","description":"Numeric X post id."},{"name":"postUrl","type":"string | null","title":"Post URL","description":"https://x.com/<handle>/status/<id>."},{"name":"postText","type":"string | null","title":"Post text","description":"Full text of the post."},{"name":"postCreatedAt","type":"string | null","title":"Posted at","description":"ISO 8601."},{"name":"authorHandle","type":"string | null","title":"Author handle","description":"Handle of the post's author."},{"name":"post","type":"object | null","title":"Post","description":"Normalized post: counts, entities, media, reply / quote / repost flags."},{"name":"author","type":"object | null","title":"Author profile","description":"Normalized author profile (followers, bio, verification, createdAt…); null when includeAuthor is false or the lookup failed."},{"name":"authorSource","type":"string | null","title":"Author source","description":"embedded (from the post payload, no extra call) or lookup (/twitter/user/info)."},{"name":"likes","type":"integer | null","title":"Likes","description":"Likes at fetch time."},{"name":"retweets","type":"integer | null","title":"Reposts","description":"Reposts at fetch time."},{"name":"replyCount","type":"integer | null","title":"Reply count","description":"Total replies reported by X (not just the sampled ones)."},{"name":"quoteCount","type":"integer | null","title":"Quote count","description":"Quote posts reported by X."},{"name":"views","type":"integer | null","title":"Views","description":"Views at fetch time."},{"name":"bookmarks","type":"integer | null","title":"Bookmarks","description":"Bookmarks at fetch time."},{"name":"engagementTotal","type":"integer | null","title":"Engagement total","description":"likes + reposts + replies + quotes."},{"name":"engagementRateByViewsPct","type":"number | null","title":"Engagement rate (views) %","description":"engagementTotal / views × 100."},{"name":"engagementRateByFollowersPct","type":"number | null","title":"Engagement rate (followers) %","description":"engagementTotal / author followers × 100."},{"name":"postAgeHours","type":"number | null","title":"Post age (h)","description":"Hours between posting and fetch."},{"name":"likesPerHour","type":"number | null","title":"Likes per hour","description":"likes / postAgeHours."},{"name":"hashtags","type":"array","title":"Hashtags","description":"Hashtags in the post."},{"name":"mentions","type":"array","title":"Mentions","description":"Handles mentioned in the post."},{"name":"links","type":"array","title":"Links","description":"Expanded links in the post."},{"name":"linkDomains","type":"array","title":"Link domains","description":"Domains of the post's links."},{"name":"repliesReturned","type":"integer | null","title":"Replies returned","description":"Replies included in replies[] (newest first)."},{"name":"uniqueRepliers","type":"integer | null","title":"Unique repliers","description":"Distinct reply authors in the sample."},{"name":"topRepliers","type":"array","title":"Top repliers","description":"Up to 5 { handle, replies } by replies in the sample."},{"name":"verifiedRepliersSharePct","type":"number | null","title":"Verified repliers %","description":"Share of unique repliers with a blue check (over repliers whose status is known)."},{"name":"authorRepliesCount","type":"integer | null","title":"Author replies","description":"Sampled replies written by the post's author."},{"name":"avgReplyLikes","type":"number | null","title":"Avg reply likes","description":"Mean likes per sampled reply."},{"name":"medianReplyLikes","type":"number | null","title":"Median reply likes","description":"Median likes per sampled reply."},{"name":"mostLikedReply","type":"object | null","title":"Most liked reply","description":"{ id, url, authorHandle, text, likes }."},{"name":"repliesWithMediaPct","type":"number | null","title":"Replies with media %","description":"Share of sampled replies with images / video."},{"name":"repliesWithLinksPct","type":"number | null","title":"Replies with links %","description":"Share of sampled replies with links."},{"name":"replyLanguages","type":"array","title":"Reply languages","description":"Up to 5 { lang, count }."},{"name":"replyTopHashtags","type":"array","title":"Reply hashtags","description":"Up to 10 { tag, count } across sampled replies."},{"name":"replyTopMentions","type":"array","title":"Reply mentions","description":"Up to 10 { handle, count }, the post's author excluded."},{"name":"replyLinkDomains","type":"array","title":"Reply link domains","description":"Up to 10 { domain, count } linked in replies (x.com excluded)."},{"name":"newestReplyAt","type":"string | null","title":"Newest reply","description":"ISO 8601."},{"name":"oldestReplyAt","type":"string | null","title":"Oldest reply","description":"ISO 8601 (oldest in the sample)."},{"name":"replies","type":"array","title":"Replies","description":"Sampled replies, newest first: { id, url, text, createdAt, lang, authorHandle, authorName, authorFollowers, authorIsBlueVerified, likes, retweets, replies, quotes, views, inReplyToId, hashtags, mentions, urls, mediaCount }."},{"name":"repliesRequested","type":"integer | null","title":"Replies requested","description":"Effective maxReplies (20 on the free plan)."},{"name":"repliesPagesFetched","type":"integer | null","title":"Reply pages","description":"Upstream reply pages fetched."},{"name":"repliesStopReason","type":"string | null","title":"Replies stop reason","description":"limit | end | budget | deadline | aborted | empty_pages | max_pages | error | skipped."},{"name":"extraRepliesCharged","type":"integer | null","title":"Extra replies charged","description":"Replies charged as x-context-extra-reply (beyond the included 20)."},{"name":"emptyReplyPagesCharged","type":"integer | null","title":"Empty reply pages charged","description":"Extra-reply pages the upstream billed that added no new reply, charged one x-context-extra-reply each."},{"name":"quotesIncluded","type":"boolean | null","title":"Quotes requested","description":"Whether includeQuotes was on."},{"name":"quotesReturned","type":"integer | null","title":"Quotes returned","description":"Quote posts in quotePosts[]."},{"name":"quotePosts","type":"array","title":"Quote posts","description":"Up to 20 newest quote posts (same shape as replies[])."}],"outputExample":{"input":"https://x.com/jack/status/20","found":true,"postId":"20","postUrl":"https://x.com/jack/status/20","postText":"just setting up my twttr","postCreatedAt":"2006-03-21T20:50:14.000Z","authorHandle":"jack","post":{"id":"20","likes":300000,"retweets":120000,"replies":18000,"quotes":9000,"views":null,"hashtags":[],"mentions":[],"urls":[],"isReply":false,"...":"…"},"author":{"handle":"jack","name":"jack","followers":6500000,"isBlueVerified":true,"createdAt":"2006-03-21T20:50:14.000Z","...":"…"},"authorSource":"embedded","likes":300000,"retweets":120000,"replyCount":18000,"quoteCount":9000,"views":null,"bookmarks":2000,"engagementTotal":447000,"engagementRateByViewsPct":null,"engagementRateByFollowersPct":6.8769,"postAgeHours":179000.5,"likesPerHour":1.68,"hashtags":[],"mentions":[],"links":[],"linkDomains":[],"repliesReturned":40,"uniqueRepliers":38,"topRepliers":[{"handle":"someone","replies":2}],"verifiedRepliersSharePct":21.05,"authorRepliesCount":0,"avgReplyLikes":3.4,"medianReplyLikes":1,"mostLikedReply":{"id":"18…","url":"https://x.com/someone/status/18…","authorHandle":"someone","text":"history","likes":51},"repliesWithMediaPct":12.5,"repliesWithLinksPct":5,"replyLanguages":[{"lang":"en","count":31}],"replyTopHashtags":[{"tag":"history","count":3}],"replyTopMentions":[{"handle":"elonmusk","count":2}],"replyLinkDomains":[{"domain":"youtube.com","count":1}],"newestReplyAt":"2026-10-14T09:12:00.000Z","oldestReplyAt":"2026-10-10T17:40:00.000Z","replies":[{"id":"18…","url":"…","text":"…","authorHandle":"someone","authorIsBlueVerified":false,"likes":51,"...":"…"}],"repliesRequested":40,"repliesPagesFetched":2,"repliesStopReason":"limit","extraRepliesCharged":20,"quotesIncluded":true,"quotesReturned":20,"quotePosts":[{"id":"18…","text":"…","...":"…"}],"status":"ok","charged":true,"chargedEvent":"x-post-context","source":"twitterapi","fetchedAt":"2026-10-14T10:00:00.000Z"},"faq":[],"mcpExamplePrompt":"Get the context of https://x.com/jack/status/20: who posted it, how it performed and what the replies are saying.","related":["x-post-replies","x-posts-lookup","x-user-mentions"],"urls":{"site":"https://www.sfoln.com/actors/x-post-context/","siteJson":"https://www.sfoln.com/actors/x-post-context.json","siteMarkdown":"https://www.sfoln.com/actors/x-post-context.md","runSync":"https://api.apify.com/v2/actors/sfoln~x-post-context/run-sync-get-dataset-items","runAsync":"https://api.apify.com/v2/actors/sfoln~x-post-context/runs","mcp":"https://mcp.apify.com?tools=sfoln/x-post-context","requestAccess":"mailto:contact@sfoln.com?subject=Access%20request%3A%20Tweet%20Thread%20Context%20API%20%E2%80%93%20Replies%20%26%20Author%20(sfoln%2Fx-post-context)&body=Please%20publish%20x-post-context.%20What%20we%20plan%20to%20use%20it%20for%3A"},"publisher":{"name":"SFOLN LLC","apifyUsername":"sfoln","url":"https://www.sfoln.com","apifyProfile":"https://apify.com/sfoln","email":"contact@sfoln.com"},"generatedAt":"2026-10-22T04:28:58.477Z"}