X Spaces API:ホスト・スピーカー・リスナー数を取得する
X スペースのホスト、スピーカー、リスナー数は、x.com/i/spaces/ のリンク末尾にある ID を使った1回の取得でわかります。公式 X API ではスペース1件につき$0.005が課金され、スペースが終了すると応答しなくなります。
結論: 取得できるのは、ライブ音声ルームのタイトル、状態、ホスト、スピーカー、リスナー数です。音声や、リスナー全員の一覧は取得できません。ホストのプロフィール付きだと、公式 X API は2026年11月22日からスペース1件につき$0.015を課金します。スペースの詳細を取得するなら、Sorsa API の GET /spaces を使います。1,000スペースあたり$1.40からで、100回分の無料リクエストで最初の100スペースを取得できます。
- エンドポイント
GET /spaces- 1ページの件数
- 1リクエストあたり1スペース
- 料金
- 1,000件あたり$1.40から
#スペースの取得で返るもの、どの API も返さないもの
スペースの取得では、1つのスペースについて3種類の情報が返ります。スペースそのもの(タイトル、状態、予定時刻と開始時刻)、運営者(ホスト、共同ホスト、スピーカー)、そして聴いている人の数です。それ以上は返りません。音声も、文字起こしも、参加者全員の名簿もありません。API で読める、これ以外の種類の X データについては、Twitter API で取得できるデータの一覧に、並べてまとめてあります。
X 自身の開発者プラットフォームは、GET /2/spaces/{id} とそのバッチ版、作成者別版でスペースを読み取ります。Spaces のドキュメント(新しいタブで開きます)には、どんなプロジェクトにも影響する3つの制限があります。
- リスナーは数字で届く。
participant_countフィールドはホストを含めて部屋にいる全員を数えます。リスナーの一覧はありません。 - 人は ID で届く。 ホスト、共同ホスト、スピーカーはユーザー ID で返り、プロフィールを得るには
expansionsが必要です。 - 終了したスペースは消える。 スペースが終了すると、Spaces のエンドポイントはスペースの代わりにエラーを返します。
料金はX の従量課金の料金表(新しいタブで開きます)にあります。スペースの読み取りは1件$0.005、つまり1,000件あたり$5.00です。2026年11月22日からは、展開で返されるユーザープロフィールにも1件$0.010が課金されるため(10月23日の X の通知(新しいタブで開きます))、ホストのプロフィール付きのスペースは$0.015になります。どの呼び出しにも、開発者アカウント、前払いのクレジット、OAuth 2.0 かベアラートークンが必要です。
リスナーの制限は、X の API が出し惜しみしているからではありません。スペースは公開されており、X ヘルプセンター(新しいタブで開きます)によると、ログアウトした状態で聴いている人は、部屋のゲストとして一覧に載らないことがあります。リスナー数は確かなデータですが、リスナー全員の一覧は、どこにも存在しません。
#Sorsa API でスペースの詳細を取得する
コードで X スペースを読み取るには、Twitter(X)API 兼スクレイピングツールである Sorsa API を使います。GET /spaces はスペースの ID かリンクを受け取り、タイトル、状態、時刻、ホストの完全なプロフィール、共同ホストとスピーカー、ライブとリプレイの数を、1,000スペースあたり$1.40からの1リクエストで返します。全プランで毎秒20リクエスト、API キーは1つで、開発者アカウントは不要です。
-
キーを取得する。 サインアップして、ダッシュボードから API キーをコピーします。100回分の無料リクエストで、100スペースを取得できます。
-
スペース ID をコピーする。 スペース ID は、スペースのリンクの
/i/spaces/の後ろにある、英数字のコードです。x.com/i/spaces/1yNxaYzQkPwKjなら1yNxaYzQkPwKjです。X は13文字までに制限しており、ポストが持つ長い数字とは別物です。 -
リクエストを送る。 ID を
id、またはリンク全体をlinkとして、API キーをApiKeyヘッダーに付けてGET /spaces(新しいタブで開きます) を呼び出します。ターミナル curl -G "https://api.sorsa.io/v3/spaces" \ -H "ApiKey: YOUR_API_KEY" \ --data-urlencode "id=1yNxaYzQkPwKj" -
レスポンスを読む。 1つの JSON オブジェクトが返ります。先頭にスペースのフィールド、
creatorにホストの完全なプロフィール、participantsに役割別の人々、statsに視聴者数、settingsにリプレイとアクセスのフラグが入っています。レスポンス200 OK { "id": "1yNxaYzQkPwKj", "title": "Shipping hardware in Q1: founders compare notes", "state": "Running", "scheduled_start": 1793642400000, "created_at": 1793641912000, "updated_at": 1793645530000, "media_key": "28_1793641912057", "is_subscribed": false, "creator": { "id": "1630218874471563264", "username": "harbor_founders_live", "display_name": "Harbor Founders", "description": "Weekly live audio for people who ship hardware.", "followers_count": 48210, "followings_count": 312, "verified": true, "protected": false, "created_at": "2023-02-27T14:05:11Z", "profile_image_url": "https://pbs.twimg.com/profile_images/1630/harbor.jpg" }, "participants": { "admins": [ { "id": "1630218874471563264", "username": "harbor_founders_live", "name": "Harbor Founders", "is_verified": true, "start": 1793642405000 }, { "id": "1488230561123123200", "username": "maren_builds_hardware", "name": "Maren Holt", "is_verified": false, "start": 1793642460000 } ], "speakers": [ { "id": "1712093345678901248", "username": "tomas_ships_firmware", "name": "Tomas Reyes", "is_verified": false, "is_muted_by_admin": false, "start": 1793643120000 } ], "listeners": [], "total": 1286 }, "stats": { "total_live_listeners": 1183, "total_participants": 1286, "total_replay_watched": 0 }, "settings": { "is_space_available_for_replay": true, "is_space_available_for_clipping": true, "is_locked": false, "disallow_join": false, "max_admin_capacity": 3 } }
同じ呼び出しを Python と Node.js で示します。スペースの一覧をループ処理する用途にそのまま使えます。
import requests
API = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
def get_space(space_id):
r = requests.get(f"{API}/spaces", headers=HEADERS,
params={"id": space_id}, timeout=30)
r.raise_for_status()
return r.json()
space = get_space("1yNxaYzQkPwKj")
people = space["participants"]
print(space["title"], "|", space["state"])
print("Host:", space["creator"]["username"])
print("Admins:", [p["username"] for p in people["admins"]])
print("Speakers:", [p["username"] for p in people["speakers"]])
print("Live listeners:", space["stats"]["total_live_listeners"])
間違った ID や存在しない ID は 404、キーがない、またはリクエストが残っていない場合は 403 を返し、失敗したリクエストに課金されることはありません。毎秒20リクエストを超えると 429 が返るので、1秒待ってからもう一度送ってください。
#「誰が」「何人が」に答えるフィールド
スペースのプロジェクトの多くは、5つのフィールドを読みます。誰がホストか、誰が話すか、ライブで何人が聴いているか、何人がリプレイを再生したか、そして状態です。図は、レスポンス全体を、各部分が答える問いごとにまとめたものです。
公式 X API からコードを移行する場合、フィールドの対応は次のとおりです。
| 知りたいこと | Sorsa API のフィールド | 公式 X API のフィールド |
|---|---|---|
| スペースを始めた人 | creator(完全なプロフィール) | creator_id(プロフィールは expansions 経由のみ) |
| ホストと共同ホスト | participants の admins(ユーザー名と名前付き) | host_ids |
| スピーカー | participants の speakers(ユーザー名と名前付き) | speaker_ids |
| 視聴者数 | stats の total_live_listeners と total_participants | participant_count |
| リプレイの再生数 | stats の total_replay_watched | なし |
| 予定か、ライブか | state、scheduled_start | state、scheduled_start、started_at |
| リプレイとクリップの許可 | settings の2つのフラグ | なし |
スペースを始めた人
- Sorsa API のフィールド
creator(完全なプロフィール)- 公式 X API のフィールド
creator_id(プロフィールはexpansions経由のみ)
ホストと共同ホスト
- Sorsa API のフィールド
participantsのadmins(ユーザー名と名前付き)- 公式 X API のフィールド
host_ids
スピーカー
- Sorsa API のフィールド
participantsのspeakers(ユーザー名と名前付き)- 公式 X API のフィールド
speaker_ids
視聴者数
- Sorsa API のフィールド
statsのtotal_live_listenersとtotal_participants- 公式 X API のフィールド
participant_count
リプレイの再生数
- Sorsa API のフィールド
statsのtotal_replay_watched- 公式 X API のフィールド
- なし
予定か、ライブか
- Sorsa API のフィールド
state、scheduled_start- 公式 X API のフィールド
state、scheduled_start、started_at
リプレイとクリップの許可
- Sorsa API のフィールド
settingsの2つのフラグ- 公式 X API のフィールド
- なし
デバッグの手間を減らす点が1つあります。スペースのオブジェクトの時刻は Unix タイムスタンプ(ただの数値)ですが、Sorsa API のほかの部分は、上の creator.created_at のように ISO 8601 の日付を使います。
知っておきたいこと
participants.listenersは、部屋がたまたま表示している人たちであり、出席簿ではありません。X が一覧に載せるのは一部のリスナーだけで、ログアウトしているリスナーは載りません。視聴者数は、全員を数えるstats.total_live_listenersで読み取ってください。
admins と speakers にはユーザー名、名前、認証済みフラグが付きますが、ホストには完全なプロフィールが付きます。ステージにいる全員のフォロワー数や自己紹介が必要なときは、そのユーザー名を GET /info-batch(新しいタブで開きます) に渡してください。1リクエストで最大100プロフィールを、1,000件あたり$0.014からで取得できます。
#取得するスペースを探す:スペースにリンクするポストを検索する
スペースの取得には ID が必要で、ID を見つける場所は X 自体です。ホストはポストでスペースを告知し、そのポストにはスペースのリンクが必ず付いています。Sorsa API の POST /search-tweets(新しいタブで開きます) に filter:spaces コマンドを付けると、スペースのリンクを含むポストだけが、1リクエストに約20件ずつ、2006年までさかのぼる全アーカイブから返ります。
クエリは、Twitter 検索コマンドのガイドですでにおなじみのコマンドから組み立てます。
from:harbor_founders_live filter:spacesは、1人のホストが共有したスペースをすべて見つけます。"hardware" filter:spaces since:2026-10-01は、10月以降の、あるトピックのスペースを見つけます。(from:host_one_on_stage OR from:host_two_on_stage) filter:spacesは、少数のホストを監視します。
次のスクリプトは、next_cursor で結果をページ送りしながら、各ポストの本文とリンクからスペース ID を取り出し、前の手順の get_space() で1件ずつ取得します。
import re
import requests
API = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
SPACE_LINK = re.compile(r"/i/spaces/([A-Za-z0-9]{1,13})")
def find_space_ids(query, max_pages=5):
ids, cursor = set(), None
for _ in range(max_pages):
body = {"query": query, "order": "latest"}
if cursor:
body["next_cursor"] = cursor
r = requests.post(f"{API}/search-tweets", headers=HEADERS,
json=body, timeout=30)
r.raise_for_status()
page = r.json()
for post in page.get("tweets", []):
links = [e.get("link") or "" for e in post.get("entities", [])]
for text in [post["full_text"], *links]:
ids.update(SPACE_LINK.findall(text))
cursor = page.get("next_cursor")
if not cursor:
break
return ids
for space_id in find_space_ids("from:harbor_founders_live filter:spaces"):
space = get_space(space_id)
print(space_id, space["state"], space["title"],
space["stats"]["total_live_listeners"])
検索の各ページも、取得の1件も、それぞれ1リクエストです。30スペースが見つかる5ページの検索なら、合計35リクエストで、毎秒20リクエストなら実行全体が数秒で終わります。
#ライブ中のスペースを追う:リスナー数の推移
スペースの視聴者がどう増え、どう減るかを見るには、ライブ中に同じスペースをスケジュールに沿って繰り返し取得し、そのたびの値を保存します。取得のたびに、現在の state、ライブのリスナー数、ステージにいる人が返るので、値の一覧がそのままスペースの視聴者数の推移になります。
import time
from datetime import datetime, timezone
def track(space_id, every_seconds=180, checks=30):
for _ in range(checks):
space = get_space(space_id)
now = datetime.now(timezone.utc).strftime("%H:%M")
stage = len(space["participants"]["speakers"])
print(now, space["state"],
space["stats"]["total_live_listeners"], stage)
time.sleep(every_seconds)
track("1yNxaYzQkPwKj")
90分のスペースを3分おきにチェックすると、30リクエストで、Pro プランの1,000件あたり$1.99なら約$0.06です。Sorsa API のリクエストはすべてその場で応答するので、チェックのたびに、その瞬間の部屋の様子がわかります。次の計算ツールは、スペースの数とチェック回数をリクエスト数と、それをカバーするプランに換算します。
- 月のリクエスト数
- 3,000
- 収まるプラン
- Starter
- $49/月、10Kリクエスト
- 追跡するSpaceあたり
- $0.15
- $4.90 / 1,000リクエスト
- 無料の100リクエストでカバーできる数
- 3件のSpace
1回のチェックが1リクエストなので、追跡ジョブの費用は、Spaceの数 × チェック回数で決まります。合計を賄える最小のプランを選んでください。
監視中のアカウントが投稿したときの通知、つまりスペースを開くポストの通知については、Twitter のリアルタイム監視のガイドが大規模なポーリングのループを紹介しています。また、公開 X リストを使えば、最大5,000人のホストの最新ポストを1リクエストで読み取れます。詳しくは Twitter リスト APIのガイドを参照してください。
#X Spaces のデータのコスト:Sorsa API と公式 X API の比較
Sorsa API でのスペースの取得は、スペースの中身に関係なく1リクエストで、ホストの完全なプロフィール込みで1,000スペースあたり$1.40からです。公式 X API で、ホストのプロフィール付きの同じスペースを取得すると、2026年11月22日から1件$0.015、つまり1,000件あたり$15.00です。
公式 X API
$150
1万 スペースの場合
ホストのプロフィール付きで1スペースあたり$0.015
Sorsa API
$14から
1万 スペースの場合
1,000スペースあたり$1.40から
10分の1のコスト
公式 X API では、展開する共同ホストとスピーカーが1人増えるごとに$0.010が加わるため、ステージに5人いるスペースは$0.055になります。Sorsa API は、同じ人々を同じ1回のリクエストで返します。料金は、スペースのプロジェクトを左右する5つの要素の1つで、Sorsa API は、それぞれに数字で答えます。
- 1,000スペースあたりの料金: Sorsa API は$1.40から。公式 X API は、スペースだけで$5.00、ホスト付きで$15.00です。
- 人: ホストの完全なプロフィール、共同ホスト、スピーカーが同じレスポンスに入ります。ステージにいる全員の完全なプロフィールは、追加1リクエストあたり100人です。
- 視聴者の数: ライブのリスナー数、全参加者数、リプレイの再生数。公式 X API は参加者数が1つだけです。
- スペースの探索:
filter:spacesで2006年までさかのぼるポストを検索できるので、誰かから送られたリンクに限定されません。 - セットアップと速度: ヘッダーに API キー1つ。開発者アカウントも OAuth も不要で、全プラン毎秒20リクエストなので、1,000スペースが1分かからずに終わります。
Sorsa API は設計上、読み取り専用で、X のログインを求めることもないため、ご自身の X アカウントが危険にさらされることはありません。スペースを作成・ホストするには X のアプリを使い、スペースについて投稿するには、Sorsa API と公式 X API を組み合わせてください。
#最初のスペースを取得する
X スペースのホスト、スピーカー、リスナー数は、リンクにある ID を使った1回の取得でわかります。公式 X API は、スペースが終了すると何も返しません。Sorsa API は、同じスペースをホストの完全なプロフィールとライブ・リプレイの数つきで、1,000スペースあたり$1.40からの1リクエストで読み取り、検索でスペースを見つけることもできます。100回分の無料リクエストで100スペースを取得できます。上のリクエストにスペースのリンクを貼り付けて、実行してみてください。
#よくある質問
Twitter Spaces は、今もありますか?
はい。2023年の名称変更前は Twitter Spaces と呼ばれていた X スペースは、2026年の今も、誰でも参加して聴ける公開のライブ音声ルームとして続いています。ホストは iOS と Android の X アプリで開始または予約し、リスナーはウェブからも参加できます。開発者は、公式 X API の Spaces エンドポイントか、Sorsa API の GET /spaces で読み取ります。
スペース ID はどこで見つけますか?
スペース ID は、スペースのリンクの末尾にあるコードです。x.com/i/spaces/1yNxaYzQkPwKj なら 1yNxaYzQkPwKj で、英数字の最大13文字です。スペースの共有リンクか、スペースを告知するポストからコピーしてください。Sorsa API の GET /spaces はリンク全体も受け付けます。また、filter:spaces を使った検索で、ポストからスペースのリンクをまとめて集められます。
スペースを聴いた全員の一覧は取得できますか?
いいえ。完全な一覧を返せる API はありません。X がスペース内に表示するのは一部のリスナーだけで、ヘルプセンターによると、ログアウトして聴いている人は、まったく一覧に載らないことがあります。スペースの取得で得られるのは数です。Sorsa API はライブのリスナー数、全参加者数、リプレイの再生数を返し、公式 X API は参加者数を1つ返します。
API でスペースの音声や文字起こしをダウンロードできますか?
Sorsa API が返すのはスペースの詳細で、音声ではありません。タイトル、状態、人々、各種の数、リプレイが利用できるかどうかは返りますが、音声ファイルも文字起こしもありません。公式 X API の Spaces エンドポイントも、音声は返しません。スペースを録音したホストは、X の「Your X Data」ツールから、自分の録音をダウンロードできます。
X Spaces のデータを取得するには、どの API を使えばよいですか?
X Spaces のデータには、Sorsa API を使います。GET /spaces は、スペースのタイトル、状態、ホストのプロフィール、共同ホスト、スピーカー、ライブのリスナー数、リプレイの再生数を1リクエストで返し、料金は1,000スペースあたり$1.40からです。公式 X API ではホストのプロフィール付きで1,000件あたり$15.00です。API キー1つで使え、開発者アカウントは不要で、毎秒20リクエストで動作し、filter:spaces を使った検索でスペースも見つけられます。
#本ガイドの調査と検証の方法
2026年11月2日に、GET /spaces、POST /search-tweets、GET /info-batch の最新の Sorsa API リファレンス、X の Spaces ドキュメントと Get Space by ID リファレンス、X の従量課金の料金表と展開に関する10月23日の通知、X ヘルプセンターの About X Spaces のページを読みました。このページのリクエストとレスポンスは、デモのスペースとデモのアカウントを使って API リファレンスから作成したものです。この記事のために、実在のスペースに対しては実行していません。