本文へスキップ

リアルタイム Twitter 監視 API

Twitter をリアルタイムで監視するには、フィード(アカウント、最大5,000アカウントの公開 X リスト、キーワード検索)を数秒ごとにポーリングし、最後に見た投稿より新しいものだけを残します。

結論: 5秒ごとのポーリングなら、新しい投稿を約5秒以内に捉えられます。X が Filtered Stream で示す4〜5秒に近く、Filtered Stream の料金は1投稿あたり$0.005です。リアルタイムの Twitter 監視には Sorsa API を使います。GET /list-tweets は1リクエストで5,000アカウントをポーリングでき、1,000投稿あたり$0.07から。100回分の無料リクエストで始められます。

エンドポイント
GET /list-tweets
1ページの対象
1リクエストあたり5,000アカウント
料金
1,000件あたり$0.07から

#リアルタイム Twitter 監視の仕組み

リアルタイムの Twitter 監視はループです。フィードの最新の投稿を X に尋ね、まだ処理していないものだけを残し、数秒後にまた尋ねます。このループをポーリングと呼びます。フィードは、1つのアカウントでも、アカウントのリストでも、言葉の検索でもかまいません。ブランド名、競合のハンドル、キャッシュタグ、障害を示すキーワード、投稿が市場を動かすアナリストなどです。

X のすべての投稿には、時間とともに大きくなる数値の ID が付いています。そのため、処理済みの最大の ID がチェックポイントになり、それより大きいものはすべて新着です。ポーリングの間隔が、最長の待ち時間を決めます。ポーリング直後に投稿された投稿は次のポーリングまで丸1間隔待ち、ポーリング直前に投稿された投稿はすぐに拾われます。

5秒ごとにポーリング 最長待ち5秒 3 s 2 s 3 s 新規投稿 確認 30秒ごとにポーリング 最長待ち30秒 28 s 17 s 8 s X Filtered Stream 投稿の99%が4~5秒 4–5 s 4–5 s 4–5 s 0 s 5 s 10 s 15 s 20 s 25 s 30 s
間隔が最長の待ち時間になる。5秒間隔なら、ポーリングは X 自身のストリームと同じ範囲に収まる。

公式 X API は逆に、プッシュで動作します。Filtered Stream は1本の HTTP 接続を開いたままにして、ルールに一致するすべての投稿を送ります。X の Filtered Stream ドキュメント(新しいタブで開きます)は、遅延を投稿の99%で約4〜5秒としています。従量課金のアクセスで使えるのは、1接続、最大1,024文字のルール1,000件、毎秒250投稿までで、承認済みの開発者アカウント、プロジェクト、アプリ、Bearer トークンが必要です。

X は、ストリームが届ける投稿を1件ずつ投稿の読み取りとして課金します。1件$0.005、つまり1,000件あたり$5.00で、月300万投稿の読み取りまでが上限です。それを超える場合は Enterprise 契約になります。10月23日の X のお知らせ(新しいタブで開きます)によると、2026年11月22日から投稿に付いて返る投稿者プロフィールに$0.010が加算されるため、投稿者付きの投稿は$0.015になります。公式のそのほかの料金は、X API の料金のガイドで項目ごとに解説しています。

#Sorsa API でアカウントとキーワードを監視する

コードから X を監視するには、Twitter(X)API 兼スクレイピングツールである Sorsa API を使います。1リクエストで最大5,000アカウントの最新の投稿を読み取れ、キーワードのフィードには X 自身の検索構文が使え、どのプランも毎秒20リクエストで動作します。ポーリングのたびに新しいデータが返り、どの投稿にも投稿者のプロフィール全体が付きます。開発者アカウントと OAuth の代わりに、必要なのは ApiKey ヘッダー1つです。

監視する対象に合わせてエンドポイントを選びます。どれも約20件の投稿を新しい順に1ページとして返し、1つ前のページを指す next_cursor も返します。

