本文へスキップ

2006年までさかのぼる過去のTwitterデータの取得方法

過去のTwitterデータは、2006年3月21日の最初のツイートまでさかのぼります。現在も公開されている投稿であれば、フルアーカイブ検索APIで、キーワード、アカウント、期間を指定して取得できます。削除された投稿と非公開アカウントの投稿は取得できません。

要点: アーカイブ全体を1つのファイルとして販売している会社はありません。必要な範囲を、キーワードと日付で検索して取得します。公式X APIは、この検索を1,000投稿あたり$5.00で課金し、月300万件が上限です。バックフィルには、Twitter(X)API兼スクレイピングツールであるSorsa APIが向いています。POST /search-tweets で1,000ツイートあたり$0.07からで、100リクエストの無料枠から始められます。

エンドポイント
POST /search-tweets
1ページの件数
1リクエストあたり約20ツイート
料金
1,000件あたり$0.07から

#過去のTwitterデータはどこまでさかのぼれるか

過去のTwitterデータは、最初のツイートが投稿された2006年3月21日から始まり、それ以降に投稿され、現在も公開されているすべての投稿は検索で見つけられます。完全なアーカイブをファイルとして配布している会社はないので、クエリ、アカウント、ツイートIDのいずれかで、必要な範囲を取得します。

どのAPIやツールでも取得できない投稿が3種類あります。投稿者が削除したツイート、非公開アカウントの投稿、凍結されたアカウントの投稿です。2019年に収集したデータセットを今日もう一度集め直すと、まさにこの理由で小さくなります。

手作業で数件調べるだけなら、無料のTwitter高度な検索ツールが、ブラウザ上で同じ日付演算子を実行します。集計やグラフ化、モデルの学習に使うデータには、APIが必要です。

2014年のツイートは今、何を返すか

過去のツイートは、本文と日付が投稿当時のまま返りますが、カウンターと投稿者のプロフィールは、どのAPIでも現在のものになります。

ツイートの要素2014年に投稿されたツイートで得られるもの
本文、日付、ID、リンク、メディア2014年の投稿当時のまま
いいね、リポスト、返信、引用の数2014年当時の数ではなく、現在の合計
投稿者:ハンドル、プロフィール文、フォロワー数現在の投稿者のプロフィール(ハンドルが変わっていればその新しい名前)
  • 本文、日付、ID、リンク、メディア

    2014年に投稿されたツイートで得られるもの
    2014年の投稿当時のまま
  • いいね、リポスト、返信、引用の数

    2014年に投稿されたツイートで得られるもの
    2014年当時の数ではなく、現在の合計
  • 投稿者:ハンドル、プロフィール文、フォロワー数

    2014年に投稿されたツイートで得られるもの
    現在の投稿者のプロフィール(ハンドルが変わっていればその新しい名前)

そのため、2014年にハッシュタグがどう広まったかを調べる研究では、1日あたりのツイート数を正確に数えられます。一方、2014年当時のフォロワー数はアーカイブから読み取れません。ツイートがフォロワー数を保存していないためです。将来、特定の時点の数値が必要になるなら、ツイートが現れるたびに収集して、カウントを自分で保存しておきましょう。

#過去のツイートを取得する3つの方法

過去のツイートには、Sorsa APIが向いています。APIキー1つで、2006年までの公開ツイートすべてに届き、全プランで毎秒20リクエスト、検索なら1,000件あたり$0.07からです。使うエンドポイントは、起点が話題と日付、1つのアカウント、ツイートIDのリストのどれかで変わります。どのツイートにも、投稿者のプロフィール全体が付きます。

話題は検索で、アカウントはタイムラインの読み取りで、公開済みのデータセットはIDの照会で取得します。1ツイートあたりのコストが最も低いのは、IDの経路です。

調査の大半は検索でカバーできます。選挙期間中のハッシュタグ、2019年のブランドへの言及、5年間にわたるキャッシュタグなどです。アカウントの経路は、1つのタイムラインを最新の投稿から最も古い投稿へと読み取ります。IDの経路は、すでに公開されているデータセットを再構築するもので、1リクエストで100ツイートを取得できるため、1ツイートあたりのコストが最も低くなります。

#APIで過去のツイートを検索する方法

