本文へスキップ

政治関連のTwitterデータを研究用に収集する方法

政治関連のTwitterデータを集めるには、公職者アカウントのウォッチリストと、選挙や争点ごとに記録した検索条件を用意し、APIで定期的に取得します。公式X APIの料金は1,000件あたり$5.00です。

要点: Xの無料の学術向けアクセスは2023年に終了しました。現在の研究用収集は読み取りごとの従量課金で、公式X APIは1投稿あたり$0.005、月間300万投稿が上限です。政治家のタイムラインや選挙をめぐる議論の収集には、Twitter(X)API兼スクレイピングツールであるSorsa APIが使えます。ツイートは1,000件あたり$0.07からで、まずは100回分の無料リクエストで試せます。

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

#収集できる政治関連のTwitterデータ

現在、Xの政治関連データとして収集できるのは3種類です。公職者の投稿、選挙や争点についての一般の発言、そして公職者の投稿に対する反応です。いずれも公開されていて、時刻と投稿者が記録されています。そのため、Xは政治コミュニケーション研究の標準的なデータ源であり続けています。

  • 公職者本人の投稿。 議員、大臣、政党、官公庁、候補者のアカウントです。件数が少なく整ったデータで、一国の議会なら数百アカウント、月に数万件の投稿規模です。
  • 選挙や争点をめぐる議論。 候補者名、法案、ハッシュタグ、討論会に触れた一般の投稿すべてです。地方選なら数千件、国政選挙なら数百万件に達します。
  • 反応。 公職者の発言に付いたリプライや引用投稿で、メッセージがどう受け止められたかが分かります。

どのAPIでも手が届かないデータもあります。投稿者が削除した投稿、非公開アカウント、ダイレクトメッセージ、いいねしたユーザーの一覧です。過去の研究用データセットでも、この欠落は埋められません。多くはツイートIDの一覧として公開されていました。プラットフォームの規約でIDの共有は認められても本文の共有は認められなかったためで、削除されたツイートのIDは今では何も返しません。研究者は2023年に無料の入手経路を失いました。その後に何が代わったかは、Twitterのアーカイブを検索できたのは誰かの経緯で解説しています。

そのため2026年の政治研究では、自分でデータを集めることになります。進行中の選挙戦なら今日から先に向けて、過去の選挙ならアーカイブをさかのぼって収集します。アーカイブは2006年3月まで届きます。

#Sorsa APIで政治関連ツイートを収集する

政治関連ツイートの収集には、Sorsa APIが使えます。APIキー1つで、公職者のタイムラインと選挙をめぐる議論を1,000ツイートあたり$0.07から読み取れます。全プラン毎秒20リクエストで、Xの開発者アカウントもOAuthも不要です。同じ読み取りに対して、公式X APIは1,000投稿あたり$5.00かかり、月間300万投稿で頭打ちになります。

政治データの種類ごとに、対応するエンドポイントがあります。どのエンドポイントも、各ツイートの中に投稿者のプロフィール全体を追加料金なしで含めて返します。

政治データSorsa APIのエンドポイント1リクエストあたり1,000件あたり(最安)
公職者のウォッチリストを1つのフィードでGET /list-tweets(新しいタブで開きます)約20ツイート$0.07
公職者1人の全タイムラインPOST /user-tweets(新しいタブで開きます)約20ツイート$0.07
クエリと日付で絞る、選挙や争点の議論POST /search-tweets(新しいタブで開きます)約20ツイート$0.07
公職者の投稿に付いたリプライPOST /comments(新しいタブで開きます)約20件のリプライ$0.07
リスト内の全アカウントのプロフィールGET /info-batch(新しいタブで開きます)最大100プロフィール$0.014
保存済みの投稿をIDで再確認POST /tweet-info-bulk(新しいタブで開きます)最大100ツイート$0.014

Sorsa APIはRESTのAPIです。キーを付けてリクエストを1回送るだけで整ったJSONが返り、ブラウザで動かすものも、Xアカウントも要りません。2022年から本番環境で稼働し、累計60億リクエスト以上を処理しています。Xに変更があってもSorsa側で修正するため、開票日の夜にまたがる収集でも途中で止まりません。Xのログイン情報を求めることはなく、ご自身のアカウントにリスクはありません。

