Twitter / X Profiles + Tweets Scraper
Pricing
Pay per event
Twitter / X Profiles + Tweets Scraper
Scrape public Twitter/X profiles & tweets. Returns username, bio, follower count, following count, verified status, location, website, and more. No login or API key required. Pay-per-result.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Ale
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Twitter / X Profile + Tweets Scraper
Pass in a list of usernames, get back their profile data and recent tweets. No login, no API key, no cookies. Just HTTP.
What you get
For every username you pass in, the scraper does two API calls behind the scenes:
- A profile lookup (bio, follower counts, banner, verified status, account creation date, all 24 profile fields)
- The user's recent tweets timeline (text, engagement metrics, entities like hashtags and mentions, plus reply / retweet / quote / pinned flags)
Each tweet comes back as one item with the full author profile embedded. If you only need profile data you can set tweetsPerUser: 0.
Input
{"usernames": ["elonmusk", "nasa", "openai"],"tweetsPerUser": 20}
Usernames can be plain (elonmusk), at-prefixed (@elonmusk), or full profile URLs (https://x.com/elonmusk or https://twitter.com/elonmusk). All three formats normalize to the same thing.
Available input fields
| Field | Type | Default | Description |
|---|---|---|---|
usernames | array | required | Usernames, @handles, or profile URLs |
tweetsPerUser | integer | 20 | Tweets per user, 0 to 1000 |
includeReplies | boolean | false | Include tweets that are replies to other people |
includeRetweets | boolean | true | Include retweets |
includeProfileOnlyItems | boolean | false | Also push one extra profile item per user |
maxIPRotations | integer | 5 | How many times to retry with a fresh session if X rate-limits us |
proxyConfiguration | object | RESIDENTIAL | Apify proxy. Residential is recommended, X rate-limits datacenter IPs hard |
Output
Each item is one tweet with the author embedded. Field count is around 45 across the nested structure.
{"item_type": "tweet","tweet": {"id": "1962908474892812685","text": "...","lang": "en","created_at": "2025-09-02T16:00:24Z","created_at_unix": 1756828824,"url": "https://x.com/NASA/status/1962908474892812685","conversation_id": "1962908474892812685","is_reply": false,"is_retweet": false,"is_quote": false,"is_pinned": false,"retweeted_status_id": null,"quoted_status_id": null,"in_reply_to_user_id": null,"in_reply_to_username": null,"in_reply_to_tweet_id": null,"source": "Sprinklr","engagement": {"reply_count": 186,"retweet_count": 638,"like_count": 2444,"quote_count": 12,"bookmark_count": 89,"view_count": 484164},"entities": {"hashtags": [],"mentions": [{"username": "NASAArtemis", "user_id": "632344577"}],"urls": [{"url": "https://t.co/ClHjcD6zgu","expanded_url": "https://science.nasa.gov/skywatching/whats-up/","display_url": "science.nasa.gov/skywatching/wh..."}],"cashtags": [],"media": [{"type": "photo", "url": "https://pbs.twimg.com/media/...", "preview_url": "..."}]}},"author": {"id": "11348282","username": "NASA","display_name": "NASA","bio": "Making the seemingly impossible, possible.","location": "Pale Blue Dot","website": "https://t.co/9NkQJKAVks","website_expanded": "https://nasa.gov","verified": false,"blue_verified": true,"is_protected": false,"followers_count": 92093477,"following_count": 188,"tweet_count": 74067,"listed_count": 92146,"favourites_count": 5183,"media_count": 21456,"profile_image_url": "https://pbs.twimg.com/profile_images/...","profile_banner_url": "https://pbs.twimg.com/profile_banners/...","created_at": "Wed Dec 19 20:20:32 +0000 2007","created_at_unix": 1198095632,"profile_url": "https://x.com/NASA","pinned_tweet_ids": ["2059393717111308634"]},"scraped_at": "2026-06-10T10:14:33Z"}
If you turn on includeProfileOnlyItems, you also get one row per user where item_type is profile, tweet is omitted, and author carries the same profile block.
A few notes about the fields
textis the full tweet text (X internally calls thisfull_text). It will not be truncated even on long-form premium tweets.entities.urls[].expanded_urlresolves the t.co shortener to the real destination. Handy for lead-gen.entities.mentions[].user_idgives you the mentioned account's stable ID, not just the username. Usernames can be changed; IDs cannot.engagement.view_countis 0 on very recent tweets. X populates the count with a small delay.is_pinnedis set when the tweet shows up as the author's pinned tweet on their profile.
Examples
Three accounts, ten tweets each
{"usernames": ["elonmusk", "nasa", "openai"], "tweetsPerUser": 10}
Mixed input formats
{"usernames": ["elonmusk", "@nasa", "https://x.com/openai"],"tweetsPerUser": 5}
Profile data only, no tweets
{"usernames": ["elonmusk", "nasa"],"tweetsPerUser": 0,"includeProfileOnlyItems": true}
Clean originals only, no retweets, no replies
{"usernames": ["openai"],"tweetsPerUser": 50,"includeReplies": false,"includeRetweets": false}
Pricing
Pay per result.
| Event | Price |
|---|---|
| Actor start | $0.010 |
| Each item delivered (tweet or profile) | $0.0003 |
Some quick math:
- 1 user, 20 tweets = $0.016
- 50 users, 20 tweets = $0.310
- 1000 items = $0.310
The actor-start fee covers the one-time session bootstrap with X. After that it's a flat $0.30 per 1000 items, which beats the leading competitors for runs of 100 items or more.
How to use it from an AI agent
The actor is exposed on Apify's MCP endpoint:
https://mcp.apify.com?tools=santamaria-automations/twitter-x-profiles-tweets-scraper
This works with Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, and any other MCP client.
Example prompt:
Use twitter-x-profiles-tweets-scraper to fetch the 30 most recent tweets from @elonmusk and @sama. Skip retweets and replies. Tell me what topics they're posting about this week.
Caveats
- Only public accounts return tweets. Protected accounts return profile metadata only.
- Suspended and deleted accounts are silently skipped.
- The scraper uses the same public GraphQL endpoint that x.com's web client hits for logged-out browsing. If X rate-limits a proxy IP, the actor retries with a fresh session up to
maxIPRotationstimes (default 5). - View counts may be 0 on very recent tweets.