WEIR

過去ツイートを API で取得:2006 年まで遡る方法 2026

X(旧 Twitter)の過去ツイートを API で取得する方法と料金。全期間検索の落とし穴、日付を ID に変える計算、日ごとに回る Python と 2012 年の実際の出力まで。


公開 · 更新 · 約 7 分で読めます · Read in English · 阅读中文版

カバー画像:2006 年まで、どの日でも

過去ツイートを API で取得するなら、全期間のアーカイブを日付の範囲で検索します。

X(旧 Twitter)自身の API でも、より安い外部の API でもできます。古いポスト(ツイート)が必要な研究者と開発者向けに、料金と、任意の期間を回るスクリプトをまとめました。

例の Weir は私たちの API なので、その前提で読んでください。次の例は、2012 年のある 1 日のポストを取得します。

curl --request POST \
  --url https://api.weirapp.io/v1/x/search \
  --header "Authorization: Bearer $WEIR_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"fromUsers":["MarsCuriosity"],"since":"2012-08-06T00:00:00Z","until":"2012-08-07T00:00:00Z","limit":3}'

過去ツイートを取得する API と方法:5 つを比較

誰のポストを何件、誰の規約のもとで取りたいかで選びます。2026 年 10 月時点の比較です。

方法 遡れる範囲 1,000 ポストあたり 向いている用途
X の全期間検索 2006 年 3 月 $5 公式のデータ、大量の取得
Weir の検索 2006 年 3 月 $0.105〜$0.21 安い読み取り、AI エージェント
TwitterAPI.io の検索 記載なし $0.15 最安値、投稿も
自分の X アーカイブ 最初のポスト 無料 自分のアカウント
研究用データセット 決まった期間 無料、ID のみ 過去の研究の再現

自分のポストなら、まず X のアーカイブです。X のヘルプセンターによると、設定から申請でき、準備に数日かかることがあります。手順は ツイートを CSV 出力する方法 にあります。

X API で過去のポストを取得するには?

X の公式の方法は GET /2/tweets/search/all で、X のドキュメントでは従量課金と Enterprise の顧客が使えます。2026 年 10 月時点の条件です。

  • 範囲:2006 年 3 月までの公開ポストです。最近の検索は直近 7 日だけです。
  • 1 ページ:1 回で最大 500 件、続きは next_token で取ります。
  • 速さ:1 秒に 1 回、アプリごとに 15 分で 300 回までです。
  • 料金:読み取りは 1 件 $0.005 で、月に読めるのは 300 万件までです。
  • 窓の指定:日時は start_time と end_time、ID は since_id と until_id です。開始と終了は、それぞれ片方しか使えません。

古いスクリプトが 3,200 件で止まるなら、ユーザーのタイムラインを読んでいます。X のドキュメントでは、タイムラインは最新 3,200 件までです。

X の料金ページでは、全期間のポスト数を数える API が 1 リクエスト $0.010 です。読む前に、作業の大きさがわかります。

ステップ 1:日付をツイート ID に変換する

2010 年 11 月 4 日以降のポストは、ID の中に作成時刻を持っています。

Twitter の Snowflake のコードは、その日からのミリ秒を ID の上位ビットに入れます。時刻を 22 ビット左にずらすと、その瞬間の最小の ID になります。

from datetime import datetime

X_EPOCH_MS = 1288834974657  # X の ID の起点:2010 年 11 月 4 日

def date_to_id(when):
    ms = int(datetime.fromisoformat(when.replace("Z", "+00:00")).timestamp() * 1000)
    return str((ms - X_EPOCH_MS) << 22)

print(date_to_id("2012-08-06T05:30:00+00:00"))  # 232347770680246272
print(date_to_id("2012-08-06T14:40:00+09:00"))  # 232350287262646272

2 行目は日本時間の 14 時 40 分で、UTC の 5 時 40 分と同じ瞬間です。逆の変換は、ツイート ID を日時に変換するツールがブラウザで行います。

2010 年 11 月より前のポストは ID が小さく、時刻を含みません。その年は、since と until で日単位に区切ります。

ステップ 2:日付の窓を 1 つ検索する

Weir の検索は、sinceId と untilId を窓の境界に取ります。どちらも境界の ID は含みません。

上の 2 つの ID で、火星探査車キュリオシティのアカウントを検索しました。火星に着いた夜です。

{
  "fromUsers": ["MarsCuriosity"],
  "sinceId": "232347770680246272",
  "untilId": "232350287262646272",
  "limit": 3
}

2026 年 10 月 21 日に実行し、3 件が返って 4 クレジットでした。いちばん新しい 1 件の抜粋です。

{
  "id": "232348380431544320",
  "text": "I'm safely on the surface of Mars. GALE CRATER I AM IN YOU!!! #MSL",
  "createdAt": "2012-08-06T05:32:25.000Z",
  "likeCount": 10098,
  "retweetCount": 44891,
  "viewCount": null
}

「火星の表面に無事着いた」という、着陸直後のポストです。null は X が値を返さなかったという意味で、0 ではありません。取得した 2012 年のポストには、どれも閲覧数がありませんでした。