#政治家アカウントのウォッチリストを作る

ウォッチリストとは、研究で追跡するアカウントの一覧で、数値のユーザーIDで保管します。作り始めるときは、青いチェックマークで探すのではなく、すでに誰かが確認した公開情報から出発してください。2023年以降、チェックマークは有料サブスクリプションの印であり、公式アカウントである証明ではありません。

ステップ ソースまたはSorsa APIエンドポイント 1 アカウントを一覧化 公開ファイルから連邦議員のハンドル505件 legislators-social-media.yaml 公式アカウントのみ 2 数値IDに固定 ハンドルは変わるがユーザーIDは変わらない GET /info-batch 1リクエストでプロフィール100件 3 ウォッチリストのフィードを読む 1時間ごと、最後に保存した投稿まで遡る GET /list-tweets 1フィードで最大5,000アカウント 4 保存して再確認 各投稿を初めて見た時刻を保存し、 返ってこなくなった投稿を記録 POST /tweet-info-bulk 1リクエストで保存済みID 100件
ウォッチリストは、リスト化、ID解決、読み取り、再確認の4ステップで動きます。最後のステップが、削除をデータに変えます。

米国連邦議会であれば、オープンデータのプロジェクトunitedstates/congress-legislators(新しいタブで開きます)に、議員の公式SNSアカウントを記したファイルがあります。2026年11月2日時点で、Xのハンドルが505件載っており、うち408件に数値IDが付いています。最終更新は2026年10月24日です。このプロジェクトが受け付けるのは、公費で運営される公式アカウントだけで、選挙運動用や個人のアカウントは含まれません。公式な発信を扱う研究に必要なのは、まさにこの区別です。他の国でも、多くの議会が議員のアカウントを自前のオープンデータサイトで公開しているので、そこから始めてください。

ハンドルは変わりますが、数値IDは変わりません。GET /info-batch で、1リクエストあたり100アカウントずつ、すべてのハンドルを一度だけIDに変換し、そのIDをウォッチリストのキーとして保管します。下のスクリプトは連邦議会のファイルを読み込み、議員1人につきプロフィールを1行ずつ保存します。

Python
import csv
import requests
import yaml  # pip install pyyaml requests

URL = "https://api.sorsa.io/v3/info-batch"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
SRC = ("https://raw.githubusercontent.com/unitedstates/"
       "congress-legislators/main/legislators-social-media.yaml")

members = yaml.safe_load(requests.get(SRC, timeout=30).text)
handles = [m["social"]["twitter"] for m in members
           if m["social"].get("twitter")]

rows = []
for i in range(0, len(handles), 100):  # 100 handles per request
    r = requests.get(URL, headers=HEADERS, timeout=30,
                     params={"usernames": handles[i:i + 100]})
    r.raise_for_status()
    rows += r.json().get("users", [])

