Scrape Twitter / X without the official API.
Tweets, profiles, followers, trends and more.
Two ways to run it
1. Hosted : nothing to manage ⭐
Runs on Apify. You do not need X accounts, cookies or proxies.
- Configure and run from your browser, no code needed, or drive it from code with the Python API
- Search tweets, profile timelines, follower / following lists
- Export in different formats (JSON, CSV or XLSX)
- Free tier included; pay-as-you-go pricing is on the Actor page
2. Self-hosted : full control
Bring your own X accounts and proxies. Run it from Python or the CLI, inside your own infrastructure.
from Scweet import Scweet
s = Scweet(auth_token="YOUR_AUTH_TOKEN")
tweets = s.search("bitcoin", limit=100)
Both give you the same data. Self-hosted: you run the code, and you manage the accounts and the proxies. Hosted: you press a button and get the results.
What you can scrape
- Tweets — by keyword, hashtag, user, date range, engagement filters, language, location
- Profile timelines — a user's full tweet history, with replies and media tabs
- Tweets by id — full data for known tweet ids, their replies, and who reposted them
- Followers / Following — full account lists at scale, verified followers included
- User profiles — bio, follower count, verification status, by handle or by id
- People search & trends — find accounts by keyword, read what is trending now
Python Quickstart
Three steps from nothing to tweets. One account, one call, one result.
1. Install
pip install -U Scweet
2. Get your auth_token
Log into x.com → DevTools F12 → Application → Cookies → https://x.com → copy the auth_token value. That one value is all you need; Scweet builds the rest.
Use a dedicated account, never your personal one.
3. Scrape
from Scweet import Scweet
s = Scweet(auth_token="YOUR_AUTH_TOKEN")
tweets = s.search("bitcoin", limit=100)
for tweet in tweets:
print(tweet["text"])
That is the whole first run. On the next run, reuse the same accounts with no credentials:
s = Scweet() # reads the state file scweet_state.db
tweets = s.search("ethereum", limit=100, save=True) # save=True writes a CSV
Always set
limit. Without it, a run continues until the daily cap of the account.
Next: add a proxy for real volume, use several accounts, or read the full documentation.
Proxies
A proxy is optional for a small run and recommended for real volume, because many requests from one IP raise the risk to an account. Pass one URL for all accounts:
s = Scweet(auth_token="YOUR_AUTH_TOKEN", proxy="http://user:[email protected]:8000")
On a rotating provider, put {session} in the URL to give each account its own exit IP: http://user,session-{session}:[email protected]:8000. For a proxy per account, see Multiple accounts & proxies.
All methods have async variants:
asearch(),aget_profile_tweets(),aget_followers(), etc.
Common tasks
Search tweets
tweets = s.search(
"AI agents",
since="2026-01-01",
from_users=["elonmusk"],
min_likes=50,
limit=200,
save=True,
)
Profile timeline
tweets = s.get_profile_tweets(["elonmusk"], limit=200)
Followers / Following
followers = s.get_followers(["elonmusk"], limit=1000)
following = s.get_following(["elonmusk"], limit=1000)
verified = s.get_verified_followers(["elonmusk"], limit=1000)
User profiles
profiles = s.get_user_info(["githubstatus", "elonmusk"])
profiles = s.get_user_info(user_ids=["44196397"]) # numeric ids work too
Tweets by id, replies, reposters
tweets = s.get_tweet_info(["1866123456789", "1866123456790"]) # up to 50 per request
replies = s.get_tweet_replies("1866123456789", limit=100)
reposters = s.get_reposters("1866123456789", limit=100)
People search, trends, media
people = s.search_users("python developer", limit=50)
trends = s.get_trending()
media = s.get_profile_media(["nasa"], limit=100)
tweets = s.get_profile_tweets(["nasa"], limit=100, include_replies=True)
For the full list of supported search operators, see twitter-advanced-search.
CLI
# Search with proxy, save to CSV
scweet --auth-token YOUR_AUTH_TOKEN --proxy http://user:pass@host:port \
search "bitcoin" --since 2026-01-01 --limit 500 --save
# Followers, saved as JSON
scweet --auth-token YOUR_AUTH_TOKEN \
followers elonmusk --limit 1000 --save --save-format json
For multi-account runs, use --cookies-file cookies.json.
Multiple accounts & proxies
For higher throughput and reduced ban risk, use multiple dedicated accounts with per-account proxies.
Running Scweet locally at any real volume usually means dedicated accounts and proxies. You can use a single proxy, a rotating proxy, or assign one per account. On a rotating provider, put {session} in the proxy URL to give each account its own session — see "Proxy modes" in DOCUMENTATION.md.
cookies.json format:
[
{ "username": "acct1", "cookies": { "auth_token": "..." }, "proxy": "http://user1:pass1@host1:port1" },
{ "username": "acct2", "cookies": { "auth_token": "..." }, "proxy": "http://user2:pass2@host2:port2" }
]
s = Scweet(cookies_file="cookies.json") # proxies are read from the file, one per a