X API: Get post
Gets a public X (Twitter) post from its link: author, full text, posting time, likes, reposts, replies, quotes, views, language, media and the quoted post. Deleted, protected and unavailable posts cannot be returned.
Unofficial. Not affiliated with or endorsed by X.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Post, required
post Link to the public X post, for example https://x.com/NASA/status/2041915225776009742.
https://x.com/NASAJPL/status/1950583566947213444
Input as JSON
{ "post": "https://x.com/NASAJPL/status/1950583566947213444" }Output
{ "likes": 567, "media": [ { "type": "photo", "image_or_thumbnail_link": "https://pbs.twimg.com/media/GxHdAf0bgAAPO76.jpg" }, { "type": "video", "image_or_thumbnail_link": "https://pbs.twimg.com/amplify_video_thumb/1950582192369004544/img/t8Ln3nL6kcIRjFWp.jpg" }, { "type": "photo", "image_or_thumbnail_link": "https://pbs.twimg.com/media/GxHdZRdbsAAqxXa.jpg" } ], "views": 164367, "quotes": 11, "post_id": "1950583566947213444", "replies": 41, "reposts": 110, "language": "English", "full_text": "Launch success! NISAR is in orbit and communicating with @NASA and @ISRO teams after launching from India this morning 🚀\n\nThe mission will study Earth’s land and ice surfaces, providing critical insight into how our planet changes over time. https://t.co/m1uEXR5QqR https://t.co/L0EEo3Lx19" , "post_link": "https://x.com/NASAJPL/status/1950583566947213444" , "posted_at": "2025-07-30T15:45:37Z", "quoted_post": null, "author_username": "NASAJPL", "author_display_name": "NASA JPL"}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"x.com/get_post","input":{"post":"https://x.com/NASAJPL/status/1950583566947213444"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "x.com/get_post" , "input": { "post": "https://x.com/NASAJPL/status/1950583566947213444" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "x.com/get_post" , "input": { "post": "https://x.com/NASAJPL/status/1950583566947213444" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run x.com/get_post# with {"post":"https://x.com/NASAJPL/status/1950583566947213444"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "post" ], "properties": { "post": { "type": "string", "description": "Link to the public X post, for example https://x.com/NASA/status/2041915225776009742." } }}Output schema
{ "type": "object", "required": [ "author_username", "author_display_name", "full_text", "posted_at", "likes", "reposts", "replies", "quotes", "views", "language", "media", "quoted_post", "post_link", "post_id" ], "properties": { "likes": { "type": "integer" }, "media": { "type": "array", "items": { "type": "object", "required": [ "type", "image_or_thumbnail_link" ], "properties": { "type": { "enum": [ "photo", "video", "gif" ], "type": "string" }, "image_or_thumbnail_link": { "type": "string" } }, "additionalProperties": false } }, "views": { "type": [ "integer", "null" ], "description": "Null if the public page does not show views." }, "quotes": { "type": "integer" }, "post_id": { "type": "string", "x-fous-developer": true }, "replies": { "type": "integer" }, "reposts": { "type": "integer" }, "language": { "type": [ "string", "null" ] }, "full_text": { "type": "string" }, "post_link": { "type": "string" }, "posted_at": { "type": "string", "format": "date-time", "description": "Date and time in UTC." }, "quoted_post": { "type": [ "object", "null" ], "required": [ "author_username", "author_display_name", "text" ], "properties": { "text": { "type": "string" }, "author_username": { "type": "string" }, "author_display_name": { "type": "string" } }, "additionalProperties": false }, "author_username": { "type": "string", "description": "Author username without the @ sign." }, "author_display_name": { "type": "string" } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
x.com/get_post- Returns
- author username and display name, full text, posted at, likes, reposts, replies, quotes, views, language, media, quoted post, post link and ID
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method x.com/get_post with the inputs above.
Ask your agent
- How many likes and reposts does this tweet have right now? https://x.com/elonmusk/status/1893456789012345678
- Pull the full text, posting time and view count for https://twitter.com/SpaceX/status/1887654321098765432
- On X, what does the post at https://x.com/nytimes/status/1901234567890123456 say, and does it quote another post?
- I need the author's display name, language and any attached images or video from this link: https://x.com/BBCBreaking/status/1876543210987654321
- Grab the reply count, quote count and timestamp of this Twitter post so I can log it in my spreadsheet: https://x.com/OpenAI/status/1912345678901234567
See more
All X methodsGets the public X profile for a username or profile link, including counts, verification, images and account details. Does not include posts or a timeline.
x.com/get_profileGets a public Threads post with its engagement counts and the replies visible without logging in.
threads.com/get_postLists an account's latest public Threads posts, newest first, with text, engagement counts, thumbnails and links. Only posts shown without logging in are returned.
threads.com/list_recent_postsLists an account's latest public Bluesky posts, newest first. Replies and reposts are left out unless requested; a repost's time is when the account reposted it.
bsky.app/list_recent_postsLists a Mastodon account's latest public posts, newest first. Replies and boosts are optional. Private and unlisted posts are left out.
mastodon.social/list_recent_postsLists a company's recent public LinkedIn posts in page order, from its name or LinkedIn company page link: post text, approximate date, reactions, comments, image and link. Only updates shown on the signed-out company page are available.
linkedin.com/list_company_postsLists the latest publicly embeddable posts and reels from an Instagram account, newest first. Without login Instagram may show fewer posts than requested. View counts that are not available are null.
instagram.com/list_recent_postsGets details and engagement statistics for one public TikTok video from its link, including vm.tiktok.com short links: creator, caption, hashtags, posting time, views, likes, comments, shares, length and sound.
tiktok.com/get_video