{
  "data": {
    "id": "aib0amnLWbKcMPzJe",
    "actId": "zhRubyXu0We3FiDsl",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-07T20:42:32.679Z",
    "finishedAt": "2026-11-07T20:42:42.619Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 9811,
      "runTimeSecs": 9.811,
      "computeUnits": 0.010901111111111111,
      "imageSizeBytes": 1228019712
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"X Space Collector\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"spaceUrls\": {\n      \"title\": \"Space links, IDs or announcement posts\",\n      \"type\": \"array\",\n      \"description\": \"Paste Space links such as https://x.com/i/spaces/1YpKkZgnrDXxj, bare Space IDs, or the post that announces a Space (the actor finds the Space from its card). x.com and twitter.com links both work.\",\n      \"editor\": \"stringList\",\n      \"sectionCaption\": \"Spaces to collect\",\n      \"sectionDescription\": \"Collect exact Spaces by link or ID. Leave empty when you use keyword or host discovery below.\",\n      \"prefill\": [\n        \"https://x.com/i/spaces/1YpKkZgnrDXxj\"\n      ],\n      \"example\": [\n        \"https://x.com/i/spaces/1YpKkZgnrDXxj\",\n        \"1YpKkZgnrDXxj\",\n        \"https://x.com/i/status/2119157462183858414\"\n      ]\n    },\n    \"searchQueries\": {\n      \"title\": \"Search keywords or hashtags\",\n      \"type\": \"array\",\n      \"description\": \"Find public Spaces from posts that match a keyword or hashtag, for example AI, crypto or #Space. Each query reads recent matching posts and resolves the Spaces they announce.\",\n      \"editor\": \"stringList\",\n      \"sectionCaption\": \"Find Spaces automatically\",\n      \"sectionDescription\": \"Discover Spaces from recent public posts, or from the recent posts of specific hosts.\",\n      \"example\": [\n        \"AI\",\n        \"#Space\"\n      ]\n    },\n    \"hostUsernames\": {\n      \"title\": \"Host usernames\",\n      \"type\": \"array\",\n      \"description\": \"Find Spaces announced by specific X accounts. Paste handles with or without @, or a profile URL.\",\n      \"editor\": \"stringList\",\n      \"example\": [\n        \"NASA\",\n        \"https://x.com/elonmusk\"\n      ]\n    },\n    \"maxSpaces\": {\n      \"title\": \"Maximum discovered Spaces\",\n      \"type\": \"integer\",\n      \"description\": \"Upper limit for Spaces found through keywords and hosts. Spaces that you paste as links or IDs are always collected.\",\n      \"default\": 20,\n      \"prefill\": 1,\n      \"minimum\": 1,\n      \"maximum\": 200\n    },\n    \"spaceState\": {\n      \"title\": \"Space state\",\n      \"type\": \"string\",\n      \"description\": \"Only keep Spaces in this state. Applies to links and discovery alike.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"live\",\n        \"upcoming\",\n        \"ended\"\n      ],\n      \"enumTitles\": [\n        \"Any state\",\n        \"Live now\",\n        \"Scheduled\",\n        \"Ended\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"includeParticipants\": {\n      \"title\": \"Include participants\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the host, speakers and listeners to the Space row and emit one separate \\\"space participant\\\" row per person.\",\n      \"default\": true,\n      \"prefill\": true,\n      \"sectionCaption\": \"What to include\",\n      \"sectionDescription\": \"Choose the extra data collected for every Space.\"\n    },\n    \"includeParticipantProfiles\": {\n      \"title\": \"Enrich participant profiles\",\n      \"type\": \"boolean\",\n      \"description\": \"Look up each participant's public profile (bio, followers, website, verification) instead of only the compact name shown in the Space. Adds one request per participant.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxParticipantProfiles\": {\n      \"title\": \"Maximum enriched participant profiles\",\n      \"type\": \"integer\",\n      \"description\": \"Cap on profile lookups per Space. 0 means every participant. Large Spaces with many listeners can be expensive.\",\n      \"default\": 50,\n      \"prefill\": 10,\n      \"minimum\": 0,\n      \"maximum\": 100\n    },\n    \"includeReplayAudio\": {\n      \"title\": \"Include replay audio\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the HLS replay link and, when a file can be produced, store a downloadable audio file with its duration and size.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeTranscript\": {\n      \"title\": \"Include transcript\",\n      \"type\": \"boolean\",\n      \"description\": \"Produce a spoken-word transcript. Captions are used when the replay has them; otherwise AI speech recognition runs (slower and memory-hungry).\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"transcriptSegmentsAsRows\": {\n      \"title\": \"Emit transcript segments as rows\",\n      \"type\": \"boolean\",\n      \"description\": \"In addition to the transcript summary row, emit one \\\"space transcript segment\\\" row per timed segment.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"transcriptionMethod\": {\n      \"title\": \"Transcription method\",\n      \"type\": \"string\",\n      \"description\": \"How the transcript should be produced.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"captions\",\n        \"ai\"\n      ],\n      \"enumTitles\": [\n        \"Automatic (captions first, then AI)\",\n        \"Captions only (fastest)\",\n        \"AI transcription (Whisper)\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"auto\"\n    },\n    \"whisperModel\": {\n      \"title\": \"AI transcription quality\",\n      \"type\": \"string\",\n      \"description\": \"Whisper model for AI transcription. Larger models are more accurate but need more actor memory; on 1 GB the actor safely falls back to a smaller model.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"tiny\",\n        \"base\",\n        \"small\",\n        \"medium\",\n        \"large-v3\"\n      ],\n      \"enumTitles\": [\n        \"Fastest (tiny)\",\n        \"Balanced (base)\",\n        \"Better (small)\",\n        \"High quality (medium)\",\n        \"Best quality (large)\"\n      ],\n      \"default\": \"base\",\n      \"prefill\": \"base\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. The actor works without a proxy and switches to Apify Proxy automatically if X blocks the direct connection.\",\n      \"editor\": \"proxy\",\n      \"sectionCaption\": \"Advanced\",\n      \"sectionDescription\": \"Optional settings for large or repeated runs.\"\n    }\n  }\n}",
    "readme": "# X Space Collector — Metadata, Hosts, Replay & Transcripts\n\nCollect public X (Twitter) Spaces without an account, cookies or API keys. Start from Space links, IDs or announcement posts — or let the actor discover Spaces from a keyword, hashtag or host handle. Every run returns clean, omit-empty records for the Space, its people, its replay audio and, when requested, a timed transcript.\n\n## Three ways to find Spaces\n\n| Mode | Input | What happens |\n|---|---|---|\n| Exact Spaces | `spaceUrls` | Reads a Space link, a bare Space ID, or the post that announces a Space. The Space card is resolved automatically. |\n| Keyword / hashtag | `searchQueries` | Reads recent public posts matching the query and resolves the Spaces they announce. |\n| Host | `hostUsernames` | Reads a host's recent public posts (and their search results) and resolves the Spaces they announce. |\n\nAll three modes can run in one go. Discovered Spaces are capped by `maxSpaces`; pasted links and IDs are always collected. When several inputs resolve to the same Space (for example its link and its announcement post), it is collected once. `spaceState` can keep only live, scheduled, ended or any Spaces.\n\n## What you get\n\nEach run writes rows with a `type`:\n\n| type | Meaning |\n|---|---|\n| `space` | One Space with metadata, counts, host and participants |\n| `space participant` | One row per host, speaker or listener |\n| `video transcript` | The transcript summary with timed segments |\n| `space transcript segment` | One row per timed segment (optional) |\n| `status` | An honest problem row (invalid link, deleted Space, rate limit, unavailable replay) |\n\n### Space row\n\n- **Identity:** `id`, `url`, `title`, `state`, `contentType`\n- **Times:** `createdAt`, `scheduledStart`, `startedAt`, `endedAt`, `durationSeconds`, `updatedAt`, `replayStartSeconds`\n- **Audience:** `listenersLive`, `listenersReplay`, `replayAvailable`\n- **People:** `creator` (full public profile), `hostId`, `hostUsername`, `hostName`, `participants[]`, `participantCounts`\n- **Space settings:** `topics`, `topicIds`, `mentionedUserIds`, `isMuted`, `isLocked`, `isEmployeeOnly`, `disallowJoin`, `noIncognito`, `conversationControls`, `maxAdminCapacity`, `maxGuestSessions`, `narrowCastSpaceType`\n- **Replay:** `replayAudioUrl`, `replayAudioFileUrl`, `replayAudioFileBytes`, `replayAudioContentType`, `replayAudioDurationSeconds`\n- **Source:** `sourceTweetId`, `sourceTweetUrl` when you started from an announcement post\n- `mediaKey`, `collectedAt`\n\n### Participant row\n\n`spaceId`, `spaceUrl`, `spaceTitle`, `participantIndex`, `role`, `userId`, `username`, `name`, `bio`, `location`, `website`, `followers`, `following`, `postCount`, `profileImageUrl`, `bannerUrl`, `isBlueVerified`, `verified`, `verifiedType`, `periscopeUserId`, `isMutedByAdmin`, `isMutedByGuest`, `collectedAt`.\n\n### Transcript row\n\n`spaceId`, `spaceUrl`, `title`, `language`, `transcriptionMethod` (`captions` or `ai`), `modelUsed`, `segmentCount`, `fullTranscript`, `segments[]` (`index`, `start`, `end`, `text`), `collectedAt`.\n\nEmpty fields are omitted at every depth. There are no `null` values in the dataset.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `spaceUrls` | array | – | Space links, Space IDs, or announcement post links |\n| `searchQueries` | array | – | Keywords or hashtags for Space discovery |\n| `hostUsernames` | array | – | Handles whose recent posts announce Spaces |\n| `maxSpaces` | integer | `20` | Cap for discovered Spaces (1–200) |\n| `spaceState` | string | `any` | `any`, `live`, `upcoming` or `ended` |\n| `includeParticipants` | boolean | `true` | Participant list on the Space row + participant rows |\n| `includeParticipantProfiles` | boolean | `true` | Enrich participant stubs with public profile details |\n| `maxParticipantProfiles` | integer | `50` | Profile lookups per Space (0 = all) |\n| `includeReplayAudio` | boolean | `false` | Replay HLS link + downloadable audio file |\n| `includeTranscript` | boolean | `false` | Produce a transcript from captions or Whisper |\n| `transcriptSegmentsAsRows` | boolean | `false` | Emit one row per transcript segment |\n| `transcriptionMethod` | string | `auto` | `auto`, `captions` or `ai` |\n| `whisperModel` | string | `base` | `tiny`, `base`, `small`, `medium` or `large-v3` |\n| `proxyConfiguration` | object | – | Optional; automatic fallback is built in |\n\nAt least one of `spaceUrls`, `searchQueries` or `hostUsernames` is needed.\n\n### Examples\n\nMetadata and participants:\n\n```json\n{\n  \"spaceUrls\": [\"https://x.com/i/spaces/1YpKkZgnrDXxj\"],\n  \"includeParticipants\": true\n}\n```\n\nDiscover by keyword, keep only ended Spaces:\n\n```json\n{\n  \"searchQueries\": [\"#Space\", \"NASA\"],\n  \"spaceState\": \"ended\",\n  \"maxSpaces\": 10\n}\n```\n\nDiscover from hosts:\n\n```json\n{\n  \"hostUsernames\": [\"NASA\", \"@SpaceX\"],\n  \"maxSpaces\": 5\n}\n```\n\nReplay audio with a transcript:\n\n```json\n{\n  \"spaceUrls\": [\"1YpKkZgnrDXxj\"],\n  \"includeReplayAudio\": true,\n  \"includeTranscript\": true,\n  \"transcriptionMethod\": \"auto\",\n  \"transcriptSegmentsAsRows\": true\n}\n```\n\n### Example Space record\n\n```json\n{\n  \"type\": \"space\",\n  \"id\": \"1YpKkZgnrDXxj\",\n  \"url\": \"https://x.com/i/spaces/1YpKkZgnrDXxj\",\n  \"title\": \"Meet NASA's New Mission Control Flight Directors #AskNASA\",\n  \"state\": \"Ended\",\n  \"createdAt\": \"2022-07-19T15:25:30+00:00\",\n  \"startedAt\": \"2022-07-19T15:59:30+00:00\",\n  \"endedAt\": \"2022-07-19T16:45:16+00:00\",\n  \"durationSeconds\": 2746.0,\n  \"listenersLive\": 47951,\n  \"listenersReplay\": 112570,\n  \"replayAvailable\": true,\n  \"hostUsername\": \"NASA\",\n  \"participantCounts\": {\"total\": 10, \"admin\": 1, \"speaker\": 9},\n  \"topics\": [\"NASA\", \"Science\", \"Space\"],\n  \"collectedAt\": \"2026-11-07T09:15:00+00:00\"\n}\n```\n\n## How discovery works\n\nSpaces are discovered from public posts, not from a private search index. The actor reads recent matching posts through X's public guest surfaces and resolves each post's Space card. This keeps the actor cookieless. Consequences:\n\n- Discovery looks at recent public posts, not the entire archive.\n- A Space with no public announcement post cannot be discovered by keyword or host. Paste its link or ID instead.\n- Guest search is the least reliable public surface; a query can return fewer posts at busy times. The actor retries and falls back to the host's own timeline.\n- X's signed-in Space search and topic browser are not available to guest callers. They are deliberately not faked.\n\n## FAQ\n\n**Do I need an X account, cookies or an API key?** No. The actor is fully cookieless and reads only public Spaces, public posts and public profiles.\n\n**Does it work with private or deleted Spaces?** No. They produce a clear `status` row.\n\n**Why is replay audio sometimes unavailable?** Live Spaces have no replay yet, and some hosts disable replay. You get a `status` row explaining which case applies.\n\n**How is the replay file produced?** The public replay stream is downloaded and combined into one playable audio file, then stored with a stable download link. Very large replays (above roughly 250 MB) may exceed the file cap — you still get the streaming replay link.\n\n**How do transcripts work?** With `auto`, native captions are used when the replay has them; otherwise Whisper AI runs over the audio. Captions are fast. AI time grows with the Space length, and long Spaces are split into 10-minute chunks to bound memory.\n\n**Which Whisper model should I use?** `base` is the best balance on the default 1 GB. Larger models need more actor memory. The actor downgrades safely instead of crashing, and reports the model it actually used in `modelUsed`.\n\n**How many rows will a run produce?** A Space with participants and a full transcript can produce several hundred rows. Longer Spaces and larger participant lists produce more. Discovery is capped by `maxSpaces`; pasted Spaces are not capped.\n\n**Can I schedule it?** Yes. Use `searchQueries` or `hostUsernames` with a schedule to pick up newly announced Spaces, or run it after a recurring show with the host's handle.\n\n**Is this affiliated with X?** No. It is a third-party actor that reads publicly visible content.\n\n## Limits\n\n- Public Spaces only; private, deleted or unavailable Spaces return a `status` row.\n- Keyword/hashtag/host discovery covers recent public posts, not the full archive.\n- Signed-in Space search and the topic browser are not reachable without credentials and are not supported.\n- Replay audio and transcripts require a finished Space with replay enabled.\n- AI transcription is CPU-bound; on 1 GB the actor runs `tiny`/`base` and may downgrade a larger requested model.\n- Participant profile enrichment stops at `maxParticipantProfiles` per Space.\n\n## Integrations\n\nUse Apify's built-in integrations to send Space summaries, participant lists or transcripts to Google Sheets, Airtable, Slack, a webhook or your own API.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "twitter-x-space-scraper",
      "title": "X Space Collector — Metadata, Hosts, Replay & Transcripts",
      "description": "Collect public X (Twitter) Spaces without login. Get metadata, hosts, speakers and listener counts, participant profiles, replay audio and downloadable files, with optional captions or AI transcripts. Start from links, IDs, announcement posts, keywords or host handles.",
      "seoTitle": "Twitter Space Scraper — X Space Metadata, Hosts, Replay & Transcripts",
      "seoDescription": "Collect public X (Twitter) Spaces without login: titles, states, listeners, hosts, speakers, participant profiles, replay audio and captions or AI transcripts. Works with links, IDs, posts, keywords or hosts.",
      "version": "1.1",
      "buildTag": "latest",
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "dockerfile": "./Dockerfile",
      "readme": "# X Space Collector — Metadata, Hosts, Replay & Transcripts\n\nCollect public X (Twitter) Spaces without an account, cookies or API keys. Start from Space links, IDs or announcement posts — or let the actor discover Spaces from a keyword, hashtag or host handle. Every run returns clean, omit-empty records for the Space, its people, its replay audio and, when requested, a timed transcript.\n\n## Three ways to find Spaces\n\n| Mode | Input | What happens |\n|---|---|---|\n| Exact Spaces | `spaceUrls` | Reads a Space link, a bare Space ID, or the post that announces a Space. The Space card is resolved automatically. |\n| Keyword / hashtag | `searchQueries` | Reads recent public posts matching the query and resolves the Spaces they announce. |\n| Host | `hostUsernames` | Reads a host's recent public posts (and their search results) and resolves the Spaces they announce. |\n\nAll three modes can run in one go. Discovered Spaces are capped by `maxSpaces`; pasted links and IDs are always collected. When several inputs resolve to the same Space (for example its link and its announcement post), it is collected once. `spaceState` can keep only live, scheduled, ended or any Spaces.\n\n## What you get\n\nEach run writes rows with a `type`:\n\n| type | Meaning |\n|---|---|\n| `space` | One Space with metadata, counts, host and participants |\n| `space participant` | One row per host, speaker or listener |\n| `video transcript` | The transcript summary with timed segments |\n| `space transcript segment` | One row per timed segment (optional) |\n| `status` | An honest problem row (invalid link, deleted Space, rate limit, unavailable replay) |\n\n### Space row\n\n- **Identity:** `id`, `url`, `title`, `state`, `contentType`\n- **Times:** `createdAt`, `scheduledStart`, `startedAt`, `endedAt`, `durationSeconds`, `updatedAt`, `replayStartSeconds`\n- **Audience:** `listenersLive`, `listenersReplay`, `replayAvailable`\n- **People:** `creator` (full public profile), `hostId`, `hostUsername`, `hostName`, `participants[]`, `participantCounts`\n- **Space settings:** `topics`, `topicIds`, `mentionedUserIds`, `isMuted`, `isLocked`, `isEmployeeOnly`, `disallowJoin`, `noIncognito`, `conversationControls`, `maxAdminCapacity`, `maxGuestSessions`, `narrowCastSpaceType`\n- **Replay:** `replayAudioUrl`, `replayAudioFileUrl`, `replayAudioFileBytes`, `replayAudioContentType`, `replayAudioDurationSeconds`\n- **Source:** `sourceTweetId`, `sourceTweetUrl` when you started from an announcement post\n- `mediaKey`, `collectedAt`\n\n### Participant row\n\n`spaceId`, `spaceUrl`, `spaceTitle`, `participantIndex`, `role`, `userId`, `username`, `name`, `bio`, `location`, `website`, `followers`, `following`, `postCount`, `profileImageUrl`, `bannerUrl`, `isBlueVerified`, `verified`, `verifiedType`, `periscopeUserId`, `isMutedByAdmin`, `isMutedByGuest`, `collectedAt`.\n\n### Transcript row\n\n`spaceId`, `spaceUrl`, `title`, `language`, `transcriptionMethod` (`captions` or `ai`), `modelUsed`, `segmentCount`, `fullTranscript`, `segments[]` (`index`, `start`, `end`, `text`), `collectedAt`.\n\nEmpty fields are omitted at every depth. There are no `null` values in the dataset.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `spaceUrls` | array | – | Space links, Space IDs, or announcement post links |\n| `searchQueries` | array | – | Keywords or hashtags for Space discovery |\n| `hostUsernames` | array | – | Handles whose recent posts announce Spaces |\n| `maxSpaces` | integer | `20` | Cap for discovered Spaces (1–200) |\n| `spaceState` | string | `any` | `any`, `live`, `upcoming` or `ended` |\n| `includeParticipants` | boolean | `true` | Participant list on the Space row + participant rows |\n| `includeParticipantProfiles` | boolean | `true` | Enrich participant stubs with public profile details |\n| `maxParticipantProfiles` | integer | `50` | Profile lookups per Space (0 = all) |\n| `includeReplayAudio` | boolean | `false` | Replay HLS link + downloadable audio file |\n| `includeTranscript` | boolean | `false` | Produce a transcript from captions or Whisper |\n| `transcriptSegmentsAsRows` | boolean | `false` | Emit one row per transcript segment |\n| `transcriptionMethod` | string | `auto` | `auto`, `captions` or `ai` |\n| `whisperModel` | string | `base` | `tiny`, `base`, `small`, `medium` or `large-v3` |\n| `proxyConfiguration` | object | – | Optional; automatic fallback is built in |\n\nAt least one of `spaceUrls`, `searchQueries` or `hostUsernames` is needed.\n\n### Examples\n\nMetadata and participants:\n\n```json\n{\n  \"spaceUrls\": [\"https://x.com/i/spaces/1YpKkZgnrDXxj\"],\n  \"includeParticipants\": true\n}\n```\n\nDiscover by keyword, keep only ended Spaces:\n\n```json\n{\n  \"searchQueries\": [\"#Space\", \"NASA\"],\n  \"spaceState\": \"ended\",\n  \"maxSpaces\": 10\n}\n```\n\nDiscover from hosts:\n\n```json\n{\n  \"hostUsernames\": [\"NASA\", \"@SpaceX\"],\n  \"maxSpaces\": 5\n}\n```\n\nReplay audio with a transcript:\n\n```json\n{\n  \"spaceUrls\": [\"1YpKkZgnrDXxj\"],\n  \"includeReplayAudio\": true,\n  \"includeTranscript\": true,\n  \"transcriptionMethod\": \"auto\",\n  \"transcriptSegmentsAsRows\": true\n}\n```\n\n### Example Space record\n\n```json\n{\n  \"type\": \"space\",\n  \"id\": \"1YpKkZgnrDXxj\",\n  \"url\": \"https://x.com/i/spaces/1YpKkZgnrDXxj\",\n  \"title\": \"Meet NASA's New Mission Control Flight Directors #AskNASA\",\n  \"state\": \"Ended\",\n  \"createdAt\": \"2022-07-19T15:25:30+00:00\",\n  \"startedAt\": \"2022-07-19T15:59:30+00:00\",\n  \"endedAt\": \"2022-07-19T16:45:16+00:00\",\n  \"durationSeconds\": 2746.0,\n  \"listenersLive\": 47951,\n  \"listenersReplay\": 112570,\n  \"replayAvailable\": true,\n  \"hostUsername\": \"NASA\",\n  \"participantCounts\": {\"total\": 10, \"admin\": 1, \"speaker\": 9},\n  \"topics\": [\"NASA\", \"Science\", \"Space\"],\n  \"collectedAt\": \"2026-11-07T09:15:00+00:00\"\n}\n```\n\n## How discovery works\n\nSpaces are discovered from public posts, not from a private search index. The actor reads recent matching posts through X's public guest surfaces and resolves each post's Space card. This keeps the actor cookieless. Consequences:\n\n- Discovery looks at recent public posts, not the entire archive.\n- A Space with no public announcement post cannot be discovered by keyword or host. Paste its link or ID instead.\n- Guest search is the least reliable public surface; a query can return fewer posts at busy times. The actor retries and falls back to the host's own timeline.\n- X's signed-in Space search and topic browser are not available to guest callers. They are deliberately not faked.\n\n## FAQ\n\n**Do I need an X account, cookies or an API key?** No. The actor is fully cookieless and reads only public Spaces, public posts and public profiles.\n\n**Does it work with private or deleted Spaces?** No. They produce a clear `status` row.\n\n**Why is replay audio sometimes unavailable?** Live Spaces have no replay yet, and some hosts disable replay. You get a `status` row explaining which case applies.\n\n**How is the replay file produced?** The public replay stream is downloaded and combined into one playable audio file, then stored with a stable download link. Very large replays (above roughly 250 MB) may exceed the file cap — you still get the streaming replay link.\n\n**How do transcripts work?** With `auto`, native captions are used when the replay has them; otherwise Whisper AI runs over the audio. Captions are fast. AI time grows with the Space length, and long Spaces are split into 10-minute chunks to bound memory.\n\n**Which Whisper model should I use?** `base` is the best balance on the default 1 GB. Larger models need more actor memory. The actor downgrades safely instead of crashing, and reports the model it actually used in `modelUsed`.\n\n**How many rows will a run produce?** A Space with participants and a full transcript can produce several hundred rows. Longer Spaces and larger participant lists produce more. Discovery is capped by `maxSpaces`; pasted Spaces are not capped.\n\n**Can I schedule it?** Yes. Use `searchQueries` or `hostUsernames` with a schedule to pick up newly announced Spaces, or run it after a recurring show with the host's handle.\n\n**Is this affiliated with X?** No. It is a third-party actor that reads publicly visible content.\n\n## Limits\n\n- Public Spaces only; private, deleted or unavailable Spaces return a `status` row.\n- Keyword/hashtag/host discovery covers recent public posts, not the full archive.\n- Signed-in Space search and the topic browser are not reachable without credentials and are not supported.\n- Replay audio and transcripts require a finished Space with replay enabled.\n- AI transcription is CPU-bound; on 1 GB the actor runs `tiny`/`base` and may downgrade a larger requested model.\n- Participant profile enrichment stops at `maxParticipantProfiles` per Space.\n\n## Integrations\n\nUse Apify's built-in integrations to send Space summaries, participant lists or transcripts to Google Sheets, Airtable, Slack, a webhook or your own API.\n",
      "input": {
        "title": "X Space Collector",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "spaceUrls": {
            "title": "Space links, IDs or announcement posts",
            "type": "array",
            "description": "Paste Space links such as https://x.com/i/spaces/1YpKkZgnrDXxj, bare Space IDs, or the post that announces a Space (the actor finds the Space from its card). x.com and twitter.com links both work.",
            "editor": "stringList",
            "sectionCaption": "Spaces to collect",
            "sectionDescription": "Collect exact Spaces by link or ID. Leave empty when you use keyword or host discovery below.",
            "prefill": [
              "https://x.com/i/spaces/1YpKkZgnrDXxj"
            ],
            "example": [
              "https://x.com/i/spaces/1YpKkZgnrDXxj",
              "1YpKkZgnrDXxj",
              "https://x.com/i/status/2119157462183858414"
            ]
          },
          "searchQueries": {
            "title": "Search keywords or hashtags",
            "type": "array",
            "description": "Find public Spaces from posts that match a keyword or hashtag, for example AI, crypto or #Space. Each query reads recent matching posts and resolves the Spaces they announce.",
            "editor": "stringList",
            "sectionCaption": "Find Spaces automatically",
            "sectionDescription": "Discover Spaces from recent public posts, or from the recent posts of specific hosts.",
            "example": [
              "AI",
              "#Space"
            ]
          },
          "hostUsernames": {
            "title": "Host usernames",
            "type": "array",
            "description": "Find Spaces announced by specific X accounts. Paste handles with or without @, or a profile URL.",
            "editor": "stringList",
            "example": [
              "NASA",
              "https://x.com/elonmusk"
            ]
          },
          "maxSpaces": {
            "title": "Maximum discovered Spaces",
            "type": "integer",
            "description": "Upper limit for Spaces found through keywords and hosts. Spaces that you paste as links or IDs are always collected.",
            "default": 20,
            "prefill": 1,
            "minimum": 1,
            "maximum": 200
          },
          "spaceState": {
            "title": "Space state",
            "type": "string",
            "description": "Only keep Spaces in this state. Applies to links and discovery alike.",
            "editor": "select",
            "enum": [
              "any",
              "live",
              "upcoming",
              "ended"
            ],
            "enumTitles": [
              "Any state",
              "Live now",
              "Scheduled",
              "Ended"
            ],
            "default": "any",
            "prefill": "any"
          },
          "includeParticipants": {
            "title": "Include participants",
            "type": "boolean",
            "description": "Add the host, speakers and listeners to the Space row and emit one separate \"space participant\" row per person.",
            "default": true,
            "prefill": true,
            "sectionCaption": "What to include",
            "sectionDescription": "Choose the extra data collected for every Space."
          },
          "includeParticipantProfiles": {
            "title": "Enrich participant profiles",
            "type": "boolean",
            "description": "Look up each participant's public profile (bio, followers, website, verification) instead of only the compact name shown in the Space. Adds one request per participant.",
            "default": true,
            "prefill": false
          },
          "maxParticipantProfiles": {
            "title": "Maximum enriched participant profiles",
            "type": "integer",
            "description": "Cap on profile lookups per Space. 0 means every participant. Large Spaces with many listeners can be expensive.",
            "default": 50,
            "prefill": 10,
            "minimum": 0,
            "maximum": 100
          },
          "includeReplayAudio": {
            "title": "Include replay audio",
            "type": "boolean",
            "description": "Add the HLS replay link and, when a file can be produced, store a downloadable audio file with its duration and size.",
            "default": false,
            "prefill": false
          },
          "includeTranscript": {
            "title": "Include transcript",
            "type": "boolean",
            "description": "Produce a spoken-word transcript. Captions are used when the replay has them; otherwise AI speech recognition runs (slower and memory-hungry).",
            "default": false,
            "prefill": false
          },
          "transcriptSegmentsAsRows": {
            "title": "Emit transcript segments as rows",
            "type": "boolean",
            "description": "In addition to the transcript summary row, emit one \"space transcript segment\" row per timed segment.",
            "default": false,
            "prefill": false
          },
          "transcriptionMethod": {
            "title": "Transcription method",
            "type": "string",
            "description": "How the transcript should be produced.",
            "editor": "select",
            "enum": [
              "auto",
              "captions",
              "ai"
            ],
            "enumTitles": [
              "Automatic (captions first, then AI)",
              "Captions only (fastest)",
              "AI transcription (Whisper)"
            ],
            "default": "auto",
            "prefill": "auto"
          },
          "whisperModel": {
            "title": "AI transcription quality",
            "type": "string",
            "description": "Whisper model for AI transcription. Larger models are more accurate but need more actor memory; on 1 GB the actor safely falls back to a smaller model.",
            "editor": "select",
            "enum": [
              "tiny",
              "base",
              "small",
              "medium",
              "large-v3"
            ],
            "enumTitles": [
              "Fastest (tiny)",
              "Balanced (base)",
              "Better (small)",
              "High quality (medium)",
              "Best quality (large)"
            ],
            "default": "base",
            "prefill": "base"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. The actor works without a proxy and switches to Apify Proxy automatically if X blocks the direct connection.",
            "editor": "proxy",
            "sectionCaption": "Advanced",
            "sectionDescription": "Optional settings for large or repeated runs."
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "X Space Collector Output",
        "description": "Space metadata, participant rows, transcripts and downloadable replay audio collected from public X Spaces.",
        "type": "object",
        "properties": {
          "spaces": {
            "type": "string",
            "title": "Spaces and participants",
            "description": "Dataset with one Space row, one participant row per person, transcript rows and status rows.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "keyValueStore": {
            "type": "string",
            "title": "Replay audio files",
            "description": "Downloadable replay audio files, stored when replay audio is requested.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}"
          }
        }
      },
      "categories": [
        "SOCIAL_MEDIA"
      ],
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Spaces",
              "transformation": {
                "fields": [
                  "type",
                  "title",
                  "state",
                  "creator.username",
                  "listenersLive",
                  "listenersReplay",
                  "replayAvailable",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.1.1",
    "imageDigest": "a43e41799315cef5de9a3c20795c6e616ad7287ebbbaa88f7f8c19c0e9ad0244",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.010901111111111111
    }
  }
}