Scrape Twitter / X without the official API.
Hosted on Apify with no cookies or proxies, or run locally with Python and CLI.
Scrape tweets, profile timelines, followers and more from Twitter/X. Use the hosted Apify Actor when you do not want to manage cookies or proxies, or run locally with your own browser cookies and account pool.
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
Hosted alternative — no setup needed
|
Use the hosted Apify Actor when you want Scweet results without running the local Python library or managing Twitter/X cookies, proxies, local accounts, rate limits, retries, or infrastructure. This runs on Apify instead of your machine. Use the local library below when you want full Python/CLI control.
|
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:pass@proxy.example.com:8000")
On a rotating provider, put {session} in the URL to give each account its own exit IP: http://user,session-{session}:pass@proxy.example.com: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 account
Never use your personal Twitter/X account for scraping. Use dedicated accounts only.
Why Scweet?
| twint | snscrape | twscrape | Scweet | |
|---|---|---|---|---|
| Works in 2026 | ❌ unmaintained | ❌ broken | ✅ | ✅ |
| Cookie / token auth | ❌ | ❌ | ✅ | ✅ |
| Multi-account pooling | ❌ | ❌ | ✅ | ✅ |
| Proxy support | ❌ | ❌ | ✅ | ✅ |
| Resume interrupted scrapes | ❌ | ❌ | ❌ | ✅ |
| Built-in CSV / JSON output | ✅ | ✅ | ❌ | ✅ |
| Sync + async API | ❌ | ❌ | Async only | ✅ both |
| Hosted, no-setup option | ❌ | ❌ | ❌ | ✅ Apify |
| Active maintenance | ❌ | ❌ | ⚠️ | ✅ |
twint has been unmaintained since 2023. snscrape broke after X's backend changes. twscrape is the closest active alternative — worth knowing, but async-only, no built-in file output, and no resume support.
Limitations
- Only publicly visible content is accessible — private/protected accounts are not supported
- Relies on undocumented X web endpoints; breakage is always possible after platform changes. Scweet self-heals by scraping fresh query IDs and feature flags from X's own bundles — at startup with
manifest_scrape_on_init=True, or on demand at any time:s = Scweet(auth_token="...", manifest_scrape_on_init=True) changes = s.refresh_manifest() # or: scweet refresh-manifest
- Cookies can expire and may need periodic refreshing
- A single account typically handles hundreds to a few thousand tweets per day before hitting rate limits; multi-account pooling scales proportionally
- Proxies and dedicated accounts are strongly recommended for anything beyond light testing
- Username/password login is not supported. X's anti-automation defenses make programmatic login unreliable and likely to trigger account locks. Scweet authenticates with browser cookies (
auth_token) extracted from an active session instead
Documentation
Full API reference, config options, structured search filters, async patterns, resume, proxies, and troubleshooting:
- Account setup
- Search API
- Profile tweets
- Tweet lookup & replies
- Followers / Following
- User info
- Search users & trends
- Manifest refresh
- Saving results
- Resume interrupted searches
- Controlling limits
- Configuration reference
- Account management (ScweetDB)
- Async usage
- Error handling
- CLI reference
For advanced Twitter search operators, see twitter-advanced-search.
FAQ
Does it work without an official Twitter API key? Yes. Scweet calls X's internal GraphQL API — the same one the web app uses. No developer account or API key required.
Is it a replacement for twint or snscrape? Yes. Both are broken as of 2024–2025. Scweet uses a different, currently-working approach: cookies + GraphQL instead of legacy unauthenticated endpoints.
How many tweets can I scrape? A single account typically handles hundreds to a few thousand tweets per day before hitting rate limits. Multi-account pooling scales this proportionally. The hosted Apify actor manages accounts and rate limits automatically.
Will my account get banned? Never use your personal account — use dedicated accounts only. To reduce risk further: use multiple accounts (distributes load) and pair each with a proxy (prevents all requests from one IP).
Does it work for private accounts? No. Only publicly visible content is accessible.
Does it still work in 2025 / 2026? Yes — last verified with the 5.8.0 release (2026-09-15) against X's current GraphQL API.
Community
Have a question or want to share what you built with Scweet? Open a thread in GitHub Discussions.
Found it useful? Star the repo
Contributing
Bug reports, feature suggestions, and PRs are welcome. See CONTRIBUTING.md.
MIT License
Metadata
Release files for Scweet 5.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| scweet-5.8.0.tar.gz | 212.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| scweet-5.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 334.6 kB
Release files / scweet-5.8.0.tar.gz
| Download URL | scweet-5.8.0.tar.gz |
|---|---|
| Size | 212.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a1f97f0565167c80cd5c76117cac6d2dd7e88cae09cc46b3d0fb2f925d6fb65
|
|
BLAKE2b-256 checksum How to use checksums |
932c2b2ee4f2e7e1b8e50139aa20fe664161d1e7d39fe0fcff5e204669aa699b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / scweet-5.8.0-py3-none-any.whl
| Download URL | scweet-5.8.0-py3-none-any.whl |
|---|---|
| Size | 121.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
452ce9278fb218b4c45e19eb296afb94646b96c252b1f6c4f2258525192d827f
|
|
BLAKE2b-256 checksum How to use checksums |
6fa47945724face9924db8a0412f290e1b871696b97f3ae49a81823883c64389
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|