2026年7月更新:100回分の無料リクエストの開始オファーを追加し、料金を1,000件あたりのバッチレートで捉え直し、節約の数字を最大50分の1に標準化し、内部リンクを引き締め、すべてのエンドポイントを稼働中の API に対して再確認しました。
要点: Twitter エンゲージメント API は、ツイートのいいね、返信、引用、リツイートの数の背後にある人々とコンテンツを返します。公式 X API は返信を7日間の会話検索に制限し、リツイート者を100に上限を設けます。サードパーティの REST エンドポイントは、返信、引用、リツイート者のプロフィールをツイート URL で、カーソルページネーションとともに、年齢の制限なしに取得します。
いいね数は数字です。返信は人であり、意見であり、ときにはサポートチームが答えるべき質問です。ツイートの下部の集計された数は要約で、その下のエンゲージメントが実際のデータです。
本ガイドはそのデータを取り出します。ツイートの完全な指標のスナップショットを取得し、それから背後に人やテキストを持つ3つのエンゲージメントタイプに掘り下げます。コメント(返信)、引用ツイート、そしてリツイート者です。例は代替の Twitter/X API プロバイダーである Sorsa API を使います。公式 X API のエンゲージメント製品はエンタープライズの顧客にゲートされ、公開の回避策(フィルターされた会話検索)は直近7日間しか到達しないからです。Sorsa は、任意の年齢の任意の公開ツイートについて、直接のコメント、引用、リツイート者のエンドポイントを、すべてのプランで一律の毎秒20リクエストの単一の API キーの背後で公開し、読み取りの多い作業では公式 X API のリソース単位の料金より最大50分の1のコストで動きます。開発者アカウントの承認も、OAuth フローもありません。キーを貼り付けて取得するだけです。
Sorsa は2022年以来ビルドと運用を続け、50億を超えるリクエストを処理してきました。以下のパターンは実際の作業から来ています。チームを公式 API から移行する ことから、ブランド監視のウォールーム、規模でのキャンペーン検証、そして学術的な対話研究までです。すべてのコード例は素の requests を使うため、ラッパーライブラリなしに任意の Python プロジェクトに貼り付けられます。
目次
- ツイートのエンゲージメントとは何か?
- なぜ公式 X API からエンゲージメントデータを得るのは難しいのか?
- 公式 X API 対専用の Twitter エンゲージメント API
- どのエンゲージメントタイプが最も多くを教えるか?
- ツイートのエンゲージメント指標をどう取得するか?
- ツイートへのすべての返信をどう取得するか?
- ツイートの引用ツイートをどう取得するか?
- 誰がツイートをリツイートしたかどう見るか?
- 1つのツイートの完全なエンゲージメントレポートを作る
- 複数のツイートにまたがってエンゲージメントを比較する
- 規模でのエンゲージメント抽出はいくらかかるか?
- 特定のユーザーがエンゲージしたかどう検証するか?
- エンゲージメントデータのエクスポート
- 実践:ローンチのウォールームのための返信抽出
- よくある質問
- 始め方
ツイートのエンゲージメントとは何か? {#what-counts-as-tweet-engagement}
ツイートのエンゲージメントは5つの異なるアクションをカバーし、それぞれの API の表面は異なります。いいねと表示は数としてのみ公開されます。返信と引用ツイートは、テキスト、作者、指標を持つ完全なツイートオブジェクトを返します。リツイートは、リツイートが純粋な再配布なので別のテキストなしに、ツイートを増幅したユーザープロフィールを返します。
| エンゲージメントの種類 | それが何か | 取得できるもの |
|---|---|---|
| いいね | 匿名のハートのタップ | 数のみ(いいねした人のリストはもう公開されていない) |
| 返信(コメント) | テキスト付きのスレッド化された応答 | 完全なツイートオブジェクト:テキスト、作者、指標 |
| 引用ツイート | コメントを加えたリポスト | 完全なツイートオブジェクト:テキスト、作者、指標 |
| リツイート | 純粋な増幅、テキストなし | ユーザープロフィールのみ(ツイートコンテンツなし) |
| 表示/インプレッション | ツイートが何回描画されたか | 数のみ、元のツイートで |
ブックマーク数もツイート上の数として存在しますが、ブックマークした人は非公開です。いいねはかつていいねした人のフィードを公開していました。X(旧Twitter)は2024年6月にすべてのユーザーのいいねを非公開にしました。興味深い作業は、根底の人々とテキストに到達する3つの領域で起こります。返信、引用、リツイート者です。本ガイドの残りはそれらに焦点を当てます。
なぜ公式 X API からエンゲージメントデータを得るのは難しいのか? {#why-is-getting-engagement-data-from-the-official-x-api-hard}
公式 X API からエンゲージメントデータを得るのが難しいのは、数と根底のデータが異なる場所に住むからです。集計指標(いいね、リツイート、返信、引用、表示)は有料アクセスで v2 の public_metrics オブジェクトを通じて利用可能ですが、実際の返信、引用ツイート、リツイート者のリストは制限されています。返信は直近7日間に制限された会話検索を必要とし、リツイート者は100に上限が設けられ、専用のエンゲージメント製品はエンタープライズ限定です。
なので数は簡単な部分です。数を超えるものが欲しくなった瞬間に当たる3つの障害を、痛みの増す順で示します。
障害1:エンゲージメント API はエンタープライズ限定。 X のエンゲージメント API は、リクエストあたり最大250ツイートについて15以上のパフォーマンス指標(インプレッション、エンゲージメント、いいね、リツイート、引用、返信、動画の再生)を返します。しかしアクセスは、その公開の /totals エンドポイントを呼ぶ前でさえアプリに対して有効化されなければならず、その承認は月数千ドルの料金でエンタープライズの営業を通じて動きます。ほとんどのチームには始めることすらできず、そしてそれでも返信と引用そのものではなく指標を返します。
障害2:実際の返信を得るには会話検索の回避策が必要。 公開の X API に /tweets/:id/replies エンドポイントはありません。返信を収集するには、最近の検索を conversation_id:<tweet_id> で照会し、replied_to の参照でフィルターします。これは2つのハードな制限とともに動きます。最近の検索は直近7日間しか到達せず、従量課金のレート制限はきついです。より古い返信への唯一の経路である完全アーカイブ検索は、エンタープライズアクセスと、X が2026年に新規登録に閉じたレガシー層に束ねられているため、1週間より古いツイートには、それなしに返信を得られません。それらの制限の背景は、2026年の Twitter API レート制限 をご覧ください。
障害3:リツイートしたユーザーのエンドポイントは上限がありレート制限される。 GET /2/tweets/:id/retweeted_by は存在しますが、最初の100リツイート者しか返さず、15分あたりおよそ75リクエストに制限されます。数千のリツイートを持つバイラルなツイートには、サンプルとそれ以上は得られません。専用の引用ツイート照会エンドポイントも1ページ100に上限が設けられ、レート制限されます。
3つすべてにまたがるパターン:数は安く、根底のデータはゲートされ、時間で区切られ、または上限が設けられています。その料金の背後のより深い理由は、なぜ公式 X API はこれほど高いか をご覧ください。
公式 X API 対専用の Twitter エンゲージメント API {#official-x-api-vs-a-dedicated-twitter-engagement-api}
実用的な違いは課金単位と到達範囲です。公式 X API は取得したリソース単位で課金し、根底の返信、引用、リツイート者を時間の窓、上限、エンタープライズアクセスの背後にゲートします。専用のサードパーティのエンゲージメント API は、リクエスト単位で課金し、完全なオブジェクトをツイート URL で直接返し、年齢にかかわらず任意の公開ツイートで動きます。
以下の表は、Sorsa 自身の制限も含めて、両側の実際の数字を使います。Sorsa は読み取り専用です。投稿、いいね、フォロー、DM の送信をしないため、どんな書き込みワークフローも依然として公式 API に属します。
| 機能 | 公式 X API | Sorsa API |
|---|---|---|
| ツイートの下の返信(コメント)のテキスト | 会話検索、直近7日間のみ(完全アーカイブ:エンタープライズまたはレガシー層) | /comments、任意の公開ツイート、任意の年齢 |
| 引用ツイート | 引用ツイート照会、1ページ100、レート制限あり | /quotes、カーソルページネーション、任意の年齢 |
| リツイート者のリスト | retweeted_by、最大100ユーザー、15分あたり約75リクエスト | /retweeters、完全なプロフィール、100を超えるカーソルページネーション |
| 集計された数(いいね、RT、返信、引用、表示) | 有料アクセスで v2 public_metrics | /tweet-info が返す、作者プロフィール無料込み |
| 書き込みアクション(投稿、いいね、フォロー、DM) | あり(投稿と DM;フォロー/いいね/引用はエンタープライズ) | なし(読み取り専用) |
| 認証 | OAuth 2.0 ベアラー、またはエンゲージメント API には OAuth 1.0a | 単一の ApiKey ヘッダー |
| 課金単位 | リソース単位:投稿読み取りあたり$0.005、ユーザー読み取りあたり$0.010 | リクエスト単位:1呼び出し = 1リクエスト、フラット |
| 作者プロフィール付きの20返信 | 約$0.30(20投稿読み取りに20作者プロフィール) | $0.00199(1リクエスト、Proプラン) |
| レート制限 | エンドポイントと層により変動 | 一律の毎秒20リクエスト、すべてのプラン |
| アクセス | 開発者アカウント、プロジェクト、承認 | 約3分で API キー、承認なし |
集計された数をひと握り読むだけでよく、すでに公式 API で動いているなら、public_metrics が低い量でそれをカバーします。返信、引用、リツイート者のプロフィールそのものが、規模で、または1週間より古いツイートで必要になった瞬間、リソース単位の請求と上限が偶発的でなくなります。それが、フラットレートのエンゲージメント API が頼れる完全な選択肢になるゾーンで、読み取りの多いエンゲージメント作業に Sorsa を推奨する理由です。両側の完全な料金は、Sorsa の料金ページ と 2026年の Twitter API 料金の内訳 にあります。
どのエンゲージメントタイプが最も多くを教えるか? {#which-engagement-type-tells-you-the-most}
すべてのエンゲージメントが等しく情報を持つわけではありません。リツイートは最も少ないシグナルを運びます。リツイートはコメントのない1クリックで、到達を測るのに有用ですが、なぜかを理解するには弱いです。返信は中程度のシグナルで、テキストに満ちていますがノイズにも満ちています。引用ツイートは最も多くを運びます。引用は労力がかかるからです。ユーザーは自分の枠組みを加え、それを自分のオーディエンスにブロードキャストしました。
リツイートは最も低いシグナル密度です。 ユーザーはなぜ共有したかを説明しませんでした。1つのことを学びます。この人は自分のオーディエンスがこれを見るべきだと決めた、と。到達には良く、理由には薄いです。
コメントは中程度のシグナルです。 返信はテキストを含み、それは感情、質問、反論、訂正を意味します。それらはまた、低品質の「一番乗り」の返信、スパム、通りすがりの批判が住む場所です。量は多く、平均の品質は低いです。
引用ツイートは最も高いシグナル密度です。 引用のテキストは通常内容があります。支持、批評、反論、「これはひどく古びた」です。PR、競合インテリジェンス、コンテンツ分析には、引用が本当の会話が起こる場所で、ツイートが予期しない方向に旅できる場所です。各引用が引用者のフィードの中の新しいトップレベルの投稿だからです。
エンゲージメントのダッシュボードを作るとき、定性的な分析ではコメントやリツイートよりも引用ツイートをはるかに重く重み付けします。正確な比率は重要ではありません。ポイントは、これら3つのタイプにまたがって量と重要性が逆方向に走ることです。
ツイートのエンゲージメント指標をどう取得するか? {#how-do-you-get-a-tweets-engagement-metrics}
ツイートのエンゲージメント指標(いいね、リツイート、返信、引用、表示、ブックマーク)は、その数を付けたツイートオブジェクトを返す単一のツイート照会の呼び出しから来ます。集計された数は取得する最も安いデータです。より深い作業は、その背後の人々とテキストが欲しくなったときに始まります。まずスナップショットを取得し、それから掘り下げます。
ツイートデータエンドポイント は、作者を含む完全なツイートオブジェクトを返します。それらの数を読み比較することのより深い見方は、ツイート指標 API ガイド をご覧ください。
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": API_KEY, "Content-Type": "application/json"}
def get_tweet(tweet_link: str) -> dict:
resp = requests.post(
f"{BASE}/tweet-info",
headers=HEADERS,
json={"tweet_link": tweet_link},
)
resp.raise_for_status()
return resp.json()
tweet = get_tweet("https://x.com/elonmusk/status/1234567890")
print(f"Author: @{tweet['user']['username']}")
print(f"Text: {tweet['full_text'][:100]}")
print(f"Likes: {tweet.get('likes_count', 0):,}")
print(f"Retweets: {tweet.get('retweet_count', 0):,}")
print(f"Quotes: {tweet.get('quote_count', 0):,}")
print(f"Replies: {tweet.get('reply_count', 0):,}")
print(f"Views: {tweet.get('view_count', 0):,}")
print(f"Bookmarks: {tweet.get('bookmark_count', 0):,}")
一度に多くのツイートの指標には、リクエストあたり最大100件のツイート ID を受け付け1回の呼び出しと数えるバッチツイートエンドポイントを使います。Proプランでは、それがツイートあたりのコストをおよそ$0.00002にし、数千の投稿を分析するとき重要になります。
ツイートへのすべての返信をどう取得するか? {#how-do-you-get-all-the-replies-to-a-tweet}
ツイートへの返信は、そのツイートの下のコメントスレッドをページネーションすることで取得します。公式 X API に返信エンドポイントはないため、返信は直近7日間に制限された会話検索から来ます。専用のコメントエンドポイントは代わりに、任意の公開ツイートについて、完全な返信オブジェクト(テキスト、作者、指標)を、ページごとに、年齢の制限なしに返します。
ツイートコメントエンドポイント は1ページあたり最大20返信を返し、Relevance、Recency、または Likes の order_by を受け付けます。next_cursor でループしてすべての返信を取得します。
def get_comments(tweet_link, order="Relevance", max_pages=None):
comments, cursor, pages = [], None, 0
while True:
payload = {"tweet_link": tweet_link, "order_by": order}
if cursor:
payload["next_cursor"] = cursor
data = requests.post(f"{BASE}/comments", headers=HEADERS, json=payload).json()
comments.extend(data.get("tweets", []))
cursor = data.get("next_cursor")
pages += 1
if not cursor or (max_pages and pages >= max_pages):
break
return comments
replies = get_comments("https://x.com/user/status/123", order="Likes", max_pages=10)
print(f"Pulled {len(replies)} replies")
返信データで何ができるか
各返信は完全なツイートオブジェクトです。テキスト、エンゲージメント指標、そして作者プロフィールです。それがいくつかのパターンを解き放ちます。
- 感情と意図の分類。 返信のテキストを感情モデルや LLM に通して、称賛、苦情、質問を分けます。Twitter 感情分析ガイド が収集と分類のパイプラインを案内します。
- サポートのトリアージ。 疑問符や既知の意図のフレーズを含む返信をフィルターし、サポートのキューにルーティングします。
- インフルエンサーの表面化。 返信者を
followers_countでソートして、どの著名なアカウントがスレッドでエンゲージしたかを見つけます。 - スパムのフィルター。 分析の前に、直近1週間に作成されたほぼゼロのフォロワーを持つアカウントからの返信を落とします。同じヒューリスティックが、フォロワーグラフレベルで偽物とボットアカウントの監査を駆動します。
ツイートの引用ツイートをどう取得するか? {#how-do-you-get-the-quote-tweets-for-a-tweet}
引用ツイートは完全なツイートオブジェクトとして取得します。引用は、元のものを埋め込み引用者自身のコメントを加える新しい投稿だからです。公式 X API は1ページ100に上限が設けられレート制限された引用ツイート照会を公開します。専用の引用エンドポイントは、その上限なしでページネーションし、任意の年齢のツイートで動きます。
引用ツイートエンドポイント は1ページあたり最大20引用を返します。next_cursor でそれらをページネーションします。
def get_quotes(tweet_link, max_pages=None):
quotes, cursor, pages = [], None, 0
while True:
payload = {"tweet_link": tweet_link}
if cursor:
payload["next_cursor"] = cursor
data = requests.post(f"{BASE}/quotes", headers=HEADERS, json=payload).json()
quotes.extend(data.get("tweets", []))
cursor = data.get("next_cursor")
pages += 1
if not cursor or (max_pages and pages >= max_pages):
break
return quotes
到達とトーンのために引用ツイートを分析する
各引用がその作者のフォロワー数と自身のテキストを運ぶため、引用を到達したオーディエンスでランク付けし、上部の枠組みを読めます。
quotes = get_quotes("https://x.com/user/status/123", max_pages=10)
top = sorted(
quotes,
key=lambda q: q.get("user", {}).get("followers_count", 0),
reverse=True,
)[:10]
for q in top:
u = q["user"]
print(f"@{u['username']} ({u.get('followers_count', 0):,} followers): {q['full_text'][:90]}")
ブランド監視には、これが始める正しい場所です。20万フォロワーのジャーナリストや競合の幹部からの引用は、まさに Slack のアラートを引き起こすべき種類のシグナルです。よくあるパターンは、しきい値(引用者のフォロワー数が5万を超える、または引用者がキュレーションされた業界リストにいる)で、それらの引用をライブ監視のワークフローのためのレビューチャンネルにルーティングするものです。
誰がツイートをリツイートしたかどう見るか? {#how-do-you-see-who-retweeted-a-tweet}
ツイートのリツイート者は、リツイートに独立したテキストがないため、ユーザープロフィールとして返されます。公式 X API は retweeted_by をツイートあたり100ユーザーに上限を設け、15分あたりおよそ75リクエストに制限するため、バイラルなツイートではサンプルしか見られません。専用のリツイート者エンドポイントは100を超えてページネーションし、素の ID ではなく完全なプロフィールを返します。
リツイート者リストエンドポイント は、新しい順にユーザープロフィールを、次のページ用の next_cursor とともに返します。
def get_retweeters(tweet_link, max_pages=None):
users, cursor, pages = [], None, 0
while True:
payload = {"tweet_link": tweet_link}
if cursor:
payload["next_cursor"] = cursor
data = requests.post(f"{BASE}/retweeters", headers=HEADERS, json=payload).json()
users.extend(data.get("users", []))
cursor = data.get("next_cursor")
pages += 1
if not cursor or (max_pages and pages >= max_pages):
break
return users
リツイート者からのオーディエンス分析
リツイート者は、アカウントを誰が増幅するかをプロファイルする最もきれいな方法です。各エントリーが完全なユーザーオブジェクトなので、ツイートを共有したオーディエンスを要約できます。
retweeters = get_retweeters("https://x.com/user/status/123", max_pages=20)
verified = [u for u in retweeters if u.get("verified")]
big = [u for u in retweeters if u.get("followers_count", 0) > 10_000]
print(f"{len(retweeters)} retweeters, {len(verified)} verified, {len(big)} with 10k+ followers")
同じプロフィールをさらに進める(地理、アカウントの年齢、フォロワーのフォロワーの重複)には、これを完全なフォロワーグラフのエンドポイントと組み合わせます。
1つのツイートの完全なエンゲージメントレポートを作る {#building-a-full-engagement-report-for-one-tweet}
完全なエンゲージメントレポートは、1つの指標のスナップショットを各エンゲージメントタイプのサンプルと組み合わせるため、単一のツイートの到達と反応が1つのオブジェクトに着地します。数を取得し、それから返信、引用、リツイート者を取得し、それらを一緒に要約します。
def engagement_report(tweet_link):
tweet = get_tweet(tweet_link)
comments = get_comments(tweet_link, max_pages=5)
quotes = get_quotes(tweet_link, max_pages=5)
retweeters = get_retweeters(tweet_link, max_pages=5)
print(f"Tweet by @{tweet['user']['username']}")
print(f" likes={tweet.get('likes_count', 0):,} "
f"retweets={tweet.get('retweet_count', 0):,} "
f"quotes={tweet.get('quote_count', 0):,} "
f"replies={tweet.get('reply_count', 0):,}")
print(f"Sampled {len(comments)} replies, {len(quotes)} quotes, "
f"{len(retweeters)} retweeters")
top_quotes = sorted(
quotes,
key=lambda q: q.get("user", {}).get("followers_count", 0),
reverse=True,
)[:5]
for q in top_quotes:
u = q["user"]
print(f" quote @{u['username']} ({u.get('followers_count', 0):,}): {q['full_text'][:70]}")
return {
"tweet": tweet,
"comments": comments,
"quotes": quotes,
"retweeters": retweeters,
}
各タイプ5ページはサンプルで、完全なスレッドではありません。すべてをページネーションするには max_pages を上げるか取り除きます。フラットなプランでは、それはレート制限との戦いではなく予算の選択です。すべてのページが同じ毎秒20の天井に対する1リクエストです。
複数のツイートにまたがってエンゲージメントを比較する {#comparing-engagement-across-multiple-tweets}
ツイートにまたがるエンゲージメントの比較は、バッチの指標呼び出しで最も効率的です。1リクエストが最大100ツイートの数を返し、メモリの中で比率を導きます。有用な発見は、どのツイートが生のエンゲージメントで勝ったかではめったになく、どのツイートが異なるエンゲージメントの形を持ったかです。
def get_metrics_bulk(tweet_links):
data = requests.post(
f"{BASE}/tweet-info-bulk",
headers=HEADERS,
json={"tweet_links": tweet_links},
).json()
return data.get("tweets", [])
def compare_tweets(tweet_links):
rows = []
for t in get_metrics_bulk(tweet_links):
likes = t.get("likes_count", 0) or 1
rows.append({
"id": t["id"],
"likes": t.get("likes_count", 0),
"replies": t.get("reply_count", 0),
"quotes": t.get("quote_count", 0),
"retweets": t.get("retweet_count", 0),
"reply_to_like": round(t.get("reply_count", 0) / likes, 3),
"quote_to_like": round(t.get("quote_count", 0) / likes, 3),
})
return sorted(rows, key=lambda r: r["reply_to_like"], reverse=True)
返信対いいねの比率が高いツイートは会話を始めるものです。引用対いいねの比率が高いものは、しばしば論争的な何かを示します。可視性には良く、ときにブランドには悪いです。リツイート対返信の比率が高いものはブロードキャストのコンテンツで、同意でき共有できますが議論を駆動しません。それらの比率は、どの単一の数よりもコンテンツ戦略について多くを教えます。
規模でのエンゲージメント抽出はいくらかかるか? {#what-does-engagement-extraction-cost-at-scale}
エンゲージメント抽出は速く膨れ上がります。単一のバイラルなツイートが5万返信を運ぶかもしれず、ブランドの完全なタイムラインの監査は数万の呼び出しになり得ます。2つのことがフラットレートのプランでそれを手頃に保ちます。すべてのエンドポイントが何を返そうと1リクエストと数え、そして単一のバッチ呼び出しが最大100ツイートをカバーします。
Proプランでは月額$199で100,000リクエストを得て、バッチエンドポイントに頼ると数百万のツイートに十分です。最大100ツイートの1回のバッチ呼び出しが1リクエストと数えるからです。公式 X API は異なる形を取ります。従量課金のアカウントは月200万投稿読み取りに制限され、投稿読み取りあたり$0.005に作者プロフィールあたり$0.010を加えて課金するため、読み取りの多いエンゲージメントのワークロードは、ハードな天井と速く上がる請求の両方にぶつかります。フラットなモデルには、リソース単位の課金も200万の上限もありません。
一律の毎秒20リクエストが、すべての Sorsa のエンドポイントとすべてのプランに適用されます。エンドポイント別の窓も、15分のリセットも、予期しない切断もありません。それに当たると 429 を得ます。1秒待ってリトライします。深い監査(たとえば5万返信をページネーションする)には、50ミリ秒間隔でリクエストの間隔を空けるか小さなセマフォを使ってそれを持続し、より高い制限がリクエストで利用可能です。
特定のユーザーがエンゲージしたかどう検証するか? {#how-do-you-verify-a-specific-user-engaged}
単一のユーザーのエンゲージメントの検証は、エンゲージした全員を列挙するのとは異なる質問です。1つのユーザー名を見つけるためにすべてのリツイート者をページネーションするのは呼び出しを無駄にします。専用の検証エンドポイントは1リクエストで yes/no を返し、それが懸賞のチェック、キャンペーンのコンプライアンス、アンバサダープログラムに正しいツールです。
規模での 懸賞とキャンペーンの検証 には、3つのエンドポイントがよくあるケースに答え、いくつのコメント、引用、リツイートが存在しようとそれぞれ1リクエストです。
/check-comment:このユーザーはツイートに返信したか?/check-quoted:このユーザーはツイートを引用したか?/check-retweet:このユーザーはツイートをリツイートしたか?
def did_user_comment(tweet_link, username):
resp = requests.get(
f"{BASE}/check-comment",
headers=HEADERS,
params={"tweet_link": tweet_link, "username": username},
)
return resp.json().get("commented", False)
2,000人の参加者と3つの必須アクションを持つキャンペーンには、それは6,000呼び出しで、Starterプランに余裕で収まります。フォローのチェックを含む完全なパターンは、Twitter エンゲージメント検証ガイド にあります。
エンゲージメントデータのエクスポート {#exporting-engagement-data}
エンゲージメントのエンドポイントは JSON を返しますが、ほとんどの分析はスプレッドシート、データフレーム、またはデータベースで起こります。返信のための最小限の CSV エクスポーター、引用(これもツイートオブジェクト)に再利用できるものが、動くファイルに速く到達させます。
import csv
def export_comments_csv(comments, path="comments.csv"):
fields = [
"comment_id", "created_at", "full_text",
"likes", "retweets", "reply_count",
"author_username", "author_followers", "author_verified",
]
with open(path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
for c in comments:
u = c.get("user", {})
writer.writerow({
"comment_id": c["id"],
"created_at": c["created_at"],
"full_text": c["full_text"],
"likes": c.get("likes_count", 0),
"retweets": c.get("retweet_count", 0),
"reply_count": c.get("reply_count", 0),
"author_username": u.get("username", ""),
"author_followers": u.get("followers_count", 0),
"author_verified": u.get("verified", False),
})
リツイート者には、フィールドをユーザー属性(username、display_name、followers_count、verified、created_at)に入れ替えます。より大きなジョブには、代わりにデータベースに書きます。生のペイロード用の jsonb 列にいくつかのインデックス付きの列(tweet_id、author_id、created_at、likes_count)を加えた Postgres が、数千万の行を快適に扱います。エンゲージメントデータを他のソーシャルシグナルと時間をまたいで結合しているなら、過去の Twitter データガイド がアーカイブのパターンを扱います。
実践:ローンチのウォールームのための返信抽出 {#in-practice-reply-extraction-for-a-launch-war-room}
あるおよそ12人規模のソーシャル分析チームが、消費者ブランドのローンチのウォールームを運用する中で Sorsa に相談してきました。その課題は、製品ローンチ中のクライアントのツイートに付く返信の抽出で、ソーシャルリスニング のライブの最前線でした。公式の会話検索は7日間しか到達しなかったため、1週間より古いローンチのどんな振り返りも不可能で、ライブのローンチ中のリソース単位の課金が日次の支出を予測しにくくしました。
このチームは返信、引用、リツイート者の取得を、フラットなプランの3つのエンドポイント呼び出しに移しました。2つのことが変わりました。到達可能な履歴が7日間から完全な公開アーカイブになったため、ローンチ後の振り返りが行き止まりでなくなりました。そして Sorsa がリソース単位ではなくリクエスト単位で課金するため、請求の読み取り部分は、この種の量ではリソース単位のコストに対してフラットなリクエスト単位の料金が生む差、つまり読み取りの多い作業で最大50分の1のコストにまで落ちました。決め手は巧妙なトリックではなく、時間の窓とレコード単位の課金メーターを取り除いたことでした。
よくある質問 {#frequently-asked-questions}
Twitter API でツイートへのすべての返信を取得できる?
返信エンドポイントを持たない公式 X API では直接にはできません。サポートされた回避策は conversation_id での最近の検索のクエリで、エンタープライズの完全アーカイブアクセスを持たない限り直近7日間に制限されます。Sorsa のようなサードパーティ API は、ツイートの年齢にかかわらず、カーソルページネーションとともに任意の公開ツイートの返信を返す直接のコメントエンドポイントを公開します。
リツイートと引用ツイートの違いは?
リツイートは元のツイートを、テキストを加えずにそのまま再配布するため、API はリツイート者のプロフィールだけを返します。引用ツイートは、元のものを埋め込み引用者自身のコメントを加える新しいツイートなので、自身のテキスト、エンゲージメントの数、作者を持つ完全なツイートオブジェクトとして返ってきます。分析には、引用はリツイートよりはるかに情報を持ちます。
誰がツイートをリツイートしたかどう見る?
公式 X API のエンドポイント retweeted_by はリツイート者を返しますが、結果をツイートあたり100ユーザーに上限を設け、呼び出しを15分あたりおよそ75に制限するため、バイラルなツイートではサンプルしか得られません。Sorsa のリツイート者エンドポイントは、その上限を超えて next_cursor でページネーションし、数値の ID だけでなく完全なユーザープロフィールを返します。
X API はツイートのコメントを見せる?
公式 X API に、ツイートのコメントのエンドポイントはありません。返信は conversation_id を使う検索エンドポイントを通じてのみ到達可能で、従量課金アクセスでは直近7日間しか到達しません。これは、投稿のコメントの取得がファーストクラスの操作である他のソーシャルプラットフォームから来るほとんどの開発者を驚かせます。
API はリクエストあたり何件の返信を返せる?
Sorsa のコメント、引用、リツイート者のエンドポイントは1ページあたり最大20件の結果を返し、next_cursor を通じたページネーションは無制限なので、任意の年齢のツイートのすべての返信をループで取得できます。公式 X API の最近の検索は1ページあたり最大100件の結果を返しますが、リクエストのレート制限と7日間の窓によって制約されます。
古いツイートのエンゲージメントデータを取得できる?
Sorsa では、yes。コメント、引用、リツイート者のエンドポイントは、年齢にかかわらず任意の公開ツイートで動きます。公式 X API では、承認と大きなコストを必要とするエンタープライズの完全アーカイブ検索を持たない限り、返信は直近7日間に投稿されたツイートについてのみ取得可能です。古いツイートの集計された数は、いずれにせよ利用可能なままです。
ツイートのエンゲージメントデータを取得する無料の方法はある?
公式 X API は2026年に無料枠がなく、その従量課金モデルは最初の呼び出しから課金するため、エンゲージメントデータ(投稿に作者プロフィール)の読み取りは速く積み上がります。Sorsa はすべての新規アカウントに100回分の無料リクエストを与えます。1回限り、クレジットカード不要・有効期限なしで、40個のエンドポイントすべてをカバーし、プランにコミットする前に実際のツイートで返信、引用、リツイート者を取得するのに十分です。Sorsa API の playground も、エンドポイントをブラウザから実行するため、コードを書く前にデータを調べられます。
API データからエンゲージメント率をどう計算する?
エンゲージメント率は通常、(いいね + 返信 + リツイート + 引用)をインプレッションで割ったもの、またはインプレッションが利用不可のときはフォロワー数で割ったものです。ツイートオブジェクト上の view_count フィールドは、2022年12月以降の投稿にインプレッションを供給します。コードを書かずにアカウントの最近のツイートにまたがってそれを計算するには、無料の エンゲージメント率計算機 を使います。
始め方 {#getting-started}
これを自分のツイートで試すには:
- 開発者アカウントの承認なしで、約3分でサインアップして API キーを取得します。すべてのアカウントは100回分の無料リクエストで始まります。1回限り、クレジットカード不要・有効期限なしで、40個のエンドポイントすべてをカバーし、バッチ経由で最大10,000ツイートまたは20,000プロフィールに十分です。有料の利用はバッチベースで安く留まり、1,000ツイートあたり$0.02、1,000プロフィールあたり$0.01から、そしてすべてのプランが一律の毎秒20リクエストですべてのエンドポイントを含みます。
- コードなしで インタラクティブな API playground でエンドポイントをテストするか、Sorsa API のドキュメント で完全な仕様を読みます。
- 本ガイドのコードを Python のスクリプトに落とし込み、自分のツイート URL を入れ替え、実行します。
既存のパイプラインを公式 X API から移しているなら、移行ガイドがリクエストの変更をエンドポイントごとに対応付けます。掲載されたプランを超える量には、カスタムのレート制限について 営業に相談 してください。質問は Discord または contacts@sorsa.io で歓迎します。
監修:Keksich(Sorsa創業者、マーケター兼X APIリサーチャー)
本ガイドは Sorsa 編集チームによって執筆・検証され、2026年7月に最後にレビューされました。2022年以来本番で代替の Twitter/X API をビルドして運用してきた Sorsa 自身の作業、ここに記述したエンドポイントを稼働中の API に対してテストすること、そして現行の公開ドキュメントに基づいています。エンドポイントの挙動と制限には Sorsa API のドキュメント、エンゲージメント API とリツイートしたユーザーのエンドポイントには公式の X 開発者ドキュメントです。公式 X API のコストの数字は、2026年4月の更新時点の X の公開されたリソース単位の料金に対して確認しました。X のアクセスモデルとプラットフォームの歴史の詳細(無料枠なし、完全アーカイブ検索は今やエンタープライズ限定、公開の表示数は2022年12月から、プラットフォーム全体の非公開のいいねは2024年6月から)は、現行の報道と X のドキュメントに対して確認しました。エンドポイント名、パラメータ、レスポンスのフィールドは、稼働中の Sorsa API に対して再確認しました。チームについての詳細は 会社概要ページ にあります。