Twitter Datasets in 2026: Where to Get Them, What They Cost
Twitter datasets in 2026: which public X collections still work, why most stop in 2023, what ready-made data costs, and a Python script to build your own.
Tarun Khatri
Published · Updated · 6 min read
Twitter datasets in 2026 come from four places: frozen research archives, tweet-ID lists you rehydrate, paid vendors, and searches you run yourself.
This guide is for students, analysts and developers who need X (Twitter) posts to study or train on. You get what each public source holds, its dates and terms, then a standard-library Python script to build a small dataset of your own. We run Weir, the API in the script, and say where others cost less.
Turn a list of post IDs back into full posts with one call:
curl -s "https://api.weirapp.io/v1/x/posts?ids=2113390212911083894,2104994048381792487" \
-H "Authorization: Bearer $WEIR_API_KEY"
- Check the free archivesFine for anything before 2023.
- Rehydrate an ID setLook each post ID up again.
- Buy a vendor datasetFresh, large, $250 and up.
- Collect your ownA search script writing JSONL.
Where Twitter datasets come from in 2026
Public collections still exist, but most are frozen in time. Here is what we checked on 26 October 2026:
| Source | What you get | Dates | Catch |
|---|---|---|---|
| Archive Team Stream Grab | Raw stream JSON | 2011 to 2023 | No longer updated |
| Sentiment140 | 1.6M labeled tweets | 2009 to 2010 | No open license |
| TweetEval (Hugging Face) | 7 labeled tasks | Older tweets | License per subset |
| COVID-19 chatter (Zenodo) | Post IDs only | 2020 to 2023 | You rehydrate them |
| Stanford SNAP twitter7 | 476M tweets | 2009 | Removed |
| Bright Data | Posts and profiles | Refreshed monthly | $250 minimum |
Each one fits a different job:
- Archive Team's Twitter Stream Grab holds JSON from Twitter's free "Spritzer" sample stream. Its Internet Archive page says it "is no longer updated" and should be treated as static.
- Sentiment140 is the classic sentiment set. Its Hugging Face card says no open-source license is attached.
- TweetEval bundles seven classification tasks, from irony to hate speech. Its card says every subset requires complying with Twitter's terms.
- The COVID-19 chatter dataset on Zenodo shares only IDs. Its last version, from April 2023, warned it "might be the last full update" because of the API paywall.
- Stanford's SNAP twitter7 set is gone. The page says, "As per request from Twitter the data is no longer available."
- Bright Data sells current X posts and profiles. Its page lists $250 per 100,000 records, refreshed monthly.
Why research datasets share only post IDs
X's Developer Policy decides what can be passed around. It says you "may only distribute Post IDs, Direct Message IDs, and/or User IDs."
It also caps sharing at 1,500,000 post IDs per person in any 30 days, without X's written permission. Academic researchers may share IDs "solely for the purposes of non-commercial research."
So a typical research dataset is a file of numbers. To read the posts, you rehydrate them, which means looking each ID up again.
A deleted post can't be rehydrated. The same policy asks you to delete stored content once it is deleted on X.
How to rehydrate a Twitter dataset of post IDs
Weir's GET /v1/x/posts takes up to 100 IDs per call. Missing posts come back in meta.notFound and aren't billed.
We ran it on 26 October 2026 with three brand post IDs and one fake one. It returned three posts for 4 credits, trimmed:
{
"data": [
{ "id": "2113390212911083894", "createdAt": "2026-10-22T22:01:06.000Z", "likeCount": 9669 }
],
"meta": { "notFound": ["1111111111111111111"], "creditsCharged": 4 }
}
In Python, with only the standard library:
import json, os, urllib.request
HEADERS = {"Authorization": f"Bearer {os.environ['WEIR_API_KEY']}", "Content-Type": "application/json"}
def hydrate(ids):
for i in range(0, len(ids), 100):
url = "https://api.weirapp.io/v1/x/posts?ids=" + ",".join(ids[i:i + 100])
page = json.load(urllib.request.urlopen(urllib.request.Request(url, headers=HEADERS), timeout=60))
yield from page["data"]
Keep IDs as strings. They are too long for a float, and a spreadsheet will round them.
Build your own small Twitter dataset with Python
For posts after 2023, collect them yourself. This script searches X through Weir and writes one post per line, a format called JSONL. It reuses the imports and HEADERS above:
SEARCH, KEEP = "https://api.weirapp.io/v1/x/search", ["id", "createdAt", "lang", "text", "likeCount", "retweetCount", "replyCount"]
def collect(body, path, max_pages=10):
seen = set()
with open(path, "a", encoding="utf-8") as out:
for _ in range(max_pages):
req = urllib.request.Request(SEARCH, json.dumps(body).encode(), HEADERS)
page = json.load(urllib.request.urlopen(req, timeout=60))
for post in page["data"]:
if post["id"] not in seen:
seen.add(post["id"])
out.write(json.dumps({k: post.get(k) for k in KEEP}, ensure_ascii=False) + "\n")
if not page["meta"]["nextCursor"]:
break
body = {**body, "cursor": page["meta"]["nextCursor"]}
Then run one search, such as a week of English posts on a topic:
collect({"query": "electric cars -filter:nativeretweets", "language": "en",
"onlyOriginal": True, "since": "2026-10-19T00:00:00Z", "limit": 20},
"posts.jsonl", max_pages=5)
Three choices in it matter:
- It stops only on a null cursor, and
max_pagescaps the spend. An empty page can still have more behind it. - It keeps no usernames. Add the author only if your study needs it, since a handle is personal data.
- It drops reposts with
-filter:nativeretweets. A repost shows 0 likes and would skew your counts.
Our guide to Twitter data for academic research adds an ethics checklist. For a CSV instead, see how to get tweets with Python.
What does a Twitter dataset cost?
A Weir search page costs 1 credit plus 1 per post, so 20 posts cost 21 credits. Here is 10,000 posts by each route, as of October 2026:
TwitterAPI.io's pricing page lists $0.15 per 1,000 tweets, the cheapest here. X's pricing page lists $0.005 per post read.
Weir's 5,000 free monthly credits cover about 4,760 posts, with no card. Price a bigger job with the X API cost calculator.
When not to use Weir
- You need tweets from before 2023 in bulk. The Archive Team files cost nothing.
- You need data licensed by X. Only X's own API or a deal with X gives you that.
- Price per post is all that matters. TwitterAPI.io charges less per tweet.
- You need millions of posts in one delivery. A vendor dataset ships it as one file.
Weir reads public posts only and isn't licensed by X, so access can change. Read is scraping Twitter legal before you collect at scale.
FAQ
Where can I find free Twitter datasets?
The Internet Archive's Twitter Stream Grab, Sentiment140 and TweetEval on Hugging Face, and ID-only sets on Zenodo. Nearly all end by early 2023. Check each one's license and X's terms before you use it.
Can I still download Twitter data in 2026?
Yes, through the paid X API, a third-party API, or a vendor dataset. Your own posts come free in your X archive. The free research collections mostly end in 2023.
What is rehydrating a Twitter dataset?
Turning a list of post IDs back into full posts by looking each one up again. Research sets share only IDs because X's policy says so. Deleted or protected posts won't come back.
Sources
All checked on 26 October 2026:
- X Developer Policy, content redistribution: https://docs.x.com/developer-terms/policy
- X API pricing: https://docs.x.com/x-api/getting-started/pricing
- Archive Team, The Twitter Stream Grab: https://archive.org/details/twitterstream
- Sentiment140 on Hugging Face: https://huggingface.co/datasets/stanfordnlp/sentiment140
- TweetEval on Hugging Face: https://huggingface.co/datasets/cardiffnlp/tweet_eval
- COVID-19 Twitter chatter dataset, version 162 (16 April 2023): https://zenodo.org/records/7834392
- Stanford SNAP twitter7: https://snap.stanford.edu/data/twitter7.html
- Bright Data X (Twitter) datasets: https://brightdata.com/products/datasets/twitter
- TwitterAPI.io pricing: https://twitterapi.io/pricing
- Weir billing and posts lookup: https://docs.weirapp.io/billing and https://docs.weirapp.io/reference/x/getXPosts