WEIR

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.


Published · Updated · 7 min read

Cover image: The dataset has no post text

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.

  1. Download the filesFive daily TSV tables from X's Download Data page.
  2. Pick your notesFilter on classification or status, then keep tweetId.
  3. Look up the posts100 ids per call to GET /v1/x/posts.
  4. 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.

5tables, released every day
24columns in the notes file
520 MBthe zipped notes file on 20 October 2026

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 says noteAuthorParticipantId. 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 for Retry-After and 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.

Adding text to 10,000 noted posts, October 2026
X API, pay-per-use$50
Weir, $5 packabout $2.02
TwitterAPI.ioabout $1.50

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: