X / Twitter Posts Scraper — Profile & Post URLs avatar

X / Twitter Posts Scraper — Profile & Post URLs

Pricing

from $0.09 / 1,000 item processeds

Go to Apify Store
X / Twitter Posts Scraper — Profile & Post URLs

X / Twitter Posts Scraper — Profile & Post URLs

Export public X/Twitter posts from profile or post URLs, with text, authors, engagement counts, and media links. Download JSON or CSV. Search queries are not supported.

Pricing

from $0.09 / 1,000 item processeds

Rating

0.0

(0)

Developer

Fetch Cat

Fetch Cat

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

1

Monthly active users

9 days ago

Last modified

Security

Limited permissions

Share

Export public X and Twitter posts from known profile or individual status URLs, with exposed text, author, engagement, media and source context. This Actor does not search keywords or access protected or login-only posts. Use the exported snapshots in your own reporting or monitoring workflow.

Quick start

Start with the existing public profile URL and a five-post cap. After the run finishes, inspect its dataset and RUN_SUMMARY before exporting:

{
"startUrls": [
{
"url": "https://x.com/elonmusk"
}
],
"maxItems": 5
}

Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.

Ready-to-run examples

Open a saved example to inspect its inputs, then adjust the limits and filters for your own run. Examples are starting points. Source availability can change.

View all ready-to-run examples

What you get

One saved row per unique public post, with stable identity, source link, text and available author, media and engagement fields. Optional values can be null. PaginationCursor records the public profile-page cursor used, rather than guaranteeing a complete account archive or a built-in resume input.

Who is it for?

  • Social-media researchers reviewing posts from selected known accounts.
  • Editorial teams preserving source-linked public statements.
  • Campaign analysts comparing their own dated post samples.
  • Data developers importing normalized posts and source outcomes.

How you can use the data

  • Review a small known-profile sample. Use the existing x.com/elonmusk target with five saved posts. Keep author identity, source URL and collection time with the text before making a summary. This is public account collection rather than keyword discovery.
  • Target a known individual post. Supply your own public numeric /status/ link when one specific source post is needed. Public author or engagement fields can be less complete than profile-mode records, so retain sourceType and unknown values.
  • Join overlapping source exports deliberately. Shared post IDs are saved once across supplied sources. Keep sourceUrl with each row and inspect partialSourceFailure plus the run summary rather than assuming every input returned records.
  • Compare your own retained observations. Join stable IDs and scrapedAt in your destination to review text or visible count changes. Public availability and advancing cursors limit coverage, and the Actor does not provide an exhaustive archive, search engine or cross-run change report.

Input settings

SettingJSON keyType / defaultWhat it does
Start URLsstartUrlsarray / not setPublic X / Twitter tweet profile or status URLs for social listening, tweet monitoring, and content research. Search URLs are not supported because X requires login for search.
Maximum itemsmaxItemsinteger / 10Maximum public X / Twitter tweets to save from supported anonymous profile pages (1–100). The Actor follows bounded public timeline cursors while they advance. Minimum 1. Maximum 100.

At least one supported public HTTPS profile or numeric status URL is required. X and Twitter domain aliases are accepted, while search targets are rejected. The default cap is ten saved posts, with at most one hundred returned per run and input sources sharing the allowance. Listing continuation is limited to advancing public cursors rather than a full profile-history guarantee.

Output data

Illustrative shortened post record. The example text, author, and counts are not live evidence.

{
"id": "2093127984701989032",
"url": "https://x.com/example/status/2093127984701989032",
"text": "Example public post text",
"createdAt": "2026-08-28T00:06:14.000Z",
"likeCount": 40194,
"repostCount": 3852,
"author": { "username": "example", "name": "Example Author" },
"sourceType": "profile"
}
FieldDescription
id, url, twitterUrl, textStable post identity, canonical links, and public post text.
createdAt, langPublication timestamp and language when the public response provides them.
replyCount, repostCount, likeCount, quoteCount, bookmarkCount, viewCountVisible engagement metrics. Unavailable values are null.
isReply, isRetweet, isQuotePost relationship flags where publicly detectable.
mediaUrlsUnique public media URLs attached to a post.
authorPublic author ID, username, display name, profile URL/image, follow counts, and verification flags when available.
sourceUrl, sourceType, paginationCursor, scrapedAt, partialSourceFailureRequested source, source mode, collection time, and partial-run indicator. paginationCursor records the public cursor used for a continued profile page, or is null for the first page/status URLs.

Download your results

Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.

See Apify's download and export guide for the available formats and field options.

Pricing

The start event is charged once after input validation for a valid run. The item event applies to each post saved for export. Failed sources are not paid post records, while successfully saved posts remain billable in a partial run. A valid started run can incur start even without saved posts.

Use a small explicit saved-post cap. See the live Pricing tab for current rates and discounts. Apify reports any applicable platform usage separately.

Tips for best results

  • Use known public profile or status URLs. Keyword queries and search-result URLs are unsupported.
  • Keep the first profile sample small. Public cursor availability does not guarantee the whole timeline.
  • Retain null engagement as unavailable. Missing counters are not measured zero activity.
  • Keep sourceType and sourceUrl. Profile and individual-status records can expose different optional details.
  • Inspect summary reasons and final status. Unavailable targets and systemic failures require different interpretation.

