誰かがツイートしたときに通知を受け取る方法
誰かがツイートしたときに通知を受け取るには、そのアカウントをフォローし、プロフィールの通知ベルをタップして、2つある選択肢のうち「すべての投稿」を選びます。その後は、投稿のたびにXがスマートフォンへプッシュ通知を送ります。
要点: 通知ベルが使えるのは、フォローしているアカウントだけです。しかも1プロフィールずつ、自分の端末でしか受け取れません。多数のアカウントやチームのチャットに通知したいなら、最大5,000アカウントを公開Xリストに入れて、タイマーでチェックします。それにはSorsa APIが向いています。GET /list-tweets はリスト全体を1リクエストで読み取れ、100リクエストの無料枠で始められます。
- エンドポイント
GET /list-tweets- 1ページの件数
- 1リクエストあたり5,000アカウント
- 料金
- 1,000投稿あたり$0.07から
#誰かの投稿の通知をオンにする
Xの標準の通知は各プロフィールにあるベルで、iPhoneまたはAndroidのXアプリなら、4ステップで設定できます。以下の表記は、現在のXヘルプセンターで使われているものです。
-
アカウントをフォローします。 ベルが表示されるのは、フォローしているプロフィールだけです。
-
プロフィールのベルをタップします。 「フォロー中」ボタンの隣にあります。
-
「すべての投稿」を選びます。 もう1つの選択肢「ライブ動画の投稿のみ」では、ライブ配信を始めたときにしか通知されません。
-
プッシュ通知がオンか確認します。 プロフィールアイコンをタップし、「設定とプライバシー」、「通知」、「設定」、「プッシュ通知」の順に進んで、「投稿」をオンのままにします。スマートフォン本体の設定でも、Xアプリからの通知を許可しておく必要があります。
通知を止めるには、もう一度ベルをタップして「なし」を選びます。投稿の通知を受け取っているアカウントをすべて確認するには、同じ「プッシュ通知」画面を開いて「投稿」をタップします。そのほかの通知の種類(メンション、返信、リポスト、いいね、新しいフォロワー、メッセージ)は、Xヘルプセンター(新しいタブで開きます)にまとめられています。
#ベルでできないこと
ベルは個人のスマートフォン向けの通知です。1台のスマートフォンで複数の人の投稿を追う必要が出た時点で、足りなくなります。
- アカウントをフォローしている必要があります。 フォローしなければベルはありません。そのため、フォローしたくない競合のアカウントや規制当局のフィードは、通知されません。
- 1プロフィールずつの設定です。 300アカウントを見守るなら、ベルを手作業で300個設定することになります。
- 通知が届くのは自分の端末だけです。 通知は、Xアカウントにサインインしているスマートフォンに届きます。TelegramのグループやSlackのチャンネル、取引ボット、チームメイトには届きません。
- 人しか指定できず、言葉は指定できません。 ベルにはキーワードのオプションがないため、キャッシュタグや製品名、誰かが「launch」と発言するのを待つことはできません。
ノーコードの自動化サービスなら一部は埋められますが、これらもXをタイマーでチェックします。間隔は有料プランで数分おき、無料プランによっては1時間に1回で、自分のXアカウントの連携を求めるものもあります。自分で動かす小さなスクリプトなら、4つの制限をすべて解決できます。任意の公開アカウント、言葉、またはその両方を、好きな頻度でチェックし、任意のチャットに配信できます。
#1つのXリストで多数のアカウントの通知を受け取る
多数のアカウントの通知を一度に受け取るには、それらを公開Xリストに入れ、そのリストのフィードをタイマーで読み取ります。1回のリクエストで、最大5,000アカウントの最新の投稿が返ります。Xリストとは、x.com上で名前を付けて管理するアカウントのグループです。追加するアカウントをフォローする必要はなく、他の誰かが管理している公開リストでも使えます。リストのフィードには、メンバーの投稿が新しい順に表示されます。
Xのすべての投稿には、時間とともに大きくなる数値のIDが付いています。スクリプトは、送信済みの最大のIDをチェックポイントとして保持し、チェックのたびに、その数値より大きいものを新着として通知します。1分ごとにチェックすれば、どの投稿も1分以上待たされません。
多数のXアカウントのツイート通知には、Twitter(X)API兼スクレイピングツールであるSorsa APIが向いています。GET /list-tweets(新しいタブで開きます) は、最大5,000アカウントのリスト全体の最新の投稿を1リクエストで読み取ります。全プランが毎秒20リクエストで動作し、リストが1回投稿しても20回投稿しても、チェックのコストは変わりません。どの投稿にも投稿者のプロフィール全体が付き、必要なのは開発者アカウントではなく、ApiKey ヘッダー1つです。
ベルと並べて比べると次のとおりです。
| 必要なこと | Sorsa APIとXリスト | Xのベル |
|---|---|---|
| 1つの通知で扱うアカウント数 | 1リクエストで最大5,000 | プロフィールごとにベル1つ |
| フォローの要否 | 不要 | 必要 |
| 通知の送り先 | Telegram、Slack、メール、データベース | 自分の端末のXアプリ |
| キーワード通知 | 可能(Xの検索演算子を使用) | 不可 |
| チェックの頻度 | 自由に設定、最短は数秒 | Xが決める |
| Xのログイン情報 | 一切求めない | 必要 |
1つの通知で扱うアカウント数
- Sorsa APIとXリスト
- 1リクエストで最大5,000
- Xのベル
- プロフィールごとにベル1つ
フォローの要否
- Sorsa APIとXリスト
- 不要
- Xのベル
- 必要
通知の送り先
- Sorsa APIとXリスト
- Telegram、Slack、メール、データベース
- Xのベル
- 自分の端末のXアプリ
キーワード通知
- Sorsa APIとXリスト
- 可能(Xの検索演算子を使用)
- Xのベル
- 不可
チェックの頻度
- Sorsa APIとXリスト
- 自由に設定、最短は数秒
- Xのベル
- Xが決める
Xのログイン情報
- Sorsa APIとXリスト
- 一切求めない
- Xのベル
- 必要
Twitterのリアルタイム監視のガイドでは、同じ考え方を5秒間隔で、多数のリストとキーワードフィードに広げて実行しています。リストを一括で作成してメンバーをエクスポートする方法は、Twitterリスト APIのガイドで解説しています。
#新しい投稿をTelegramやSlackに送る
約80行のPythonスクリプトが、リストを1分ごとにチェックし、新しい投稿のバッチを、Telegramのチャット、Slackのチャンネル、またはその両方に送ります。動かすまでの手順は6ステップです。
-
キーを取得します。 サインアップして、ダッシュボードからAPIキーをコピーします。100リクエストの無料分は、すでにキーに付与されています。
-
リストを作ります。 x.comで「リスト」を開いて新しいリストを作成し、「非公開」にチェックを入れずに、アカウントを追加します。リストIDは、リストのアドレスの
/i/lists/の後ろにある長い数字です。 -
チャット側を準備します。 Slackの場合は、アプリを作成して Incoming Webhooks をオンにし、チャンネル用のWebhookを追加してURLをコピーします。Telegramの場合は、TelegramでBotFatherにメッセージを送り、
/newbotを送信してボットのトークンをコピーします。ボットをグループに追加し、そこに適当なメッセージを投稿してから、ブラウザで次のアドレスを開き、"chat":{"id":の後に続くチャットIDをコピーします。ブラウザ https://api.telegram.org/bot<token>/getUpdates -
リストを1回チェックします。 このリクエストは、リストのフィードの最新の1ページ、投稿者つきで最大20件の投稿を返します。
ターミナル curl -G "https://api.sorsa.io/v3/list-tweets" \ -H "ApiKey: YOUR_API_KEY" \ --data-urlencode "list_id=1851937264019283746"レスポンス200 OK { "tweets": [ { "id": "2117204918263512064", "full_text": "Mainnet upgrade is live. Bridges reopen at 14:00 UTC.", "created_at": "2026-11-02T13:12:40Z", "lang": "en", "is_reply": false, "likes_count": 41, "retweet_count": 12, "reply_count": 6, "view_count": 3870, "user": { "id": "1658112940377133056", "username": "northwind_protocol_hq", "display_name": "Northwind Protocol", "followers_count": 64120, "verified": true } }, { "id": "2117204657719308288", "full_text": "Our Q4 roadmap call starts in 30 minutes.", "created_at": "2026-11-02T13:11:38Z", "lang": "en", "is_reply": false, "likes_count": 9, "retweet_count": 2, "reply_count": 1, "view_count": 1104, "user": { "id": "1702291101836602498", "username": "lumenforge_labs_team", "display_name": "Lumenforge Labs", "followers_count": 18832, "verified": false } } ], "next_cursor": "DAABCgABG3kRk8f__-oKAAIbeRGT0_7_6ggAAwAAAAIAAA" } -
通知スクリプトを実行します。
x_alerts.pyとして保存してください。最初の実行では最新のIDを記録するだけなので、古い投稿が大量に届くことはありません。以降のチェックでは、新着が送信されます。Python import os import time import requests API = "https://api.sorsa.io/v3" HEADERS = {"ApiKey": os.environ.get("SORSA_API_KEY", "YOUR_API_KEY")} LIST_ID = os.environ["X_LIST_ID"] TG_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN") TG_CHAT = os.environ.get("TELEGRAM_CHAT_ID") SLACK_URL = os.environ.get("SLACK_WEBHOOK_URL") INTERVAL = 60 # seconds between checks STATE = "last_id.txt" # the checkpoint survives restarts ORIGINALS_ONLY = True # skip replies and reposts def new_posts(last_id): """Read the List's feed back to the checkpoint, oldest first.""" posts, params = [], {"list_id": LIST_ID} for _ in range(5): # at most 5 pages per check r = requests.get(f"{API}/list-tweets", headers=HEADERS, params=params, timeout=30) r.raise_for_status() page = r.json() tweets = page.get("tweets") or [] fresh = [t for t in tweets if int(t["id"]) > last_id] posts += fresh cursor = page.get("next_cursor") if not last_id or len(fresh) < len(tweets) or not cursor: break params["next_cursor"] = cursor return sorted(posts, key=lambda t: int(t["id"])) def line(t): user = t["user"]["username"] link = f"https://x.com/{user}/status/{t['id']}" return f"@{user}: {t['full_text'][:300]}\n{link}" def messages(lines, limit=4000): """Pack posts into as few chat messages as fit.""" msg = "" for ln in lines: if msg and len(msg) + len(ln) + 2 > limit: yield msg msg = "" msg = f"{msg}\n\n{ln}" if msg else ln if msg: yield msg def send(text): if TG_TOKEN: url = f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage" requests.post(url, json={"chat_id": TG_CHAT, "text": text}, timeout=30) if SLACK_URL: requests.post(SLACK_URL, json={"text": text}, timeout=30) time.sleep(1.1) # both chats take about one message a second try: last_id = int(open(STATE).read()) except (OSError, ValueError): last_id = 0 while True: try: posts = new_posts(last_id) keep = [t for t in posts if not ORIGINALS_ONLY or not ( t.get("is_reply") or t.get("retweeted_status"))] if last_id and keep: # the first run only sets the checkpoint for text in messages([line(t) for t in keep]): send(text) if posts: last_id = int(posts[-1]["id"]) with open(STATE, "w") as f: f.write(str(last_id)) except requests.RequestException as err: print("check failed, retrying next round:", err) time.sleep(INTERVAL) -
動かし続けます。 キーを環境変数に設定し、常時稼働しているマシン(小さなサーバー、コンテナ、余っているパソコンなど)でスクリプトを起動します。チャットが片方だけなら、TelegramまたはSlackの行は省いて構いません。
ターミナル export SORSA_API_KEY="YOUR_API_KEY" export X_LIST_ID="1851937264019283746" export TELEGRAM_BOT_TOKEN="123456789:YOUR_BOT_TOKEN" export TELEGRAM_CHAT_ID="-1001234567890" export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL" nohup python3 x_alerts.py > x_alerts.log 2>&1 &
各通知には、投稿者のハンドル、本文、投稿へのリンクが含まれるので、1回タップするとXで開けます。2回のチェックの間に複数のメンバーが投稿した場合は、1つのメッセージにまとめて届きます。
スクリプトは、各チャットの制限の範囲内で動作します。TelegramのボットFAQ(新しいタブで開きます)は、ボットに対して、1つのチャットへは1秒に1メッセージ、グループへは1分に20メッセージまでを求めており、1メッセージには最大4,096文字を入れられます。Slackのレート制限(新しいタブで開きます)では、Incoming Webhookは1秒に1メッセージで、継続的に超過するとHTTP 429エラーが返されます。投稿を最大4,000文字のメッセージにまとめ、その間に1秒空けることで、どちらのチャンネルも静かに、取りこぼしなく保てます。
#通知が届くまでの速さとコスト
通知は投稿から1回のチェック間隔以内に届き、月額の料金は、投稿数ではなく間隔で決まります。Sorsa APIは、新しい投稿が20件見つかっても0件でも、1回のチェックを1リクエストとして数えます。30日の月では、1分ごとにチェックするリストは43,200リクエストで、Proプランの月間100,000リクエストで2回分以上まかなえます。
| チェック間隔(最長の待ち時間) | 月間リクエスト数(リスト1つ) | 対応するプラン |
|---|---|---|
| 5分 | 約8,600 | Starter、月間10,000 |
| 1分 | 43,200 | Pro、月間100,000 |
| 30秒 | 86,400 | Pro、月間100,000 |
| 15秒 | 約173,000 | Growth、月間250,000 |
5分
- 月間リクエスト数(リスト1つ)
- 約8,600
- 対応するプラン
- Starter、月間10,000
1分
- 月間リクエスト数(リスト1つ)
- 43,200
- 対応するプラン
- Pro、月間100,000
30秒
- 月間リクエスト数(リスト1つ)
- 86,400
- 対応するプラン
- Pro、月間100,000
15秒
- 月間リクエスト数(リスト1つ)
- 約173,000
- 対応するプラン
- Growth、月間250,000
リストは、メンバーの数にかかわらず1つのフィードなので、5,000アカウントも5アカウントも、監視のコストは変わりません。5,000アカウントを超える場合は、リストをもう1つ作り、チェックごとのリクエストももう1回増えます。下のビルダーでは、ウォッチリストに必要なフィード、リクエスト数、プランを算出できます。
GET /list-tweets
5,000アカウントの公開リスト1つ
公開のXリスト1つに全5,000アカウントが入るため、1回のチェックは1リクエストです。毎分チェックすると30日間で43.2Kリクエストになり、Proプランの100K以内に収まります。1回のチェックで、キーに許可された毎秒20リクエストのうち1リクエストを使います。
アカウント数、アラートの条件、チェック間隔を選ぶと、エンドポイント、リクエスト数、プランが決まります。
公式X APIは逆で、配信した投稿ごとに課金されます。その従量課金の料金(新しいタブで開きます)では、ストリームや検索が返す投稿1件につき$0.005、1,000件あたり$5.00が課金され、月間の読み取りは300万投稿が上限です。しかも、開発者アカウントの承認とOAuthアプリの設定が前提です。2026年11月22日からは、Xの10月23日付の告知(新しいタブで開きます)によると、各投稿と一緒に返される投稿者もユーザー読み取りとして$0.010で課金されるため、投稿1件と投稿者で$0.015になります。1日に3回投稿する5,000アカウントのウォッチリストは、月に45万投稿を送り出し、現行料金で$2,250、投稿者を含めると$6,750です。Sorsa APIなら、同じリストを1分ごとにチェックしても、Proプランの月額$199のままです。
失敗したリクエストには課金されず、GET /key-usage-info(新しいタブで開きます) を使えば、リクエストを消費せずにキーの残りを確認できます。
#1アカウント、キーワード、メンションの通知
new_posts() の中のリクエストを差し替えるだけで、同じスクリプトが、1つのアカウント、リストのメンバーが使う言葉、Xの誰かが使う言葉を通知できます。いずれのフィードも、新しい順に1ページあたり約20件の投稿を、同じ投稿フィールドで返します。
- 1つのアカウント。
POST /user-tweets(新しいタブで開きます) に"username"と"type": "posts"を指定すると、そのアカウント自身の投稿が返信なしで読み取れるため、リストは不要です。 - リストのうち、必要なときだけ。
POST /search-tweets(新しいタブで開きます) にlist:演算子を付けると、リストのメンバーが指定した言葉(リリースを示す言葉やキャッシュタグなど)を使ったときだけ通知します。 - 誰が使っても対象にする。 クエリから
list:を外せば、任意の公開アカウントによるブランド名、ハッシュタグ、ティッカーを拾えます。lang:、min_faves:などの構文は、Twitter検索演算子のガイドで解説しています。 - ハンドルへのメンション。
POST /mentions(新しいタブで開きます) は、アカウントをタグ付けした投稿を返します。TwitterメンションAPIのガイドでは、これを名前の検索と組み合わせて、タグ付けされていない投稿も拾います。
スクリプト内で、リストとキーワードの組み合わせをチェックするには、list-tweets の呼び出しを次の検索に置き換えます。since_id: により、各チェックはチェックポイントより新しい投稿に限定されます。
query = (f"list:{LIST_ID} (mainnet OR $NWND) -filter:replies "
f"since_id:{last_id}")
r = requests.post(f"{API}/search-tweets", headers=HEADERS,
json={"query": query, "order": "latest"}, timeout=30)
知っておきたいこと
通知の対象は公開データだけです。非公開リストは読み取れず、非公開アカウントはどのフィードにも表示されないため、リストは公開にしてください。Sorsa APIは設計上、読み取り専用で、投稿もいいねもフォローも行わず、Xのログイン情報も求めないので、Xで使っているアカウントにリスクはありません。
#最初のツイート通知を設定する
フォローしている1つのアカウントなら、ベルは1分で設定でき、費用もかかりません。ウォッチリスト、チームのチャット、言葉での通知には、アカウントを公開Xリストに入れて、Sorsa APIにチェックさせます。1リクエストで最大5,000アカウントをカバーでき、1分ごとのチェックはProプランに収まり、上のスクリプトが新しいバッチをTelegramまたはSlackに投稿します。100リクエストの無料分で、最初の100回のチェックが実行できます。
#よくある質問
ツイートの通知をオンにすると、相手に知られますか?
いいえ。投稿の通知をオンにしても変わるのは自分の設定だけで、Xが相手のアカウントに知らせることはありません。Sorsa APIで作る通知も、Xのログイン情報を一切求めないため、Xアカウントには触れません。1つ注意してほしい点があります。アカウントは、自分が追加された公開リストを確認できます。リストには分かりやすい名前を付けるか、他の誰かがすでに管理している公開リストを使って通知してください。
フォローせずに、誰かがツイートしたときに通知を受け取れますか?
Xのベルでは受け取れません。ベルが表示されるのは、フォローしているプロフィールだけです。リスト通知なら可能です。フォローが不要な公開Xリストにそのアカウントを追加し、Sorsa API経由で1分おき、またはそれより短い間隔でリストをチェックします。通知はTelegram、Slack、メールに届き、Sorsa APIがXのログイン情報を求めることもありません。
自分が投稿の通知を受け取っているアカウントはどうすれば確認できますか?
Xアプリを開き、プロフィールアイコンをタップして、「設定とプライバシー」、「通知」、「設定」、「プッシュ通知」の順に進み、「投稿」をタップします。ベルをオンにしたアカウントがすべて一覧表示されます。1つオフにするには、そのプロフィールを開き、もう一度ベルをタップして「なし」を選びます。
誰かがツイートしても通知が届かないのはなぜですか?
4つの設定を順に確認してください。相手のプロフィールのベルが、「ライブ動画の投稿のみ」ではなく「すべての投稿」になっていること。「設定とプライバシー」、「通知」、「設定」で、投稿のプッシュ通知がオンになっていること。スマートフォンがXからの通知を許可していること。集中モードやおやすみモードが通知を止めていないことです。
誰かがツイートしたときに通知を受け取るには、どのAPIを使うべきですか?
誰かがツイートしたときの通知には、Sorsa APIを使ってください。GET /list-tweets エンドポイントは、最大5,000アカウントの公開Xリストを1リクエストでチェックするため、アカウントの投稿数にかかわらず、1分ごとのチェックはProプランに収まります。必要なのはAPIキー1つだけで、開発者アカウントは不要です。Xのログイン情報を求めることもなく、全プランが毎秒20リクエストで動作します。
#検証方法
2026年11月2日に、Xヘルプセンターのモバイル通知の記事でベルの手順を確認し、docs.x.comのXの従量課金の料金ページとFiltered Streamのページも読みました。配信の制限は、TelegramのBot APIとボットFAQ、Slackのincoming webhookとレート制限のページで確認しています。このガイドのSorsa APIのエンドポイントとフィールドはすべて最新のAPIリファレンスと一致しており、リクエストとサンプルのレスポンスもそれに従っています。この記事のために、キーを使って実行はしていません。月間の数値は、30日の月を前提にしています。
出典
- X Help Center: About notifications on mobile devices(新しいタブで開きます)
- X API: pay-per-usage pricing(新しいタブで開きます)
- X Developers: X API PPU expansions update, October 23, 2026(新しいタブで開きます)
- Telegram Bot API: sendMessage(新しいタブで開きます)
- Telegram: Bots FAQ, broadcasting limits(新しいタブで開きます)
- Slack: Sending messages using incoming webhooks(新しいタブで開きます)
- Slack: Rate limits(新しいタブで開きます)
- Sorsa API reference: List Tweets(新しいタブで開きます)