Scrape visible public tweets from X profile pages and status URLs, including text, author, tweet URL, engagement counts when available, media URLs, reply flags, and scrape timestamps.
Use it for social listening, competitor monitoring, creator research, lightweight public-post exports, content tracking, and agent-ready X/Twitter datasets.
At a glance
- Public profile tweets: Add one or more X/Twitter profile URLs and save visible public tweets.
- Specific status URLs: Add individual public tweet URLs when you need exact posts.
- Engagement fields: Export reply, repost, like, and view counts when they are visible in the public page HTML.
- Reply control: Include or skip tweets detected as replies.
- API-ready output: Download CSV/JSON/Excel exports or send tweet rows to dashboards, social listening workflows, agents, and warehouses.
What can it do?
X Profile Tweets Scraper fetches public X pages, parses visible tweet blocks, removes duplicate tweet IDs within a run, and saves one dataset row per extracted public tweet.
- Extract profile timelines: Save visible tweets from each supplied public profile URL.
- Extract status pages: Save specific public tweets from
statusUrls. - Capture author context: Save username, display name, profile URL, tweet ID, and tweet URL.
- Capture content and metrics: Save tweet text, visible counts, media URLs, reply flag, and timestamp fields.
- Control result volume: Use
maxTweetsPerProfileto cap saved tweets per profile.
Common workflows
- Social listening: Track public posts from brands, products, founders, creators, or competitors.
- Content research: Export tweet text and URLs for topic analysis, newsletters, trend reports, or editorial planning.
- Competitor monitoring: Schedule small runs for public competitor profiles and compare post cadence or engagement.
- Creator research: Collect recent visible posts and media URLs from public accounts.
- Agent workflows: Feed public tweet rows into MCP-compatible tools or downstream summarization pipelines.
Example input
{
"profileUrls": [
{ "url": "https://x.com/Apify" }
],
"statusUrls": [],
"maxTweetsPerProfile": 10,
"includeReplies": true,
"proxyConfiguration": {
"useApifyProxy": true
}
}
Example output
{
"profileUrl": "https://x.com/Apify",
"username": "Apify",
"displayName": "Apify",
"tweetId": "1234567890123456789",
"tweetUrl": "https://x.com/Apify/status/1234567890123456789",
"text": "Build web scrapers, automations, and data extraction workflows with Apify.",
"createdAt": "Jul 3",
"replyCount": 2,
"repostCount": 6,
"likeCount": 42,
"viewCount": 1200,
"mediaUrls": [],
"isReply": false,
"scrapedAt": "2026-07-03T10:00:00.000Z"
}
Tips for better results
- Start with one profile: Test a public profile URL and a small
maxTweetsPerProfilevalue. - Use status URLs for exact posts: Add
statusUrlswhen you need specific tweet IDs instead of recent visible profile posts. - Expect visible-page limits: The actor extracts what is visible in public page HTML, not an authenticated full archive.
- Filter replies intentionally: Set
includeRepliestofalsefor brand-feed monitoring when replies are less useful. - Review null metrics: Engagement counts can be null when X does not render them in the public page response.
Limits and practical notes
- The actor extracts public X/Twitter pages only.
- It does not log in, access private profiles, scrape protected tweets, or bypass account restrictions.
- X page markup, visibility, rate limits, and anti-bot behavior can change.
- Very old posts or infinite-scroll content may not be visible from the first public page response.
- Counts and date labels are public-page values and can differ from logged-in or localized views.
API usage
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~x-profile-tweets-scraper/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"profileUrls":[{"url":"https://x.com/Apify"}],"maxTweetsPerProfile":10,"includeReplies":true}'
Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/x-profile-tweets-scraper').call({
profileUrls: [{ url: 'https://x.com/Apify' }],
maxTweetsPerProfile: 10,
includeReplies: true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("fetch_cat/x-profile-tweets-scraper").call(run_input={
"profileUrls": [{"url": "https://x.com/Apify"}],
"maxTweetsPerProfile": 10,
"includeReplies": True,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
MCP and AI agents
Use this actor from MCP-compatible tools through Apify MCP Server.
MCP URL:
https://mcp.apify.com?tools=fetch_cat/x-profile-tweets-scraper
Example prompts:
- "Scrape visible public tweets from this profile and summarize recent product mentions."
- "Extract these public status URLs and return tweet text plus engagement counts."
- "Monitor these public X profiles weekly and flag posts with media URLs."
Legality and responsible use
This actor extracts publicly visible X/Twitter page data.
Use the data responsibly, follow X's terms, Apify's terms, and applicable privacy, platform, copyright, and anti-spam laws.
Do not use exported data for harassment, spam, credential collection, or attempts to access private content.
Support
If a run fails, returns no tweets for a public profile, or a field looks wrong, open an issue from the Actor page.
Please include the Apify run ID, input JSON, one example public profile or status URL, what you expected, and what the dataset returned. Small reproducible inputs make X layout or parsing issues much faster to fix.