Limits and caveats

Only publicly exposed X or Twitter profile and post content is supported. Protected and login-only posts, private account data and search-result pages are outside scope. This is not an official X API or authenticated account-management tool.

The saved-post cap is shared across supplied sources, with stable post identities deduplicated in a run. Collection follows limited public profile cursors while they advance rather than promising a complete timeline. No custom sort, keyword-search, date-filter or automatic cross-run monitoring input is exposed. Optional public author, media and engagement fields can be absent or null.

Completed posts remain available when another source fails. Check partialSourceFailure and RUN_SUMMARY source outcomes rather than assuming complete coverage. Unavailable targets or a recognized, completed public timeline without usable posts can succeed empty with a reason. Unexpected response shapes, blocking and failed parsing are extraction failures, not evidence of an empty account. An inaccessible target is not confirmed private or deleted, and empty success does not verify that every collection path works.

Configuration, essential storage, billing and systemic extraction failures still fail the run. A run with no saved posts and unresolved source failures or deadline-pending work fails rather than declaring empty success. PENDING_SOURCES records unfinished input positions when a processing guard is reached after useful output. Runs share a 270-second processing budget from the original run start, up to 64 HTTP requests including redirects, ten timeline pages per profile, and 32 MiB of response work. Each response is limited to 8 MiB both before and after decompression; exported rows are limited to 256 KiB. A reached limit is reported, never treated as a confirmed empty source.

Large source lists are validated without silently cutting the input list. Processing stops at the shared item/work allowance. Summary failure, unavailable and pending URL examples are limited to twenty each; total counts and the first pending input index identify the remaining work against your original INPUT.

Restarts retain the original budget and completed post IDs. Already completed runs do not repeat output or startup charges. If a restart interrupts collection, saving or billing, the Actor fails safely with its processing checkpoint and any saved output retained rather than guessing whether a charge or append completed. There is no automatic replay of ambiguous work. Compare actual saved IDs before choosing a new collection in your own workflow.

Automation and integrations

Save your settings for next time

Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.

Run on a schedule

Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.

Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.

Send results to your other tools

Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.

For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.

API usage

Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.

The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.

For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.

The client examples read the first dataset page. Paginate the dataset when your export needs more. Save the Quick start JSON as input.json before using cURL.

cURL

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~tweet-scraper/runs" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @input.json

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/tweet-scraper').call({
"startUrls": [
{
"url": "https://x.com/elonmusk"
}
],
"maxItems": 5
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import json
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = json.loads('''{
"startUrls": [
{
"url": "https://x.com/elonmusk"
}
],
"maxItems": 5
}''')
run = client.actor("fetch_cat/tweet-scraper").call(run_input=run_input)
print(client.dataset(run["defaultDatasetId"]).list_items().items)

MCP and AI agents

You can ask your AI assistant to collect data with X / Twitter Posts Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.

Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.

Easier setup with an Apify plugin

If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.

Use Apify AI in Console

Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's X / Twitter Posts Scraper. You can describe the data you want and ask questions about the results.

Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.

Choose your assistant

Connect just this scraper

To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/tweet-scraper"
}
}
}

Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.

Use Apify's general server

Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use X / Twitter Posts Scraper by Fetch Cat, or give it the identifier fetch_cat/tweet-scraper.

Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.

Example requests

  • “Use Fetch Cat’s X and Twitter Posts Scraper to collect up to 5 public posts from https://x.com/elonmusk. Keep source links, dates and available author and engagement fields without searching keywords or accessing protected content.”
  • “Retrieve up to 3 public posts from https://x.com/elonmusk and preserve original source attribution and collection times for my own comparison. Keep unavailable metrics null rather than treating them as zero.”
  • “Collect up to 5 public posts from https://x.com/elonmusk for an editorial reading list. Inspect source outcomes and partial-result indicators, keeping unavailable or unfinished work distinct from confirmed no public rows.”

Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.

Pay with x402

If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.

Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.

Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.

Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.

Other ways for agents to pay

Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.

FAQ

Can I scrape X search results?

No. This version supports public profile and direct status URLs only. It rejects search URLs rather than returning a login page or unrelated records.

Can I use the Actor via API or MCP?

Yes. Submit the same input through the Apify API, retrieve the default dataset, or enable this Actor in an Apify MCP tool selection.

What happens if one source fails?

Completed posts are retained. Check partialSourceFailure and RUN_SUMMARY for source-level outcomes. Unavailable targets or recognized, completed public timelines with no usable posts produce an empty dataset and a truthful reason. Unknown responses and parser failures are reported as extraction failures instead. An inaccessible target is not automatically private or deleted. Storage, billing, configuration, and systemic extraction failures still fail the run. A valid started run can incur the startup fee even when it exports no posts.

Is this for public data only?

Yes. Do not use it to access protected content, bypass access controls, or collect data in violation of applicable laws or platform terms.

Support and feedback

For custom additions or integrations, email hello@fetchcat.dev.

Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.

Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.

Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.

Made with care for curious people, AI agents and the possibilities in data. ♥