Sorsa APIでアーカイブを検索するのは、4ステップ、キー1つで済み、Xアカウントも、アプリの審査も、OAuthも要りません。同じエンドポイントでリアルタイムの検索も実行できます。詳しくはTwitter検索APIのガイドをご覧ください。

  1. キーを取得します。 サインアップして、ダッシュボードからAPIキーをコピーします。100リクエストの無料分は、すでにキーに付与されています。

  2. クエリを書きます。 先に単語、次に期間を指定します。since:2014-04-01 はその日を含み、until:2014-05-01 はその日の手前までで、どちらもUTCです。from:、lang:、min_faves:、-filter:retweets で絞り込めます。すべての演算子は、Twitter検索演算子の一覧にあります。

  3. 最初のリクエストを送ります。 クエリを POST /search-tweets(新しいタブで開きます) にPOSTし、"order": "latest" を指定すると、ページが期間内を時系列順にたどります。

    ターミナル
    curl -X POST "https://api.sorsa.io/v3/search-tweets" \
      -H "ApiKey: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "query": "\"rainfall survey\" since:2014-04-01 until:2014-05-01",
        "order": "latest"
      }'
    
    レスポンス200 OK
    {
      "tweets": [
        {
          "id": "456721912166192197",
          "full_text": "Day 3 of the rainfall survey: 41 mm in the valley.",
          "created_at": "2014-04-17T09:12:44Z",
          "lang": "en",
          "likes_count": 38,
          "retweet_count": 12,
          "reply_count": 4,
          "quote_count": 1,
          "is_reply": false,
          "user": {
            "id": "583920117",
            "username": "mira_archive_notes",
            "display_name": "Mira Field Notes",
            "followers_count": 2214,
            "created_at": "2012-06-02T18:40:11Z"
          }
        }
      ],
      "next_cursor": "DAADDAABCgABGEZx0iWAJ8kKAAIYRm0eqZvwRg"
    }
    
  4. 期間内をページ送りします。 同じクエリのまま、本文に next_cursor を入れて送り返し、カーソルのないレスポンスが返ったら止めます。1ページは約20ツイートで、件数は変動するため、ページが短くても期間が終わったとは限りません。

403が返った場合は、キーがないか、間違っているか、リクエストを使い切っています。429は1秒間に20リクエストを超えたことを意味するので、1秒待ってから再送してください。

知っておきたいこと

バックフィルには "order": "latest" を使ってください。期間内を時系列順にたどるので、漏れのない収集ができます。"popular" はエンゲージメントの多いツイートを先に返すため、ある期間のトップ投稿を探すには向いていますが、期間内のすべての投稿を数えるには向きません。

#数年分のツイートを欠落なくバックフィルする方法

数年分のバックフィルは、1か月または1週間ごとの小さな期間に分け、最後までページ送りして1つずつ保存すると、最もうまくいきます。失敗した期間だけを単独で再実行でき、すべての期間を件数で検証できます。until: はその日自体を含まないので、連続する期間で同じツイートを2回保存することもありません。

1か月ずつ処理:各期間は最後のカーソルまでページ送りして保存するため、クラッシュしても失うのは1か月分で、全体ではありません。

下のスクリプトは、日付の範囲を月ごとにたどり、各期間を next_cursor でページ送りします。月ごとに1つのJSON Linesファイルを書き出し、すでにディスクにある月は飛ばすので、いつ止めても、いつ再開しても構いません。

import json
import os
import time
from datetime import date

import requests

URL = "https://api.sorsa.io/v3/search-tweets"
HEADERS = {"ApiKey": "YOUR_API_KEY"}