監視する対象エンドポイント1リクエストで返るもの
最大5,000アカウントGET /list-tweets(新しいタブで開きます)公開リストの全メンバーの最新の投稿
1つのアカウントPOST /user-tweets(新しいタブで開きます)そのアカウントの最新の投稿、返信、リポスト
言葉、ハッシュタグ、キャッシュタグPOST /search-tweets(新しいタブで開きます)"order": "latest" で最新の一致結果
ハンドルをタグ付けした投稿POST /mentions(新しいタブで開きます)最新のメンション(いいね数や日付のフィルタ付き)
  1. キーを取得する。 サインアップして、ダッシュボードから API キーをコピーします。100回分の無料リクエストは、すでにキーに入っています。

  2. アカウントを公開 X リストに入れる。 x.com でリストを作成し、最大5,000アカウントを追加して、公開のままにします。非公開リストはどの API キーでも読み取れません。リスト ID は x.com 上のリストのアドレス末尾の数字で、下のリクエストが送る list_id です。

  3. リストをポーリングする。 GET リクエスト1回で、全メンバーの最新の投稿が、それぞれの投稿者のプロフィール付きで一度に返ります。

    ターミナル
    curl -G "https://api.sorsa.io/v3/list-tweets" \
      -H "ApiKey: YOUR_API_KEY" \
      --data-urlencode "list_id=1849722563900214388"
    
    レスポンス200 OK
    {
      "tweets": [
        {
          "id": "2117190277605314310",
          "full_text": "Status update: EU-West checkout errors are resolved.",
          "created_at": "2026-11-02T09:41:12Z",
          "lang": "en",
          "likes_count": 14,
          "retweet_count": 5,
          "reply_count": 3,
          "quote_count": 1,
          "view_count": 2140,
          "is_reply": false,
          "conversation_id_str": "2117190277605314310",
          "user": {
            "id": "1702291101836602498",
            "username": "harborline_status_hq",
            "display_name": "Harborline Status",
            "followers_count": 48210,
            "verified": false
          }
        },
        {
          "id": "2117190206607470143",
          "full_text": "Our Q3 freight index is out: spot rates down 4%.",
          "created_at": "2026-11-02T09:40:55Z",
          "lang": "en",
          "likes_count": 31,
          "retweet_count": 9,
          "reply_count": 4,
          "quote_count": 2,
          "view_count": 5320,
          "is_reply": false,
          "conversation_id_str": "2117190206607470143",
          "user": {
            "id": "1366689741639744314",
            "username": "quaywright_analytics",
            "display_name": "Quaywright Analytics",
            "followers_count": 12904,
            "verified": true
          }
        }
      ],
      "next_cursor": "DAABCgABG3kQ8x7_7ToKAAIbeRDz9yz3QAgAAwAAAAIAAA"
    }
    
  4. 新しい投稿だけを残す。 各 ID をチェックポイントと比べ、前回のポーリング以降に複数ページ届いたときは next_cursor をたどり、処理済みの ID は飛ばします。下のループは、この3つを5秒ごとに行い、直近2分間の ID も再確認します。フィードに遅れて届いた投稿も、これで拾えます。

    import time
    import requests
    
    API = "https://api.sorsa.io/v3"
    HEADERS = {"ApiKey": "YOUR_API_KEY"}
    LIST_ID = "1849722563900214388"
    INTERVAL = 5              # seconds between polls
    OVERLAP = 120_000 << 22   # re-check the last 2 minutes of IDs
    
    
    def read_newer(floor):
        """Read pages until posts at or below floor show up."""
        posts, params = [], {"list_id": LIST_ID}
        for _ in range(5):  # at most 5 pages per poll
            r = requests.get(f"{API}/list-tweets", headers=HEADERS,
                             params=params, timeout=30)
            r.raise_for_status()
            page = r.json()
            tweets = page.get("tweets", [])
            newer = [t for t in tweets if int(t["id"]) > floor]
            posts += newer
            cursor = page.get("next_cursor")
            if not floor or len(newer) < len(tweets) or not cursor:
                break
            params["next_cursor"] = cursor
        return sorted(posts, key=lambda t: int(t["id"]))
    
    
    def handle(t):
        print(t["user"]["username"], t["created_at"], t["full_text"][:80])
    
    
    last_id, seen, first = 0, set(), True
    while True:
        try:
            posts = read_newer(max(last_id - OVERLAP, 0))
        except requests.RequestException as err:
            print("poll failed, retrying:", err)
            time.sleep(INTERVAL * 2)
            continue
        for t in posts:
            if t["id"] not in seen:
                seen.add(t["id"])
                if not first:  # the first poll only sets the checkpoint
                    handle(t)
            last_id = max(last_id, int(t["id"]))
        first = False
        time.sleep(INTERVAL)
    
  5. キーワードのフィードを追加する。 ブランドやキャッシュタグには、"order": "latest" を付けて POST /search-tweets をポーリングし、クエリに since_id: 演算子を入れます。これで、ポーリングのたびに新しい一致結果だけが返ります。ネイティブのリポストは、クエリに include:nativeretweets を加えない限り結果に含まれません。そのほかの演算子は、Twitter 検索 APIのガイドに一覧があります。

    Python
    floor = max(last_id - OVERLAP, 0)
    query = '("lumenforge" OR #lumenforge OR $LMFG) lang:en'
    body = {"query": f"{query} since_id:{floor}", "order": "latest"}
    r = requests.post(f"{API}/search-tweets", headers=HEADERS,
                      json=body, timeout=30)
    
  6. 新しい投稿を必要な場所に送る。 handle() 関数はご自身で置き換えてください。データベースに書き込む、Slack のチームチャンネルに投稿する、仕分けと要約を行う AI エージェントに渡す、などです。

