APIでTwitterのフォローとリツイートを確認する方法
APIによるXのフォロー、リツイート、引用、リプライの確認とは、1つのアカウントと1つのアクションを照合してtrueかfalseを返す処理です。公式X APIにはこうした確認がなく、リスト全体を読み取るため1アカウントあたり$0.010かかります。
要点: アクションごとに専用の確認があります。フォロー、リツイート、引用、リプライ、コミュニティ参加です。いいねには確認がありません。2024年6月以降、誰がいいねしたかを見られるのは投稿の作者だけだからです。Sorsa APIは各確認を1リクエストで返します。POST /check-follow ほか4つのエンドポイントで、1,000回の確認あたり$1.40からです。100回分の無料リクエストで最初の100回をまかなえます。
- 確認エンドポイント
/check-followほか4つ- 1確認あたり
- 1リクエスト
- 価格
- 1確認あたり$0.0014から
#Xで確認できること、できないこと
Xの5つのアクションは公開されているため、APIで1アカウントずつ確認できます。フォロー、リツイート、引用、リプライ、コミュニティのメンバーシップです。ここでの確認とは、あるアカウントが何かを行った証明を指します。たとえば、あなたをフォローした、投稿をリポストした、といったことです。Xの青いチェックマークとは関係ありません。
アカウント1組だけなら、無料の相互フォロー確認ツールでコードなしに、一方が他方をフォローしているかを双方向で確認できます。投稿のリポスト、返信、引用から当選者を抽選するなら、無料のX(Twitter)抽選ツールが、抽選された各当選者のフォローを確認します。キャンペーンの応募者全員を確認するにはAPIが必要です。
いいね以外のタスクはすべて証明できますが、公式X APIはどれも直接は証明できません。検索するためのリストを返すだけで、コミュニティのメンバーシップに至っては対応するルートがまったくありません。
| タスク | 確認に必要なもの | 公式X APIのルート |
|---|---|---|
| アカウントをフォローした | 双方のハンドル | フォロー中またはフォロワーのリストを読み取る |
| 投稿をリツイートした | 投稿リンクとハンドル | 投稿のリツイートしたユーザーを1ページ100件で読み取る |
| 投稿を引用した | 投稿リンクとハンドル | 投稿の引用を読み取る |
| 投稿に返信した | 投稿リンクとハンドル | 投稿の会話を検索する |
| Xコミュニティに参加した | コミュニティとハンドル | エンドポイントなし |
| ハンドルの所有者である | ハンドルと本人が投稿するコード | アカウントの投稿を読み取る |
| 投稿にいいねした | 確認不可 | いいねしたユーザーが見られるのは投稿の作者だけ |
アカウントをフォローした
- 確認に必要なもの
- 双方のハンドル
- 公式X APIのルート
- フォロー中またはフォロワーのリストを読み取る
投稿をリツイートした
- 確認に必要なもの
- 投稿リンクとハンドル
- 公式X APIのルート
- 投稿のリツイートしたユーザーを1ページ100件で読み取る
投稿を引用した
- 確認に必要なもの
- 投稿リンクとハンドル
- 公式X APIのルート
- 投稿の引用を読み取る
投稿に返信した
- 確認に必要なもの
- 投稿リンクとハンドル
- 公式X APIのルート
- 投稿の会話を検索する
Xコミュニティに参加した
- 確認に必要なもの
- コミュニティとハンドル
- 公式X APIのルート
- エンドポイントなし
ハンドルの所有者である
- 確認に必要なもの
- ハンドルと本人が投稿するコード
- 公式X APIのルート
- アカウントの投稿を読み取る
投稿にいいねした
- 確認に必要なもの
- 確認不可
- 公式X APIのルート
- いいねしたユーザーが見られるのは投稿の作者だけ
Xは2024年6月11日にいいねを非公開にしました。投稿の作者には誰がいいねしたかが引き続き表示されますが、それ以外の人には表示されません(Engadget、X Engineeringの発表を引用(新しいタブで開きます))。「この投稿にいいねする」という条件は、リツイート、引用、リプライのいずれかに置き換えましょう。この3つはどれも公開されたままで、確認できます。
#Sorsa APIの6つの確認、どれも1リクエスト
キャンペーンのタスクを応募者ごとに確認するなら、Twitter(X)API兼スクレイピングツールであるSorsa APIを使います。各確認は1リクエストでtrueかfalseを返し、1確認あたり$0.0014からです。APIキーは1つ、OAuthは不要、毎秒20リクエストの上限は全プラン共通です。
5つのエンドポイントが5つの公開アクションに対応し、6つ目のリクエストが応募者の最新の投稿を読み取って所有確認コードを探します。
| タスク | Sorsa APIのリクエスト | 返ってくるもの |
|---|---|---|
| あなたのアカウントをフォローした | POST /check-follow | follow:trueまたはfalse |
| あなたの投稿をリツイートした | POST /check-retweet | retweetと、最新100件より先を見るためのnext_cursor |
| あなたの投稿を引用した | POST /check-quoted | status:quoted、retweet、not_foundのいずれかと、引用のテキスト |
| あなたの投稿に返信した | GET /check-comment | commentedと、返信そのもの |
| あなたのXコミュニティに参加した | POST /check-community-member | is_member:trueまたはfalse |
| ハンドルの所有者である | POST /user-tweets | 最新の投稿。ここでコードを探す |
あなたのアカウントをフォローした
- Sorsa APIのリクエスト
POST /check-follow- 返ってくるもの
follow:trueまたはfalse
あなたの投稿をリツイートした
- Sorsa APIのリクエスト
POST /check-retweet- 返ってくるもの
retweetと、最新100件より先を見るためのnext_cursor
あなたの投稿を引用した
- Sorsa APIのリクエスト
POST /check-quoted- 返ってくるもの
status:quoted、retweet、not_foundのいずれかと、引用のテキスト
あなたの投稿に返信した
- Sorsa APIのリクエスト
GET /check-comment- 返ってくるもの
commentedと、返信そのもの
あなたのXコミュニティに参加した
- Sorsa APIのリクエスト
POST /check-community-member- 返ってくるもの
is_member:trueまたはfalse
ハンドルの所有者である
- Sorsa APIのリクエスト
POST /user-tweets- 返ってくるもの
- 最新の投稿。ここでコードを探す
どの確認も、応募者をハンドル、数値のユーザーID、プロフィールリンクのいずれかで受け取り、投稿をリンクまたはIDのみで受け取ります。返ってくるのは「はい/いいえ」だけではありません。引用のテキスト、返信そのもの、そしてフォロー・リツイート・引用の確認では、応募者のアカウントが非公開のときに付くuser_protectedフラグも含まれます。あなた自身のXアカウントは一切関与しないため、キャンペーンでアカウントが危険にさらされることはありません。
#応募者1人を4ステップで確認する
応募者1人の確認は、タスクごとに1リクエストです。次の例は、プレゼント企画で最も多い条件であるフォロー、リツイート、リプライを、ApiKeyヘッダーにキーを付けて確認します。
-
キーを取得します。 サインアップして、ダッシュボードからAPIキーをコピーします。最初の100リクエストは無料で、カードは不要です。
-
フォローを確認します。 自分のハンドルを
username_1、応募者のハンドルをusername_2として送ります。Terminal curl -X POST "https://api.sorsa.io/v3/check-follow" \ -H "ApiKey: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"username_1": "lumenharbor_labs", "username_2": "maya_quest_runner"}'Response200 OK { "follow": true, "user_protected": false } -
投稿に関するタスクを確認します。 投稿のリンクと応募者のハンドルを、
POST /check-retweetにはJSONボディで、GET /check-commentにはクエリパラメータで送ります。 -
結果をまとめます。 必須の確認がすべてtrueだった場合にのみ応募者を有資格とし、各結果は記録として残します。
import requests BASE = "https://api.sorsa.io/v3" HEADERS = {"ApiKey": "YOUR_API_KEY"} BRAND = "lumenharbor_labs" POST = "https://x.com/lumenharbor_labs/status/2115459618305512658" def call(method, path, **kwargs): r = requests.request(method, BASE + path, headers=HEADERS, timeout=20, **kwargs) r.raise_for_status() return r.json() def verify_entrant(handle): follow = call("POST", "/check-follow", json={"username_1": BRAND, "username_2": handle}) retweet = call("POST", "/check-retweet", json={"tweet_link": POST, "username": handle}) reply = call("GET", "/check-comment", params={"tweet_link": POST, "username": handle}) result = { "handle": handle, "follow": follow["follow"], "retweet": retweet["retweet"], "reply": reply["commented"], "protected": follow.get("user_protected", False), } result["eligible"] = all( result[k] for k in ("follow", "retweet", "reply")) return result print(verify_entrant("maya_quest_runner"))
3つの確認は3リクエストで、この応募者の確認にかかった費用は$0.0042からです。403はキーがないか、リクエストを使い切ったことを意味します。429は1秒間に20を超えるリクエストを送ったことを意味するので、1秒待ってからもう一度送ってください。失敗したリクエストには課金されません。
#あるXアカウントが別のアカウントをフォローしているか確認する
POST /check-follow(新しいタブで開きます)は、2番目のアカウントが1番目をフォローしているかを答えます。username_1はフォローされるべきアカウント、username_2は確認対象のアカウントです。どちらのフォロワー数がいくつであっても、followは1リクエストでtrueかfalseとして返ります。
各サイドには、ハンドル、数値ID(user_id_1、user_id_2)、プロフィールリンク(user_link_1、user_link_2)のいずれか1つを指定します。答えは一方向のみなので、相互フォローの確認には、サイドを入れ替えた2回の呼び出しが必要です。user_protectedがtrueのときは、確認対象のアカウントが非公開です。フォローが公開されていないため、外部のどのサービスでも確認できません。
公式X APIには、1組のアカウントだけを答えるエンドポイントがありません。代わりにリスト全体を読み取るルートが用意されています。GET /2/users/:id/followingは1ページあたり最大1,000アカウントを返し、Xの従量課金の料金表(新しいタブで開きます)のFollowing/Followers: Readで、1アカウントあたり$0.010が課金されます。800アカウントをフォローしている応募者を確認するのに、この方法では最大$8かかります。自分の5万人のフォロワーのリストを読むと、1回の取得で$500です。
#ユーザーが投稿をリツイートしたか確認する
POST /check-retweet(新しいタブで開きます)は、投稿のリツイートを新しい順に100件ずつ走査し、応募者が見つかった時点でretweet: trueを返します。最初の100件に含まれていなければ、next_cursorで次の100件に進みます。
応募者を待たせている間に確認するリツイート、たとえばクエストページで「確認」を押した直後のものは、最新の100件に入っているため、1リクエストで答えが出ます。拡散した投稿の公開直後にリポストした応募者はもっと深い位置にいます。次のループは、あなたが決めた上限までカーソルをたどり、上限に達したときは「いいえ」ではなく「未確認」と報告します。
def retweeted(post, handle, max_pages=10): # 10 pages = 1,000 retweets
body = {"tweet_link": post, "username": handle}
for _ in range(max_pages):
page = call("POST", "/check-retweet", json=body)
if page["retweet"]:
return "yes"
if not page.get("next_cursor"):
return "no"
body["next_cursor"] = page["next_cursor"]
return "not checked yet"
公式X APIは同じリストをGET /2/tweets/:id/retweeted_byで読み取ります。1ページ100アカウントで1アカウントあたり$0.010、アプリごとに15分あたり75リクエストのため、1ウィンドウで取得できるリツイートしたユーザーは最大7,500件です(X APIのレート制限(新しいタブで開きます))。
#引用、リプライ、コミュニティ参加を確認する
残りの3つの確認でキャンペーンのほぼ全体をカバーできます。POST /check-quoted(新しいタブで開きます)は引用と単なるリツイートを区別し、GET /check-comment(新しいタブで開きます)は応募者の返信そのものを返し、POST /check-community-member(新しいタブで開きます)はあなたのXコミュニティに参加したかを答えます。
/check-quotedはstatusとしてquoted、retweet(コメントなしでリポストした)、not_foundのいずれかを返し、引用がある場合はそのテキストと日時を付けます。このテキストがあれば、最小文字数やキャンペーンのハッシュタグといったルールを強制できます。
{
"status": "quoted",
"date": "2026-10-28 15:21:47",
"text": "Joined the Lumen Harbor beta. The queue tool is quick #LumenBeta",
"user_protected": false
}
/check-commentは、投稿のtweet_linkと応募者をクエリパラメータとして受け取り、commentedがtrueのときは返信全体を返します。full_text、created_at、エンゲージメント数が含まれるので、絵文字だけの返信やコピーした返信をルールで不合格にできます。投稿の返信をまとめて読むには、Xのコメントを見る方法を参照してください。
/check-community-memberは、community_idまたはcommunity_linkと応募者を受け取り、is_memberを返します。どちらも数値IDまたはx.com/i/communities/の完全なURLを受け付けます。公式X APIはIDでコミュニティを調べたり検索したりできますが、メンバーの一覧取得やメンバーシップの確認を行うエンドポイントはありません。
#応募から賞品送付まで、プレゼント企画を確認する
確認付きのプレゼント企画は3ステップで進みます。応募者のハンドルを集め、必須タスクごとに1回ずつ確認し、すべての確認を通過した応募者にだけ賞品を送ります。
-
ハンドルとコードを集めます。 応募フォームでXのハンドルを尋ね、各応募者に投稿してもらう1回限りの短いコードを示します。これでハンドルが本人のものだと証明できます(次のセクション)。
-
タスクごとに1回確認します。 応募時に確認すれば即座に答えが出ます。応募締切後にまとめて確認してもかまいません。下の図が、規模に応じて安いルートを示します。
-
再確認してから賞品を送ります。 応募後にフォローを外す人もいるため、賞品を送る前に当選者の
/check-followをもう一度実行し、すべてを通過した応募者の中からのみ抽選します。応募時に確認すれば答えは即座に出ます。数千人規模の締切後のキャンペーンでは、各リストを1回ずつ取得してIDを突き合わせます。
リストを使うルートは、応募者が数千人に達すると有利になります。GET /followers(新しいタブで開きます)は1ページ200フォロワー、POST /retweeters(新しいタブで開きます)は新しい順に1ページ20リツイートユーザーを返すため、1万人のリツイートしたユーザーは1万回の確認ではなく500リクエストで済みます。フォロワーリストのカーソルループは、Twitterフォロワーのエクスポートのガイドにあります。2つのリストはアカウントのidで突き合わせます。IDはハンドルが変わっても変わりません。
Xのプロモーションのガイドライン(Guidelines for Promotions on X)(新しいタブで開きます)は、主催者に対して、複数アカウントからの応募や同一投稿の繰り返しを排除するよう求めています。また、公開検索ではすべての応募が表示されるとは限らないと注意しています。応募者をハンドルで1人ずつ確認すれば、確認が検索に依存しないため、この抜け穴を避けられます。下の所有確認コードとプロフィールフィルターが、借り物のアカウントや使い捨てのアカウントを排除します。
#賞品を送る前に偽のハンドルとボットを排除する
安価な2つの確認で、借り物のハンドルやボットファームを賞品送付の前に排除できます。POST /user-tweets(新しいタブで開きます)で読み取る所有確認コードと、GET /info-batch(新しいタブで開きます)によるプロフィールフィルターです。後者は1リクエストで100人の応募者を処理できます。
所有確認コードが機能するのは、アカウントから投稿できるのは所有者だけだからです。各応募者にLUMEN-7Q4Kのようなコードを渡し、最新の投稿を1リクエストあたり最大20件読み取って、コードを探します。
from datetime import datetime, timedelta, timezone
CUTOFF = datetime.now(timezone.utc) - timedelta(days=30)
def owns_handle(handle, code):
page = call("POST", "/user-tweets", json={"username": handle})
return any(code in t["full_text"] for t in page.get("tweets", []))
def looks_real(user):
joined = datetime.fromisoformat(
user["created_at"].replace("Z", "+00:00"))
return (joined < CUTOFF and user["tweets_count"] >= 10
and user["followers_count"] >= 5)
def real_entrants(handles):
keep = []
for i in range(0, len(handles), 100):
batch = {"usernames": handles[i:i + 100]}
users = call("GET", "/info-batch", params=batch)["users"]
keep += [u["username"] for u in users if looks_real(u)]
return keep
上のフィルターは、作成から30日未満のアカウント、投稿が10件未満のアカウント、フォロワーが5人未満のアカウントを除外します。数値は自分のオーディエンスに合わせて調整してください。プロフィールは1,000件あたり$0.014からなので、1万人の応募者のフィルタリングは$0.14からです。疑わしいリストをさらに詳しく採点するには、Twitterボット判定のガイドで、ボットと人間を分けるシグナルを解説しています。
知っておきたいこと
「やっていない」と「確認できなかった」は分けて扱ってください。
429、タイムアウト、上限に達したリツイートのループは、応募者が不合格だったのではなく、まだ確認できていないことを意味します。その状態を保存して後で再試行し、明確なfalseの場合にのみ応募者を不合格にします。
#キャンペーンの確認にかかるコスト
Sorsa APIでキャンペーンを確認するコストは、応募者1人のタスク1つにつき1リクエスト、1リクエストあたり$0.0014からです。公式X APIで同じ証明を行うにはリスト全体を読み取ることになり、1アカウントあたり$0.010、1投稿あたり$0.005かかります。
タスクごとに見ると、Sorsa APIの列は常に1リクエストのままですが、公式X APIの列は読み取るリストごとに増えていき、コミュニティのメンバーシップには対応する項目すらありません。
| タスク | Sorsa API | 公式X APIのルートと価格 |
|---|---|---|
| フォロー | 1リクエスト、$0.0014から | フォロワーまたはフォロー中のリストを読み取る、1アカウントあたり$0.010 |
| リツイート | 応募時は1リクエスト、$0.0014から | retweeted_byを読み取る、1アカウントあたり$0.010、15分あたり75リクエスト |
| 引用 | 1リクエスト、$0.0014から | 引用投稿を読み取る、1投稿あたり$0.005 |
| リプライ | 1リクエスト、$0.0014から | 会話を検索する、1投稿あたり$0.005 |
| コミュニティ | 1リクエスト、$0.0014から | エンドポイントなし |
| 所有確認コード | 1リクエスト、$0.0014から | ユーザーの投稿を読み取る、最低5件で$0.025 |
フォロー
- Sorsa API
- 1リクエスト、$0.0014から
- 公式X APIのルートと価格
- フォロワーまたはフォロー中のリストを読み取る、1アカウントあたり$0.010
リツイート
- Sorsa API
- 応募時は1リクエスト、$0.0014から
- 公式X APIのルートと価格
- retweeted_byを読み取る、1アカウントあたり$0.010、15分あたり75リクエスト
引用
- Sorsa API
- 1リクエスト、$0.0014から
- 公式X APIのルートと価格
- 引用投稿を読み取る、1投稿あたり$0.005
リプライ
- Sorsa API
- 1リクエスト、$0.0014から
- 公式X APIのルートと価格
- 会話を検索する、1投稿あたり$0.005
コミュニティ
- Sorsa API
- 1リクエスト、$0.0014から
- 公式X APIのルートと価格
- エンドポイントなし
所有確認コード
- Sorsa API
- 1リクエスト、$0.0014から
- 公式X APIのルートと価格
- ユーザーの投稿を読み取る、最低5件で$0.025
具体例で考えます。応募者は1万人、あなたのアカウントのフォロワーは5万人です。キャンペーンの条件はフォロー、リツイート、引用、リプライ、コミュニティ参加で、これに所有確認コード、プロフィールフィルター、賞品送付前のフォロー再確認を加えます。応募者1人あたり7回の確認になり、キャンペーン全体のコストはSorsa APIで$98からです。毎秒20リクエストなら約1時間で終わります。同じキャンペーンを公式X APIのルートで行うと、実行できないコミュニティの確認を除いても約$1,550になります。フォロワーリストの取得が$500で2回、リツイートしたユーザーが$100、引用とリプライが$100、所有確認コード用のタイムラインが$250、プロフィールが$100です。
1エントリーあたり7回のチェック、全員分で約58分(毎秒20リクエスト)。
エントリー数、フォロワー数、タスクを設定してください。両方の合計がそれに合わせて変わります。
Sorsa APIが課金するのはアカウント単位ではなくリクエスト単位で、失敗したリクエストには課金されません。1,000リクエストあたりの単価は、Starterの$4.90から最大プランの$1.40までです。
#最初の100回の確認を無料で試す
すべての応募者についてフォロー、リツイート、引用、リプライ、コミュニティ参加を確認するなら、Sorsa APIを使いましょう。1確認につき1リクエストで$0.0014から、毎秒20リクエストの上限は全プラン共通で、フローのどこにもあなたのXログインは登場しません。100回分の無料リクエストを使い、上の4ステップをテスト投稿で実行し、キャンペーンを始める前に所有確認コードを加えてください。フォロワーやフォロー中のリスト全体を扱うなら、Twitterフォロワー APIのガイドにあるリストを使うルートがさらに役立ちます。
#よくある質問
Twitterのフォローとリツイートを確認するのに最適なAPIは?
Sorsa APIです。フォロー、リツイート、引用、リプライ、コミュニティのメンバーシップを、それぞれ1リクエストで、1確認あたり$0.0014からで確認できます。APIキー1つで利用でき、OAuthもX開発者アカウントも不要です。どの選択肢も、応募者ごとに「はい/いいえ」を直接返すか、1確認あたりの価格、レート制限、対応するアクションという4点で比較してください。Sorsa APIはこの4点をすべて満たします。1回の呼び出し、1,000回の確認あたり$1.40、毎秒20リクエスト(全プラン共通)、6種類の確認です。
Xでいいねを確認できますか?
いいえ。2024年6月以降、Xは誰が投稿にいいねしたかを投稿の作者にしか表示しないため、公開データAPIでは応募者がいいねしたことを確認できず、Sorsa APIもいいねを返しません。代わりに、リツイート、引用、リプライを求めましょう。この3つはどれも公開されたままで、Sorsa APIが1リクエストずつで確認します。
応募者のアカウントが非公開だった場合は?
非公開アカウントのフォローとリポストは公開されていないため、外部の確認では証明できません。その場合、Sorsa APIのフォロー、リツイート、引用の確認はuser_protected: trueを返します。抽選中は応募者のアカウントが公開である必要があることをルールに明記し、応募者に公開へ切り替えてもらうか、そのルールに基づいて応募を無効にしてください。
Twitterのフォローとリツイートを無料で確認する方法はありますか?
あります。無料の相互フォロー確認ツールは、一方のアカウントがもう一方をフォローしているかを確認でき、無料の抽選ツールは、抽選された当選者のフォローを確認します。APIで応募者全員を確認する場合は、Sorsa APIの100回分の無料リクエストで、カードなしで100回の確認ができます。有効期限もないため、プランを選ぶ前にキャンペーンのフロー全体を試せます。
タスクの確認にX開発者アカウントやOAuthは必要ですか?
Sorsa APIでは不要です。ApiKeyヘッダーのキー1つでXの公開データを読み取れ、X開発者アカウントも、アプリも、OAuthフローも、応募者のサインインも要りません。公式X APIでは、最初の読み取りの前に、承認済みの開発者アカウント、プロジェクトとアプリ、そのキーとトークンが必要です(X API: Retweets(新しいタブで開きます))。
#検証の方法
2026年11月2日に、本ガイドのすべてのエンドポイント、パラメータ、レスポンスのフィールドを、稼働中のSorsa APIリファレンス(45エンドポイント)と、5つの確認、/user-tweets、/info-batch、/retweetersのドキュメントページと照合しました。リクエストとレスポンスにはデモアカウントを使っています。公式X APIの価格、レート制限、エンドポイントはdocs.x.comから、Xのプロモーションルールはヘルプセンターから、同じ日に読み取ったものです。キャンペーンのコストは、両方の料金表から当社で計算したものです。
情報源
- Sorsa API reference: Check Follow(新しいタブで開きます)
- Sorsa API reference: Check Retweet(新しいタブで開きます)
- Sorsa API reference: Check Quote or Retweet(新しいタブで開きます)
- Sorsa API reference: Check Comment(新しいタブで開きます)
- Sorsa API reference: Check Community Membership(新しいタブで開きます)
- X API pricing(新しいタブで開きます)
- X API rate limits(新しいタブで開きます)
- X API: Follows(新しいタブで開きます)
- X API: Retweets(新しいタブで開きます)
- X Help Center: Guidelines for Promotions on X(新しいタブで開きます)
- Engadget: X is officially making likes (mostly) private for everyone(新しいタブで開きます)