# Get an X Space

`GET /v1/x/spaces/{id}`

Returns a Space (a live audio room): its title, state (`NotStarted`, `Running`, or `Ended`), schedule, host, speakers, and audience counts, and whether a replay is available. Listeners are included only with `listeners=true`. 404 when the Space does not exist. Billed per Space returned.

**Price:** 1 credit per call, plus 2 credits per X space returned. Failed and refused calls cost nothing.

**Rate limit:** Counts as 1 request against your per-minute rate limit.

**MCP tool:** `get_x_space`, on every [MCP](/mcp) connection.

Requires an API key, sent as `Authorization: Bearer <key>`.

## Request

```bash
curl --request GET \
  --url https://api.weirapp.io/v1/x/spaces/ID \
  --header "Authorization: Bearer $WEIR_API_KEY"
```

### Path parameters

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `id` | string | yes | Space id: the code after `/i/spaces/` in a Space's URL. · matches `^[A-Za-z0-9]{8,20}$` |

### Query parameters

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `listeners` | string | no | Include the listener list. Off by default: it can be long, and it names individuals who only listened. · `true`, `false`, default `"false"` |

## Response

One X Space.

### `200`

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `data` | object | yes |  |
| `data.id` | string | yes |  |
| `data.url` | string | yes | `https://x.com/i/spaces/{id}`. |
| `data.state` | string or null | yes | X's lifecycle state, such as `NotStarted`, `Running`, or `Ended`. |
| `data.title` | string or null | yes |  |
| `data.createdAt` | string or null | yes |  |
| `data.scheduledStart` | string or null | yes |  |
| `data.startedAt` | string or null | yes |  |
| `data.endedAt` | string or null | yes |  |
| `data.updatedAt` | string or null | yes |  |
| `data.creatorId` | string or null | yes |  |
| `data.creator` | object or null | yes |  |
| `data.creator.id` | string | yes |  |
| `data.creator.username` | string | yes |  |
| `data.creator.name` | string | yes |  |
| `data.creator.verified` | boolean | yes |  |
| `data.creator.followersCount` | integer | yes | min 0 |
| `data.creator.profileImageUrl` | string or null | yes |  |
| `data.isLocked` | boolean or null | yes |  |
| `data.disallowJoin` | boolean or null | yes |  |
| `data.isSpaceAvailableForReplay` | boolean or null | yes |  |
| `data.isSpaceAvailableForClipping` | boolean or null | yes |  |
| `data.totalLiveListeners` | integer or null | yes | min 0 |
| `data.totalReplayWatched` | integer or null | yes | min 0 |
| `data.participantCount` | integer or null | yes | min 0 |
| `data.participants` | object | yes |  |
| `data.participants.admins` | array of object | yes | Hosts and co-hosts. |
| `data.participants.admins[].id` | string or null | yes |  |
| `data.participants.admins[].username` | string or null | yes |  |
| `data.participants.admins[].name` | string or null | yes |  |
| `data.participants.admins[].profileImageUrl` | string or null | yes |  |
| `data.participants.admins[].verified` | boolean or null | yes |  |
| `data.participants.admins[].isMutedByAdmin` | boolean or null | yes |  |
| `data.participants.admins[].isMutedByGuest` | boolean or null | yes | Muted their own microphone. |
| `data.participants.speakers` | array of object | yes |  |
| `data.participants.speakers[].id` | string or null | yes |  |
| `data.participants.speakers[].username` | string or null | yes |  |
| `data.participants.speakers[].name` | string or null | yes |  |
| `data.participants.speakers[].profileImageUrl` | string or null | yes |  |
| `data.participants.speakers[].verified` | boolean or null | yes |  |
| `data.participants.speakers[].isMutedByAdmin` | boolean or null | yes |  |
| `data.participants.speakers[].isMutedByGuest` | boolean or null | yes | Muted their own microphone. |
| `data.participants.listeners` | array of object | yes | Empty unless listeners were requested with `listeners=true`. |
| `data.participants.listeners[].id` | string or null | yes |  |
| `data.participants.listeners[].username` | string or null | yes |  |
| `data.participants.listeners[].name` | string or null | yes |  |
| `data.participants.listeners[].profileImageUrl` | string or null | yes |  |
| `data.participants.listeners[].verified` | boolean or null | yes |  |
| `data.participants.listeners[].isMutedByAdmin` | boolean or null | yes |  |
| `data.participants.listeners[].isMutedByGuest` | boolean or null | yes | Muted their own microphone. |
| `meta` | object | yes |  |
| `meta.requestId` | string | yes |  |
| `meta.nextCursor` | string or null | no |  |

## Errors

| Status | Meaning | What to do |
| --- | --- | --- |
| `400` | The request failed validation. | The request was malformed. The `details` object names the field. |
| `401` | The API key is missing, malformed, expired, or revoked. | The key is missing, malformed, revoked, or expired. |
| `402` | The account is out of credit. Not retryable: this cannot clear until the billing period resets or the plan changes. | Out of credits. **Never retry.** Only a person can clear it, by adding credits at https://weirapp.io/dashboard/billing. Retrying never will. |
| `403` | The API key does not carry the scope this route requires. | The key is valid but lacks the scope this operation needs. |
| `404` | The requested resource does not exist. | No such resource, or it is not public. |
| `429` | The per-minute rate limit is exhausted. Retryable: wait for Retry-After and try again. | Rate limited. Retryable: wait for `Retry-After`, then try again. |
| `500` | An unexpected error occurred. | Something failed on our side. Retryable with backoff. |
| `503` | The source is temporarily unavailable. The request is safe to retry. | A source was unreachable. Retryable with backoff. |