#1つの X リストで5,000アカウントをカバー

X のリストを使えば、数千のアカウントを1つのフィードにまとめられます。これが、大規模でもポーリングを安く保つ理由です。5,000アカウントを1つずつ監視すると、ポーリングのたびに5,000回のタイムラインリクエストが必要です。1つの公開リストに入れれば、何人のメンバーが投稿したかにかかわらず、ポーリングは GET /list-tweets への1リクエストで済みます。

アカウントごとにタイムライン1つ ポーリングのたびに5,000リクエスト 5,000 リクエスト 公開Xリスト1つ ポーリングのたびに1リクエスト GET /list-tweets 全メンバーの最新投稿 1 リクエスト
公開リストは最大5,000アカウントを1つのフィードにまとめる。アカウントごとではなく、ポーリングごとに1リクエスト。

こうなると、レート制限がボトルネックではなくなります。Sorsa API は、無料アカウントを含むすべてのプランで、キーあたり毎秒20リクエストを許可します。1つのキーで、毎秒20個のリストをポーリングでき、30秒ごとなら最大300万アカウントをカバーする600個のリストをポーリングできます。公式 X API のリストタイムラインのエンドポイントは、アプリあたり15分に900リクエスト、つまり毎秒約1回までで、返した投稿すべてに課金します。完全な表は、X API のレート制限のガイドにあります。

1リクエストで返るのは約20件の投稿です。2回のポーリングの間にリストがそれ以上投稿したときは、上のループが next_cursor をたどってチェックポイントまで戻ります。ページが1つ増えるごとにリクエストが1回増えます。間隔を短くしても同じ効果が得られます。リストのメンバーとフォロワーの読み取りや、リストの一括作成については、X のリストとコミュニティの APIのガイドで扱っています。

#ポーリングの頻度と費用

仕事が許容する最長の待ち時間から間隔を決め、そのうえでポーリング回数を数えます。Sorsa API は、ページに20件の新着投稿があってもなくても、ポーリング1回につき1リクエストを課金します。したがって月額費用は、ポーリングするフィードの数と頻度の2つの数で決まります。30日の月で、1つのフィードを30秒ごとにポーリングすると約86,000リクエストになり、Pro プランの100,000に収まります。フィードあたりの費用は、間隔ごとに次のとおりです。

