Twitter / X Profiles + Tweets Scraper avatar

Twitter / X Profiles + Tweets Scraper

Pricing

Pay per event

Go to Apify Store
Twitter / X Profiles + Tweets Scraper

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

Ale

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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:

  1. A profile lookup (bio, follower counts, banner, verified status, account creation date, all 24 profile fields)
  2. 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

FieldTypeDefaultDescription
usernamesarrayrequiredUsernames, @handles, or profile URLs
tweetsPerUserinteger20Tweets per user, 0 to 1000
includeRepliesbooleanfalseInclude tweets that are replies to other people
includeRetweetsbooleantrueInclude retweets
includeProfileOnlyItemsbooleanfalseAlso push one extra profile item per user
maxIPRotationsinteger5How many times to retry with a fresh session if X rate-limits us
proxyConfigurationobjectRESIDENTIALApify 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

  • text is the full tweet text (X internally calls this full_text). It will not be truncated even on long-form premium tweets.
  • entities.urls[].expanded_url resolves the t.co shortener to the real destination. Handy for lead-gen.
  • entities.mentions[].user_id gives you the mentioned account's stable ID, not just the username. Usernames can be changed; IDs cannot.
  • engagement.view_count is 0 on very recent tweets. X populates the count with a small delay.
  • is_pinned is 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.

EventPrice
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 maxIPRotations times (default 5).
  • View counts may be 0 on very recent tweets.

Issues, feature requests