Community Notes Dataset: Download It and Add Post Text
The Community Notes dataset is a free daily download from X, but it has post IDs, not text. Get the files, then add text to 10,000 posts for about $2.
Tarun Khatri
Published · Updated · 7 min read
The Community Notes dataset is free: X publishes every note and rating as daily TSV files, but the files hold post IDs, not post text.
This guide is for researchers and journalists who need X (Twitter) Community Notes data with the posts attached. You get the download steps, a Python script that adds the text, and what 10,000 posts cost. We run Weir, the API in Step 3, so weigh our view knowing that.
Paste two tweetId values from the notes file into this lookup:
curl --get https://api.weirapp.io/v1/x/posts \
--header "Authorization: Bearer $WEIR_API_KEY" \
--data-urlencode "ids=1783154445682979015,1779984568143282686"
You need the notes file, Python 3 with requests, and a Weir key.
- Download the filesFive daily TSV tables from X's Download Data page.
- Pick your notesFilter on classification or status, then keep tweetId.
- Look up the posts100 ids per call to GET /v1/x/posts.
- Save a CSVOne row per post, with its text and date.
Step 1: Download the X Community Notes dataset
X's guide says the data is public "so that anyone has free access to analyze the data," but it names no licence. Get it from the Download Data page.
You get five tables: notes, ratings, note status history, user enrollment and note requests. Each is a tab-separated file with a header row, and the ones we opened came zipped.
You get new files "daily, on a best-effort basis." Each release holds notes and ratings created up to 48 hours before it.
Big tables come split. On 20 October, the notes came as notes-00000.zip plus smaller parts of about 2.5 MB each, so grab them all.
Deleted notes drop out of later releases. Your status history file keeps data on scored notes, but not their text.
Step 2: Read the columns that matter
You need only a few columns from the notes file. Here is one row from the 20 October file, trimmed:
noteId 1783182562279494134
createdAtMillis 1713978827435
tweetId 1783154445682979015
classification MISINFORMED_OR_POTENTIALLY_MISLEADING
classification is either NOT_MISLEADING or MISINFORMED_OR_POTENTIALLY_MISLEADING. The note's own words sit in summary, and other columns hold the writer's reasons.
To keep only notes people rated helpful, join the status file on noteId. Its currentStatus column reads CURRENTLY_RATED_HELPFUL, CURRENTLY_RATED_NOT_HELPFUL or NEEDS_MORE_RATINGS.
Two traps catch first-time users:
- The author column has another name. X's guide calls it
participantId, but the file saysnoteAuthorParticipantId. Code against the header row. - No column holds the post. X's field list has no post text in any of the five tables.
Writers stay anonymous on purpose. X says their aliases "are not publicly associated with contributors' X accounts," so never try to unmask one.
Researchers keep hitting the text gap. A December 2025 paper on arXiv states that "X does not provide access to the public posts that correspond to the notes." The COMMUNITYNOTES dataset, 104k posts with notes, got its post text "via the X API and web crawling."
Step 3: Add the post text with a batch lookup
Weir's GET /v1/x/posts takes up to 100 ids per call and returns the posts in the order you sent. An id it can't return goes into meta.notFound, and you pay nothing for it.
We looked up five tweetId values from the first rows of the 20 October file on 22 October 2026. All five came back, for 6 credits. The first, trimmed:
{
"data": [
{
"id": "1783154445682979015",
"text": "Our response to the TikTok Ban Bill in the US: https://t.co/LpoE67sxHo",
"createdAt": "2024-04-24T15:22:03.000Z",
"author": { "username": "TikTokComms", "verified": true },
"viewCount": 463705
}
],
"meta": { "notFound": [] }
}
That's the post behind the note you saw in Step 2.
A deleted, suspended or protected post lands in notFound instead. Keep those rows: they show which noted posts are gone. The getXPosts reference lists every field.
Step 4: Run the script on a whole file
First, read the unzipped notes TSV and keep each post with a "misleading" note:
import csv, os, time, requests
SESSION = requests.Session()
SESSION.headers["Authorization"] = f"Bearer {os.environ['WEIR_API_KEY']}"
def tweet_ids(path, wanted="MISINFORMED_OR_POTENTIALLY_MISLEADING", limit=10_000):
ids = {} # a dict keeps the file's order and drops repeats
with open(path, encoding="utf-8", newline="") as file:
for row in csv.DictReader(file, delimiter="\t", quoting=csv.QUOTE_NONE):
if row["classification"] == wanted:
ids[row["tweetId"]] = True
if len(ids) >= limit:
break
return list(ids)
Next, look the posts up 100 at a time, with one row per post, found or not:
def add_text(ids):
while ids:
r = SESSION.get("https://api.weirapp.io/v1/x/posts",
params={"ids": ",".join(ids[:100])}, timeout=60)
if r.status_code == 429: # too fast: wait, then retry this batch
time.sleep(int(r.headers.get("Retry-After", "10")))
continue
if r.status_code == 402: # out of credits: stop, keep what is saved
return
r.raise_for_status()
page = r.json()
yield from ([p["id"], "found", p["createdAt"], p["text"]] for p in page["data"])
yield from ([i, "notFound", "", ""] for i in page["meta"]["notFound"])
ids = ids[100:]
Then write the rows to a CSV:
with open("noted_posts.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["tweetId", "status", "createdAt", "text"])
writer.writerows(add_text(tweet_ids("notes-00000.tsv", limit=10_000)))
We tested the reader on 7,154 real rows and the loop against a mock API. Join the CSV back to the notes on tweetId to put each note next to its post.
If a run doesn't go as planned:
- It stopped early. That's a
402: you ran out of credits. Every row written so far stays in the file. - It pauses now and then. That's a
429, so it waits forRetry-Afterand retries the same batch. - Excel shows ids like 1.78E+18. That's only the display. The CSV keeps every digit.
What does it cost to add text to 10,000 noted posts?
On Weir, you pay 1 credit per call plus 1 per post found. So 100 full calls cost 10,100 credits.
The $5 pack holds 25,000 credits that never expire. Your 5,000 free credits each month cover about 4,950 posts.
TwitterAPI.io is cheaper here. Its pricing page lists $0.15 per 1,000 tweets, and its lookup takes 50 ids per call. X's own API charges $0.005 per post read, with 100 ids per call. Try other sizes in the X API cost calculator.
Do the DocNow Hydrator and twarc still work?
No. Both say on their own pages that they stopped working:
- DocNow Hydrator turned tweet ids back into posts. Its README says Twitter's API changes mean it "is no longer a useful application."
- twarc archived tweets from the command line. Its README says it "is no longer actively supported after changes to Twitter's API quotas made it unusable." Its last release, 2.14.1, shipped on 31 October 2025.
Is there a Community Notes API for bulk data?
No. X's Community Notes API is for writing notes, not for downloading them.
It lets enrolled AI Note Writers find posts that can get a note, check a draft and submit it. X says the endpoints are "currently in a pilot test." For bulk data, use the daily files.
When not to use Weir
- You only study the notes. X's files are free, and you may not need the posts.
- Price per post decides it. TwitterAPI.io lists $0.15 per 1,000 tweets, below our $0.20 on the $5 pack.
- Your study must use X's own API. It costs $0.005 per post read, with X's terms attached.
- You want the note on a few posts you already have. An Apify actor returns that, from $1.50 per 1,000 results.
X's Terms of Service say you "cannot scrape the Services without X's express written permission," so check what applies to your study. This isn't legal advice. Our guide to research data has an ethics checklist.
FAQ
Where can I download Community Notes data?
From X's Download Data page at x.com/i/communitynotes/download-data. It offers five tables: notes, ratings, note status history, user enrollment and note requests. On 20 October 2026, the zipped notes file alone was 520 MB.
Does the Community Notes dataset include the tweet text?
No. Each note has a tweetId, but no table holds the post's text. You look the ids up with an API to add it. Posts deleted or made protected since then can't come back.
How often is Community Notes data updated?
Daily, on a best-effort basis, according to X's guide. Each release holds notes and ratings created up to 48 hours before it, so the newest notes always lag by two days.
Can I see who wrote a Community Note?
No. Each writer appears only as a Community Notes ID, which X keeps apart from their X account. Study notes in aggregate, and never try to link a writer to a real person.
Sources
Checked on 22 October 2026:
- X Community Notes guide, Downloading data, read in X's GitHub repo because its site blocked us: https://communitynotes.x.com/guide/en/under-the-hood/download-data and https://github.com/twitter/communitynotes/blob/main/documentation/under-the-hood/download-data.md
- X Community Notes guide, Aliases: https://github.com/twitter/communitynotes/blob/main/documentation/contributing/aliases.md
- X's Download Data page; we read the first rows of its 20 October 2026 files: https://x.com/i/communitynotes/download-data
- arXiv 2512.19947, Community Notes across languages (December 2025): https://arxiv.org/abs/2512.19947
- arXiv 2510.24810, the COMMUNITYNOTES dataset (revised January 2026): https://arxiv.org/abs/2510.24810
- X API Community Notes introduction: https://docs.x.com/x-api/community-notes/introduction
- X API pricing and post lookup: https://docs.x.com/x-api/getting-started/pricing and https://docs.x.com/x-api/posts/get-posts-by-ids
- TwitterAPI.io pricing and tweet lookup: https://twitterapi.io/pricing and https://docs.twitterapi.io/api-reference/endpoint/get_tweet_by_ids
- Apify, X Community Notes actor: https://apify.com/bakos_bence/x-community-notes
- DocNow Hydrator README: https://github.com/DocNow/hydrator
- twarc README and release history: https://github.com/DocNow/twarc and https://pypi.org/project/twarc/
- X Terms of Service, effective 9 October 2026: https://x.com/en/tos
- Weir getXPosts reference and billing: https://docs.weirapp.io/reference/x/getXPosts and https://docs.weirapp.io/billing
- Our Weir lookup of five noted posts, 22 October 2026