Skip to main content

twitscrape

A Python library for interacting with Twitter/X — no API key required.

Uses cookie-based authentication and browser-level HTTP fingerprinting (curl_cffi) to bypass connection issues that affect standard httpx clients.

Features

  • No API key required
  • Cookie-based auth — paste cookies from your browser, no login flow needed
  • Supports 4 cookie input formats
  • Async API built on twikit internals

Install

pip install twitscraper

Getting your cookies

  1. Open x.com and log in
  2. Open DevTools → Application → Cookies → https://x.com
  3. Copy auth_token and ct0 (minimum required)

Or use a browser extension like EditThisCookie or Cookie-Editor to export all cookies at once.

Quick start

From a dict

import asyncio
from twitscrape import create_client

async def main():
    client = await create_client({
        "auth_token": "your_auth_token",
        "ct0": "your_ct0",
        "twid": "u%3D123456789",
    })

    me = await client.user()
    print(me.screen_name)

asyncio.run(main())

From a JSON file

from twitscrape import create_client_from_file

client = await create_client_from_file("cookies.json")

cookies.json:

{
  "auth_token": "...",
  "ct0": "...",
  "twid": "u%3D123456789"
}

From a raw cookie string (Network tab)

from twitscrape import create_client_from_string

raw = "auth_token=abc123; ct0=xyz789; twid=u%3D123456789"
client = await create_client_from_string(raw)

From a browser extension export

from twitscrape import create_client_from_browser_export

# Paste the JSON array copied from EditThisCookie / Cookie-Editor
raw_json = '[{"name": "auth_token", "value": "...", "domain": ".x.com"}, ...]'
client = await create_client_from_browser_export(raw_json)

Examples

Search tweets

tweets = await client.search_tweet("python", "Latest")
for tweet in tweets:
    print(tweet.user.screen_name, tweet.text)

Create a tweet

tweet = await client.create_tweet("Hello from twitscrape!")

Upload media

media_id = await client.upload_media("image.jpg")
await client.create_tweet("Tweet with image", media_ids=[media_id])

Send a DM

await client.send_dm("123456789", "Hello!")

Get trends

trends = await client.get_trends("trending")
for t in trends:
    print(t.name)

Download tweet media

tweet = await client.get_tweet_by_id("tweet_id")
for i, media in enumerate(tweet.media):
    if media.type == "photo":
        await media.download(f"photo_{i}.jpg")
    elif media.type == "video":
        await media.streams[-1].download(f"video_{i}.mp4")

Listen for new tweets

import asyncio
from twitscrape import Tweet

async def on_new_tweet(tweet: Tweet):
    print(f"New tweet: {tweet.text}")

USER_ID = "44196397"
before = (await client.get_user_tweets(USER_ID, "Tweets", count=1))[0]

while True:
    await asyncio.sleep(60)
    latest = (await client.get_user_tweets(USER_ID, "Tweets", count=1))[0]
    if latest.id != before.id:
        await on_new_tweet(latest)
        before = latest

Rate limits

See ratelimits.md for per-endpoint limits (reset every 15 minutes).

License

MIT

Metadata

Release files for twitscraper 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for twitscraper 1.0.3
File Size Uploaded
twitscraper-1.0.3.tar.gz 78.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for twitscraper 1.0.3
File Interpreter ABI Platform
twitscraper-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 165.0 kB

Release files / twitscraper-1.0.3.tar.gz

Download URL twitscraper-1.0.3.tar.gz
Size 78.3 kB
Tags Source
SHA-256 checksum
How to use checksums
503fb38102cda5e466c6d3c1acfda1ac2ce5dd1c5de1071cdfe2fcf9094b4f68
BLAKE2b-256 checksum
How to use checksums
6b2e78cb9f0a98361d8a7216c4c7321d879a43c9e858805a9b53cfc8806472cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.2

Release files / twitscraper-1.0.3-py3-none-any.whl

Download URL twitscraper-1.0.3-py3-none-any.whl
Size 86.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
50677946760851361730037ed6a5d915720baabd8dd8cc43734a131bae7a20ef
BLAKE2b-256 checksum
How to use checksums
97d816c17ce18bd1e0adf04bb9dbbe82feaf81baad42e0c77529afb7adef990b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.2

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 release files

1.0.2

2 release files

1.0.1

2 release files

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