ポーリング間隔月間リクエスト数最安料金Pro の料金
5秒518K$726$1,032
15秒173K$242$344
30秒86K$121$172
1分43K$60$86
5分8.6K$12$17
  • 5秒

    月間リクエスト数
    518K
    最安料金
    $726
    Pro の料金
    $1,032
  • 15秒

    月間リクエスト数
    173K
    最安料金
    $242
    Pro の料金
    $344
  • 30秒

    月間リクエスト数
    86K
    最安料金
    $121
    Pro の料金
    $172
  • 1分

    月間リクエスト数
    43K
    最安料金
    $60
    Pro の料金
    $86
  • 5分

    月間リクエスト数
    8.6K
    最安料金
    $12
    Pro の料金
    $17

「最安料金」の列は Sorsa API の最低レートである1,000リクエストあたり$1.40、Pro のレートは$1.99で計算しています。ここでのフィードとは、最大5,000アカウントの1つのリスト、または1つの検索クエリのことなので、5,000アカウントを30秒ごとにポーリングしても、1アカウントの場合と同じ費用です。下のプランナーでフィードを追加すると、どのプランでまかなえるかが分かります。

ウォッチするアカウント数
キーワードフィード
ポーリング間隔
30 s 新規投稿までの最長待ち時間
173K 月間リクエスト数
最安 $242 Sorsa APIでの月額

5,000アカウントは公開リスト1つでカバーでき、キーワードフィード1つと合わせて、30秒ごとにポーリングするフィードは2つです。1キーの毎秒20リクエストのうち0.3%を使います。Proの単価1,000リクエストあたり$1.99なら月額は$344で、月173KリクエストはGrowthプランの250Kに収まります。

アカウント、キーワードフィード、間隔を変更すると、待ち時間、リクエスト数、料金が連動します。

投稿あたりで見ると、差が出るのは忙しいフィードです。ポーリングのたびに20件のページが埋まるリストや検索なら、Sorsa API では1,000投稿あたり$0.07からで収集できます。公式 X API は、ストリームが届ける1,000投稿あたり$5.00を課金し、11月22日から各投稿に付いて返る投稿者にも課金されるようになると、1,000投稿あたり$15.00になります。

監視で収集する投稿数

公式 X API

$5,000

1M投稿の場合

1投稿あたり$0.005

Sorsa API

$70から

1M投稿の場合

1,000件あたり$0.07から

71分の1のコスト

失敗したリクエストに課金されることはありません。GET /key-usage-info(新しいタブで開きます) を使えば、リクエストを1回も消費せずに、キーの残りリクエスト数を確認できます。

#API で行う X のソーシャルリスニング

X のソーシャルリスニングとは、ブランド、商品、話題について人々が投稿した内容を集め、投稿量、感情、リーチ、話題を牽引するアカウントといった数値に変えることです。リスニングツールは、その作業を専用のダッシュボード内で行います。API を使えば、投稿を自分で集め、数値はご自身のコード、データウェアハウス、AI エージェントで計算します。

複数ネットワーク対応のリスニングツールが備える X コネクタと比べて、X 専用のデータ API には次の利点があります。

  • 任意の公開投稿の完全なリプライ、引用、リポストしたユーザーを、ページごとに取得できる。
  • 完全一致のフレーズから lang:、min_faves:、from: まで、X 自身の検索構文を使える。
  • 2006年まで遡る任意の期間を検索でき、ローンチを過去のものと比較できる。
  • すべての投稿の中に投稿者のプロフィール全体が入っていて、追加の呼び出しが不要。
  • 生の JSON をシート課金や出力上限なしで、リクエストごとの定額料金で取得できる。
