X(旧ツイッター)リアルタイムAPI
取引ボット、ターミナル、AIエージェント向け
Xanguard B2B は、開発者向けのX(旧Twitter/ツイッター)リアルタイムデータAPIです。1本の WebSocket 接続で、監視中アカウントの新規ツイート、削除ツイート、プロフィール変更、新規フォロワー、フォロー・フォロー解除を JSON で受け取れ、REST API でリストを管理できます。有料プランの検知中央値は約200ミリ秒です(実測データ)。50アカウントで月額$49から、最大1000アカウント、SOLで支払い、自動で有効になります。
料金は2026年10月5日時点で確認
開発者より:取引ボットやターミナルを開発されている方、ご訪問ありがとうございます。AIエージェントをお使いの場合もご一緒にどうぞ。連携、お見積り、フィールドの対応づけのご相談は、Telegramの @notAdegen へ直接どうぞ。私が個人的に返信します。
Xanguard 開発者 @notAdegen ・ ダイレクトメッセージには本人が返信します
リンクが開かない場合は、Telegramで @B2B_Xanguard_bot を検索してください
5種類のリアルタイムイベントを、1本の WebSocket で
取引ボットやターミナルに必要なもの:ツイート、削除ツイート、プロフィール変更、新規フォロワー、フォロー・フォロー解除。そのまま使える JSON です。
ツイート twitter.post.new
ツイート、返信、引用、リポスト。検知中央値は約200ミリ秒。全文、メディアのリンク、引用・返信元のツイート、投稿者情報、コントラクトアドレスの自動抽出を含みます。全プラン対象。
削除ツイート twitter.tweet.deleted
監視中のアカウントがツイートを削除したときに、ツイートIDと本文付きで送信します。削除は確認できたものの対象を特定できない場合、この2つのフィールドは null になります。全プラン対象。
プロフィール変更 twitter.profile.update
名前、自己紹介、アイコン、固定ツイートの変更を、変更前と変更後の値付きで送信します。プロジェクトの方針が変わるときは、プロフィールから始まることがよくあります。Pro 以上。
新規フォロワー twitter.follower.new
監視中のアカウントにフォロワーが増えたとき、誰がフォローしたかを送信します。重要な開発者を、誰が静かにフォローしているかを知るのに役立ちます。Pro 以上。
フォロー・フォロー解除 twitter.following.new / .removed
監視中のアカウントが誰をフォロー・解除したかを、相手の名前、自己紹介、フォロワー数付きで送信します。提携や重要人物の動きの兆候を、同じ接続で受け取れます。Enterprise。
REST API
dt_ で始まるキーで、アカウントの追加・削除(POST /v1/dt/targets)と、プロフィールや過去の変更の参照ができます。画像内のコントラクトアドレスの OCR は Enterprise に含まれます。
5分で接続し、イベントの受信を開始
打ち合わせも営業担当の対応待ちもありません。ボットで購入し、キーを受け取り、接続するだけです。
申し込む
Telegramで @B2B_Xanguard_bot を開き、プランを選んでSOLで支払います。
キーを受け取る
オンチェーンで確認されるとプランが自動で有効になり、ボットが dt_ で始まるAPIキーを送ります。
アカウントを追加する
ボットで、ユーザー名を付けて /add を送るか、POST /v1/dt/targets を呼び出します。
WebSocket に接続する
接続すると HELLO が届きます。LOGIN(op 2 + キー)を送ると、以降 EVENT が継続的に届きます。
opcode プロトコルと、Python・Node で動くサンプル
URL:wss://api.xanguard.tech/v1/dt/realtime/ws。TweetCatcher 互換の opcode フローで、1キーあたり最大5本の同時接続に対応し、90秒間ハートビートがないと切断されます。
| op | 名称 | 方向 | 説明 |
|---|---|---|---|
| 10 | HELLO | サーバー → クライアント | 接続時に送信。heartbeat_interval(ミリ秒)を含みます |
| 2 | LOGIN | クライアント → サーバー | 15秒以内にAPIキーを送信: {"op": 2, "d": "dt_..."} |
| 4 | READY | サーバー → クライアント | 認証成功。有効なモジュールとアカウント数を含みます |
| 0 | EVENT | サーバー → クライアント | リアルタイムイベント。d.event がイベントタイプです |
| 1 | HEARTBEAT | クライアント → サーバー | heartbeat_interval に従って送信 |
| 11 | HEARTBEAT_ACK | サーバー → クライアント | ハートビートへの応答 |
| 3 | DISCONNECT | サーバー → クライアント | 切断。d.reason に理由(無効なキー、期限切れなど)が入ります |
import asyncio, json
import websockets
URL = "wss://api.xanguard.tech/v1/dt/realtime/ws"
API_KEY = "dt_your_key"
async def main():
async with websockets.connect(URL) as ws:
# op 10 HELLO:ハートビート間隔(ms)を含む
hello = json.loads(await ws.recv())
interval = hello["d"]["heartbeat_interval"] / 1000
# op 2 LOGIN:15秒以内にキーを送信
await ws.send(json.dumps({"op": 2, "d": API_KEY}))
ready = json.loads(await ws.recv())
if ready["op"] != 4: # 失敗時は op 3 DISCONNECT が届く
raise SystemExit(ready["d"].get("reason"))
print("接続しました:", ready["d"]["modules"])
# 間隔に合わせてハートビート送信。90秒なしで切断
async def heartbeat():
while True:
await asyncio.sleep(interval)
await ws.send(json.dumps({"op": 1}))
hb = asyncio.create_task(heartbeat())
async for raw in ws:
msg = json.loads(raw)
if msg["op"] != 0: # op 0 EVENT のみ処理
continue
ev, d = msg["d"]["event"], msg["d"]["data"]
if ev == "twitter.post.new":
print(d["author"]["handle"], d["text"])
elif ev == "twitter.tweet.deleted":
print("削除:", d["tweet_id"])
elif ev == "twitter.profile.update":
print("プロフィール変更:", d["field"], d["updated"])
asyncio.run(main())
const WebSocket = require('ws');
const URL = 'wss://api.xanguard.tech/v1/dt/realtime/ws';
const ws = new WebSocket(URL);
let hb;
ws.on('message', (raw) => {
const msg = JSON.parse(raw.toString());
switch (msg.op) {
case 10: // HELLO:LOGIN を送信してハートビート開始
ws.send(JSON.stringify({ op: 2, d: 'dt_your_key' }));
hb = setInterval(
() => ws.send(JSON.stringify({ op: 1 })),
msg.d.heartbeat_interval
);
break;
case 4: // READY:認証成功
console.log('接続しました', msg.d.modules);
break;
case 3: // DISCONNECT:無効または期限切れのキーなど
console.error('切断されました:', msg.d.reason);
break;
case 0: { // EVENT:リアルタイムイベント
const { event, data } = msg.d;
if (event === 'twitter.post.new') {
console.log(data.author.handle, data.text);
} else if (event === 'twitter.following.new') {
console.log('新規フォロー:', data.handle);
}
break;
}
}
});
ws.on('close', () => clearInterval(hb));
JSONの例
以下はサンプルです。有効なフィールドはAPIドキュメント(英語)に従います。ツイートは先に twitter.post.new として届き、同じ data.id の twitter.post.update で内容が補完されることがあります。
twitter.post.new{
"op": 0,
"d": {
"event": "twitter.post.new",
"event_id": "evt_1234567890123456789",
"task_info": {"handle": "example_dev"},
"data": {
"id": "1234567890123456789",
"created_at": 1712000000000,
"type": "post",
"text": "gm, new version ships tonight",
"media": [],
"author": {
"id": "1234567890",
"handle": "example_dev",
"name": "Example Dev",
"stats": {"followers": 12000, "following": 800}
},
"in_reply_to": null,
"quoted_tweet": null
}
}
}
twitter.following.new(Enterprise){
"op": 0,
"d": {
"event": "twitter.following.new",
"event_id": "evt_f_example_dev_1712000000000",
"event_time": 1712000000000,
"task_info": {"handle": "example_dev", "id": "1234567890"},
"data": {
"id": "2233445566",
"handle": "example_founder",
"name": "Example Founder",
"bio": "building on Solana",
"followers": 5400,
"following": 310
}
}
}
twitter.profile.update(Pro 以上){
"op": 0,
"d": {
"event": "twitter.profile.update",
"event_id": "evt_p_example_dev_1712000000000",
"task_info": {"handle": "example_dev"},
"data": {
"field": "bio",
"prev": "Old bio text",
"updated": "New bio text"
}
}
}
twitter.follower.new / twitter.tweet.deleted{
"op": 0,
"d": {
"event": "twitter.follower.new",
"task_info": {"handle": "example_dev"},
"data": {
"id": "12345678",
"handle": "newfollower",
"name": "New Follower"
}
}
}
{
"op": 0,
"d": {
"event": "twitter.tweet.deleted",
"task_info": {"handle": "example_dev"},
"data": {
"tweet_id": "1234567890123456789",
"text": "deleted tweet text"
}
}
}
data.type の値:post、reply、quote、repost。プロフィール変更では、field は bio、name、avatar、pinned_tweet のいずれかです。
レベルはモジュールで、料金はアカウント数で決まります
まずモジュールのレベルを選び、次に監視するアカウント数を選びます。月額、米ドル表記、SOLでお支払い(2026年10月5日時点で確認)。
- ツイートのイベント
- 削除ツイートのイベント
- WebSocket + REST
- Starter のすべて
- プロフィール変更のイベント
- 新規フォロワーのイベント
- Pro のすべて
- フォロー・フォロー解除のイベント
- 画像内のコントラクトアドレス(OCR)
| 監視アカウント数 | Starter ツイート + 削除 | Pro + プロフィール変更 + 新規フォロワー | Enterprise + フォロー・解除 | Starter 1アカウントあたり |
|---|---|---|---|---|
| 50 | $49 | $99 | $249 | $0.98 |
| 250 | $229 | $429 | $979 | $0.92 |
| 500 | $449 | $749 | $1649 | $0.90 |
| 1000 | $849 | $1349 | $2849 | $0.85 |
1000アカウントを超える場合は個別にご相談ください。CA Search アドオン(コントラクトアドレス、トークン名、キーワードで過去24時間のツイートを検索。1クエリ最大200件):1日1000クエリで月額$100、2000クエリで$180、5000クエリで$250。支払いはSOLのみで、確定後の返金はできません。英語の完全な料金表:B2B API pricing。
200アカウントをリアルタイム監視する月額コスト
他社の料金は各社の公式サイトで2026年9月20日に確認したもの、X公式APIの料金は2026年10月5日(docs.x.com)に確認したものです。最新の料金は必ず各社サイトでご確認ください。
| 選択肢 | 200アカウント/月 | 備考 |
|---|---|---|
| Xanguard B2B Starter 250 | $229 | WebSocket + REST。削除ツイートのイベントを含み、最大250アカウント |
| TweetStream(250アカウントの Pro プラン) | $499 | 同社サイトに掲載の料金 |
| twitterapi.io(250アカウントのプラン) | $499 | 同社サイトの価格 |
| X公式API(従量課金) | 約$210 | ツイートの読み取りのみ。1件 $0.005、1アカウントあたり1日7ツイートの場合。フォローやプロフィール変更は別料金で、利用制限あり |
他のサービスからの移行
- TweetCatcher:WebSocket は互換の opcode フロー(HELLO → LOGIN → EVENT + ハートビート)です。URL とキーを切り替え、少数の異なるフィールドを調整すれば、通常1時間以内に移行できます。移行ガイド(英語)
- twitterapi.io:リクエスト先URLを
api.xanguard.techに変更し、X-API-Keyヘッダーとデータ構造をそのままお使いください。移行ガイド(英語) - その他のサービス:現在お使いのデータのドキュメントまたはサンプルをお送りください。通常は数時間でフィールドの対応表を用意し、同じチャットで一緒に連携します。
現時点でご提供していないもの
- WebSocket の再接続後の再送は標準では行いません(30秒より古いツイートは遅れて届けず破棄します)。再接続後の直近15分の再送と遅延配信は、ご依頼によりキー単位で有効にできます。
- 書面による稼働率のSLA。
- Discordへの公式配信。支払いはSOLのみで、カードは利用できません。
- ボットの画面は英語のみで、日本語の画面はありません。
よくある質問
1本の WebSocket、そのまま使える JSON
50アカウントで月額49ドルから、SOLで支払い。オンチェーンで確認されると、キーが自動で送られます。
リンクが開かない場合は、Telegramで @B2B_Xanguard_bot を検索してください