本文へスキップ

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つで、開発者アカウントは不要です。

  1. キーを取得する。 サインアップして、ダッシュボードから API キーをコピーします。100回分の無料リクエストで、100スペースを取得できます。

  2. スペース ID をコピーする。 スペース ID は、スペースのリンクの /i/spaces/ の後ろにある、英数字のコードです。x.com/i/spaces/1yNxaYzQkPwKj なら 1yNxaYzQkPwKj です。X は13文字までに制限しており、ポストが持つ長い数字とは別物です。

  3. リクエストを送る。 ID を id、またはリンク全体を link として、API キーを ApiKey ヘッダーに付けて GET /spaces(新しいタブで開きます) を呼び出します。

    ターミナル
    curl -G "https://api.sorsa.io/v3/spaces" \
      -H "ApiKey: YOUR_API_KEY" \
      --data-urlencode "id=1yNxaYzQkPwKj"
    
  4. レスポンスを読む。 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つのフィールドを読みます。誰がホストか、誰が話すか、ライブで何人が聴いているか、何人がリプレイを再生したか、そして状態です。図は、レスポンス全体を、各部分が答える問いごとにまとめたものです。

GET /spaces?id=1yNxaYzQkPwKj リクエスト1回、JSONオブジェクト1つ Space 内容と日時 title state scheduled_start created_at, updated_at UnixタイムスタンプでありISO日付ではない 運営者 ホスト、共同ホスト、スピーカー creator プロフィール全体 participants.admins participants.speakers username、name、認証済みフラグ ステージ上の各人について 聴取者数 ルーム内の全員の数 stats.total_live_listeners stats.total_participants stats.total_replay_watched participants.total 数のみで、全リストは返さない 設定 リプレイ、クリップ、アクセス is_space_available_for_replay is_space_available_for_clipping is_locked disallow_join すべてsettings配下
1回のリクエストで、スペースを運営している人、話している人、聴いている人数がわかります。ホスト以外の人々のプロフィールには、バッチ取得をもう1回行います。

公式 X API からコードを移行する場合、フィールドの対応は次のとおりです。

知りたいことSorsa API のフィールド公式 X API のフィールド
スペースを始めた人creator(完全なプロフィール)creator_id(プロフィールは expansions 経由のみ)
ホストと共同ホストparticipants の admins(ユーザー名と名前付き)host_ids
スピーカーparticipants の speakers(ユーザー名と名前付き)speaker_ids
視聴者数stats の total_live_listeners と total_participantsparticipant_count
リプレイの再生数stats の total_replay_watchedなし
予定か、ライブかstate、scheduled_startstate、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年までさかのぼる全アーカイブから返ります。

クエリ from:harbor_founders_live filter:spaces 1 投稿を検索 POST /search-tweets Spaceリンク付きの 投稿、 1ページ約20件 2 IDを抽出 /i/spaces/ 1yNxaYzQkPwKj 各投稿の 本文とリンクから 3 1件ずつ取得 GET /spaces Spaceごとに リクエスト1回 4 自分のテーブル タイトルと状態 ホストとスピーカー ライブ聴取者数 リプレイ再生数
検索でスペースにリンクするポストを見つけ、リンクから ID を取り出し、ID ごとに1回取得して表を埋めます。

クエリは、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件ずつ取得します。

Python
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、ライブのリスナー数、ステージにいる人が返るので、値の一覧がそのままスペースの視聴者数の推移になります。

Python
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 のリクエストはすべてその場で応答するので、チェックのたびに、その瞬間の部屋の様子がわかります。次の計算ツールは、スペースの数とチェック回数をリクエスト数と、それをカバーするプランに換算します。

100
Spaceごとのチェック回数
月のリクエスト数
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 リファレンスから作成したものです。この記事のために、実在のスペースに対しては実行していません。

Sorsa APIチーム 読み取り専用のX(Twitter)APIとスクレイピングツール、Sorsa APIを開発・運営しています。2022年から本番稼働し(旧TweetScout API)、累計60億リクエスト以上を処理しています。 Sorsa APIについて

変更点
  • 初公開。