{
  "data": {
    "id": "ilFk20SGtzrsuw9Db",
    "actId": "TvCs8gaYvL352HNwD",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-10-22T17:54:00.125Z",
    "finishedAt": "2026-10-22T17:54:45.225Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 44975,
      "runTimeSecs": 44.975,
      "computeUnits": 0.04997222222222222,
      "imageSizeBytes": 3106752512
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Reddit Multi-Mode Scraper Input\",\n  \"description\": \"Pick a mode, then set its targets. Live records come from Reddit's rendered web pages; deep comment trees and bulk history can fall back to the Arctic Shift archive.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to scrape: a subreddit listing, post URLs with comments, a user profile, or keyword search.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"subreddit\",\n        \"post\",\n        \"profile\",\n        \"search\"\n      ],\n      \"enumTitles\": [\n        \"Subreddit posts\",\n        \"Post URLs + comments\",\n        \"User profile + history\",\n        \"Keyword search\"\n      ],\n      \"default\": \"subreddit\",\n      \"prefill\": \"subreddit\"\n    },\n    \"source\": {\n      \"title\": \"Data source\",\n      \"type\": \"string\",\n      \"description\": \"auto uses live Reddit first and the Arctic Shift archive for depth/bulk or as a fallback. archive is faster and cheaper but lags live Reddit by several hours; live never uses archive data.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"live\",\n        \"archive\"\n      ],\n      \"enumTitles\": [\n        \"Auto (live + archive fallback)\",\n        \"Live only\",\n        \"Archive only (Arctic Shift)\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"archive\"\n    },\n    \"subreddits\": {\n      \"title\": \"Subreddits\",\n      \"type\": \"array\",\n      \"description\": \"Subreddits to scrape (mode=subreddit). Accepts names, r/ names or URLs.\",\n      \"editor\": \"stringList\",\n      \"default\": [\n        \"programming\"\n      ],\n      \"prefill\": [\n        \"programming\"\n      ],\n      \"example\": [\n        \"programming\",\n        \"r/Python\"\n      ]\n    },\n    \"postUrls\": {\n      \"title\": \"Post URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Post URLs, comment URLs, share links or bare post IDs (mode=post).\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"example\": [\n        \"https://www.reddit.com/r/programming/comments/1vqukkf/\",\n        \"1xbw0h8\"\n      ]\n    },\n    \"usernames\": {\n      \"title\": \"Usernames\",\n      \"type\": \"array\",\n      \"description\": \"Reddit usernames to scrape (mode=profile). Accepts names, u/ names or profile URLs.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"example\": [\n        \"spez\"\n      ]\n    },\n    \"searchQuery\": {\n      \"title\": \"Search query\",\n      \"type\": \"string\",\n      \"description\": \"Keyword or phrase to search for (mode=search). Reddit search syntax such as \\\"exact phrase\\\", author:name, subreddit:name and -exclude is supported by live search.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"\",\n      \"example\": \"asyncio\"\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum total records\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on all records pushed by the run, across every target.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 50,\n      \"prefill\": 2\n    },\n    \"maxPosts\": {\n      \"title\": \"Maximum posts per target\",\n      \"type\": \"integer\",\n      \"description\": \"Posts per subreddit, keyword or profile section.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 25,\n      \"prefill\": 2\n    },\n    \"maxComments\": {\n      \"title\": \"Maximum comments\",\n      \"type\": \"integer\",\n      \"description\": \"Comments per post, keyword, or profile comment section. 0 disables comment records.\",\n      \"minimum\": 0,\n      \"maximum\": 100000,\n      \"default\": 100,\n      \"prefill\": 5\n    },\n    \"maxDepth\": {\n      \"title\": \"Maximum comment depth\",\n      \"type\": \"integer\",\n      \"description\": \"Deepest reply level to emit (0 = top-level comments only).\",\n      \"minimum\": 0,\n      \"maximum\": 20,\n      \"default\": 6,\n      \"prefill\": 6\n    },\n    \"includeComments\": {\n      \"title\": \"Include comments (mode=post)\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit comment records for each post. Disable to fetch only the parent post.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includePost\": {\n      \"title\": \"Include parent post (mode=post)\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit the post record before its comments.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"sort\": {\n      \"title\": \"Sort\",\n      \"type\": \"string\",\n      \"description\": \"Post/listing sort. Search accepts relevance, hot, top, new or comments; other modes use hot, new, top, rising, controversial or best.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"hot\",\n        \"new\",\n        \"top\",\n        \"rising\",\n        \"controversial\",\n        \"best\",\n        \"relevance\",\n        \"comments\"\n      ],\n      \"enumTitles\": [\n        \"Hot\",\n        \"New\",\n        \"Top\",\n        \"Rising\",\n        \"Controversial\",\n        \"Best\",\n        \"Relevance (search)\",\n        \"Most comments (search)\"\n      ],\n      \"default\": \"hot\",\n      \"prefill\": \"hot\"\n    },\n    \"timeFilter\": {\n      \"title\": \"Time filter\",\n      \"type\": \"string\",\n      \"description\": \"Time window for top/controversial sorts and search.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"hour\",\n        \"day\",\n        \"week\",\n        \"month\",\n        \"year\",\n        \"all\"\n      ],\n      \"enumTitles\": [\n        \"Past hour\",\n        \"Past day\",\n        \"Past week\",\n        \"Past month\",\n        \"Past year\",\n        \"All time\"\n      ],\n      \"default\": \"day\",\n      \"prefill\": \"day\"\n    },\n    \"commentSort\": {\n      \"title\": \"Comment sort\",\n      \"type\": \"string\",\n      \"description\": \"Comment ordering for mode=post.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"confidence\",\n        \"top\",\n        \"new\",\n        \"controversial\",\n        \"old\",\n        \"qa\"\n      ],\n      \"enumTitles\": [\n        \"Best (confidence)\",\n        \"Top\",\n        \"New\",\n        \"Controversial\",\n        \"Old\",\n        \"Q&A\"\n      ],\n      \"default\": \"confidence\",\n      \"prefill\": \"confidence\"\n    },\n    \"includeNSFW\": {\n      \"title\": \"Include NSFW (18+) posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Include over-18 posts and communities.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeSubredditInfo\": {\n      \"title\": \"Include community info (mode=subreddit)\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit one community record per subreddit before its posts.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeSubredditRules\": {\n      \"title\": \"Include community rules (mode=subreddit)\",\n      \"type\": \"boolean\",\n      \"description\": \"Attach posting rules to the community record. Requires includeSubredditInfo.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeProfileInfo\": {\n      \"title\": \"Include profile record (mode=profile)\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit a profile record with karma, counts and account metadata.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"sections\": {\n      \"title\": \"Profile sections\",\n      \"type\": \"array\",\n      \"description\": \"Which history sections to fetch (mode=profile). Allowed values: overview, posts, comments.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [\n        \"overview\"\n      ],\n      \"prefill\": [\n        \"posts\"\n      ]\n    },\n    \"searchPosts\": {\n      \"title\": \"Search posts (mode=search)\",\n      \"type\": \"boolean\",\n      \"description\": \"Include post results in keyword search.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"searchComments\": {\n      \"title\": \"Search comments (mode=search)\",\n      \"type\": \"boolean\",\n      \"description\": \"Include comment results in keyword search when Reddit's comment tab returns them.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"searchCommunities\": {\n      \"title\": \"Search communities (mode=search)\",\n      \"type\": \"boolean\",\n      \"description\": \"Include subreddit matches in keyword search.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"searchUsers\": {\n      \"title\": \"Search users (mode=search)\",\n      \"type\": \"boolean\",\n      \"description\": \"Include matching Reddit accounts in keyword search.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"withinCommunity\": {\n      \"title\": \"Restrict search to one community\",\n      \"type\": \"string\",\n      \"description\": \"Limit post/comment search to a single subreddit (name, r/name or URL). Required for archive keyword search.\",\n      \"editor\": \"textfield\",\n      \"example\": \"r/technology\"\n    },\n    \"maxCommunities\": {\n      \"title\": \"Maximum community results\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum subreddit matches per search query.\",\n      \"minimum\": 0,\n      \"maximum\": 1000,\n      \"default\": 10,\n      \"prefill\": 0\n    },\n    \"maxUsers\": {\n      \"title\": \"Maximum user results\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum account matches per search query.\",\n      \"minimum\": 0,\n      \"maximum\": 100,\n      \"default\": 25,\n      \"prefill\": 0\n    },\n    \"onlyNew\": {\n      \"title\": \"Only new records (incremental runs)\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit only records newer than the watermark saved under stateKey by a previous run.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"stateKey\": {\n      \"title\": \"Incremental state key\",\n      \"type\": \"string\",\n      \"description\": \"Key-value store key prefix used by onlyNew watermarks.\",\n      \"editor\": \"textfield\",\n      \"default\": \"reddit-mcp-state\",\n      \"prefill\": \"reddit-mcp-state\"\n    },\n    \"failOnEmpty\": {\n      \"title\": \"Fail when no records are found\",\n      \"type\": \"boolean\",\n      \"description\": \"Mark the run FAILED with a clear status message instead of finishing silently with 0 records.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxProxyBytesMb\": {\n      \"title\": \"Maximum proxy traffic (MB)\",\n      \"type\": \"integer\",\n      \"description\": \"Safety ceiling for paid proxy traffic. The run stops when the ceiling is reached. Images, media and fonts are never downloaded.\",\n      \"minimum\": 0,\n      \"maximum\": 10000,\n      \"default\": 50,\n      \"prefill\": 50\n    },\n    \"proxyMode\": {\n      \"title\": \"Connection\",\n      \"type\": \"string\",\n      \"description\": \"Direct (no proxy) is the default. Choose datacenter if Reddit blocks your runs. Residential is an explicit last resort and is capped by maxProxyBytesMb.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"none\",\n        \"datacenter\",\n        \"residential\"\n      ],\n      \"enumTitles\": [\n        \"Direct / no proxy\",\n        \"Datacenter proxy\",\n        \"Residential proxy (explicit fallback)\"\n      ],\n      \"default\": \"none\",\n      \"prefill\": \"none\"\n    },\n    \"minScore\": {\n      \"title\": \"Minimum score\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts/comments below this score.\",\n      \"minimum\": -1000000,\n      \"maximum\": 1000000\n    },\n    \"maxScore\": {\n      \"title\": \"Maximum score\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts/comments above this score.\",\n      \"minimum\": -1000000,\n      \"maximum\": 1000000\n    },\n    \"minPostComments\": {\n      \"title\": \"Minimum post comment count\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer comments than this.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"maxPostComments\": {\n      \"title\": \"Maximum post comment count\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with more comments than this.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"minUpvoteRatio\": {\n      \"title\": \"Minimum upvote ratio\",\n      \"type\": \"number\",\n      \"description\": \"Drop posts below this upvote ratio (0-1).\",\n      \"minimum\": 0,\n      \"maximum\": 1\n    },\n    \"postType\": {\n      \"title\": \"Post type\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts of this type.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"self\",\n        \"link\",\n        \"image\",\n        \"video\",\n        \"gallery\",\n        \"poll\"\n      ],\n      \"enumTitles\": [\n        \"Text (self)\",\n        \"Link\",\n        \"Image\",\n        \"Video\",\n        \"Gallery\",\n        \"Poll\"\n      ]\n    },\n    \"titleContains\": {\n      \"title\": \"Title contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts whose title contains this text.\",\n      \"editor\": \"textfield\"\n    },\n    \"contentContains\": {\n      \"title\": \"Body contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts whose body/self-text contains this text.\",\n      \"editor\": \"textfield\"\n    },\n    \"flairContains\": {\n      \"title\": \"Flair contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts whose link flair contains this text.\",\n      \"editor\": \"textfield\"\n    },\n    \"authorFlairContains\": {\n      \"title\": \"Author flair contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts whose author flair contains this text.\",\n      \"editor\": \"textfield\"\n    },\n    \"domain\": {\n      \"title\": \"Link domain contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep only posts whose link domain contains this text.\",\n      \"editor\": \"textfield\"\n    },\n    \"authors\": {\n      \"title\": \"Only these authors\",\n      \"type\": \"array\",\n      \"description\": \"Keep posts by these usernames.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"excludeAuthors\": {\n      \"title\": \"Exclude these authors\",\n      \"type\": \"array\",\n      \"description\": \"Drop posts by these usernames.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"excludeKeywords\": {\n      \"title\": \"Exclude keywords\",\n      \"type\": \"array\",\n      \"description\": \"Drop posts whose title, body or flair contains any of these terms.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"excludeStickied\": {\n      \"title\": \"Exclude stickied posts\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Exclude pinned/stickied posts from results.\"\n    },\n    \"excludeRemoved\": {\n      \"title\": \"Exclude removed posts\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Exclude posts or comments removed by moderators.\"\n    },\n    \"excludeCrossposts\": {\n      \"title\": \"Exclude crossposts\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Exclude crossposts.\"\n    },\n    \"excludeSpoilers\": {\n      \"title\": \"Exclude spoilers\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Exclude posts marked as spoilers.\"\n    },\n    \"excludeLocked\": {\n      \"title\": \"Exclude locked posts\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Exclude locked posts and comments.\"\n    },\n    \"excludeDeletedAuthor\": {\n      \"title\": \"Exclude deleted authors\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Exclude records whose author account was deleted.\"\n    },\n    \"excludeArchived\": {\n      \"title\": \"Exclude archived posts\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Exclude archived posts that no longer accept votes or comments.\"\n    },\n    \"onlyWithFlair\": {\n      \"title\": \"Only posts with flair\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts without a link flair.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"onlyOriginalContent\": {\n      \"title\": \"Only original content\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only posts tagged as OC.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"minAwards\": {\n      \"title\": \"Minimum awards\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only posts with at least this many awards.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"minContentLength\": {\n      \"title\": \"Minimum body length\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only posts whose body is at least this many characters.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"maxContentLength\": {\n      \"title\": \"Maximum body length\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only posts whose body is at most this many characters.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"postedAfter\": {\n      \"title\": \"Created on or after\",\n      \"type\": \"string\",\n      \"description\": \"UTC date lower bound (YYYY-MM-DD).\",\n      \"editor\": \"datepicker\"\n    },\n    \"postedBefore\": {\n      \"title\": \"Created on or before\",\n      \"type\": \"string\",\n      \"description\": \"UTC date upper bound (YYYY-MM-DD), inclusive.\",\n      \"editor\": \"datepicker\"\n    },\n    \"restrictSubreddits\": {\n      \"title\": \"Restrict profile history to subreddits\",\n      \"type\": \"array\",\n      \"description\": \"Only keep profile posts/comments made in these subreddits.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"keyword\": {\n      \"title\": \"Profile keyword filter\",\n      \"type\": \"string\",\n      \"description\": \"Only keep profile posts/comments whose title, body or text contains this phrase.\",\n      \"editor\": \"textfield\"\n    },\n    \"minCommunitySubscribers\": {\n      \"title\": \"Minimum community subscribers\",\n      \"type\": \"integer\",\n      \"description\": \"Community search only: drop smaller subreddits.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"maxCommunitySubscribers\": {\n      \"title\": \"Maximum community subscribers\",\n      \"type\": \"integer\",\n      \"description\": \"Community search only: drop larger subreddits.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"minUserKarma\": {\n      \"title\": \"Minimum user karma\",\n      \"type\": \"integer\",\n      \"description\": \"User search only: drop accounts with less total karma.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"maxUserKarma\": {\n      \"title\": \"Maximum user karma\",\n      \"type\": \"integer\",\n      \"description\": \"User search only: drop accounts with more total karma.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"distinguished\": {\n      \"title\": \"Distinguished posts\",\n      \"type\": \"string\",\n      \"description\": \"Keep only moderator/admin/special posts, or only regular posts.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"moderator\",\n        \"admin\",\n        \"special\",\n        \"none\"\n      ],\n      \"enumTitles\": [\n        \"Moderator posts\",\n        \"Admin posts\",\n        \"Special/official posts\",\n        \"Regular posts only\"\n      ]\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Reddit Multi-Mode Scraper for Posts, Comments & Profiles\r\n\r\nExtract public Reddit data without an account, cookie, or API key. Choose a subreddit feed, specific post URLs with their comment trees, a user profile and history, or a keyword search. Every record is JSON with a stable `recordType` (`post`, `comment`, `profile`, or `community`), the original `dataType`, and a `source` tag so mixed datasets stay easy to audit.\r\n\r\n## What this actor does\r\n\r\n- **Four modes:** `subreddit` (post listings), `post` (one or more post URLs plus comments), `profile` (account metadata, posts and comments), and `search` (posts, comments, communities, and users).\r\n- **Two data sources with provenance:** `live` reads Reddit's public rendered pages, while `archive` reads the Arctic Shift historical snapshot. `auto` uses live data first and archive for depth, bulk history, or fallback.\r\n- **Full comment trees:** the archive path returns nested replies with `depth` and `parent_id`; live mode starts with the visible tree and expands top-level pages up to your cap.\r\n- **Rich post fields:** score, upvote ratio, comment count, flair, domain, media URLs, galleries, video metadata, awards, crossposts, NSFW/spoiler/locked flags, and derived engagement metrics.\r\n- **Filters and incremental runs:** score, comment count, upvote ratio, date range, post type, text matches, author allow/deny lists, flair, domain, awards, and an optional `onlyNew` watermark.\r\n- **Empty fields are omitted:** records never contain `null`, empty strings, or empty arrays/objects.\r\n\r\n## Output per post\r\n\r\n- `recordType: \"post\"`, `dataType: \"post\"`, `source`, `sourceDetail`, `fetchedAt`, `snapshotFreshness`\r\n- `id`, `post_id`, `post_name`, `title`, `author`, `author_id`, `author_meta`\r\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `subreddit_subscribers`, `subreddit_type`\r\n- `content` / `body`, `content_html`, `content_url`, `url`, `permalink`, `domain`, `is_self`, `post_type`, `media_type`\r\n- `score`, `ups`, `downs`, `upvote_ratio`, `num_comments`, `commentCount`, `gilded`, `total_awards_received`, `awards[]`\r\n- `link_flair`, flair colors/classes/richtext, `thumbnail_url`, `images[]`, `gallery_images[]`, `gallery_count`\r\n- `video_url`, `video_duration_seconds`, `video_width`, `video_height`, `video_has_audio`, `video_bitrate_kbps`\r\n- `poll_data`, embed metadata, `crosspost_parent_id`\r\n- `created_utc`, `created_at`, `createdAt`, `edited`, `edited_at`\r\n- `is_nsfw`, `nsfw`, `is_spoiler`, `is_stickied`, `is_locked`, `is_archived`, `is_original_content`, `is_crosspost`\r\n- `derived` (`ageHours`, `scorePerHour`, `commentsPerHour`, `engagementTotal`)\r\n- `warning` and `degraded` when the record came from the archive snapshot\r\n\r\n## Output per comment\r\n\r\n- `recordType: \"comment\"`, `dataType: \"comment\"`, `source`, `sourceDetail`, `fetchedAt`\r\n- `id`, `comment_id`, `comment_name`, `post_id`, `post_url`, `post_title`, `link_id`\r\n- `parent_id`, `parentId`, `parent_kind`, `depth`, `body`, `body_html`\r\n- `author`, `author_id`, `author_meta`\r\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `subreddit_type`\r\n- `score`, `ups`, `downs`, `controversiality`, `gilded`, `total_awards_received`, `awards[]`\r\n- `is_op`, `is_stickied`, `is_locked`, `collapsed`, `removed_by_category`\r\n- `replies_count`, `replies`, `created_utc`, `created_at`, `createdAt`, `edited`, `edited_at`, `permalink`\r\n- `coverage` on the parent post when comment coverage is known\r\n- `warning` and `degraded` for archive records\r\n\r\n## Output per profile\r\n\r\n- `recordType: \"profile\"`, `dataType: \"user_profile\"`, `source`, `fetchedAt`\r\n- `id`, `username`, `user_id`, `profile_url`, `icon_img`, `snoovatar_img`\r\n- `karma` (`total`, `post`, `comment`), plus the flat `post_karma`, `comment_karma`, `total_karma`\r\n- `post_count`, `comment_count`, `created_utc`, `created_at`, `createdAt`\r\n- `description`, `is_gold`, `is_mod`, `is_employee`, `has_verified_email`, `verified`\r\n- Profile history records are emitted as separate `post` and `comment` records.\r\n\r\n## Output per community\r\n\r\nCommunity records appear when `includeSubredditInfo`, `searchCommunities`, or the MCP `get_subreddit_info` tool is used.\r\n\r\n- `recordType: \"community\"`, `dataType: \"community\"`, `source`, `fetchedAt`\r\n- `id`, `subreddit`, `subreddit_prefixed`, `subreddit_id`, `url`, `title`\r\n- `subscribers`, `active_user_count`, `created_utc`, `created_at`, `createdAt`\r\n- `description`, `public_description`, `subreddit_type`, `over18`, `quarantine`\r\n- `rules[]` when rules are requested\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | string | `subreddit` | `subreddit`, `post`, `profile`, or `search`. Legacy `comments` maps to `post`; `posts`, `profiles`, and `subreddits` are accepted aliases. |\r\n| `source` | string | `auto` | `auto`, `live`, or `archive`. `auto` prefers live data and uses the archive for depth, history, or fallback. |\r\n| `subreddits` | array | `[\"programming\"]` | Subreddits for `mode=subreddit`; names, `r/` names, and URLs are accepted. |\r\n| `postUrls` | array | - | Post URLs, comment URLs, share links, or bare post IDs for `mode=post`. |\r\n| `usernames` | array | - | Reddit usernames for `mode=profile`; `u/` names and profile URLs are accepted. |\r\n| `searchQuery` | string | - | Keyword or phrase for `mode=search`. Reddit search operators are supported by the live path. |\r\n| `maxItems` | int | `50` | Hard cap on all records emitted by the run (1-10,000). |\r\n| `maxPosts` | int | `25` | Posts per subreddit, keyword, or profile section (1-5,000). |\r\n| `maxComments` | int | `100` | Comments per post, keyword, or profile comment section; `0` disables comment records. |\r\n| `maxDepth` | int | `6` | Deepest reply level to emit (0-20). |\r\n| `includeComments` | bool | `true` | Emit comment records in `mode=post`. |\r\n| `includePost` | bool | `true` | Emit the parent post record before its comments in `mode=post`. |\r\n| `sort` | string | `hot` | `hot`, `new`, `top`, `rising`, `controversial`, `best`, or search values `relevance` and `comments`. |\r\n| `timeFilter` | string | `day` | `hour`, `day`, `week`, `month`, `year`, or `all`. |\r\n| `commentSort` | string | `confidence` | `confidence`, `top`, `new`, `controversial`, `old`, or `qa`. |\r\n| `includeNSFW` | bool | `false` | Include over-18 posts and communities. |\r\n| `includeSubredditInfo` | bool | `false` | Emit one community record per subreddit. |\r\n| `includeSubredditRules` | bool | `false` | Attach rules to community records. |\r\n| `includeProfileInfo` | bool | `true` | Emit the profile record in `mode=profile`. |\r\n| `sections` | array | `[\"overview\"]` | Profile history sections: `overview`, `posts`, `comments`. |\r\n| `searchPosts` / `searchComments` / `searchCommunities` / `searchUsers` | bool | posts on | Select which result types `mode=search` returns. |\r\n| `withinCommunity` | string | - | Restrict search to one subreddit; required for archive keyword search. |\r\n| `maxCommunities` / `maxUsers` | int | `10` / `25` | Caps for community and user search results. |\r\n| `onlyNew` | bool | `false` | Emit only records newer than the watermark stored under `stateKey`. |\r\n| `stateKey` | string | `reddit-mcp-state` | Key-value store key prefix for `onlyNew` watermarks. |\r\n| `failOnEmpty` | bool | `true` | Fail the run with a clear message when no records are found. |\r\n| `proxyMode` | string | `none` | `none`, `datacenter`, or `residential`. Residential is an explicit fallback and is capped by `maxProxyBytesMb`. |\r\n| `maxProxyBytesMb` | int | `50` | Stop the run before paid proxy traffic exceeds this many megabytes. |\r\n| `minScore` / `maxScore` | int | - | Score range for posts and comments. |\r\n| `minPostComments` / `maxPostComments` | int | - | Comment-count range for posts. |\r\n| `minUpvoteRatio` | number | - | Minimum post upvote ratio (0-1). |\r\n| `postType` | string | - | `self`, `link`, `image`, `video`, `gallery`, or `poll`. |\r\n| `titleContains` / `contentContains` / `flairContains` / `authorFlairContains` | string | - | Case-insensitive text matches. |\r\n| `domain` | string | - | Link domain contains this text. |\r\n| `authors` / `excludeAuthors` | array | - | Author allow/deny lists. |\r\n| `excludeKeywords` | array | - | Drop posts whose title, body, or flair contains any term. |\r\n| `excludeStickied` / `excludeRemoved` / `excludeCrossposts` / `excludeSpoilers` / `excludeLocked` / `excludeDeletedAuthor` / `excludeArchived` | bool | `false` | Exclusion toggles. |\r\n| `onlyWithFlair` / `onlyOriginalContent` | bool | `false` | Flair and OC filters. |\r\n| `minAwards` | int | - | Minimum total awards. |\r\n| `minContentLength` / `maxContentLength` | int | - | Body length range. |\r\n| `postedAfter` / `postedBefore` | string | - | UTC date bounds (`YYYY-MM-DD`); `postedBefore` is inclusive. |\r\n| `restrictSubreddits` | array | - | Keep profile history only from these subreddits. |\r\n| `keyword` | string | - | Keep profile posts/comments containing this phrase. |\r\n| `minCommunitySubscribers` / `maxCommunitySubscribers` | int | - | Community search size filters. |\r\n| `minUserKarma` / `maxUserKarma` | int | - | User search karma filters. |\r\n| `distinguished` | string | - | `moderator`, `admin`, `special`, or `none`. |\r\n\r\n## Example: subreddit listing\r\n\r\n```json\r\n{\r\n  \"mode\": \"subreddit\",\r\n  \"subreddits\": [\"programming\", \"r/Python\"],\r\n  \"sort\": \"top\",\r\n  \"timeFilter\": \"week\",\r\n  \"maxItems\": 100,\r\n  \"maxPosts\": 50,\r\n  \"includeNSFW\": false\r\n}\r\n```\r\n\r\n## Example: post URLs with comments\r\n\r\n```json\r\n{\r\n  \"mode\": \"post\",\r\n  \"postUrls\": [\r\n    \"https://www.reddit.com/r/programming/comments/1xbl8y1/\",\r\n    \"https://www.reddit.com/r/Python/s/example\"\r\n  ],\r\n  \"maxComments\": 250,\r\n  \"maxDepth\": 6,\r\n  \"includePost\": true,\r\n  \"source\": \"auto\"\r\n}\r\n```\r\n\r\n## Example: profile and history\r\n\r\n```json\r\n{\r\n  \"mode\": \"profile\",\r\n  \"usernames\": [\"spez\"],\r\n  \"sections\": [\"overview\"],\r\n  \"maxPosts\": 25,\r\n  \"maxComments\": 50,\r\n  \"postedAfter\": \"2026-01-01\"\r\n}\r\n```\r\n\r\n## Example: keyword search\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQuery\": \"asyncio\",\r\n  \"withinCommunity\": \"python\",\r\n  \"searchPosts\": true,\r\n  \"searchComments\": true,\r\n  \"sort\": \"relevance\",\r\n  \"timeFilter\": \"month\",\r\n  \"maxItems\": 50\r\n}\r\n```\r\n\r\n## MCP server (Standby)\r\n\r\nThe actor runs a native Streamable HTTP MCP server at `/mcp` when started in Standby mode. It exposes five typed tools that reuse the same scrapers as the batch modes:\r\n\r\n| Tool | What it returns |\r\n|---|---|\r\n| `search_reddit` | Posts, comments, communities, or users matching a query, with optional subreddit scope, sort, time window, and NSFW toggle. |\r\n| `get_subreddit_posts` | A subreddit's posts with sort, time window, NSFW toggle, and item cap. |\r\n| `get_post_comments` | One post plus its flat, depth-tagged comments, with `max_comments`, `max_depth`, comment sort, and an optional parent-post record. |\r\n| `get_user_profile` | Profile metadata plus recent posts/comments for one user. |\r\n| `get_subreddit_info` | Community metadata, optional rules, subscriber count, and description. |\r\n\r\nMCP responses include `items`, `count`, `source`, and `degraded`; archive-backed responses also include a freshness warning. Use the Actor's Standby URL followed by `/mcp`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"reddit\": {\r\n      \"type\": \"streamable-http\",\r\n      \"url\": \"https://<your-actor-standby-host>/mcp\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer <your-apify-token>\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Community monitoring:** follow new and top posts in a set of subreddits on a schedule with `onlyNew`.\r\n- **Thread research:** export a full comment tree for sentiment, topic, or quote analysis.\r\n- **Creator and moderator analysis:** profile karma, posting history, and subreddit participation.\r\n- **Trend discovery:** keyword search across Reddit posts and comments, optionally scoped to one community.\r\n- **AI and RAG pipelines:** consume flat JSON records or call the MCP tools from an agent.\r\n- **Moderation and compliance review:** filter by flair, domain, score, date, NSFW, and author.\r\n\r\n## Data source, freshness, and cost\r\n\r\nLive records come from Reddit's public rendered pages. The archive path uses the Arctic Shift historical snapshot, which typically lags live Reddit by several hours and can have fewer comments or older scores. Archive records are marked `source: \"archive\"`, `degraded: true`, and include a `warning`; the `snapshotFreshness` field distinguishes them from live data.\r\n\r\nThe actor defaults to 1 GB of memory; Apify bills the run by allocated memory and any proxy traffic. Browser requests block images, fonts, and media to keep traffic and cost down. No proxy is used by default; `datacenter` is available when Reddit blocks a run, and `residential` is an explicit last resort. `maxProxyBytesMb` stops the run when the configured proxy traffic ceiling is reached.\r\n\r\n## FAQ\r\n\r\n### Do I need a Reddit account or API key?\r\n\r\nNo. The actor reads public pages and a public archive, and no cookies, login, or API key are required.\r\n\r\n### Why do live and archive records disagree on score or comment count?\r\n\r\nThe archive is a historical crawl. Live pages reflect the current score, upvote ratio, and comment count; archive records can be several hours stale and are marked `degraded`.\r\n\r\n### Why are some comments missing from a very large thread?\r\n\r\nLive mode starts with the comments Reddit renders and expands top-level pages up to `maxComments`; replies can be limited by Reddit's pagination. Use `source: \"auto\"` or `\"archive\"` for deeper trees, and check the parent post's `coverage` fields.\r\n\r\n### Why did my search return fewer results than expected?\r\n\r\nReddit limits search result pages and caps many queries. The actor follows the available result pages up to `maxItems`; use a narrower `withinCommunity`, a different sort, or a broader time window.\r\n\r\n### What does `onlyNew` do?\r\n\r\nIt stores a watermark in the key-value store under `stateKey` and emits only records newer than the previous run. Archive watermarks keep a small overlap so a late-indexed comment is not skipped.\r\n\r\n### Does the actor work for private or quarantined communities?\r\n\r\nNo. Only public, cookieless content is supported. NSFW posts can be included with `includeNSFW`, but login-gated or quarantined communities are out of scope.\r\n\r\n### How do I get community rules?\r\n\r\nSet `includeSubredditInfo` and `includeSubredditRules` in `mode=subreddit`, or call the `get_subreddit_info` MCP tool with `include_rules: true`.\r\n\r\n### How do I keep runs cheap?\r\n\r\nUse `source: \"archive\"` when you only need historical posts or deep trees, keep `maxItems` and `maxComments` small, and leave `proxyMode` at `none`. The actor defaults to 1 GB of memory and does not download images, fonts, or media. If you choose a proxy, `maxProxyBytesMb` stops the run when its traffic ceiling is reached.\r\n\r\n### Is this affiliated with Reddit?\r\n\r\nNo. This is a third-party tool that reads public Reddit pages and a public archive. Respect Reddit's terms and applicable law when using the data.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "reddit-multi-mode-scraper-for-posts-comments",
      "title": "Reddit Multi-Mode Scraper for Posts, Comments & Profiles",
      "description": "Scrape Reddit subreddit posts, full comment trees, user profiles and keyword search without an account or API key. Live records come from rendered pages; deep threads use an archive fallback, every record is source-tagged, and a native MCP server exposes typed tools in Standby mode.",
      "version": "2.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Reddit Multi-Mode Scraper for Posts, Comments & Profiles\r\n\r\nExtract public Reddit data without an account, cookie, or API key. Choose a subreddit feed, specific post URLs with their comment trees, a user profile and history, or a keyword search. Every record is JSON with a stable `recordType` (`post`, `comment`, `profile`, or `community`), the original `dataType`, and a `source` tag so mixed datasets stay easy to audit.\r\n\r\n## What this actor does\r\n\r\n- **Four modes:** `subreddit` (post listings), `post` (one or more post URLs plus comments), `profile` (account metadata, posts and comments), and `search` (posts, comments, communities, and users).\r\n- **Two data sources with provenance:** `live` reads Reddit's public rendered pages, while `archive` reads the Arctic Shift historical snapshot. `auto` uses live data first and archive for depth, bulk history, or fallback.\r\n- **Full comment trees:** the archive path returns nested replies with `depth` and `parent_id`; live mode starts with the visible tree and expands top-level pages up to your cap.\r\n- **Rich post fields:** score, upvote ratio, comment count, flair, domain, media URLs, galleries, video metadata, awards, crossposts, NSFW/spoiler/locked flags, and derived engagement metrics.\r\n- **Filters and incremental runs:** score, comment count, upvote ratio, date range, post type, text matches, author allow/deny lists, flair, domain, awards, and an optional `onlyNew` watermark.\r\n- **Empty fields are omitted:** records never contain `null`, empty strings, or empty arrays/objects.\r\n\r\n## Output per post\r\n\r\n- `recordType: \"post\"`, `dataType: \"post\"`, `source`, `sourceDetail`, `fetchedAt`, `snapshotFreshness`\r\n- `id`, `post_id`, `post_name`, `title`, `author`, `author_id`, `author_meta`\r\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `subreddit_subscribers`, `subreddit_type`\r\n- `content` / `body`, `content_html`, `content_url`, `url`, `permalink`, `domain`, `is_self`, `post_type`, `media_type`\r\n- `score`, `ups`, `downs`, `upvote_ratio`, `num_comments`, `commentCount`, `gilded`, `total_awards_received`, `awards[]`\r\n- `link_flair`, flair colors/classes/richtext, `thumbnail_url`, `images[]`, `gallery_images[]`, `gallery_count`\r\n- `video_url`, `video_duration_seconds`, `video_width`, `video_height`, `video_has_audio`, `video_bitrate_kbps`\r\n- `poll_data`, embed metadata, `crosspost_parent_id`\r\n- `created_utc`, `created_at`, `createdAt`, `edited`, `edited_at`\r\n- `is_nsfw`, `nsfw`, `is_spoiler`, `is_stickied`, `is_locked`, `is_archived`, `is_original_content`, `is_crosspost`\r\n- `derived` (`ageHours`, `scorePerHour`, `commentsPerHour`, `engagementTotal`)\r\n- `warning` and `degraded` when the record came from the archive snapshot\r\n\r\n## Output per comment\r\n\r\n- `recordType: \"comment\"`, `dataType: \"comment\"`, `source`, `sourceDetail`, `fetchedAt`\r\n- `id`, `comment_id`, `comment_name`, `post_id`, `post_url`, `post_title`, `link_id`\r\n- `parent_id`, `parentId`, `parent_kind`, `depth`, `body`, `body_html`\r\n- `author`, `author_id`, `author_meta`\r\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `subreddit_type`\r\n- `score`, `ups`, `downs`, `controversiality`, `gilded`, `total_awards_received`, `awards[]`\r\n- `is_op`, `is_stickied`, `is_locked`, `collapsed`, `removed_by_category`\r\n- `replies_count`, `replies`, `created_utc`, `created_at`, `createdAt`, `edited`, `edited_at`, `permalink`\r\n- `coverage` on the parent post when comment coverage is known\r\n- `warning` and `degraded` for archive records\r\n\r\n## Output per profile\r\n\r\n- `recordType: \"profile\"`, `dataType: \"user_profile\"`, `source`, `fetchedAt`\r\n- `id`, `username`, `user_id`, `profile_url`, `icon_img`, `snoovatar_img`\r\n- `karma` (`total`, `post`, `comment`), plus the flat `post_karma`, `comment_karma`, `total_karma`\r\n- `post_count`, `comment_count`, `created_utc`, `created_at`, `createdAt`\r\n- `description`, `is_gold`, `is_mod`, `is_employee`, `has_verified_email`, `verified`\r\n- Profile history records are emitted as separate `post` and `comment` records.\r\n\r\n## Output per community\r\n\r\nCommunity records appear when `includeSubredditInfo`, `searchCommunities`, or the MCP `get_subreddit_info` tool is used.\r\n\r\n- `recordType: \"community\"`, `dataType: \"community\"`, `source`, `fetchedAt`\r\n- `id`, `subreddit`, `subreddit_prefixed`, `subreddit_id`, `url`, `title`\r\n- `subscribers`, `active_user_count`, `created_utc`, `created_at`, `createdAt`\r\n- `description`, `public_description`, `subreddit_type`, `over18`, `quarantine`\r\n- `rules[]` when rules are requested\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | string | `subreddit` | `subreddit`, `post`, `profile`, or `search`. Legacy `comments` maps to `post`; `posts`, `profiles`, and `subreddits` are accepted aliases. |\r\n| `source` | string | `auto` | `auto`, `live`, or `archive`. `auto` prefers live data and uses the archive for depth, history, or fallback. |\r\n| `subreddits` | array | `[\"programming\"]` | Subreddits for `mode=subreddit`; names, `r/` names, and URLs are accepted. |\r\n| `postUrls` | array | - | Post URLs, comment URLs, share links, or bare post IDs for `mode=post`. |\r\n| `usernames` | array | - | Reddit usernames for `mode=profile`; `u/` names and profile URLs are accepted. |\r\n| `searchQuery` | string | - | Keyword or phrase for `mode=search`. Reddit search operators are supported by the live path. |\r\n| `maxItems` | int | `50` | Hard cap on all records emitted by the run (1-10,000). |\r\n| `maxPosts` | int | `25` | Posts per subreddit, keyword, or profile section (1-5,000). |\r\n| `maxComments` | int | `100` | Comments per post, keyword, or profile comment section; `0` disables comment records. |\r\n| `maxDepth` | int | `6` | Deepest reply level to emit (0-20). |\r\n| `includeComments` | bool | `true` | Emit comment records in `mode=post`. |\r\n| `includePost` | bool | `true` | Emit the parent post record before its comments in `mode=post`. |\r\n| `sort` | string | `hot` | `hot`, `new`, `top`, `rising`, `controversial`, `best`, or search values `relevance` and `comments`. |\r\n| `timeFilter` | string | `day` | `hour`, `day`, `week`, `month`, `year`, or `all`. |\r\n| `commentSort` | string | `confidence` | `confidence`, `top`, `new`, `controversial`, `old`, or `qa`. |\r\n| `includeNSFW` | bool | `false` | Include over-18 posts and communities. |\r\n| `includeSubredditInfo` | bool | `false` | Emit one community record per subreddit. |\r\n| `includeSubredditRules` | bool | `false` | Attach rules to community records. |\r\n| `includeProfileInfo` | bool | `true` | Emit the profile record in `mode=profile`. |\r\n| `sections` | array | `[\"overview\"]` | Profile history sections: `overview`, `posts`, `comments`. |\r\n| `searchPosts` / `searchComments` / `searchCommunities` / `searchUsers` | bool | posts on | Select which result types `mode=search` returns. |\r\n| `withinCommunity` | string | - | Restrict search to one subreddit; required for archive keyword search. |\r\n| `maxCommunities` / `maxUsers` | int | `10` / `25` | Caps for community and user search results. |\r\n| `onlyNew` | bool | `false` | Emit only records newer than the watermark stored under `stateKey`. |\r\n| `stateKey` | string | `reddit-mcp-state` | Key-value store key prefix for `onlyNew` watermarks. |\r\n| `failOnEmpty` | bool | `true` | Fail the run with a clear message when no records are found. |\r\n| `proxyMode` | string | `none` | `none`, `datacenter`, or `residential`. Residential is an explicit fallback and is capped by `maxProxyBytesMb`. |\r\n| `maxProxyBytesMb` | int | `50` | Stop the run before paid proxy traffic exceeds this many megabytes. |\r\n| `minScore` / `maxScore` | int | - | Score range for posts and comments. |\r\n| `minPostComments` / `maxPostComments` | int | - | Comment-count range for posts. |\r\n| `minUpvoteRatio` | number | - | Minimum post upvote ratio (0-1). |\r\n| `postType` | string | - | `self`, `link`, `image`, `video`, `gallery`, or `poll`. |\r\n| `titleContains` / `contentContains` / `flairContains` / `authorFlairContains` | string | - | Case-insensitive text matches. |\r\n| `domain` | string | - | Link domain contains this text. |\r\n| `authors` / `excludeAuthors` | array | - | Author allow/deny lists. |\r\n| `excludeKeywords` | array | - | Drop posts whose title, body, or flair contains any term. |\r\n| `excludeStickied` / `excludeRemoved` / `excludeCrossposts` / `excludeSpoilers` / `excludeLocked` / `excludeDeletedAuthor` / `excludeArchived` | bool | `false` | Exclusion toggles. |\r\n| `onlyWithFlair` / `onlyOriginalContent` | bool | `false` | Flair and OC filters. |\r\n| `minAwards` | int | - | Minimum total awards. |\r\n| `minContentLength` / `maxContentLength` | int | - | Body length range. |\r\n| `postedAfter` / `postedBefore` | string | - | UTC date bounds (`YYYY-MM-DD`); `postedBefore` is inclusive. |\r\n| `restrictSubreddits` | array | - | Keep profile history only from these subreddits. |\r\n| `keyword` | string | - | Keep profile posts/comments containing this phrase. |\r\n| `minCommunitySubscribers` / `maxCommunitySubscribers` | int | - | Community search size filters. |\r\n| `minUserKarma` / `maxUserKarma` | int | - | User search karma filters. |\r\n| `distinguished` | string | - | `moderator`, `admin`, `special`, or `none`. |\r\n\r\n## Example: subreddit listing\r\n\r\n```json\r\n{\r\n  \"mode\": \"subreddit\",\r\n  \"subreddits\": [\"programming\", \"r/Python\"],\r\n  \"sort\": \"top\",\r\n  \"timeFilter\": \"week\",\r\n  \"maxItems\": 100,\r\n  \"maxPosts\": 50,\r\n  \"includeNSFW\": false\r\n}\r\n```\r\n\r\n## Example: post URLs with comments\r\n\r\n```json\r\n{\r\n  \"mode\": \"post\",\r\n  \"postUrls\": [\r\n    \"https://www.reddit.com/r/programming/comments/1xbl8y1/\",\r\n    \"https://www.reddit.com/r/Python/s/example\"\r\n  ],\r\n  \"maxComments\": 250,\r\n  \"maxDepth\": 6,\r\n  \"includePost\": true,\r\n  \"source\": \"auto\"\r\n}\r\n```\r\n\r\n## Example: profile and history\r\n\r\n```json\r\n{\r\n  \"mode\": \"profile\",\r\n  \"usernames\": [\"spez\"],\r\n  \"sections\": [\"overview\"],\r\n  \"maxPosts\": 25,\r\n  \"maxComments\": 50,\r\n  \"postedAfter\": \"2026-01-01\"\r\n}\r\n```\r\n\r\n## Example: keyword search\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQuery\": \"asyncio\",\r\n  \"withinCommunity\": \"python\",\r\n  \"searchPosts\": true,\r\n  \"searchComments\": true,\r\n  \"sort\": \"relevance\",\r\n  \"timeFilter\": \"month\",\r\n  \"maxItems\": 50\r\n}\r\n```\r\n\r\n## MCP server (Standby)\r\n\r\nThe actor runs a native Streamable HTTP MCP server at `/mcp` when started in Standby mode. It exposes five typed tools that reuse the same scrapers as the batch modes:\r\n\r\n| Tool | What it returns |\r\n|---|---|\r\n| `search_reddit` | Posts, comments, communities, or users matching a query, with optional subreddit scope, sort, time window, and NSFW toggle. |\r\n| `get_subreddit_posts` | A subreddit's posts with sort, time window, NSFW toggle, and item cap. |\r\n| `get_post_comments` | One post plus its flat, depth-tagged comments, with `max_comments`, `max_depth`, comment sort, and an optional parent-post record. |\r\n| `get_user_profile` | Profile metadata plus recent posts/comments for one user. |\r\n| `get_subreddit_info` | Community metadata, optional rules, subscriber count, and description. |\r\n\r\nMCP responses include `items`, `count`, `source`, and `degraded`; archive-backed responses also include a freshness warning. Use the Actor's Standby URL followed by `/mcp`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"reddit\": {\r\n      \"type\": \"streamable-http\",\r\n      \"url\": \"https://<your-actor-standby-host>/mcp\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer <your-apify-token>\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Community monitoring:** follow new and top posts in a set of subreddits on a schedule with `onlyNew`.\r\n- **Thread research:** export a full comment tree for sentiment, topic, or quote analysis.\r\n- **Creator and moderator analysis:** profile karma, posting history, and subreddit participation.\r\n- **Trend discovery:** keyword search across Reddit posts and comments, optionally scoped to one community.\r\n- **AI and RAG pipelines:** consume flat JSON records or call the MCP tools from an agent.\r\n- **Moderation and compliance review:** filter by flair, domain, score, date, NSFW, and author.\r\n\r\n## Data source, freshness, and cost\r\n\r\nLive records come from Reddit's public rendered pages. The archive path uses the Arctic Shift historical snapshot, which typically lags live Reddit by several hours and can have fewer comments or older scores. Archive records are marked `source: \"archive\"`, `degraded: true`, and include a `warning`; the `snapshotFreshness` field distinguishes them from live data.\r\n\r\nThe actor defaults to 1 GB of memory; Apify bills the run by allocated memory and any proxy traffic. Browser requests block images, fonts, and media to keep traffic and cost down. No proxy is used by default; `datacenter` is available when Reddit blocks a run, and `residential` is an explicit last resort. `maxProxyBytesMb` stops the run when the configured proxy traffic ceiling is reached.\r\n\r\n## FAQ\r\n\r\n### Do I need a Reddit account or API key?\r\n\r\nNo. The actor reads public pages and a public archive, and no cookies, login, or API key are required.\r\n\r\n### Why do live and archive records disagree on score or comment count?\r\n\r\nThe archive is a historical crawl. Live pages reflect the current score, upvote ratio, and comment count; archive records can be several hours stale and are marked `degraded`.\r\n\r\n### Why are some comments missing from a very large thread?\r\n\r\nLive mode starts with the comments Reddit renders and expands top-level pages up to `maxComments`; replies can be limited by Reddit's pagination. Use `source: \"auto\"` or `\"archive\"` for deeper trees, and check the parent post's `coverage` fields.\r\n\r\n### Why did my search return fewer results than expected?\r\n\r\nReddit limits search result pages and caps many queries. The actor follows the available result pages up to `maxItems`; use a narrower `withinCommunity`, a different sort, or a broader time window.\r\n\r\n### What does `onlyNew` do?\r\n\r\nIt stores a watermark in the key-value store under `stateKey` and emits only records newer than the previous run. Archive watermarks keep a small overlap so a late-indexed comment is not skipped.\r\n\r\n### Does the actor work for private or quarantined communities?\r\n\r\nNo. Only public, cookieless content is supported. NSFW posts can be included with `includeNSFW`, but login-gated or quarantined communities are out of scope.\r\n\r\n### How do I get community rules?\r\n\r\nSet `includeSubredditInfo` and `includeSubredditRules` in `mode=subreddit`, or call the `get_subreddit_info` MCP tool with `include_rules: true`.\r\n\r\n### How do I keep runs cheap?\r\n\r\nUse `source: \"archive\"` when you only need historical posts or deep trees, keep `maxItems` and `maxComments` small, and leave `proxyMode` at `none`. The actor defaults to 1 GB of memory and does not download images, fonts, or media. If you choose a proxy, `maxProxyBytesMb` stops the run when its traffic ceiling is reached.\r\n\r\n### Is this affiliated with Reddit?\r\n\r\nNo. This is a third-party tool that reads public Reddit pages and a public archive. Respect Reddit's terms and applicable law when using the data.\r\n",
      "input": {
        "title": "Reddit Multi-Mode Scraper Input",
        "description": "Pick a mode, then set its targets. Live records come from Reddit's rendered web pages; deep comment trees and bulk history can fall back to the Arctic Shift archive.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to scrape: a subreddit listing, post URLs with comments, a user profile, or keyword search.",
            "editor": "select",
            "enum": [
              "subreddit",
              "post",
              "profile",
              "search"
            ],
            "enumTitles": [
              "Subreddit posts",
              "Post URLs + comments",
              "User profile + history",
              "Keyword search"
            ],
            "default": "subreddit",
            "prefill": "subreddit"
          },
          "source": {
            "title": "Data source",
            "type": "string",
            "description": "auto uses live Reddit first and the Arctic Shift archive for depth/bulk or as a fallback. archive is faster and cheaper but lags live Reddit by several hours; live never uses archive data.",
            "editor": "select",
            "enum": [
              "auto",
              "live",
              "archive"
            ],
            "enumTitles": [
              "Auto (live + archive fallback)",
              "Live only",
              "Archive only (Arctic Shift)"
            ],
            "default": "auto",
            "prefill": "archive"
          },
          "subreddits": {
            "title": "Subreddits",
            "type": "array",
            "description": "Subreddits to scrape (mode=subreddit). Accepts names, r/ names or URLs.",
            "editor": "stringList",
            "default": [
              "programming"
            ],
            "prefill": [
              "programming"
            ],
            "example": [
              "programming",
              "r/Python"
            ]
          },
          "postUrls": {
            "title": "Post URLs or IDs",
            "type": "array",
            "description": "Post URLs, comment URLs, share links or bare post IDs (mode=post).",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "example": [
              "https://www.reddit.com/r/programming/comments/1vqukkf/",
              "1xbw0h8"
            ]
          },
          "usernames": {
            "title": "Usernames",
            "type": "array",
            "description": "Reddit usernames to scrape (mode=profile). Accepts names, u/ names or profile URLs.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "example": [
              "spez"
            ]
          },
          "searchQuery": {
            "title": "Search query",
            "type": "string",
            "description": "Keyword or phrase to search for (mode=search). Reddit search syntax such as \"exact phrase\", author:name, subreddit:name and -exclude is supported by live search.",
            "editor": "textfield",
            "default": "",
            "prefill": "",
            "example": "asyncio"
          },
          "maxItems": {
            "title": "Maximum total records",
            "type": "integer",
            "description": "Hard cap on all records pushed by the run, across every target.",
            "minimum": 1,
            "maximum": 10000,
            "default": 50,
            "prefill": 2
          },
          "maxPosts": {
            "title": "Maximum posts per target",
            "type": "integer",
            "description": "Posts per subreddit, keyword or profile section.",
            "minimum": 1,
            "maximum": 5000,
            "default": 25,
            "prefill": 2
          },
          "maxComments": {
            "title": "Maximum comments",
            "type": "integer",
            "description": "Comments per post, keyword, or profile comment section. 0 disables comment records.",
            "minimum": 0,
            "maximum": 100000,
            "default": 100,
            "prefill": 5
          },
          "maxDepth": {
            "title": "Maximum comment depth",
            "type": "integer",
            "description": "Deepest reply level to emit (0 = top-level comments only).",
            "minimum": 0,
            "maximum": 20,
            "default": 6,
            "prefill": 6
          },
          "includeComments": {
            "title": "Include comments (mode=post)",
            "type": "boolean",
            "description": "Emit comment records for each post. Disable to fetch only the parent post.",
            "default": true,
            "prefill": false
          },
          "includePost": {
            "title": "Include parent post (mode=post)",
            "type": "boolean",
            "description": "Emit the post record before its comments.",
            "default": true,
            "prefill": true
          },
          "sort": {
            "title": "Sort",
            "type": "string",
            "description": "Post/listing sort. Search accepts relevance, hot, top, new or comments; other modes use hot, new, top, rising, controversial or best.",
            "editor": "select",
            "enum": [
              "hot",
              "new",
              "top",
              "rising",
              "controversial",
              "best",
              "relevance",
              "comments"
            ],
            "enumTitles": [
              "Hot",
              "New",
              "Top",
              "Rising",
              "Controversial",
              "Best",
              "Relevance (search)",
              "Most comments (search)"
            ],
            "default": "hot",
            "prefill": "hot"
          },
          "timeFilter": {
            "title": "Time filter",
            "type": "string",
            "description": "Time window for top/controversial sorts and search.",
            "editor": "select",
            "enum": [
              "hour",
              "day",
              "week",
              "month",
              "year",
              "all"
            ],
            "enumTitles": [
              "Past hour",
              "Past day",
              "Past week",
              "Past month",
              "Past year",
              "All time"
            ],
            "default": "day",
            "prefill": "day"
          },
          "commentSort": {
            "title": "Comment sort",
            "type": "string",
            "description": "Comment ordering for mode=post.",
            "editor": "select",
            "enum": [
              "confidence",
              "top",
              "new",
              "controversial",
              "old",
              "qa"
            ],
            "enumTitles": [
              "Best (confidence)",
              "Top",
              "New",
              "Controversial",
              "Old",
              "Q&A"
            ],
            "default": "confidence",
            "prefill": "confidence"
          },
          "includeNSFW": {
            "title": "Include NSFW (18+) posts",
            "type": "boolean",
            "description": "Include over-18 posts and communities.",
            "default": false,
            "prefill": false
          },
          "includeSubredditInfo": {
            "title": "Include community info (mode=subreddit)",
            "type": "boolean",
            "description": "Emit one community record per subreddit before its posts.",
            "default": false,
            "prefill": false
          },
          "includeSubredditRules": {
            "title": "Include community rules (mode=subreddit)",
            "type": "boolean",
            "description": "Attach posting rules to the community record. Requires includeSubredditInfo.",
            "default": false,
            "prefill": false
          },
          "includeProfileInfo": {
            "title": "Include profile record (mode=profile)",
            "type": "boolean",
            "description": "Emit a profile record with karma, counts and account metadata.",
            "default": true,
            "prefill": true
          },
          "sections": {
            "title": "Profile sections",
            "type": "array",
            "description": "Which history sections to fetch (mode=profile). Allowed values: overview, posts, comments.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [
              "overview"
            ],
            "prefill": [
              "posts"
            ]
          },
          "searchPosts": {
            "title": "Search posts (mode=search)",
            "type": "boolean",
            "description": "Include post results in keyword search.",
            "default": true,
            "prefill": true
          },
          "searchComments": {
            "title": "Search comments (mode=search)",
            "type": "boolean",
            "description": "Include comment results in keyword search when Reddit's comment tab returns them.",
            "default": false,
            "prefill": false
          },
          "searchCommunities": {
            "title": "Search communities (mode=search)",
            "type": "boolean",
            "description": "Include subreddit matches in keyword search.",
            "default": false,
            "prefill": false
          },
          "searchUsers": {
            "title": "Search users (mode=search)",
            "type": "boolean",
            "description": "Include matching Reddit accounts in keyword search.",
            "default": false,
            "prefill": false
          },
          "withinCommunity": {
            "title": "Restrict search to one community",
            "type": "string",
            "description": "Limit post/comment search to a single subreddit (name, r/name or URL). Required for archive keyword search.",
            "editor": "textfield",
            "example": "r/technology"
          },
          "maxCommunities": {
            "title": "Maximum community results",
            "type": "integer",
            "description": "Maximum subreddit matches per search query.",
            "minimum": 0,
            "maximum": 1000,
            "default": 10,
            "prefill": 0
          },
          "maxUsers": {
            "title": "Maximum user results",
            "type": "integer",
            "description": "Maximum account matches per search query.",
            "minimum": 0,
            "maximum": 100,
            "default": 25,
            "prefill": 0
          },
          "onlyNew": {
            "title": "Only new records (incremental runs)",
            "type": "boolean",
            "description": "Emit only records newer than the watermark saved under stateKey by a previous run.",
            "default": false,
            "prefill": false
          },
          "stateKey": {
            "title": "Incremental state key",
            "type": "string",
            "description": "Key-value store key prefix used by onlyNew watermarks.",
            "editor": "textfield",
            "default": "reddit-mcp-state",
            "prefill": "reddit-mcp-state"
          },
          "failOnEmpty": {
            "title": "Fail when no records are found",
            "type": "boolean",
            "description": "Mark the run FAILED with a clear status message instead of finishing silently with 0 records.",
            "default": true,
            "prefill": false
          },
          "maxProxyBytesMb": {
            "title": "Maximum proxy traffic (MB)",
            "type": "integer",
            "description": "Safety ceiling for paid proxy traffic. The run stops when the ceiling is reached. Images, media and fonts are never downloaded.",
            "minimum": 0,
            "maximum": 10000,
            "default": 50,
            "prefill": 50
          },
          "proxyMode": {
            "title": "Connection",
            "type": "string",
            "description": "Direct (no proxy) is the default. Choose datacenter if Reddit blocks your runs. Residential is an explicit last resort and is capped by maxProxyBytesMb.",
            "editor": "select",
            "enum": [
              "none",
              "datacenter",
              "residential"
            ],
            "enumTitles": [
              "Direct / no proxy",
              "Datacenter proxy",
              "Residential proxy (explicit fallback)"
            ],
            "default": "none",
            "prefill": "none"
          },
          "minScore": {
            "title": "Minimum score",
            "type": "integer",
            "description": "Drop posts/comments below this score.",
            "minimum": -1000000,
            "maximum": 1000000
          },
          "maxScore": {
            "title": "Maximum score",
            "type": "integer",
            "description": "Drop posts/comments above this score.",
            "minimum": -1000000,
            "maximum": 1000000
          },
          "minPostComments": {
            "title": "Minimum post comment count",
            "type": "integer",
            "description": "Drop posts with fewer comments than this.",
            "minimum": 0,
            "maximum": 1000000
          },
          "maxPostComments": {
            "title": "Maximum post comment count",
            "type": "integer",
            "description": "Drop posts with more comments than this.",
            "minimum": 0,
            "maximum": 1000000
          },
          "minUpvoteRatio": {
            "title": "Minimum upvote ratio",
            "type": "number",
            "description": "Drop posts below this upvote ratio (0-1).",
            "minimum": 0,
            "maximum": 1
          },
          "postType": {
            "title": "Post type",
            "type": "string",
            "description": "Keep only posts of this type.",
            "editor": "select",
            "enum": [
              "self",
              "link",
              "image",
              "video",
              "gallery",
              "poll"
            ],
            "enumTitles": [
              "Text (self)",
              "Link",
              "Image",
              "Video",
              "Gallery",
              "Poll"
            ]
          },
          "titleContains": {
            "title": "Title contains",
            "type": "string",
            "description": "Keep only posts whose title contains this text.",
            "editor": "textfield"
          },
          "contentContains": {
            "title": "Body contains",
            "type": "string",
            "description": "Keep only posts whose body/self-text contains this text.",
            "editor": "textfield"
          },
          "flairContains": {
            "title": "Flair contains",
            "type": "string",
            "description": "Keep only posts whose link flair contains this text.",
            "editor": "textfield"
          },
          "authorFlairContains": {
            "title": "Author flair contains",
            "type": "string",
            "description": "Keep only posts whose author flair contains this text.",
            "editor": "textfield"
          },
          "domain": {
            "title": "Link domain contains",
            "type": "string",
            "description": "Keep only posts whose link domain contains this text.",
            "editor": "textfield"
          },
          "authors": {
            "title": "Only these authors",
            "type": "array",
            "description": "Keep posts by these usernames.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "excludeAuthors": {
            "title": "Exclude these authors",
            "type": "array",
            "description": "Drop posts by these usernames.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop posts whose title, body or flair contains any of these terms.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "excludeStickied": {
            "title": "Exclude stickied posts",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Exclude pinned/stickied posts from results."
          },
          "excludeRemoved": {
            "title": "Exclude removed posts",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Exclude posts or comments removed by moderators."
          },
          "excludeCrossposts": {
            "title": "Exclude crossposts",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Exclude crossposts."
          },
          "excludeSpoilers": {
            "title": "Exclude spoilers",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Exclude posts marked as spoilers."
          },
          "excludeLocked": {
            "title": "Exclude locked posts",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Exclude locked posts and comments."
          },
          "excludeDeletedAuthor": {
            "title": "Exclude deleted authors",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Exclude records whose author account was deleted."
          },
          "excludeArchived": {
            "title": "Exclude archived posts",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Exclude archived posts that no longer accept votes or comments."
          },
          "onlyWithFlair": {
            "title": "Only posts with flair",
            "type": "boolean",
            "description": "Drop posts without a link flair.",
            "default": false,
            "prefill": false
          },
          "onlyOriginalContent": {
            "title": "Only original content",
            "type": "boolean",
            "description": "Keep only posts tagged as OC.",
            "default": false,
            "prefill": false
          },
          "minAwards": {
            "title": "Minimum awards",
            "type": "integer",
            "description": "Keep only posts with at least this many awards.",
            "minimum": 0,
            "maximum": 1000000
          },
          "minContentLength": {
            "title": "Minimum body length",
            "type": "integer",
            "description": "Keep only posts whose body is at least this many characters.",
            "minimum": 0,
            "maximum": 1000000
          },
          "maxContentLength": {
            "title": "Maximum body length",
            "type": "integer",
            "description": "Keep only posts whose body is at most this many characters.",
            "minimum": 0,
            "maximum": 1000000
          },
          "postedAfter": {
            "title": "Created on or after",
            "type": "string",
            "description": "UTC date lower bound (YYYY-MM-DD).",
            "editor": "datepicker"
          },
          "postedBefore": {
            "title": "Created on or before",
            "type": "string",
            "description": "UTC date upper bound (YYYY-MM-DD), inclusive.",
            "editor": "datepicker"
          },
          "restrictSubreddits": {
            "title": "Restrict profile history to subreddits",
            "type": "array",
            "description": "Only keep profile posts/comments made in these subreddits.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "keyword": {
            "title": "Profile keyword filter",
            "type": "string",
            "description": "Only keep profile posts/comments whose title, body or text contains this phrase.",
            "editor": "textfield"
          },
          "minCommunitySubscribers": {
            "title": "Minimum community subscribers",
            "type": "integer",
            "description": "Community search only: drop smaller subreddits.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "maxCommunitySubscribers": {
            "title": "Maximum community subscribers",
            "type": "integer",
            "description": "Community search only: drop larger subreddits.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "minUserKarma": {
            "title": "Minimum user karma",
            "type": "integer",
            "description": "User search only: drop accounts with less total karma.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "maxUserKarma": {
            "title": "Maximum user karma",
            "type": "integer",
            "description": "User search only: drop accounts with more total karma.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "distinguished": {
            "title": "Distinguished posts",
            "type": "string",
            "description": "Keep only moderator/admin/special posts, or only regular posts.",
            "editor": "select",
            "enum": [
              "moderator",
              "admin",
              "special",
              "none"
            ],
            "enumTitles": [
              "Moderator posts",
              "Admin posts",
              "Special/official posts",
              "Regular posts only"
            ]
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Reddit Multi-Mode Scraper for Posts, Comments & Profiles Output",
        "description": "Reddit posts, comments, profiles and community records with engagement metrics, derived activity and per-record source provenance.",
        "properties": {
          "redditRecords": {
            "type": "string",
            "title": "Reddit records",
            "description": "Dataset containing post, comment, profile or community records (see `recordType`). Every record carries `source` (live/archive), `fetchedAt` and, for archive data, `snapshotFreshness` plus a warning.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "usesStandbyMode": true,
      "webServerMcpPath": "/mcp",
      "webServerSchema": {
        "openapi": "3.0.0",
        "info": {
          "title": "Reddit Multi-Mode MCP",
          "version": "2.0.0",
          "description": "Streamable HTTP MCP endpoint exposing typed Reddit tools."
        },
        "paths": {
          "/": {
            "get": {
              "summary": "Standby readiness probe",
              "responses": {
                "200": {
                  "description": "Actor is ready"
                }
              }
            }
          },
          "/mcp": {
            "post": {
              "summary": "MCP Streamable HTTP endpoint",
              "description": "Send MCP JSON-RPC requests here. Tools: search_reddit, get_subreddit_posts, get_post_comments, get_user_profile, get_subreddit_info.",
              "responses": {
                "200": {
                  "description": "MCP response"
                }
              }
            },
            "get": {
              "summary": "MCP Streamable HTTP event stream",
              "description": "Optional server-sent event stream for the MCP session.",
              "responses": {
                "200": {
                  "description": "MCP event stream"
                }
              }
            }
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Reddit Records",
              "transformation": {
                "fields": [
                  "recordType",
                  "subreddit_prefixed",
                  "title",
                  "author",
                  "score",
                  "commentCount",
                  "source",
                  "createdAt",
                  "permalink"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {},
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      },
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 512,
      "maxMemoryMbytes": 4096,
      "categories": [
        "SOCIAL_MEDIA"
      ]
    },
    "buildNumber": "2.0.1",
    "imageDigest": "bf3128e89ca0484f6aef4231ac0d03234328fd4d8959bcde47d105b9ece843d3",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.04997222222222222
    }
  }
}