キーワードとハッシュタグ テーマについての発言 POST /search-tweets ブランドのメンション タグ付きもなしも、IDで統合 POST /mentions POST /search-tweets 会話 投稿への返信、引用、リポストした人 POST /comments, /quotes POST /retweeters アカウントとオーディエンス 投稿、フォロワー、プロフィール POST /user-tweets GET /followers, /info-batch 地域別トレンド 国や都市で今話題のもの GET /trends?woeid=
5つの構成要素でリスニングの取り組みをカバーできる。どれも、ポーリングするか、スケジュールで実行する1つのエンドポイント。

ブランドへの言及は2つのフィードから集めます。POST /mentions はあなたのハンドルをタグ付けした投稿を拾い、名前の検索はタグ付けされていない投稿を拾います。Twitter メンション APIのガイドでは、両方をツイート ID でマージしています。話題になった投稿の周辺では、POST /comments(新しいタブで開きます)、POST /quotes(新しいタブで開きます)、POST /retweeters(新しいタブで開きます) が、リプライ、引用ポスト、リポストしたアカウントを読み取ります。GET /followers(新しいタブで開きます) はオーディエンスを1ページ200プロフィールで、GET /info-batch(新しいタブで開きます) は一度に100プロフィールを読み取り、GET /trends(新しいタブで開きます) は WOEID で指定した国や都市のトレンドを返します。

チームがフィードから計算する指標

  • シェア・オブ・ボイス: 同じ期間に、自社ブランドと各競合に同じクエリを実行し、一致した投稿と、その背後にある閲覧数とフォロワーのリーチを比較します。完全な比較の作り方は、Twitter 競合分析のガイドにあります。
  • センチメント: Twitter 感情分析のガイドのように、自前のモデルや LLM で、各投稿の本文をポジティブ、ネガティブ、ニュートラルに分類します。
  • リーチと拡散: 期間内の投稿の view_count、retweet_count、quote_count を合計します。
  • 主要な発信者: 投稿者を followers_count と、投稿が獲得したエンゲージメントで順位づけします。

コードから X のソーシャルリスニングを行う場合、Sorsa API は検索結果を1,000件あたり$0.07から、2006年まで遡る履歴付きで返します。上のライブ監視も、同じキーで動かせます。

#監視を安定して動かす

数か月動き続ける監視は、再起動、急増、順序が入れ替わって届く投稿に遭遇します。投稿の取りこぼしや二重報告を防ぐ習慣は5つです。

  • チェックポイントを保存する。 最後の ID をデータベースの行かファイルに保存しておけば、再起動後に古い投稿を再処理したり新しい投稿を飛ばしたりせず、止まった場所から再開できます。
  • 短い重複範囲を再確認する。 投稿は、より新しい投稿の数秒後にリストや検索のフィードに届くことがあります。ポーリングのたびに2分間の ID をさかのぼって読み、処理済みの ID を飛ばせば、こうした遅れて届く投稿を拾えます。
  • 位置ではなく ID を比べる。 POST /user-tweets はアカウントの固定投稿を先頭に返すことがあるため、ページ内で最大の ID を最新として扱います。
  • エラー時は待ってから再試行する。 429 は、キーが毎秒20リクエストを超えたという意味なので、待ってから再試行します。403 は、キーのリクエストが残っていないという意味です。どちらも失敗したリクエストは課金されないため、費用はかかりません。
  • カウントはあとで更新する。 投稿から数秒で拾った投稿には、いいねや閲覧がほとんど付いていません。保存した投稿は1時間後に POST /tweet-info-bulk(新しいタブで開きます) で再取得してください。1リクエスト100件で、既知のツイートの取得は1,000件あたり$0.014からです。

知っておきたいこと

ポーリングが読み取るのは公開データだけです。非公開アカウント、非公開リスト、ダイレクトメッセージは、どのフィードにも現れません。Sorsa API は設計上、読み取り専用で、投稿、いいね、フォローは一切行わず、X のログイン情報を求めることもないため、ご自身の X アカウントにリスクはありません。

#最初のリアルタイム監視を始める

