著者:Sorsa Editorial

2026年7月4日更新:100回分の無料リクエストの開始オプションを追加し、料金を1,000ツイートおよび1,000プロフィールあたりで述べ直し、全アーカイブの2006年3月の開始と3,200ツイートのタイムライン上限を再確認しました。

要点: 過去のTwitter/Xデータ、すなわち2006年3月まで遡るすべての公開ツイートには、5つの方法で到達できます。X の無料の高度な検索、公式 X API の全アーカイブ検索、オープンソースのスクレイパー、学術データセット、またはサードパーティのデータ API です。大規模なプログラムからのアクセスには、ダウンロードできる公開の完全アーカイブが存在しないため、データ API が実用的な経路です。

公式の経路は、この3年で急激に狭まりました。X は2023年に無料のアカデミックリサーチのトラックを新規申請者に対して閉じ、2026年初頭には新規開発者向けの固定プランを廃止し、今ではリソースの読み取り単位で課金するため、大規模な過去分の取得は高くつきます。Twitter/X の代替 API である Sorsa API は、異なる形をしています。その /search-tweets エンドポイント は、標準の since:until: コマンドで2006年まで遡る全アーカイブのキーワード検索を実行し、作者プロフィールとともに完全なツイートオブジェクトを1回の呼び出しで返し、ツイート読み取り単位ではなくリクエスト単位のフラット料金で課金します。料金はバッチエンドポイントで1,000ツイートあたり$0.02、1,000プロフィールあたり$0.01から始まり、すべてのプランで一律の毎秒20リクエスト、開発者アカウントの審査は不要です。新規アカウントには、まずアーカイブをテストするための 100回分の無料リクエスト も付きます。1回限り・クレジットカード不要・有効期限なしです。

当チームはこの API を開発・運用し、公式のエンドポイントから過去分のパイプラインを定期的に再構築しています。したがってここでのトレードオフは、ドキュメントの要約ではなく、実際に作業した結果に基づいています。

過去のTwitterデータの概観

5つの方法が、ほぼすべての実際のユースケースをカバーします。これらは、アーカイブの深さ、コスト、セットアップの手間、そして現実的にどれだけのデータを取得できるかで異なります。

方法アーカイブの深さコスト(2026年)セットアップ最適な用途
X の高度な検索(Web)2006年まで遡る無料なし特定の古いツイートを手作業で見つける
公式 X API 全アーカイブ2006年まで遡る従量課金、投稿読み取り1件あたり約$0.005、月200万件の上限高(開発者アカウント、従量課金クレジット)予算があり低ボリュームのチーム
オープンソースのスクレイパー変動、たいてい浅い無料(エンジニアリング時間)中、頻繁に壊れるその場限りの、予算に制約のある作業
学術データセットイベント固有のスナップショット無料中(ツイート ID のリハイドレート)既知のイベント向けの構築済みデータセット
Sorsa API(検索エンドポイント)2006年まで遡る1Kツイートあたり$0.02からのフラットプラン(月額$49 / $199 / $899)低(API キー1つ)本番パイプライン、継続的な研究

目次


