Scweet is a free, open source data extraction & web scraping project written in Python and released under MIT. It has 1,658 GitHub stars, 287 forks and 1 open issues, and was last pushed 8 days ago. On this registry it ranks #90 of 150 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available. It gained 20 stars over the last 30 tracked days.

What is Scweet?

Scweet is an MIT-licensed Python library that scrapes tweets, profiles, followers and following lists from Twitter/X without an API key, for analysts, researchers and data engineers who need X data without going through the official API.

What it is

Scweet lives in the data extraction and web scraping corner of the Python ecosystem and replaces the official Twitter/X API as the route to tweets, profile timelines, follower graphs and user metadata. Instead of requesting a developer key and working inside tiered rate limits, it authenticates as an ordinary logged-in session: the caller supplies the auth_token cookie copied from x.com, and the library builds the rest of the request context from that single value. The registry files it under Data & Analytics / Data Extraction & Web Scraping, and its topic list carries python-library, tweet-scraper, scraper, graphql, proxy and social-media.

The concrete problem it solves is access. The official API is key-gated and metered, and it does not expose everything a scraper wants, such as full follower and following lists or complete profile histories. Scweet's answer is two deployment shapes over the same data. The hosted shape runs on Apify and needs no X accounts, cookies or proxies — a run can be configured in a browser with no code, or driven from code through the Python API, and results export as JSON, CSV or XLSX, with a free tier and pay-as-you-go pricing on the Actor page. The self-hosted shape keeps the code, the accounts and the proxies inside the operator's own infrastructure.

Key capabilities

  • Keyword and filtered tweet search through search(), accepting hashtags, since and date ranges, from_users, min_likes and other engagement filters, language and location, plus limit and save=True to write CSV.
  • Full profile timelines through get_profile_tweets(), covering a user's tweet history with replies and media tabs.
  • Tweet lookup by id through get_tweet_info(), up to 50 ids per request, along with replies and the accounts that reposted them.
  • Follower and following lists at scale through get_followers(), get_following() and get_verified_followers().
  • User profile lookup through get_user_info(), by handle or numeric user_ids, returning bio, follower count and verification status.
  • People search and current trends, for finding accounts by keyword.
  • Multi-account pooling and proxy support: one proxy URL for all accounts, a proxy per account, or rotating providers using the {session} placeholder, with async variants such as asearch(), aget_profile_tweets() and aget_followers().

Who uses it and how

  • Self-hosting teams that already hold their own X accounts and proxies and want both the code and the collected data to stay inside their own infrastructure.
  • Researchers and analysts pulling large follower or following lists, where the documentation demonstrates runs at limit=1000, or narrower verified-follower subsets.
  • Data teams feeding analysis tooling directly, taking results as JSON, CSV or XLSX, with save=True writing CSV on the self-hosted path.
  • Browser-first users running the hosted Apify actor, who configure a job without writing code and never handle cookies or proxies.
  • Higher-volume pipelines that pool several accounts and rotate exit IPs, using the async methods to keep many requests in flight at once.

Getting started

Install with pip install -U Scweet, copy the auth_token value from the x.com cookies in the browser developer tools, then construct Scweet(auth_token="YOUR_AUTH_TOKEN") and call a method such as search("bitcoin", limit=100); later runs reuse the saved accounts in scweet_state.db with no credentials. The hosted route is the Scweet actor on Apify, which requires no X account, cookies or proxies.

How it compares

The facts supply no list of paid products that Scweet replaces, and no comparable scraper is named beside it, so it stands alone in this registry. The one contrast the documentation draws is with the official Twitter/X API, which the project positions as the key-gated route it works around, and both its self-hosted and hosted paths are documented as returning the same data.

When to use it — and when not to

Self-hosting places real operational work on the operator: the README advises a dedicated account rather than a personal one, and recommends a proxy for genuine volume because many requests from a single IP raise the risk to the account. Runs must set limit explicitly, or a job continues until the account's daily cap is reached. Anyone unwilling to hold X accounts, manage rotating proxies and accept account risk should take the hosted Apify actor instead — and should note that pricing beyond the free tier is published on the Actor page rather than in the README.

project readme (upstream, from github) — read inline

Scrape Twitter / X without the official API.
Tweets, profiles, followers, trends and more.

Run on Apify Python Quickstart CLI Quickstart Documentation

Tests PyPI Version Python versions PyPI Downloads License Scweet Actor Status


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

Run Scweet on Apify - free tier

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: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?

One page of X is easy to fetch. 10,000 tweets is not, because accounts get rate-limited, cookies expire, and X changes its API.

Your run finishes

  • A wide date range is split into intervals that run in parallel. If X stops one interval early, the others still fill.
  • If X ends a page chain early, Scweet continues from the oldest tweet it received.
  • If a run stops, resume=True continues from the last saved point instead of starting again.

Your accounts stay usable

  • Scweet reads the rate-limit headers of X and stops each account 2 requests before its limit, so X does not block it.
  • Scweet identifies the cause of each error. A bad request, an old query id and a dead session are handled differently, so a small error does not cost you an account.
  • Scweet records the state of each account (locked, suspended, rate-limited) and waits the needed time before it uses that account again.

It keeps working when X changes

  • X changes the ids of its internal API without notice. Scweet reads the new ids from the JavaScript files of X, at startup or when you call refresh_manifest().

It is easy to work with

  • 12 read operations, one consistent row shape, sync and async, a real CLI, and CSV/JSON output built in.
  • 25 fields per tweet, including view counts, quotes, bookmarks, language and the nested quoted or retweeted post.

Or let us run it for you

  • The hosted version does all of the above on our accounts and proxies. Free tier included.

Also on twint and snscrape: both are unmaintained and no longer work against X's current backend. If you are migrating from either, Scweet covers the same ground and more.


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:

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

Frequently asked questions

Is Scweet free to use?

Scweet is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Scweet do?

Scrape tweets, profiles, followers and following from Twitter/X, no API key needed. Python library with smart multi-account pooling, proxy support and async.

What is Scweet written in?

Scweet is primarily written in Python. Its source is publicly available at https://github.com/Altimis/Scweet, and it has 1,658 GitHub stars.