Skip to main content

Scweet

Scrape Twitter / X without the official API.
Hosted on Apify with no cookies or proxies, or run locally with Python and CLI.

Run on Apify Python Quickstart CLI Quickstart Documentation

Tests PyPI Version Python versions PyPI Downloads License Scweet Actor Status


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.

Run Scweet on Apify

  • No code required: configure and run from the Apify Console
  • Prefer code? Use the Actor through Apify's Python API guide
  • No Twitter/X cookies or proxies to provide
  • Search tweets, profile timelines, and follower / following lists
  • Export results as JSON, CSV, or XLSX from the Apify dataset
  • Free tier included; current usage pricing is shown on the Apify Actor page

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

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)

Source distribution for Scweet 5.8.0
File Size Uploaded
scweet-5.8.0.tar.gz 212.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for Scweet 5.8.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

5.8.1

2 release files

This release

5.8.0 This release

2 release files

5.7.0

2 release files

5.6.0

2 release files

5.5.0

2 release files

5.4.0

2 release files

5.3

2 release files

5.2

2 release files

5.1

2 release files

5.0

2 release files

4.0

2 release files

3.2

2 release files

3.1

2 release files

3.0

2 release files

1.8

2 release files

1.7

2 release files

1.6

2 release files

1.5

2 release files

1.4

2 release files

1.2

2 release files

1.1

2 release files

1.0

1 release file

0.3.3

1 release file

0.3.1

1 release file

0.2.1

1 release file

0.2

1 release file

0.1.2

1 release file

0.1.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page