なぜ2026年に過去のTwitterデータは取得しにくくなったのか? {#why-is-historical-twitter-data-harder-to-get-in-2026}

2026年に過去のTwitterデータが取得しにくいのは、ダウンロードできる公開の完全アーカイブが存在せず、研究者が頼っていた安価なプログラムからの経路が閉じたためです。公開ツイートの完全な過去のカタログは、2006年3月まで遡って存在しますが、それに到達するのは検索または有料アクセスを通じてのみで、手頃な選択肢は2023年から2026年のあいだに縮小しました。

3つのプラットフォームの変化がアクセスを作り変えました。2023年2月、無料 API プランは書き込み専用のスタブとなり、有料プランがそれに取って代わりました。2023年半ば、公開された Twitter 研究の大半を支えていたアカデミックリサーチのトラックが、新規申請者の受け入れを停止しました。2026年初頭、X は新規開発者を従量課金クレジットに移し、そこでは読み取りがリソースあたり約$0.005で、従量課金アカウントは月200万件の読み取りが上限です。月額$5,000のレガシー Proプランは今も全アーカイブ検索を同梱していますが、新規登録には閉じられています。プランごとの完全な全体像については、2026年版 Twitter API 料金の詳細 をご覧ください。

制度的な近道もありません。米国議会図書館はかつて、2006年以降の Twitter の完全な過去カタログを取り込み、すべての公開ツイートを保存することに同意しましたが、2017年末に包括的なアーカイブを停止し、今では選択的にのみ収集しています。そしてその2006年から2017年のコレクションは、公開アクセスから封印されたままです。アーカイブのクエリ可能なコピーを保持する外部の団体はありません。だからこそ、サードパーティのデータ API とオープンソースのスクレイパーが、行き場を失ったボリュームの大半を吸収したのです。


5つの方法を詳しく {#the-five-methods-in-detail}

X の高度な検索

X の高度な検索は、無料の手動の経路で、Web インターフェースで直接2006年まで遡ります。since:until: コマンドをサポートし、既知のツイートを見つけたり、小さな期間をサンプリングしたりするのに役立ちます。エクスポートはできず、構造化されたデータも返さず、どんな規模でも実用になりません。結果は画面に表示されるだけで、手作業でスクロールするしかないためです。古い日付範囲はノイズの多い結果も表面化させます。関連性のランキングが古いコンテンツを後回しにするためです。

公式 X API の全アーカイブ検索

公式の search/all エンドポイントは、サードパーティ API と同じアーカイブの深さを提供しますが、2026年には3つの摩擦があります。新規開発者は、固定の月額費用のない従量課金クレジットを使わなければなりません。v2 のレスポンスはデフォルトで最小限のフィールドを返すため、必要なエンゲージメント指標、作者プロフィール、メディアを明示的に要求する必要があります。そして従量課金の月200万件の読み取り上限は、実際の研究予算がすぐに到達する固定の天井です。認証はベアラートークンを用いた OAuth 2.0 で、最初のアーカイブクエリを実行する前に、それ自体のセットアップの手間が加わります。

オープンソースのスクレイパー

オープンソースのスクレイパーは、X の Web エンドポイントをリバースエンジニアリングして古いツイートに到達し、それが無料かつ脆弱にしています。よく知られた名前である snscrape と twint は事実上終わっており、snscrape は何年も更新されず、twint はアーカイブされました。メンテナンスされているライブラリもいくつか残っていますが、同じ故障モードを共有しています。動くスクレイパーは、X がフロントエンドのトークンをローテーションした瞬間に、移行経路もなく壊れます。これらのツールの現状については、2026年にどの Twitter スクレイパーがまだ動くか の解説をご覧ください。

学術データセット

構築済みのアーカイブは、特定のイベントについて、完全なツイートではなくツイート ID を配布します。現在の内容を取得するには ID を API に対してリハイドレートしますが、これはデータセットが構築されてから1年経つごとに、より多くのツイートが削除・凍結・非公開になって脱落することを意味します。ジョージ・ワシントン大学の TweetSets や DocNow のカタログのようなリポジトリは主要なイベントをカバーし、ウォートンの研究データベースは、SQL でクエリ可能な全ツイートの約1%のサンプルを提供します。ハイドレートには依然として API アクセスが必要で、これは料金の問題に戻ります。アカデミックリサーチのトラックを失ったチームには、学術研究向けアクセス が、無料または割引のプランで同じ期間指定のクエリをカバーします。

サードパーティのデータ API

サードパーティのデータ API は、プログラムからのアクセスに最も信頼できる経路です。キー1つ、構造化された JSON、そして全アーカイブにわたるページネーション。Sorsa はそうした Twitter/X API の代替 の1つです。その /search-tweets エンドポイントは、2006年3月からのアーカイブをカバーし、各ツイートに埋め込まれた作者プロフィールを含むすべてのフィールドをデフォルトで返し、ツイート読み取り単位ではなくリクエスト単位のフラット料金で課金します。このフラットなモデルこそが、公式 API では数千ドルに達する大きなバックフィルが、ここでは数百ドル台に収まる主な理由です。


「全アーカイブ」が実際に意味すること(そして得られないもの) {#what-full-archive-actually-means-and-what-you-cannot-get}

「全アーカイブ」は、この分野で最も使い古された言い回しです。どのプロバイダーもそれを主張しますが、公式 API 自体を含めて、そのいずれも4つのカテゴリのデータを返せません。これらはプラットフォームレベルの制限であり、特定のツールの欠陥ではなく、公式 X API、Sorsa API、そして他のすべてのプロバイダーに等しく当てはまります。

削除されたツイート。 ツイートが削除されると、X の検索インデックスから消え、どの API もそれを復元できません。Wayback Machine が、トラフィックの多いプロフィールページのスクリーンショットをまれに保持していることがありますが、それは画像であって、ツイートではありません。

保護されたアカウントのツイート。 投稿を保護しているアカウントは、公開の検索・タイムラインのエンドポイントから除外されます。それらのツイートを読む唯一の方法は、承認された認証済みのフォロワーであることです。

過去のプロフィールのスナップショット。 プロフィールデータは現在の状態を反映します。今日返される2014年のツイートは、2014年当時のものではなく、作者の2026年のユーザー名とプロフィール文を示します。ハンドルがそれ以降3回変わっていれば、表示されるのは現在のものです。

過去のエンゲージメントのスナップショット。 これは、感情分析や影響力の研究をつまずかせるものです。今日取得される2018年のツイートは、2018年当時の数ではなく、現在のいいね数を示します。X のエコシステムのどこにも、タイムマシンのエンドポイントはありません。特定時点のエンゲージメントが必要なら、ツイートを投稿されるそばから取り込み、指標を自分で保存します。そのパターンは リアルタイムモニタリングのドキュメント にあります。


APIで過去のツイートを検索する方法 {#how-to-search-historical-tweets-with-the-api}

過去分の作業は、ユーザーをまたいでキーワードで検索するか、1つのアカウントの完全なタイムラインを取得するかに応じて、2つのエンドポイントがカバーします。

エンドポイント機能ページネーションページサイズ
POST /v3/search-tweetssince:until:from:min_faves: を含む X の検索コマンドで全アーカイブをキーワード検索next_cursor約20ツイート
POST /v3/user-tweets1ユーザーの完全な投稿履歴、新しい順から古い順へnext_cursor約20ツイート

認証は単一の ApiKey ヘッダーです。すべてのレスポンスは、埋め込まれた作者プロフィール、メディアエンティティ、エンゲージメント指標を含む完全なツイートオブジェクトを持つフラットな JSON です。最小限のリクエストはこうです。

bash
curl -X POST https://api.sorsa.io/v3/search-tweets \
  -H "ApiKey: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "\"climate change\" since:2015-06-01 until:2015-12-31 lang:en min_faves:10",
    "order": "latest"
  }'

これは、2015年6月から12月のあいだの、いいねが少なくとも10件ある「climate change」というフレーズに一致する英語のツイートを、時系列で並べて返します。完全なコマンドのセット(from:to:filter:min_retweets:、完全一致のフレーズ、ブール論理)は、Twitter 検索コマンドのリファレンス にあり、任意のアーカイブクエリを絞り込むために必要な構文をカバーします。

日付範囲をページネーションで検索する(Python)

最も一般的な過去分のワークフローはイベント分析です。定義された期間内でトピックに一致するすべての英語のツイートを取得します。next_cursor が空で返るまでループします。

python
import requests
import time

API_KEY = "YOUR_API_KEY"
URL = "https://api.sorsa.io/v3/search-tweets"

def search_historical(query, max_pages=50):
    """Search the full tweet archive with automatic pagination."""
    all_tweets = []
    next_cursor = None

    for page in range(max_pages):
        body = {"query": query, "order": "latest"}
        if next_cursor:
            body["next_cursor"] = next_cursor

        resp = requests.post(
            URL,
            headers={"ApiKey": API_KEY, "Content-Type": "application/json"},
            json=body,
        )
        resp.raise_for_status()
        data = resp.json()

        tweets = data.get("tweets", [])
        all_tweets.extend(tweets)
        print(f"Page {page + 1}: {len(tweets)} tweets (total: {len(all_tweets)})")

        next_cursor = data.get("next_cursor")
        if not next_cursor:
            break
        time.sleep(0.1)

    return all_tweets


tweets = search_historical("SpaceX since:2015-06-01 until:2015-07-01 lang:en")

各ツイートオブジェクトには、140文字の切り詰めのない本文全体、言語コード、スレッド再構成のための会話 ID、6つすべてのエンゲージメント数、メディアエンティティの URL、そして完全な作者プロフィールが含まれます。ユーザーを取得する2回目の呼び出しは決して必要ありません。再試行や大規模化に伴う注意点を含む、より多くの Python パターンについては、Python での Twitter API ガイド をご覧ください。

エンゲージメントの高い過去のコンテンツを浮かび上がらせる(JavaScript)

コンテンツ研究では、時系列ではなく人気で並べます。order: "popular"min_retweets: および -filter:nativeretweets と組み合わせて、リツイートの洪水ではなく、特定の期間に実際に動いた元のツイートを浮かび上がらせます。

javascript
const API_KEY = "YOUR_API_KEY";
const URL = "https://api.sorsa.io/v3/search-tweets";

async function searchHistorical(query, maxPages = 10) {
  const allTweets = [];
  let nextCursor = null;

  for (let page = 0; page < maxPages; page++) {
    const body = { query, order: "popular" };
    if (nextCursor) body.next_cursor = nextCursor;

    const resp = await fetch(URL, {
      method: "POST",
      headers: { "ApiKey": API_KEY, "Content-Type": "application/json" },
      body: JSON.stringify(body),
    });
    if (!resp.ok) throw new Error(`API error: ${resp.status}`);

    const data = await resp.json();
    const tweets = data.tweets || [];
    allTweets.push(...tweets);

    nextCursor = data.next_cursor;
    if (!nextCursor) break;
    await new Promise((r) => setTimeout(r, 100));
  }

  return allTweets;
}

// Viral Tesla tweets from 2019, originals only
searchHistorical(
  'Tesla since:2019-01-01 until:2019-12-31 min_retweets:1000 -filter:nativeretweets lang:en'
).then((t) => console.log(`Collected ${t.length} tweets`));

ここで -filter:nativeretweets フラグが重要です。それがないと、人気の検索は同じバズったツイートをリツイートとして何十回も返し、元のツイートをその下に埋めてしまいます。

CSV と Pandas にエクスポートする

本番のパイプラインは、ツイートを収集し、CSV に書き出し、それから分析のために読み込みます。同じレスポンス構造が、そのまま DataFrame に落とし込まれます。

python
import pandas as pd

def to_dataframe(tweets):
    rows = []
    for t in tweets:
        u = t.get("user", {})
        rows.append({
            "created_at": pd.to_datetime(t["created_at"]),
            "username": u.get("username"),
            "followers": u.get("followers_count", 0),
            "text": t["full_text"],
            "likes": t.get("likes_count", 0),
            "retweets": t.get("retweet_count", 0),
            "views": t.get("view_count", 0),
            "lang": t.get("lang"),
        })
    return pd.DataFrame(rows)

df = to_dataframe(tweets)
df.to_csv("historical_tweets.csv", index=False)

そこから、エンゲージメント率の時系列、感情スコアリング、または回帰のためのきれいなフレームが手に入ります。完全な感情分析のワークフローについては、姉妹ガイドの Twitter 感情分析 を、ラベル付きコーパスの組み立てについては 機械学習用のTwitterデータセットの構築 をご覧ください。


大規模な過去分の収集の戦略 {#strategies-for-large-scale-historical-collection}

数千ツイートを超えるどんなバックフィルにも、いくつかのパターンが有効です。

大きな日付範囲を月単位の窓に分割する。 丸1年にわたる単一のクエリでは、バッチサイズを制御できず、リクエストが途中で失敗しても、きれいな再開地点がありません。月ごとに分割すれば、並列化・再試行・監査をきれいに行え、選挙や市場の暴落のような変動の激しい期間には、さらに週単位や日単位のまとまりに分けます。

リツイートのノイズを除く。 過去の人気検索はリツイートの洪水を返します。元のコンテンツが欲しいときは -filter:nativeretweets を、旧来の「RT @user」形式の再投稿も落とすには -filter:retweets を加えます。

エンゲージメントフィルターを日付範囲と組み合わせる。 since:until:min_faves: または min_retweets: と組み合わせると、対象期間で注目を集めたツイートだけが浮かび上がり、ノイズとリクエスト量の両方を削減します。不要な呼び出しを削り、カーソルの仕組みをきれいに扱うヒントについては、API 利用の最適化 をご覧ください。

一度バックフィルし、その後は前向きに監視する。 エンゲージメント数は特定時点のスナップショットではなく現在の総数なので、継続的な研究では、過去の期間を一度バックフィルし、以降はリアルタイムのモニターを取り付けるのが最も強力なパターンです。これにより、過去のベースラインと、すべての新しいものについての正確な特定時点の指標の両方が得られます。


アカウントの完全なタイムラインをスクレイピングする {#scraping-a-full-account-timeline}

目標が、ユーザーをまたいだキーワード検索ではなく、1つのアカウントの完全な投稿履歴なら、代わりに /user-tweets を使います。これはカーソルが空になるまでタイムラインを新しい順から古い順へたどり、公式 API のタイムラインエンドポイントを制限する3,200ツイートの上限に相当するものはありません。

python
import requests

resp = requests.post(
    "https://api.sorsa.io/v3/user-tweets",
    headers={"ApiKey": "YOUR_API_KEY", "Content-Type": "application/json"},
    json={"username": "naval"},
)

これはアーカイブ検索とは異なるワークフローで、独自のコスト計算と、GUI ツールやスクレイパーとの比較を伴います。専用ガイド ユーザーの全ツイートをダウンロードする が、それを最初から最後まで扱います。本記事の残りは、ユーザーをまたいだ過去の検索にとどまります。


実例:公式 API から履歴を再構築する {#in-practice-rebuilding-history-off-the-official-api}

2026年の締め付けを最も感じるのは、限られた予算で何年分ものデータをバックフィルするチームです。当チームが協力したあるクオンツファンドは、暗号資産のツイートから感情モメンタムのシグナルを、5年分の価格変動に対してバックテストして得たいと考えていました。第一段階は、約400アカウントのキュレーションされたリストからのすべてのツイートに加え、2019年から2024年までの30のキーワードに一致する英語のツイートのバックフィルでした。公式のプランでは読み取り上限が拘束的な制約で、見積もりの請求額は5桁の後半に達しました。フラット料金のアーカイブ API に対して再構築したところ、同じバックフィルが3日間のページネーションで数百ドルで完了し、以来、その仕組みは稼働し続けています。

形は違えど、同じ教訓です。縦断的な言説研究を行うある学術グループは、方法論全体をアカデミックリサーチのトラックを前提に組み立てていました。トラックが新規申請者に閉じられたとき、その代替として同じ from: とキーワードのクエリをフラットプランに対して実行し、元のアクセス中に収集したより小さなデータセットに対して結果を再検証しました。再構築にかかったのは Starterプランの1か月分でした。どちらのケースでも、障害はデータそのものではなくアクセスの経済性であり、フラットなリクエスト単位のモデルがそれを取り除きました。


よくある質問 {#frequently-asked-questions}

Twitter/X のアーカイブ検索はどこまで遡れる?

2006年3月21日、最初の公開ツイートの日付までです。公式 X API の全アーカイブ検索と Sorsa API の /search-tweets エンドポイントは、どちらもその日付以降の完全な公開アーカイブをカバーします。その後に作者によって削除または非公開にされたツイートは、プラットフォームの検索インデックスにもう存在しないため、どの結果からも除外されます。

削除されたツイートをどの API でも取得できる?

いいえ。ツイートが削除されると、X の検索インデックスから取り除かれ、どの公開 API もそれを取得できません。唯一の選択肢は、削除前に作られた外部のキャプチャ、たとえば Wayback Machine のスクリーンショットや、ツイートをリアルタイムで取り込んだ監視サービスです。削除され得るコンテンツの保存が重要なら、ツイートを投稿されるそばから取り込み、自分の側に保存してください。

Twitter のアカデミックリサーチ API はまだ無料?

新規申請者には無料ではありません。X は2023年にアカデミックリサーチのトラックへの新規申請の受け入れを停止しました。それ以前にアクセスを持っていた研究者は今のところそれを保持しますが、新しい学術用の枠は発行されません。2026年のほとんどの学術プロジェクトは、残っている枠を使うか、構築済みのデータセットから作業するか、同じ期間指定のクエリを実行するためにフラット料金のサードパーティのアーカイブ API に移行します。

2026年に全アーカイブを検索するといくらかかる?

公式 X API の従量課金モデルでは、読み取りは各約$0.005で月間200万件の読み取り上限があり、月額$5,000で全アーカイブ検索を同梱していたレガシー Proプランは新規登録に閉じられています。Sorsa API は代わりにフラットな月額プランを使います。10,000リクエストで$49、100,000で$199、500,000で$899で、各検索リクエストが最大20ツイートを返します。

特定の過去の日付のツイートのエンゲージメント指標を取得できる?

いいえ。返されるツイートのエンゲージメント数、すなわちいいね、リツイート、返信、表示回数、引用、ブックマークは、特定の過去の日付の総数ではなく、現在の総数を反映します。プラットフォームはエンゲージメントの過去のスナップショットを保存していません。特定時点の指標が必要なら、ツイートをリアルタイムで取り込み、その瞬間に自分で数を記録する必要があります。

2つの特定の日付のあいだのツイートをどう検索する?

クエリの中で since:YYYY-MM-DDuntil:YYYY-MM-DD コマンドを使います。since は開始日を含み、until は終了日を含まないため、since:2020-01-01 until:2020-02-01 は2020年1月の丸1か月を返します。アーカイブ全体でよりきれいな結果を得るには、これらを lang:min_faves:-filter:retweets と組み合わせます。

ツイート単位の課金なしで、過去のTwitterデータ向けの手頃な API はある?

はい。Sorsa API は、ツイート読み取り単位ではなくリクエスト単位のフラット料金で課金するため、20ツイートを返す検索は、それらのツイートが2024年のものでも2009年のものでも同じ費用です。Proプランの100,000リクエストで月額$199、これはおよそ200万ツイートに相当するため、大きな過去のバックフィルは、リソース単位のモデルが課金する数千ドルの代わりに、数ドルで済みます。


始め方 {#getting-started}

コードを書く前にアーカイブ検索をテストするには、Sorsa API Playground が、キー不要でブラウザから /search-tweets/user-tweets に対してリクエストを発行し、ビジュアルクエリビルダー が、コマンドを手作業で組み立てさせてくれます。統合する準備ができたら、ダッシュボード からキーを取得し、クイックスタート に従います。審査も OAuth もなく、単一の API キー、そしてすべてのプランで一律の毎秒20リクエストです。すべての新規アカウントは100回分の無料リクエストで始まり、1回限り・クレジットカード不要・有効期限なしで、40個のエンドポイントすべてをカバーし、これは決める前に期間指定のクエリを検証するのに十分です。10,000リクエストで$49の Starterプランは、イベント分析や1年の窓での単一トピックの研究を含む、ほとんどの単発のバックフィルをカバーします。

監修:Keksich(Sorsa創業者、マーケター兼X APIリサーチャー)

本ガイドは、2022年以降 Twitter/X の代替 API を運用し、公式のエンドポイントから過去分のパイプラインを再構築してきた当チーム自身の作業に基づいています。全アーカイブの2006年3月の開始と包括的な収集の限界は、米国議会図書館による自館の Twitter アーカイブの説明 に対して確認し、公式 X API の従量課金レートは X が公開する開発者向け料金に対して再確認し、エンドポイントの挙動、コマンド、リクエスト単位のコストは Sorsa API のドキュメントと、Sorsa が公開した2026年の料金の詳細から取りました。本稿のために5つのアクセス方法を比較しました。チームの詳細は about ページ にあります。最終確認:2026年7月4日。