Twitterハッシュタグ追跡API
APIでTwitterのハッシュタグを追跡するには、#tagを最新順で検索し、結果の全ページを読み取って、日別と投稿者別に投稿を数えます。公式X APIではこの読み取りが投稿1,000件あたり$5.00です。
要点: Xにはハッシュタグ専用のエンドポイントがないため、どのトラッカーもタグを検索します。Xの直近の件数を返すエンドポイントは7日分の合計だけを返し、投稿も投稿者も含みません。タグを日別に数えて投稿者をランク付けするには、Sorsa APIのPOST /search-tweetsを使います。投稿者付きで1リクエストあたり約20投稿、1,000件あたり$0.07からで、100回分の無料リクエストで始められます。
- エンドポイント
POST /search-tweets- ページサイズ
- 1リクエストあたり約20投稿
- 価格
- 1,000件あたり$0.07から
#APIによるハッシュタグ追跡の仕組み
ハッシュタグ追跡とは、ある期間に1つのタグが付いた公開投稿をすべて集め、その投稿を3つの答えに変えることです。1日ごとに何件あったか、誰が投稿したか、どの投稿が最も読まれたか、の3つです。ハッシュタグそのものを扱うXのAPIエンドポイントはありません。どのルートも検索を経由し、タグをクエリに書き込みます。
コードなしですぐ確認したいなら、無料のTwitterハッシュタグ分析ツールが、任意のタグの1時間ごとの投稿数、上位の発信者、上位投稿を直近24時間または7日間で表示します。このガイドの残りでは、同じレポートを、任意の期間と任意の数のタグに対して、コードで作ります。
検索クエリでは、#tidewaterdevdaysは、Xがハッシュタグとして認識した投稿に、大文字小文字を問わず一致します。単語だけのtidewaterdevdaysは、#を付けずに書いた投稿にも一致するので、タグ付きの投稿だけを数えるキャンペーンのレポートでは#を残します。タグは、文字、数字、アンダースコア以外の最初の文字で終わるため、#c++は#cというタグになります。日本語、アラビア語など、どの文字体系のタグでも書いたとおりに機能します。言語から最小いいね数まで、その他のフィルターは、Twitter検索コマンドのガイドにすべてあります。
検索には2つの順序があります。最新順は、一致するすべての投稿を新しいものから順にさかのぼるので、数えるのに向いています。人気順(Top)は最もエンゲージメントの高い一致だけを返すため、ベストオブのリストには向きますが、カウントには不向きです。
公式X APIにも件数を返すエンドポイントが2つあります。直近7日間のGET /2/tweets/counts/recentと、アーカイブ全体のGET /2/tweets/counts/allで、1分、1時間、1日ごとの合計を返します(Xの件数の概要(新しいタブで開きます))。返すのは数字だけで、投稿も、投稿者も、表示回数もありません。Xの注記には、件数が検索結果と正確には一致しないことがあるとも書かれています。誰がタグを広めたか、どの投稿がそれを運んだかを示す必要があるトラッカーは、投稿そのものを読み取ります。
#Sorsa APIで4ステップでハッシュタグを追跡する
Twitter(X)API兼スクレイピングツールであるSorsa APIは、Xの検索構文を1つのエンドポイントPOST /search-tweetsで実行し、すべての投稿を投稿者の完全なプロフィールとともに返します。ページを1回たどるだけで3つの出力がすべて得られるため、件数、投稿者のランキング、上位投稿に別々のリクエストは要りません。
ハッシュタグ追跡にはSorsa APIを使います。APIキーは1つで、開発者アカウントは不要です。投稿者付きで1リクエストあたり約20投稿、投稿1,000件あたり$0.07から、全プランで毎秒20リクエストです。
-
キーを取得します。 サインアップして、ダッシュボードからAPIキーをコピーします。最初の100リクエストは無料で、カードは不要です。
-
クエリを送ります。
queryにタグと期間を入れ、新しい投稿から順に取得します。#はURLエンコードせず、JSONボディにそのまま入れます。Terminal curl -X POST "https://api.sorsa.io/v3/search-tweets" \ -H "ApiKey: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query": "#tidewaterdevdays since:2026-10-19 until:2026-11-02", "order": "latest"}'Response200 OK { "tweets": [ { "id": "2115444854355529755", "full_text": "Day one of #tidewaterdevdays, slides below #devrel", "created_at": "2026-10-28T14:05:31Z", "lang": "en", "likes_count": 312, "retweet_count": 41, "reply_count": 18, "quote_count": 6, "view_count": 28410, "is_reply": false, "user": { "id": "1366674638239301632", "username": "maren_codes_at_night", "display_name": "Maren", "followers_count": 18240, "verified": false } } ], "next_cursor": "DAADDAABCgABHVvqb2SWYBsKAAIdW-l6pZbQkAAIAAIAAAAC" } -
カーソルをたどります。 カーソルのないレスポンスが返るまで、
next_cursorを次のリクエストのボディに入れて送り返します。ページサイズは一定ではないので、短いページではなく、カーソルがなくなったところで止めてください。403はキーがないか、リクエストを使い切ったことを意味します。429は1秒間に20を超えるリクエストを送ったことを意味するので、1秒待って再試行してください。 -
投稿をグループ化します。 投稿IDごとに1行を残し、日別と投稿者別に数えます。次のスクリプトが一連の処理をすべて行い、レポートを出力します。
import re from collections import Counter from datetime import datetime, timezone import requests URL = "https://api.sorsa.io/v3/search-tweets" HEADERS = {"ApiKey": "YOUR_API_KEY"} TAG = re.compile(r"#\w+") def collect(query): """Yield every post the search returns, newest first.""" body = {"query": query, "order": "latest"} while True: r = requests.post(URL, headers=HEADERS, json=body, timeout=30) r.raise_for_status() page = r.json() yield from page.get("tweets", []) cursor = page.get("next_cursor") if not cursor: return body["next_cursor"] = cursor def utc_day(post): stamp = post["created_at"].replace("Z", "+00:00") t = datetime.fromisoformat(stamp) return t.astimezone(timezone.utc).date().isoformat() def track(tag, since, until): posts = {} for p in collect(f"{tag} since:{since} until:{until}"): posts[p["id"]] = p # one row per post ID per_day, by_author, views, tags = Counter(), Counter(), Counter(), Counter() for p in posts.values(): per_day[utc_day(p)] += 1 by_author[p["user"]["username"]] += 1 views[p["user"]["username"]] += p.get("view_count") or 0 tags.update(m.lower() for m in TAG.findall(p["full_text"])) top = sorted(posts.values(), key=lambda p: p.get("view_count") or 0) return per_day, by_author, views, tags, top[::-1][:10] per_day, by_author, views, tags, top = track( "#tidewaterdevdays", "2026-10-19", "2026-11-02") for day, n in sorted(per_day.items()): print(day, n) print("Top authors:", by_author.most_common(5)) print("Most viewed:", views.most_common(5)) print("Related tags:", tags.most_common(10))
このエンドポイントのパラメータとレスポンスのフィールドは、POST /search-tweetsリファレンス(新しいタブで開きます)にあります。キーワード検索から投稿を見つけるほかの方法まで、ハッシュタグ以外の検索でできることは、Twitter検索APIのガイドを参照してください。
#ハッシュタグの投稿数を日別に数える
ハッシュタグを日別に数えるには、期間内のすべての投稿を最新順で読み取り、投稿IDごとに1行を残し、各投稿のcreated_atのUTC日付でグループ化します。クエリの日付が決めるのはどの投稿を取得するかだけで、どの日に数えるかを決めるのは各投稿の日付です。
この区別は境界で重要になります。since:とuntil:はUTCで動作し、until:は自分の日付を含まないため、since:2026-10-28 until:2026-10-29は10月28日の1日分です。真夜中に近い投稿は隣のウィンドウにも現れることがあります。そのためスクリプトは、ウィンドウを信頼せず、created_atで数えて、重複をIDで除外します。
長い期間は、1日1ウィンドウに分けると最も速く読み取れます。各日は互いに依存しないので並行して実行できます。キー1つで毎秒20リクエスト、つまり毎秒約400投稿を処理でき、1日5,000投稿のタグの1年分が約76分で読み取れます。履歴は2006年までさかのぼれるので、今日始めたトラッカーでも、今週のキャンペーンと同じ手軽さで昨年のキャンペーンを数えられます。
数え方を変えるクエリの選択が3つあるので、数字と一緒に書き留めておきましょう。
- リポスト。 Xの検索は、通常のリポストをデフォルトで除外し、返信は含めます。リポストも数えるには
include:nativeretweetsを追加し、retweeted_statusで区別します。 - 返信。 会話を始める投稿だけを数えるには
-filter:repliesを追加します。 - 表記ゆれ。 表記違いや関連タグは
ORでつなぎます:(#tidewaterdevdays OR #tidewater2026)。
この例では、架空のカンファレンスタグが10月19日の420投稿から、初日の10月28日に4,812投稿まで増え、14日間で合計約2万5,000投稿、9,214人の投稿者に達します。すべてを読み取るコストは、Sorsa APIで$1.76から、公式X APIでは$126です。
知っておきたいこと
Xはすべての投稿の日時をUTCで記録するため、レポートの1日はUTCの1日です。ニューヨークのチームにとって、現地時間の10月28日は、UTCの28日4時から29日4時までです。レポートを現地の日付に合わせたい場合は、グループ化する前に
created_atを自分のタイムゾーンに変換してください。
#上位の投稿者、投稿、関連ハッシュタグを調べる
上位の投稿者は、同じ投稿をuser.usernameでグループ化して求めます。各アカウントの投稿数を数え、表示回数といいねを合計してください。最も多く投稿するアカウントと、最も読まれるアカウントは、めったに一致しないからです。ハッシュタグのレポートに必要な指標はすべて、各投稿に付いてくるフィールドから得られるので、追加のリクエストは要りません。
| 指標 | 計算方法 | フィールド |
|---|---|---|
| 1日あたりの投稿数 | UTC日付ごとの投稿ID数 | created_at |
| 1時間あたりの投稿数 | UTC時間ごとの投稿ID数。急増の立ち上がりを見る | created_at |
| ユニークな投稿者数 | 重複を除いたアカウント数 | user.id |
| 投稿数による上位投稿者 | アカウントごとの投稿数 | user.username |
| リーチによる上位投稿者 | 各アカウントのフォロワー数 | user.followers_count |
| 表示回数 | タグ付き投稿の表示回数の合計 | view_count |
| エンゲージメント | いいね、リポスト、返信、引用 | likes_count、retweet_count、reply_count、quote_count |
| 言語 | 言語ごとの投稿数 | lang |
| 関連ハッシュタグ | テキスト内で見つかったタグ | full_text |
1日あたりの投稿数
- 計算方法
- UTC日付ごとの投稿ID数
- フィールド
created_at
1時間あたりの投稿数
- 計算方法
- UTC時間ごとの投稿ID数。急増の立ち上がりを見る
- フィールド
created_at
ユニークな投稿者数
- 計算方法
- 重複を除いたアカウント数
- フィールド
user.id
投稿数による上位投稿者
- 計算方法
- アカウントごとの投稿数
- フィールド
user.username
リーチによる上位投稿者
- 計算方法
- 各アカウントのフォロワー数
- フィールド
user.followers_count
表示回数
- 計算方法
- タグ付き投稿の表示回数の合計
- フィールド
view_count
エンゲージメント
- 計算方法
- いいね、リポスト、返信、引用
- フィールド
likes_count、retweet_count、reply_count、quote_count
言語
- 計算方法
- 言語ごとの投稿数
- フィールド
lang
関連ハッシュタグ
- 計算方法
- テキスト内で見つかったタグ
- フィールド
full_text
表示回数は、Xが各投稿の下に表示する数字です。タグ全体で合計すると、公開されている数字の中ではインプレッションに最も近く、多くのレポートが冒頭に掲げるフォロワー合計の「リーチ」より優れています。フォロワーが全投稿を見るわけではないからです。両方を保持し、どちらがどちらかを明記しましょう。
急増を信頼する前に、投稿数とユニークな投稿者数を比べてください。数十のアカウントから何千もの投稿が出ているなら、それは組織的な働きかけです。何千人もの人が1回ずつ使っているタグは、会話です。投稿者を投稿数ではなく表示回数で並べ替えると、たいていは本物の発信者が上位に来ます。
関連ハッシュタグは、投稿のテキストから得られます。entitiesフィールドが列挙するのはメディアとリンクで、タグではありません。そのためスクリプトは、正規表現でfull_textからすべての#wordを抜き出して数えます。キャンペーンのタグと最もよく並ぶものを見れば、クエリに加えるべき関連タグと、届いたコミュニティが分かります。
#ハッシュタグ追跡のコスト
ハッシュタグの投稿を読み取るコストは、Sorsa APIで1,000件あたり$0.07から、公式X APIで1,000件あたり$5.00です。約70倍の差で、これは投稿者への課金を含みません。2026年11月22日以降、Xは投稿とともに返される投稿者ごとに、ユーザー読み取りの料金$0.010を請求します。そのため、公式APIで投稿者付きの投稿を読み取ると1,000件あたり最大$15.00になります(10月23日のXのお知らせ(新しいタブで開きます))。Sorsa APIでは、投稿者のプロフィールがすべての投稿に追加料金なしで含まれます。
公式のルートでは、承認された開発者アカウント、OAuthアプリ、プリペイドのクレジットも必要です。従量課金プランは月300万件の投稿読み取りで止まり、それを超える活発なタグには月額約$42,000からのEnterprise契約が必要です(Xの料金表(新しいタブで開きます))。Sorsa APIはヘッダーにキーを1つ付けるだけで、Xのログイン情報を求めることはなく、投稿1,000件あたりの単価はプランが大きくなるほど下がります。
ハッシュタグの1日の投稿数
追跡期間
150K件のハッシュタグ投稿 全投稿者のプロフィール付き、1回読み取り
$750
公式X API
1,000投稿あたり$5.00
最大$2,250(11月22日以降は投稿者情報込み)
最安 $10.50
Sorsa API
1,000投稿あたり$0.07から
すべての投稿に投稿者情報を含む
約6分 Sorsa APIで毎秒20リクエストの場合の読み取り時間。 公式X APIでは、月間上限3M投稿に収まります。
タグの投稿量と追跡期間を選んでください。各カードは全投稿を1回ずつ読み取る料金で、Xの投稿者課金は価格の下の行です。
ほとんどのタグは見た目より小さいものです。1日数百投稿の製品やイベントのタグなら、追跡に必要なのは1日約15リクエストで、100回分の無料リクエストで約2,000投稿を読み取れます。料金を払う前にあらゆるタグの規模を把握するには十分です。
#ハッシュタグトラッカーを動かし続ける
トラッカーを最新に保つには、スケジュールで実行し、最後に保存した投稿より新しい投稿だけを、その投稿のIDをsince_id:に指定して取得します。#tidewaterdevdays since_id:2117039272883781709のようにします。すると各実行は新しいページだけを読み取るので、静かな1時間のコストは1リクエストです。
間隔はタグのペースに合わせて選びます。実施中のキャンペーンなら1時間ごと、ライブイベント中は数分ごとです。Sorsa APIはポーリングで動作し、ストリームもWebhookもありません。毎秒20リクエストなら、数十のタグのポーリングでも数秒で終わります。タグが急増したときにSlackやメールでアラートを送るには、Twitterのリアルタイム監視のガイドで、スケジューラーと配信を構築します。
各投稿はIDをキーにしたテーブルに保存し、同じ投稿をもう一度見たときは行を更新します。表示回数といいねは、投稿が現れてから数日間は増え続けるので、キャンペーンの最終的な数字を公表する前に、直近2〜3日分を再取得してください。
タグが急上昇するタイミングを知るには、気になる地域のXのトレンド一覧を確認します。GET /trendsは地域の現在のトレンド一覧を返し、その監視方法はTwitterトレンド APIのガイドで示しています。複数のタグを同時に追うには、タグごとに1つのクエリを並行して実行し、それぞれの件数を別々に保ちます。
#ハッシュタグの追跡を始める
ハッシュタグトラッカーとは、タグを最新順で検索し、全ページを1回ずつ読み取り、投稿をUTC日別と投稿者別に数えるものです。Sorsa APIは、すべての投稿者を含めて投稿1,000件あたり$0.07から読み取りを行い、全プランで毎秒20リクエスト、履歴は2006年までさかのぼれます。最初の2,000投稿は無料です。
#よくある質問
Twitterのハッシュタグを追跡するにはどのAPIを使うべきですか?
Sorsa APIです。POST /search-tweetsはXの検索コマンド付きのタグを受け取り、1リクエストで約20投稿を、投稿者の完全なプロフィール付きで返すため、日別の件数、上位の投稿者、上位投稿が同じページから得られます。コストは投稿1,000件あたり$0.07からで、公式X APIの$5.00に対して安く、全プランで毎秒20リクエスト、開発者アカウントの代わりにAPIキー1つで済みます。
Xにハッシュタグ用のAPIはありますか?
ありません。Xにはハッシュタグ専用のエンドポイントがなく、タグを追跡するには、検索エンドポイントのクエリに#tagと書いて検索します。公式X APIは、1分、1時間、1日ごとの合計を返す件数のエンドポイントも用意していますが、投稿、投稿者、表示回数は含まれないため、誰がタグを広めたかのランキングには、やはり投稿を読み取る必要があります。
ハッシュタグがTwitterで何回使われたかを知るには?
Xのアプリには、ハッシュタグの合計はどこにも表示されません。無料のTwitterハッシュタグ分析ツールは、最新の投稿からタグの1時間あたりの投稿数を推定します。任意の期間の正確な件数が必要なら、APIで最新順の検索ですべての投稿を読み取り、投稿IDごとに1行を残して日別に数えます。
ハッシュタグをリアルタイムで追跡できますか?
ポーリングでほぼリアルタイムにできます。手元にある最新の投稿をsince_id:に指定して、1分ごと、または数分ごとに検索を実行すれば、各実行がそれ以降に現れた投稿だけを返します。Sorsa APIにはストリーミングもWebhookもありません。毎秒20リクエストなら、多数のタグのポーリングでも数秒で完了します。
ハッシュタグはどこまでさかのぼって追跡できますか?
Sorsa APIでは2006年までです。クエリにsince:とuntil:の日付を加えれば、ほかの期間と同じように読み取れます。公式X APIの直近の検索と直近の件数は直近7日間が対象で、アーカイブのエンドポイントは従量課金とEnterpriseのアクセスでさらにさかのぼれますが、読み取った投稿1,000件あたり$5.00かかります。
複数のハッシュタグを同時に追跡できますか?
できます。ハッシュタグごとに1つの検索を並行して実行します。Sorsa APIではキー1つにつき毎秒20リクエストまでで、各タグが個別の件数を保てます。1つのクエリでORを使ってタグをつなぐことも可能で、その場合は合算した1つの件数になります。後で分けるには、投稿のテキストから各タグを探します。
#検証の方法
2026年11月2日に、Xの投稿件数エンドポイントのドキュメントと従量課金の料金表、expansionsの課金に関するXの10月23日のお知らせを読みました。このページのSorsa APIのリクエストはすべて、/search-tweetsと/trendsの稼働中のAPIリファレンスをもとに書いています。レスポンス、グラフ、アカウントは架空のデータによる例で、コストは料金ページにあるリクエスト単価から算出しました。