def months(start, end):
    """Yield (since, until) pairs, one calendar month each."""
    d = start
    while d < end:
        nxt = date(d.year + d.month // 12, d.month % 12 + 1, 1)
        yield d, min(nxt, end)
        d = nxt


def backfill(words, start, end, folder="archive"):
    os.makedirs(folder, exist_ok=True)
    for since, until in months(start, end):
        path = f"{folder}/{since:%Y-%m}.jsonl"
        if os.path.exists(path):
            continue  # this month is already saved
        body = {"query": f"{words} since:{since} until:{until}",
                "order": "latest"}
        rows = []
        while True:
            r = requests.post(URL, headers=HEADERS, json=body)
            if r.status_code == 429:
                time.sleep(1)  # over 20 requests a second
                continue
            r.raise_for_status()
            page = r.json()
            rows += page.get("tweets", [])
            if not page.get("next_cursor"):
                break
            body["next_cursor"] = page["next_cursor"]
        with open(path, "w", encoding="utf-8") as f:
            for t in rows:
                f.write(json.dumps(t) + "\n")
        print(since, len(rows), "tweets")


backfill('"rainfall survey" lang:en', date(2015, 1, 1), date(2021, 1, 1))

キャッシュタグや世界的な出来事のようにツイートの多い話題は、日単位や時間単位に分けるのが適しています。静かなハッシュタグなら、1か月で十分です。1日より細かい期間には、Xの演算子がUnix秒も受け付けます。since_time:1397692800 until_time:1397779200 は、UTCで2014年4月17日です。

#過去データのバックフィルにかかるコスト

Sorsa APIでの過去データのバックフィルは、検索なら1,000ツイートあたり$0.07から、ツイートIDの指定なら1,000件あたり$0.014からです。つまり、過去のツイート100万件は$70から、すでにIDを持っているなら$14からです。公式X APIで同じ100万件の投稿を取得すると、$5,000が課金されます。

過去のツイート

開始元

1Mの過去ツイート 検索で取得、投稿者情報付き

$5,000

公式X API

1投稿あたり$0.005

最大$15,000(11月22日以降は投稿者情報込み)

最安 $70

Sorsa API

1,000件あたり$0.07から

投稿者情報込み

約42分 Sorsa APIで毎秒20リクエストの場合。 公式X APIの月間上限3M投稿なら、この作業は1回の請求サイクルに収まります。

規模と開始元を選ぶと、2つのAPIを比較でき、Sorsa APIで毎秒20リクエストの場合の所要時間もわかります。

どの規模でも、検索によるバックフィルのコストは公式X APIの約70分の1、IDによるバックフィルは約350分の1です。

過去のツイート数Sorsa API、検索Sorsa API、ツイートID公式X API、投稿のみ月300万件の上限で必要なXの課金サイクル
10万$7から$1.40から$5001
100万$70から$14から$5,0001
1,000万$700から$140から$50,0004
1億$7,000から$1,400から$500,00034、またはEnterprise
  • 10万

    Sorsa API、検索
    $7から
    Sorsa API、ツイートID
    $1.40から
    公式X API、投稿のみ
    $500
    月300万件の上限で必要なXの課金サイクル
    1
  • 100万

    Sorsa API、検索
    $70から
    Sorsa API、ツイートID
    $14から
    公式X API、投稿のみ
    $5,000
    月300万件の上限で必要なXの課金サイクル
    1
  • 1,000万

    Sorsa API、検索
    $700から
    Sorsa API、ツイートID
    $140から
    公式X API、投稿のみ
    $50,000
    月300万件の上限で必要なXの課金サイクル
    4
  • 1億

    Sorsa API、検索
    $7,000から
    Sorsa API、ツイートID
    $1,400から
    公式X API、投稿のみ
    $500,000
    月300万件の上限で必要なXの課金サイクル
    34、またはEnterprise

「から」を付けた料金はSorsa APIのリクエスト単価が最も低い場合のものです。Proプランでは、検索結果が1,000件あたり約$0.10、IDによるツイートが約$0.02になります。失敗したリクエストには課金されず、各ツイートに含まれる投稿者のプロフィールに追加料金はかかりません。

知っておきたいこと

2026年11月22日から、公式X APIは、Xの開発者チームが10月23日に告知した(新しいタブで開きます)とおり、expansionで返されるすべてのオブジェクトを標準料金で課金します。投稿者つきで読み取る投稿は、$0.005ではなく$0.015になります。過去のデータセットはほぼ必ず投稿者が必要になるため、公式APIでは1,000投稿あたり最大$15.00で見込んでください。

公式X APIの従量課金には、1回の課金サイクルあたり300万件の投稿読み取りという上限もあります。1,000万ツイートのバックフィルには4回の課金サイクルがかかり、上限を超える唯一の方法は、月約$42,000からのEnterprise契約です。公式のその他の料金は、すべてX APIの料金の解説にあります。

#公式X APIでの過去のツイート

公式X APIは、フルアーカイブ検索 GET /2/tweets/search/all で過去のツイートを提供します。2006年3月までさかのぼり、1リクエストで最大500投稿を返します。Xの検索ドキュメント(新しいタブで開きます)によると、利用できるのは従量課金とEnterpriseの顧客です。最初の呼び出しの前に、承認された開発者アカウント、Developer Consoleのプロジェクトとアプリ、アプリのキーとトークンが必要です。読み取りはすべて、Xの料金表(新しいタブで開きます)のとおり、事前に購入したクレジットから1投稿$0.005で引かれます。日付は start_time と end_time にISO 8601のタイムスタンプで指定します。

バックフィルに必要な点で測ると、Sorsa APIは、料金、投稿者データ、取得量、セットアップで勝っており、2006年3月からという開始点も同じです。

API1,000ツイートあたりの料金投稿者プロフィール月間の取得量セットアップ
Sorsa API検索で$0.07から、IDで$0.014から全ツイートに含まれ、追加料金なし投稿数の上限なし、毎秒20リクエストAPIキー1つ
公式X API$5.002026年11月22日から投稿者1,000件あたり$10.00300万投稿、それ以上はEnterprise開発者アカウント、アプリ、OAuthトークン、事前チャージのクレジット
  • Sorsa API

    1,000ツイートあたりの料金
    検索で$0.07から、IDで$0.014から
    投稿者プロフィール
    全ツイートに含まれ、追加料金なし
    月間の取得量
    投稿数の上限なし、毎秒20リクエスト
    セットアップ
    APIキー1つ
  • 公式X API

    1,000ツイートあたりの料金
    $5.00
    投稿者プロフィール
    2026年11月22日から投稿者1,000件あたり$10.00
    月間の取得量
    300万投稿、それ以上はEnterprise
    セットアップ
    開発者アカウント、アプリ、OAuthトークン、事前チャージのクレジット

公式X APIが引き続き必要になるのは書き込みです。Sorsa APIは設計上、読み取り専用で、投稿もせず、Xアカウントにも触れません。投稿するには公式X APIと組み合わせてください。読み取りだけなら、開発者アカウントなしでTwitter APIを使う方法で説明しているとおり、キー1つで足ります。

#Twitterのアーカイブを検索できたのは誰か、2006年から2026年

Twitterの歴史の大半で、フルアーカイブはエンタープライズ契約の向こう側にありました。研究者が無料でアクセスできたのは約2年間だけで、2026年2月からは、どの開発者でもXから投稿単位で購入できます。

アーカイブへのアクセスの20年間を6つの日付で。研究者向けの無料アクセスは2021年から2023年までの間でした。

2021年1月26日に始まったAcademic Researchトラックは、承認された研究者に無料のフルアーカイブ検索を提供しました。Twitterは2023年3月30日に有料ティアを発表(新しいタブで開きます)した際に、従来のアクセスレベルを廃止しました。アカデミック利用者は一般向けプランに誘導され、同社はこのコミュニティへの対応を続ける新しい方法を検討するとしました。アカデミックアクセスはその夏に使えなくなり、アカデミック向けのティアは戻っていません。研究者は、機関のメールアドレスから、Sorsa APIの学術研究向けアクセスを申請できます。研究に必要な量のリクエストから大幅な割引まで、個別の内容で承認されます。

#1つのアカウントの履歴、または公開されているツイートIDのリスト

1つのアカウントが投稿したすべてを取得するには、username、user_id、プロフィールのリンクのいずれかを指定して POST /user-tweets(新しいタブで開きます) を呼び出し、next_cursor で最新の投稿から最も古い投稿までページ送りします。数年分の一部だけなら、代わりにそのハンドルの from: と since:、until: で検索します。CSVへのエクスポート手順は、ユーザーの全ツイートをダウンロードのガイドで解説しています。

リハイドレーションとは、ツイートIDのリストから完全なツイートを取得することで、研究用データセットの多くが共有される形式です。POST /tweet-info-bulk(新しいタブで開きます) は、1リクエストで最大100件のIDまたはリンクを受け取り、各ツイートを投稿者つきで1,000件あたり$0.014からで返すため、IDが100万件のデータセットは$14からです。公開後に削除された、または非公開になったツイートのIDは欠落して返るので、リハイドレーションしたデータセットは、元のものより必ず少し小さくなります。残りを学習データに変える方法は、機械学習向けTwitterデータセットの作り方で解説しています。

#100リクエストの無料枠でバックフィルを始める

過去のTwitterデータには、まずSorsa APIです。APIキー1つで2006年までのすべての公開ツイートに届き、全プランで毎秒20リクエストです。検索は1,000ツイートあたり$0.07から、IDによる照会は1,000件あたり$0.014からです。100リクエストの無料枠で、任意の期間から約2,000ツイートを取得でき、カードは不要で、期限もありません。まず対象のトピックを1か月分取得して確認し、それから全期間を計画しましょう。

#よくある質問

過去のTwitterデータに最適なAPIは何ですか?

過去のTwitterデータには、Sorsa APIを使ってください。2006年までのすべての公開ツイートを、検索結果1,000件あたり$0.07から検索できます。公式X APIは$5.00です。Xの検索演算子をそのまま使え、各ツイートに投稿者が追加料金なしで含まれます。月300万件の上限がなく、開発者アカウントも不要で、全プランで毎秒20リクエストです。

過去のツイートを無料で取得する方法はありますか?

小規模な作業ならあります。Xの高度な検索は、ログイン済みのユーザーに古いツイートを1画面ずつ表示します。無料の日付指定ツイート検索ツールは、アカウントが特定の日に投稿した内容を一覧表示します。エクスポートできるデータが必要なら、Sorsa APIの100リクエストの無料枠で、検索なら約2,000の過去ツイート、IDなら1万件を、カード不要で取得できます。

Twitterのアーカイブから、削除されたツイートを取得できますか?

できません。投稿者が削除したツイートはXの検索インデックスから消えるため、Sorsa APIでも公式X APIでも、どのAPIも返せません。非公開アカウントや凍結されたアカウントの投稿も、同様に取得できません。削除されたツイートが残るのは、削除前に誰かが全文を保存していた場合、たとえばウェブアーカイブのスナップショットだけです。

Twitter検索で since: と until: はどう動作しますか?

since:2014-04-01 はその日付以降のツイートを返し、until:2014-05-01 はその日付の手前で止まります。どちらもUTCで数えるので、この2つで2014年4月全体をカバーできます。単語、from:、lang: と組み合わせて1つのクエリにできます。時間単位の期間には、since_time: と until_time: がUnix秒を受け付けます。Sorsa APIの POST /search-tweets は、この4つの演算子すべてに対応しています。

Twitterのアーカイブ全体をダウンロードできますか?

できません。公開ツイートのアーカイブ全体を1つのダウンロードとして販売している会社はなく、Xでダウンロードできるのは、設定とプライバシーから取得する自分のアカウントのアーカイブだけです。研究者は必要な範囲を取得します。Sorsa APIなら、任意のキーワード、ハッシュタグ、アカウントを、日付を指定して2006年まで検索でき、1,000ツイートあたり$0.07からです。公開されているIDのリストは、1,000件あたり$0.014から再構築できます。

#検証方法

2026年11月2日に、Xの従量課金の料金表、検索のドキュメント、2026年10月23日付の課金拡張の告知、2023年3月30日の有料ティアの発表を読みました。このページの公式X APIの料金、制限、日付は、すべてそれらに基づいています。同じ日に、Sorsa APIのすべてのエンドポイント、パラメータ、ページサイズを、最新のAPIリファレンスと検索演算子のドキュメントに照らして確認しました。リクエストとレスポンスはそのリファレンスをもとに、デモ用のアカウントで作成したものです。コストと所要時間は、公開されている料金から算出した計算値です。

Sorsa APIチーム 読み取り専用のX(Twitter)APIとスクレイピングツール、Sorsa APIを開発・運営しています。2022年から本番稼働し(旧TweetScout API)、累計60億リクエスト以上を処理しています。 Sorsa APIについて

変更点
  • 全面的に書き直しました。公式X APIの料金、月300万件の上限、2026年11月22日からの投稿者課金をXの公式ページで再確認しています。新たに、過去のツイートを取得する3つの方法、PythonとNode.jsの両方で書いた月ごとのバックフィルスクリプト、コストと所要時間の計算ツール、今日の過去ツイートが返す内容、アーカイブへのアクセスの年表を追加しました。
  • 初公開。