with open("watchlist.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["id", "username", "display_name", "followers"])
    for u in rows:
        w.writerow([u["id"], u["username"], u["display_name"],
                    u["followers_count"]])
print(len(rows), "accounts saved")

505件のハンドルは6リクエストで処理できます。結果に含まれなかったアカウントは、リストの更新後に名前が変わったか、凍結されたか、非公開になったものです。一度手作業で確認し、ファイルを修正してください。

#ウォッチリストの全投稿を収集する

ウォッチリストが発信する全投稿を集めるには、アカウントを公開Xリストにまとめ、GET /list-tweets で読み取ります。1つのフィードに全メンバーの投稿が新しい順に並び、1リクエストあたり約20件です。Xリストには最大5,000アカウントを登録できるので、どの国の議会でも収まります。Xリストの読み取り方は、リストのガイドAPIでXリストを読み取る方法で紹介しています。

フィードは定期的に確認し、すでに保存した投稿に行き当たったところでページの取得を止めます。そうすれば、505アカウントの連邦議会リストを1時間ごとに確認しても、その時間帯が静かでも忙しくても、リクエストは数回で済みます。

import json
import time
from datetime import datetime, timezone

import requests

URL = "https://api.sorsa.io/v3/list-tweets"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
LIST_ID = "1720000000000000001"  # your public X List of officials


def check(last_id):
    """Fetch posts newer than last_id, newest first."""
    params, new = {"list_id": LIST_ID}, []
    while True:
        r = requests.get(URL, headers=HEADERS, params=params, timeout=30)
        if r.status_code == 429:  # over 20 requests a second
            time.sleep(1)
            continue
        r.raise_for_status()
        page = r.json()
        for t in page.get("tweets", []):
            if int(t["id"]) <= last_id:
                return new  # reached the last saved post
            new.append(t)
        if not page.get("next_cursor"):
            return new
        params["next_cursor"] = page["next_cursor"]


last_id = 0  # store this between runs
while True:
    seen = datetime.now(timezone.utc).isoformat()
    posts = check(last_id)
    with open("posts.jsonl", "a", encoding="utf-8") as f:
        for t in posts:
            f.write(json.dumps({"first_seen": seen, **t}) + "\n")
    if posts:
        last_id = max(int(t["id"]) for t in posts)
    print(seen, len(posts), "new posts")
    time.sleep(3600)  # one check an hour

403が返るのは、キーがない、キーが誤っている、またはリクエストを使い切った場合です。429は1秒間に20リクエストを超えたことを示すため、スクリプトは1秒待ってからもう一度リクエストします。ツイートIDは時間とともに大きくなるので、IDを比較すれば保存済みの最後の投稿を見つけられます。

ウォッチリストのアカウント数

各アカウントの1日の投稿数

フィードを確認する頻度

月に約61Kポスト 505アカウントから、1時間ごとに確認

$303

公式X API

1ポストあたり$0.005

月額、ポストのみ

最安 $5.04

Sorsa API

リストのフィード1本、1リクエストあたり約20ポスト

月額、投稿者情報込み

1秒未満 Sorsa APIでの1回の確認あたり(毎秒20リクエスト)、毎回約84件の新しいポストを取得します。

ウォッチリストの規模、アカウントの投稿頻度、確認する頻度を設定すると、両方のAPIで1か月に収集した場合の結果が表示されます。

公職者1人の全履歴を一度に取得するには、そのアカウントのユーザーIDを指定して POST /user-tweets を呼び、最新の投稿から最古の投稿までページを順にさかのぼります。CSVへのエクスポートは、ユーザーの全ツイートをダウンロードする方法のガイドで解説しています。

選挙や争点をめぐる議論は、検索クエリで収集します。候補者名や政党名、選挙戦のハッシュタグ、争点のキーフレーズ、言語、期間を指定して POST /search-tweets に送り、next_cursor でページをたどります。クエリは研究デザインそのものです。収集の前に書き上げ、結果と一緒に公開してください。

クエリはバランスを取ります。一方の陣営のハッシュタグだけで検索すれば、測れるのはその陣営だけです。選挙戦に出ているすべての候補者と政党を、同じ書き方、同じ演算子で指定してください。長い期間は since: と until: で1日または1週間の窓に区切ると、失敗した窓だけを単独で再実行できます。構文の全体は、Twitterの検索演算子の一覧にあります。

Terminal
curl -X POST "https://api.sorsa.io/v3/search-tweets" \
  -H "ApiKey: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "(#Measure7 OR \"Measure 7\") since:2026-10-20 until:2026-10-21",
    "order": "latest"
  }'
Response200 OK
{
  "tweets": [
    {
      "id": "1981234567890123456",
      "full_text": "Measure 7 forum tonight: each side got 5 questions.",
      "created_at": "2026-10-20T23:41:07Z",
      "lang": "en",
      "likes_count": 57,
      "retweet_count": 14,
      "reply_count": 9,
      "quote_count": 3,
      "is_reply": false,
      "is_quote_status": false,
      "user": {
        "id": "1590000000000000042",
        "username": "county_civics_desk_demo",
        "display_name": "County Civics Desk",
        "followers_count": 8213
      }
    }
  ],
  "next_cursor": "DAADDAABCgABG4lN0iWAJ8kKAAIbiUY1qZvwRg"
}

次のページは、同じボディに next_cursor を加えて送ります。カーソルが含まれないレスポンスが返ったら止めてください。1ページは約20ツイートで件数にばらつきがあるため、数えるのはページではなく投稿です。

収集の前にリツイートの扱いを決める

政治的な内容は、元の投稿よりリツイートのほうがはるかに多く含みます。そのため、リツイートを外すとデータセットの内容が変わります。Pew Research Centerが米国の成人による1年分のツイートを調べたところ、政治的な内容だったのはリツイートの44%、引用投稿の42%で、リプライは26%、元のツイートは8%でした。

政治的ツイートの割合(種類別) リツイート 44% 引用ツイート 42% 返信 26% オリジナルツイート 8% 0% 25% 50%
米国の成人のツイートの種類別に見た政治的内容の割合(2020年5月〜2021年5月)。リツイートを除外すると、会話の中で最も政治色の濃い部分が消えます。

人々が自分の言葉で何を語るかを調べる研究なら、クエリに -filter:retweets を加えます。何が拡散するかを調べる研究なら、リツイートを残し、各リツイートの retweeted_status から元の投稿を読み取ります。どちらの選び方でも構いませんが、成り行きに任せるのは避けてください。

#削除された投稿の記録を残す

投稿者が削除した投稿は、どのAPIも返しません。Sorsa APIも公式X APIも同じです。そのため、政治家の削除済み投稿の記録は、自分が最初に保存したものしかありません。ウォッチリストの投稿を初めて見た時点ですべて保存していれば、その記録はすでに手元にあります。次に必要なのは、削除に気づく仕組みです。

保存したIDは、POST /tweet-info-bulk で1リクエストあたり100件ずつ再確認します。返ってこなくなった投稿は、削除されたか、アカウントが凍結または非公開になったということです。そのIDを、気づいた時刻とともに記録してください。保存した10万件の投稿を毎日再確認する場合、リクエストは1,000回で、$1.40からです。

Python
import requests

URL = "https://api.sorsa.io/v3/tweet-info-bulk"
HEADERS = {"ApiKey": "YOUR_API_KEY"}


def missing(ids):
    """Return the saved IDs that no longer come back."""
    gone = []
    for i in range(0, len(ids), 100):  # 100 IDs per request
        batch = ids[i:i + 100]
        r = requests.post(URL, headers=HEADERS, timeout=30,
                          json={"tweet_links": batch})
        r.raise_for_status()
        back = {t["id"] for t in r.json().get("tweets", [])}
        gone += [x for x in batch if x not in back]
    return gone

削除された投稿は、政治関連の収集で最も慎重に扱うべき部分です。報告するときは件数とパターンにとどめてください。引用するのは、投稿者が公職者で、投稿が公務に関わるものだった場合に限ります。報道機関が政治家の削除済み投稿をアーカイブしてきたのと同じ扱いです。

#政治関連の収集にかかる費用

Sorsa APIで政治関連のデータを集める費用は、検索、タイムライン、リストのフィードのいずれも1,000ツイートあたり$0.07からです。公式X APIは1,000投稿あたり$5.00なので、約70分の1のコストです。下のカードで、研究の規模に合わせて両APIを比較できます。

政治関連ツイート

公式X API

$5,000

政治関連ツイート100万件の場合

1投稿$0.005

Sorsa API

$70から

政治関連ツイート100万件の場合

1,000件あたり$0.07から

71分の1のコスト

典型的な研究作業を3つ挙げると、差がどこに出るかが分かります。公式X APIの金額は投稿のみを対象とし、Xの従量課金の料金表(新しいタブで開きます)の価格で計算しています。

研究作業ツイート数Sorsa API公式X API
連邦議会の1か月分の投稿(505アカウント、1日4件ずつ、1時間ごとに確認)6.1万$5.04から$303
討論会の夜1回分(全候補者の名前とハッシュタグ)20万$14から$1,000
選挙戦の議論10週間分1,000万$700から月間300万件の上限を超過:Enterprise、月$42K以上
  • 連邦議会の1か月分の投稿(505アカウント、1日4件ずつ、1時間ごとに確認)

    ツイート数
    6.1万
    Sorsa API
    $5.04から
    公式X API
    $303
  • 討論会の夜1回分(全候補者の名前とハッシュタグ)

    ツイート数
    20万
    Sorsa API
    $14から
    公式X API
    $1,000
  • 選挙戦の議論10週間分

    ツイート数
    1,000万
    Sorsa API
    $700から
    公式X API
    月間300万件の上限を超過:Enterprise、月$42K以上

知っておきたいこと

2026年11月22日から、公式X APIは投稿と一緒に返される投稿者プロフィールにも、1件あたり$0.010を課金します。Xの開発者チームが10月23日に発表(新しいタブで開きます)しました。検索結果には数多くの異なる投稿者が含まれるため、そこで読み取った選挙の議論には、1,000投稿あたり最大$15.00かかる場合があります。Sorsa APIは、すべての投稿者をツイートに含めて返します。

公式X APIの従量課金プランは、課金サイクルあたり300万投稿の読み取りが上限です。全国規模の選挙戦なら数週間で上限に達し、その先はEnterprise契約で、月約$42,000からになります。最初の1回を読み取る前に、承認された開発者アカウント、プロジェクトとアプリ、OAuthトークンも必要です。

#政治研究の信頼性を保つためのルール

政治関連のTwitterデータが測るのはオンライン上の議論であり、世論ではありません。次のルールは、研究をデータが示せる範囲にとどめるためのものです。

  • Xのユーザーは有権者全体ではありません。 Pewの調査では、50歳以上の成人は米国の成人ユーザーの24%でしたが、政治関連のツイートの78%を書いていました。件数は、Xで誰が発言しているかを測る指標として扱い、世論調査の代わりにはしないでください。
  • ボットや協調アカウントは、政治的な話題の数字を押し上げます。 集計の前に除外し、何を除いたかを報告してください。見分けるシグナルは、Twitterのボット検出のガイドにまとめています。
  • クエリが結果を決めます。 他の人があなたのデータセットを再現できるよう、実際のクエリ、期間の窓、エンドポイント、収集日を公開してください。
  • 研究の対象は投稿と公職者であり、有権者ではありません。 議論は集計して測り、一般ユーザーの引用は控えめにします。個人の政治的見解を推定することは、研究倫理で禁じられています。Xの開発者規約(新しいタブで開きます)も、政治的な立場による個人のプロファイリングを禁じています。

知っておきたいこと

政治データは政治を理解するためのもので、有権者を誘導するためのものではありません。政治関連の収集は、研究、報道、説明責任を問う取り組みにとどめてください。有権者名簿の利用、ターゲティングリストの作成、投稿をもとに選んだ人へのメッセージ配信は行わないでください。

コーパスのラベル付け、重複排除、モデル用の分割は、政治関連のツイートでも他のツイートと変わりません。手順は機械学習用のTwitterデータセットの作り方で解説しています。トーンやスタンスのスコアリングは、Twitterの感情分析が扱うテーマです。

#100回分の無料リクエストで政治関連の収集を始める

政治関連のTwitterデータを集めるなら、Sorsa APIから始めましょう。ウォッチリストのフィード、タイムライン、選挙の検索を、APIキー1つ、1,000ツイートあたり$0.07から、全プラン毎秒20リクエストで利用できます。100回分の無料リクエストで約2,000件の投稿を取得でき、カードも有効期限も不要です。まず公職者か選挙戦の1週間分を取得してクエリを確かめ、そのあとで残りをスケジュール実行に移してください。大学のチームは、大学のメールアドレスでSorsa APIの学術研究向けアクセスにも申請できます。

#よくある質問

研究用に、Twitterの政治関連データは今も入手できますか?

はい。無料の学術向けアクセスは2023年に終了しましたが、公開されている政治関連の投稿は、APIで引き続き収集できます。公式X APIの料金は1投稿あたり$0.005で、月間300万投稿が上限です。Sorsa APIなら同じ公開投稿を1,000件あたり$0.07から読み取れ、予算を組む前に100回分の無料リクエストで研究を試せます。ツイートIDを集めた公開データセットもありますが、削除された投稿はそこからは返ってきません。

政治関連のTwitterデータに最適なAPIはどれですか?

政治関連のTwitterデータには、Sorsa APIが適しています。政治家のタイムライン、Xリストのフィード、選挙の検索を1,000ツイートあたり$0.07から読み取れます(公式X APIは$5.00)。APIキー1つで開発者アカウントは不要、全プラン毎秒20リクエストで、月間300万件の上限もなく、各投稿者のプロフィールも追加料金なしで返ります。読み取り専用なので、ご自身のXアカウントに触れることはありません。

政治家が削除したツイートは入手できますか?

投稿者が削除したツイートは、Sorsa APIを含め、どのAPIも返しません。削除された投稿が残るのは、先に誰かが保存した場所だけです。報道機関のアーカイブ、ウェブアーカイブのスナップショット、自分の収集データがそれに当たります。削除を研究するには、ウォッチリストの投稿を現れた時点ですべて保存し、そのIDをSorsa APIの POST /tweet-info-bulk で1リクエストあたり100件ずつ再確認して、返ってこなくなったものを記録します。

連邦議会議員のTwitterアカウントの一覧は、どこで見つかりますか?

オープンデータのプロジェクトunitedstates/congress-legislatorsが、legislators-social-media.yamlというファイルで一覧を公開しています。2026年11月2日時点で、現職議員のXハンドルが505件載っており、うち408件に数値のユーザーIDが付いています。公式アカウントのみで、選挙運動用のアカウントは含まれません。ハンドルはSorsa APIの GET /info-batch で1リクエストあたり100件ずつIDに変換し、IDを保管してください。ハンドルは変わるためです。

Twitterのデータで選挙結果を予測できますか?

それだけでは予測できません。Xのユーザーは有権者の標本ではないからです。Pew Research Centerの調査では、50歳以上の成人は米国の成人ユーザーの24%にすぎないのに、政治関連ツイートの78%を書いていました。投稿数や感情のスコアが測るのはオンライン上の議論です。議題、選挙運動、反応の研究には役立ちますが、それだけを根拠にした予測の実績は芳しくありません。

EUの研究者は、DSAに基づいてXのデータを入手できますか?

はい。デジタルサービス法(DSA)の第40条に基づいて可能です。審査を受けた研究者は、Xのような超大規模プラットフォームのデータを、各国のデジタルサービス調整官を通じて請求できます。対象はEUにおけるシステミックリスクの研究で、選挙や市民的言論へのリスクも含まれます。EUのデータアクセス用ポータルは、2025年10月29日から申請を受け付けています。承認には時間がかかるため、その間にAPIで公開投稿の収集を始めるチームも多くあります。

#検証の方法

2026年11月2日に、Xの従量課金の料金表、2026年4月27日付の開発者規約、2026年10月23日付の課金拡大のお知らせを読みました。この記事に出てくる公式X APIの料金とルールは、すべてそこから引用しています。同じ日に、unitedstates/congress-legislatorsのSNSファイルをダウンロードしてアカウント数を数え、Pew Research Centerの2022年のレポートと、欧州委員会のDSAデータアクセスに関するFAQも読みました。Sorsa APIの各エンドポイント、パラメーター、ページサイズは、公開中のAPIリファレンスと照らして確認しています。リクエストとレスポンスはそれをもとにデモアカウントで作成し、費用は公開料金から計算した数字です。

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

変更点
  • 全面的に書き直しました。公式X APIの料金、300万件の上限、2026年11月22日からの投稿者課金、開発者規約をXの公式ページで再確認しています。新規追加:公開データを使った連邦議会のウォッチリスト、PythonとNode.jsによる1時間ごとのリスト収集スクリプト、月額コストの計算ツール、削除ログ、実際のクエリを使ったバランスの取れた選挙検索、リツイートに関するPewの数値、研究上のルール。古い料金表と検証できない収集例は削除しました。2026-07-11: 初回公開。