--- title: "Twitter Spaces API: Titles, Hosts, Listeners as JSON" description: "Look up any X Space by ID for $0.0008 a call: title, state, host, topics, listener counts and the live roster, for scheduled, running and ended Spaces." canonical: https://www.twitterapis.com/twitter-spaces-api generator: md-live-route generated: 2026-11-06T08:43:55.792Z --- # Twitter Spaces API: Titles, Hosts, Listeners as JSON 1. [Home](https://www.twitterapis.com/) 2. / Twitter Spaces API SPACE LOOKUP # Twitter Spaces API: Titles, Hosts, Listeners as JSON Updated July 2026 What does the Twitter Spaces API return? `GET /twitter/spaces/info` takes a Space ID and returns its title, state, host, topics, start and end times, live listener and replay counts, and its admin, speaker and listener roster as JSON. It works on scheduled, running and ended Spaces, costs $0.0008 a lookup, and needs a Bearer key rather than an X developer account. Flat $0.0008 per lookup, $0.80 per 1,000 Spaces. One call returns one Space. Per our own API records, 125 endpoints share this one Bearer key and one prepaid balance. Start with the [quickstart](https://www.twitterapis.com/quickstart), compare [every price](https://www.twitterapis.com/pricing), or connect an agent through the [MCP server](https://www.twitterapis.com/mcp). [Start Free](https://www.twitterapis.com/signup)[Read the docs](https://docs.twitterapis.com/docs/reference/spaces/spaces-info) By the numbers ## What one Space lookup gives you The numbers below come from the example Space in our API reference and from the published rate cards. - A Space lookup on TwitterAPIs bills $0.0008, or $0.80 per 1,000 Spaces. [(TwitterAPIs pricing, 2026)](https://www.twitterapis.com/pricing) - The official X API bills reads between $0.005 and $0.010 per resource. [(X API rates compared, 2026)](https://www.twitterapis.com/twitter-api-pricing) - The example Space in our reference drew 264 live listeners and 6,290 replay views, and both counts come back on one response. [(TwitterAPIs API reference, 2026)](https://docs.twitterapis.com/docs/reference/spaces/spaces-info) - Per our billing data, paying customers made 484,424 tweet-returning read calls over October 22 to 28, 2026 (UTC), on the same keys and the same per-call billing as this endpoint. [(TwitterAPIs measured yield, 2026)](https://www.twitterapis.com/twitter-api-pricing) ## The endpoint that looks up a Space There is one route and one required input, the Space ID, which is the token at the end of an `x.com/i/spaces/` link. The two optional flags control how much roster and replay data comes back. Both default to true, so a plain call gives you everything X will share. ### GET /twitter/spaces/info Look up a single X Space by its id and get back its title, lifecycle state, host, topics, timing, audience counts and its admin, speaker and listener roster. Works for a Space that is scheduled, running or already ended. Billed at $0.0008 per call. | Parameter | Where | Required | Purpose | | --- | --- | --- | --- | | id | query | Yes | The Space id, the trailing token in a x.com/i/spaces/ URL. 5-32 alphanumeric characters. | | with\_listeners | query | No | Include the listener roster. Defaults to true. X does not retain this roster after a Space ends, so it comes back empty for an ended Space regardless of this flag. | | with\_replays | query | No | Include replay availability and related metadata. Defaults to true. | ## Sample response from GET /twitter/spaces/info This is the example from our OpenAPI document, taken from a real ended Space. Timestamps are in milliseconds since the epoch, so divide by 1,000 before you hand them to most date libraries. The `listeners` array is empty here because the Space has ended, which is explained further down. Space Info Copy ``` { "space": { "id": "1RKZzjkoYRAKB", "title": "TIME TO BUILD!", "state": "Ended", "content_type": "visual_audio", "media_key": "28_2042268179733643265", "created_at": 1775749652198, "scheduled_start": 1775840400000, "started_at": 1775840398722, "ended_at": 1775842790853, "updated_at": 1775842791870, "total_live_listeners": 264, "total_replay_watched": 6290, "is_space_available_for_replay": true, "is_space_available_for_clipping": true, "is_locked": false, "is_muted": false, "is_employee_only": false, "no_incognito": false, "disallow_join": false, "is_subscribed": false, "max_admin_capacity": 3, "max_guest_sessions": 10, "narrow_cast_space_type": 0, "conversation_controls": 0, "topics": [ { "topic_id": "848920371311001600", "name": "Technology" }, { "topic_id": "857879302733418496", "name": "Entrepreneurship" } ], "creator": { "id": "825531272621654016", "username": "TheBestOfAdam", "name": "Adam Soccolich" }, "tweet": { "id": "2042648800989233184", "text": "https://t.co/TARX17sERY" }, "community_id": "1471580197908586507", "mentioned_user_ids": [ "1254214946751049729" ], "admins": [ { "user_id": "825531272621654016", "screen_name": "TheBestOfAdam", "display_name": "Adam Soccolich", "avatar_url": "https://pbs.twimg.com/profile_images/...", "periscope_user_id": "1WLERGNWdqRQb", "is_verified": true, "is_muted_by_admin": false, "is_muted_by_guest": false, "community_role": "Moderator", "start": 1775840398860 } ], "speakers": [], "listeners": [] } } ``` | Field | What it tells you | | --- | --- | | state | X's lifecycle value: Scheduled, NotStarted, Running or Ended. | | title | The name the host gave it. | | scheduled\_start, started\_at, ended\_at | Timing in epoch milliseconds, so you can measure how late it started and how long it ran. | | total\_live\_listeners | How many people listened while it was live. | | total\_replay\_watched | How many replay views it has collected since. | | topics | X's own topic labels, useful for sorting Spaces by subject. | | creator | The host's account: numeric ID, handle and display name. | | admins, speakers, listeners | The roster, each entry with a handle, display name and verification flag. | | is\_space\_available\_for\_replay | Whether a replay exists, so you know whether to link to one. | ## Quickstart: look up a Space Space data is public, so a Bearer key is the only credential you need. Take the ID from a Space link, send it as `id`, and read the JSON. If you already have a tweet that links to a Space, the ID is the last path segment of that link. 1. Create a key at [signup](https://www.twitterapis.com/signup). 2. Copy the token after `/i/spaces/` from the Space's link. It is 5 to 32 letters and digits. 3. Send the request below and read `space.state` to see where the Space stands. cURL Python JavaScript Copy ``` curl "https://api.twitterapis.com/twitter/spaces/info?id=1RKZzjkoYRAKB" \ -H "Authorization: Bearer $TWITTERAPIS_KEY" ``` ``` import os import requests resp = requests.get( "https://api.twitterapis.com/twitter/spaces/info", headers={"Authorization": f"Bearer {os.environ['TWITTERAPIS_KEY']}"}, params={"id": "1RKZzjkoYRAKB"}, ) resp.raise_for_status() data = resp.json() print(data) ``` ``` const url = new URL("https://api.twitterapis.com/twitter/spaces/info"); url.search = new URLSearchParams({ id: "1RKZzjkoYRAKB" }).toString(); const resp = await fetch(url, { headers: { Authorization: `Bearer ${process.env.TWITTERAPIS_KEY}` }, }); const data = await resp.json(); console.log(data); ``` ## What the Twitter Spaces API costs at real fill One call returns one Space, so the fill is exactly 1 and the price does not depend on the size of the room. A Space with thousands of listeners costs the same as an empty one. The polling row shows the realistic bill for tracking a live event, where you call repeatedly to catch the roster before it disappears. | Workload | Calls | Cost | | --- | --- | --- | | One Space | 1 | $0.0008 | | 1,000 Spaces | 1,000 | $0.80 | | Polling one two-hour Space every 60 seconds | 120 | $0.096 | Calculated from the biller's per-call rate. The signup credit of $0.50 covers 625 lookups. See [all endpoint prices](https://www.twitterapis.com/pricing). ## Twitter Spaces data options compared Spaces data is a small corner of the market, and few vendors cover it at all. What you choose depends on whether you start from an ID or need discovery, so the table separates those two jobs. A row that can search will suit a team that has no IDs yet. | Option | Cost | Finds Spaces by keyword | Listener roster | | --- | --- | --- | --- | | TwitterAPIs | $0.0008 per lookup | No, lookup by ID | Yes, while the Space is live | | Official X API | $0.005 to $0.010 per resource | Yes | Limited to fields X exposes on v2 | | No-code scrapers | Monthly plan | Yes, search results | Varies by tool | | Joining by hand | Your time | Browsing the app | Only what you can see on screen | ## Why the listener roster disappears X does not keep the listener list after a Space ends. While the Space is running, `with_listeners` returns who is in the room. Once it closes, that array comes back empty whatever flag you send, and no vendor can recover it afterwards. Admins and speakers stay available, and so do the aggregate counts. If the audience is the reason you want the data, you have to capture it live. That means finding the Space before it ends and polling on an interval while it runs, then storing each snapshot yourself. A roster taken every minute also shows you who stayed and who dropped off, which a single final count never would. ## How to find Space IDs This endpoint starts from an ID, so you need a way to get one. Hosts almost always share a link to the Space, which makes tweets the natural discovery surface. Search for posts containing `spaces` links with the [Twitter search API](https://www.twitterapis.com/twitter-search-api), then read the token from each result. - From a tweet. Announcement posts carry the `x.com/i/spaces/` link in their URLs. - From an account. Watch a host with the [Twitter webhook API](https://www.twitterapis.com/twitter-webhook-api) and catch the link the moment they post it, or [follow the host](https://www.twitterapis.com/twitter-follow-api) from an account you run. - From a response. The `tweet` object on a Space points back at the post that announced it, which helps when you start from one ID. ## What this endpoint does not return The response is metadata, not media. You get the title, the people and the counts, and you do not get the audio stream or a transcript. `is_space_available_for_replay` tells you whether a recording exists, and a person can open that replay in the app. If your project needs the words that were spoken, you need a separate recording and transcription step. There is also no keyword search on this route, so it will not list every Space on a topic. That is a deliberate scope limit and the comparison table above shows who covers it. Our answer on [getting Twitter Spaces data](https://www.twitterapis.com/answers/how-to-get-twitter-spaces-data-api) goes through the how-to in more detail. ## Capture a live roster with a polling loop The loop below polls one Space once a minute until its state reads Ended, and records who was in the room at each pass. Every snapshot goes into a dictionary keyed by handle, so at the end you have the first and last minute each listener was seen, which gives you an attendance curve that no single response can show. The handles sit on `screen_name` inside each roster entry. Start the loop before the Space does if you can. A Space that is still scheduled returns its `scheduled_start`, so a job can sleep until then and begin polling on time. To catch a host's next Space without watching by hand, register that account with the [Twitter webhook API](https://www.twitterapis.com/twitter-webhook-api) and start the loop when the announcement arrives. Our [monitoring page](https://www.twitterapis.com/twitter-monitoring) describes how that watching works in more detail. Python Copy ``` import os import time import requests API = "https://api.twitterapis.com/twitter/spaces/info" HEADERS = {"Authorization": f"Bearer {os.environ['TWITTERAPIS_KEY']}"} space_id = "1RKZzjkoYRAKB" seen = {} minute = 0 while True: resp = requests.get(API, headers=HEADERS, params={"id": space_id}, timeout=30) resp.raise_for_status() space = resp.json()["space"] if space["state"] == "Ended": break for person in space["listeners"]: handle = person["screen_name"] first, _ = seen.get(handle, (minute, minute)) seen[handle] = (first, minute) minute += 1 time.sleep(60) print(len(seen), "listeners seen") ``` ## What teams do with Spaces data Spaces leave little behind once they end, so most uses revolve around recording a moment that would otherwise vanish. The title, the host and the headline counts survive, and they are enough for reporting. The roster is what makes the richer jobs possible, and it only exists while the Space runs. These are the jobs the endpoint is usually asked to do. Enrich what you collect with the rest of the API. A handle from the roster goes straight into the [user API](https://www.twitterapis.com/twitter-user-api) for a bio and a follower count, and the [followers API](https://www.twitterapis.com/twitter-followers-api) shows who those people reach. For a recurring community call, save a [Twitter list](https://www.twitterapis.com/twitter-list-api) of regular speakers and watch how it changes over time. - Event reporting. Send sponsors the live count, replay views and duration, all from one response. - Speaker research. Pull `admins` and `speakers` from past Spaces in your field to build a guest shortlist. - Audience capture. Sample the live roster to see who attends, then compare across a series. - Community tracking. `community_id` links a Space to its X Community, and `topics` gives you X's own labels for grouping. ## Reading the less obvious fields A few fields answer questions people usually assume they cannot ask. `content_type` reads `audio` for an audio-only Space and `visual_audio` when the host turned video on. `started_at` minus `scheduled_start` tells you how late it began, and `ended_at` minus `started_at` gives the running time, all in milliseconds. A scheduled Space that has not begun returns `started_at` as 0. `tweet` points at the post that wraps the Space, which you can pass to a [tweet by ID lookup](https://www.twitterapis.com/twitter-tweet-by-id-api) for its engagement. `mentioned_user_ids` lists accounts the Space tagged, and the roster entries carry `is_verified` and a `community_role`. If you have not called the API before, the [quickstart](https://www.twitterapis.com/quickstart) and the [rate limits page](https://www.twitterapis.com/twitter-api-rate-limits) cover the basics that apply to every route. ## Handling scheduled, cancelled and missing Spaces A Space ID can resolve to nothing, and your code should expect that. The response is a 404 with `space` null when the ID resolves to no Space, which usually means a typo or a Space that was removed, so log it and move on rather than retrying. A Space that is planned but has not begun returns `started_at` as 0, so test that field before you compute a duration. ## Read Spaces from an AI agent Hand an agent a Space link and it can report who hosted, what it covered and how many people listened. The tool below takes the same inputs as the REST call, and the [MCP page](https://www.twitterapis.com/mcp) shows how to connect it to your client with the same key. - `twitter_spaces_info` calls GET /twitter/spaces/info Install the MCP server Copy ``` npx -y @twitterapis/mcp@latest ``` ## Twitter Spaces API questions ### Is there a Twitter Spaces API? Yes. X has Spaces endpoints on its v2 API, and TwitterAPIs offers GET /twitter/spaces/info at $0.0008 a lookup, which returns a Space's metadata and roster by ID with no developer app. ### Can I get the listeners of a Space? Yes, while it is live. Set with\_listeners to true or leave it out, since it defaults to true. X does not retain the listener roster after a Space ends, so it comes back empty for an ended Space. ### Can I download the audio of a Space? Not through this endpoint. It returns metadata. is\_space\_available\_for\_replay tells you whether a recording exists, and the audio itself stays on X. ### How much does the Spaces API cost? $0.0008 per lookup, or $0.80 per 1,000 Spaces. A large room costs the same as a small one, because the price is per call and not per listener. ### How do I find a Space's ID? It is the token at the end of the Space's link, after /i/spaces/. In x.com/i/spaces/1RKZzjkoYRAKB the ID is 1RKZzjkoYRAKB. ### Does it work on ended Spaces? Yes. Scheduled, running and ended Spaces all return. An ended Space still gives you its title, host, timing, admins, speakers and total counts, but not the listener list. ### Can I search for Spaces by keyword? Not on this route, which looks up one ID at a time. To discover Spaces, search tweets for Space links with the search API, then look each one up by ID. ### Look up your first Space Create a key and paste in a Space ID. The signup credit covers 625 lookups. [Start free](https://www.twitterapis.com/signup)[See every price](https://www.twitterapis.com/pricing) ## Next read Continue exploring related pages: [ Twitter API use cases 14 use cases from sentiment analysis to lead generation. ](https://www.twitterapis.com/twitter-api-usecases)[ Twitter API answers Short, sourced answers to the most common Twitter and X API questions. ](https://www.twitterapis.com/answers)[ Twitter timeline API Pull an account's full posting history over one REST endpoint. ](https://www.twitterapis.com/twitter-timeline-api)[ Twitter list API Read list members and list timelines with the same Bearer key. ](https://www.twitterapis.com/twitter-list-api) [ TwitterAPIs ](https://www.twitterapis.com/) The cheapest pay-as-you-go Twitter and X API. $0.0008 per call, which works out to $0.04 per 1,000 tweets on a full 20-tweet page. No subscriptions and no developer account. ## Product / API - [Pricing](https://www.twitterapis.com/pricing) - [Cost Calculator](https://www.twitterapis.com/twitter-api-cost-calculator) - [Rate Limits](https://www.twitterapis.com/twitter-api-rate-limits) - [MCP Server](https://www.twitterapis.com/mcp) - [Integrations](https://www.twitterapis.com/integrations) - [Language Clients](https://www.twitterapis.com/sdk) - [Changelog](https://www.twitterapis.com/changelog) - [Status](https://www.twitterapis.com/status) ## Developers - [Documentation](https://docs.twitterapis.com/docs) - [API Reference](https://docs.twitterapis.com/docs/reference/search/tweet-advanced-search) - [User Info](https://docs.twitterapis.com/docs/reference/user-reads/user-info) - [User Tweets](https://docs.twitterapis.com/docs/reference/user-reads/user-tweets) - [Advanced Search](https://docs.twitterapis.com/docs/reference/search/tweet-advanced-search) - [Verified Followers](https://docs.twitterapis.com/docs/reference/follower-graph/user-verified-followers) ## Resources / Compare - [Answers](https://www.twitterapis.com/answers) - [Reviews](https://www.twitterapis.com/reviews) - [Free Tools](https://www.twitterapis.com/tools) - [Twitter ID Finder](https://www.twitterapis.com/tools/twitter-id-finder) - [Get a Twitter API Key](https://www.twitterapis.com/twitter-api-key) - [Official X API Comparison](https://www.twitterapis.com/twitter-api-pricing) - [Twitter API Use Cases](https://www.twitterapis.com/twitter-api-usecases) - [Twitter API Alternatives](https://www.twitterapis.com/twitter-api-alternatives) - [Twitter Unofficial API](https://www.twitterapis.com/twitter-unofficial-api) - [Twitter Free API](https://www.twitterapis.com/twitter-free-api) - [TwitterAPIs vs twitterapi.io](https://www.twitterapis.com/twitterapis-vs-twitterapi-io) - [TwitterAPIs vs GetXAPI](https://www.twitterapis.com/twitterapis-vs-getxapi) - [TwitterAPIs vs TweetAPI](https://www.twitterapis.com/twitterapis-vs-tweetapi) - [TwitterAPIs vs TwexAPI](https://www.twitterapis.com/twitterapis-vs-twexapi) - [TwitterAPIs vs RapidAPI](https://www.twitterapis.com/twitterapis-vs-rapidapi) ## Legal - [About](https://www.twitterapis.com/about) - [Security](https://www.twitterapis.com/security) - [Trust](https://www.twitterapis.com/privacy-and-data-handling) - [Terms of Service](https://www.twitterapis.com/terms-of-service) - [Affiliates](https://www.twitterapis.com/affiliates) - [Contact](https://www.twitterapis.com/contact) - [Jobs](https://www.twitterapis.com/jobs) © 2026 TwitterAPIs. All rights reserved. TwitterAPIs is an independent third-party API for developers and researchers. Not affiliated with, endorsed by, or sponsored by X Corp. All systems operational