リアルタイムの Twitter 監視は、間隔とチェックポイントに尽きます。公開リストに対する5秒ごとのループなら、ポーリング1回につき1リクエストで5,000アカウントを監視できます。Sorsa API は、そのループを API キー1つで、全プラン毎秒20リクエストで動かします。収集した投稿は1,000件あたり$0.07からで、公式 X API の$5.00と比べて安くなります。アカウントをリストに入れ、100回分の無料リクエストで上のループを動かし、最初の投稿が届いたらキーワードのフィードを追加してください。

#FAQ

ポーリングはリアルタイムの Twitter 監視に十分な速さですか

ほぼすべての監視の用途で十分です。新しい投稿の最長の待ち時間はポーリングの間隔に等しいので、5秒のループなら、各投稿がフィードに届いてから約5秒以内に捉えられます。X は自社の Filtered Stream の配信の99%について約4〜5秒としています。Sorsa API は全プランで毎秒20リクエストを許可しているため、1つのキーで毎秒20個のフィードをポーリングできます。

X にソーシャルリスニング API はありますか

X に、ソーシャルリスニング API という名前の製品はありません。公式 X API には検索、タイムライン、Filtered Stream があり、開発者アカウントのもとで1投稿あたり$0.005が課金されます。Twitter(X)API 兼スクレイピングツールである Sorsa API は、同じ公開投稿をキー1つで返します。2006年まで遡るキーワード検索、会話、投稿者プロフィールを、検索結果1,000件あたり$0.07から提供します。

ソーシャルリスニング API とツールは何が違いますか

ソーシャルリスニングツールは、グラフ、アラート、有料のシートを備えた完成品のダッシュボードです。ソーシャルリスニング API は生の投稿を JSON で返すので、ダッシュボードも、製品の機能も、AI エージェントも、自分で作ります。API なら、指標を自分で選び、データを手元に残し、シート単位ではなくリクエスト単位で支払います。

自分の @ハンドルをタグ付けしていないブランドへの言及も追跡できますか

はい。POST /search-tweets でブランド名とよくある綴り間違いを検索し、POST /mentions でタグ付けされた投稿を集め、両方のリストをツイート ID でマージすれば、同じ投稿が二重にカウントされません。X では、ブランドをタグ付けせずに名前だけで言及する人が多く、そうした投稿を見つけられるのは検索のほうだけです。

X でシェア・オブ・ボイスを測れますか

はい。同じ期間に、自社ブランドと各競合に同じクエリを実行し、一致した投稿の件数と、その背後にある閲覧数とフォロワーのリーチを比較します。Sorsa API の投稿にはどれも投稿者のプロフィールとエンゲージメント数が付いているので、比較全体を1組の検索から作れます。

リアルタイムの Twitter 監視にはどの API を使うべきですか

リアルタイムの Twitter 監視には Sorsa API を使ってください。GET /list-tweets 1リクエストで最大5,000アカウントをポーリングでき、キーワードのフィードには X の検索構文が使えます。全プランで毎秒20リクエストが可能で、収集した投稿は1,000件あたり$0.07から。公式 X API は$5.00です。必要なのは API キー1つで、開発者アカウントは不要、あなたの X アカウントには一切触れません。

#検証の方法

2026年11月2日に、docs.x.com の Filtered Stream、レート制限、従量課金の料金のページと、expansions の課金に関する X の10月23日のお知らせを読みました。このガイドで取り上げた Sorsa API のエンドポイント、パラメータ、ページサイズはすべて、公開中の API リファレンスと照合しています。リクエストとサンプルのレスポンスはそのリファレンスに沿ったもので、今回の更新ではキーを使った実行はしていません。費用は、Sorsa API の料金表のプランのレートと、30日の月で計算しています。

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

変更点
  • 全面的に書き直しました。docs.x.com で X の Filtered Stream の制限と料金(11月22日からの投稿者課金を含む)を確認し、チェックポイントまでページをさかのぼって遅れて届く投稿も拾うループ、ポーリング間隔ごとの費用とプランナー、旧ソリューションのページから移したソーシャルリスニングを追加しました。
  • 初公開。