ステップ 3:長い期間を 1 日ずつ取得する

長い期間は、小さな窓を並べ、窓ごとに最後までページを送ります。途中で落ちても、失うのは 1 日分です。

import json, os, urllib.request

API = "https://api.weirapp.io/v1/x/search"
HEADERS = {"Authorization": "Bearer " + os.environ["WEIR_API_KEY"],
           "Content-Type": "application/json"}

def window(body, max_pages=50):
    for _ in range(max_pages):
        req = urllib.request.Request(API, json.dumps(body).encode(), HEADERS)
        with urllib.request.urlopen(req, timeout=60) as r:  # 402 や 429 は例外で止まる
            page = json.load(r)
        yield from page["data"]
        body["cursor"] = page["meta"]["nextCursor"]
        if not body["cursor"]:
            return

標準ライブラリだけなので、pip がなくても動きます。続けて、必要な日を回ります。

from datetime import date, timedelta

day = date(2012, 8, 1)
while day < date(2012, 9, 1):
    nxt = day + timedelta(days=1)
    body = {"fromUsers": ["MarsCuriosity"], "limit": 20,
            "since": f"{day}T00:00:00Z", "until": f"{nxt}T00:00:00Z"}
    for post in window(body):
        print(post["createdAt"], post["id"], post["text"][:60])
    day = nxt

日本時間の 1 日で区切るなら、Z を +09:00 に変えます。話題を集めるなら、fromUsers を query に替えます。足せる条件は X の検索コマンド一覧 にあります。

各窓は最後に、1 クレジットの空の呼び出しで終わります。

過去のツイートデータ取得にかかる費用は?

2026 年 10 月時点で、10,000 ポストを方法ごとに読む費用です。

過去の 10,000 ポストを読む費用
公式 X API$50
Weir、$5 パック約 $2.10
TwitterAPI.io約 $1.50

Weir の検索は、呼び出し 1 回と、ポスト 1 件ごとに 1 クレジットずつかかります。X が 1 回に返すのは約 20 件なので、10,000 ポストで約 10,500 クレジットです。

毎月の無料 5,000 クレジットで、約 4,700 ポスト読めます。

TwitterAPI.io は、1 件あたり私たちより安いです。 検索がどこまで遡れるかはドキュメントにないので、必要な最古の日付で先に試してください。

速さでは、X が勝ちます。

150,000X の API で 15 分に読めるポストの上限
300Weir の無料枠で 1 分に読めるポスト
1,200購入後の Weir で 1 分に読めるポスト

無料の過去ツイートのデータセットはある?

いくつかありますが、ID だけか使える人が限られ、どれも今日までは届きません。

  • 2006〜2009 年:オビエド大学のデータセットは、約 15 億件のポストの ID を CC BY 4.0 で無料公開しています。2020 年の確認では、85.5% がまだ残っていました。
  • 2012〜2022 年:ウォートン校の 1% サンプルは、ストリーミング API の変更で 2022 年 11 月に止まりました。使えるのは、ウォートンとアネンバーグの研究者だけです。
  • 2006〜2017 年:米国議会図書館がこの期間の公開ポストの本文を保管していますが、公開は制限されています。

ID からポストに戻すには、GET /v1/x/posts で 100 件ずつ調べます。削除されたポストは meta.notFound に入り、費用はかかりません。

うまくいかないときは

  • 2006〜2010 年のポストが ID の窓で抜ける:初期の ID は時刻を持たないので、日付で区切ります。
  • 2 ページ目で 400 になる:body が変わっています。カーソルは、それを作ったリクエストでしか使えません。

Weir が向かないケース

  • X 自身の規約や契約が必要:X の全期間検索を使います。
  • 今週中に数百万件ほしい:X の 500 件のページは、私たちの 20 件よりずっと速く進みます。
  • 1 件の単価だけが大事:TwitterAPI.io は 1,000 ツイート $0.15 で、投稿やストリーミングもできます。

Weir は公開データを読むだけで、投稿はできません。X の規約は書面の許可のないスクレイピングを禁じています。自分に当てはまるかは Twitter スクレイピングの規約と判例 で確かめてください。法的な助言ではありません。

よくある質問

過去ツイートを取得できる API はありますか?

あります。X の全期間検索 GET /2/tweets/search/all が、2006 年 3 月以降の公開ポストを 1 件 $0.005 で返します。Weir などの外部の検索 API も、同じ年まで安く届きます。

X API で過去のポストはどこまで遡れますか?

X のドキュメントでは、2006 年 3 月までです。2026 年 10 月 21 日、私たちの検索は 2006 年 3 月 21 日の 20 番のポスト「just setting up my twttr」を返しました。削除されたポストと鍵アカウントは出てきません。

過去ツイートを無料で取得できますか?

一部はできます。X の API に、ポストを読む無料枠はありません。Weir の無料枠は毎月 5,000 クレジットで、約 4,700 ポストです。ID のデータセットは無料ですが、ポストに戻すにはクレジットがかかります。

参考資料

X の資料と TwitterAPI.io は、2026 年 10 月 26 日に確認しました。