{
  "data": {
    "id": "Yy4ffYbftredacudh",
    "actId": "ArU0Lx9NfPdbDYHu8",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-05T10:03:21.915Z",
    "finishedAt": "2026-11-05T10:04:03.758Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 41744,
      "runTimeSecs": 41.744,
      "computeUnits": 0.04638222222222222,
      "imageSizeBytes": 1238481920
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Reddit Community Scraper Input\",\n  \"description\": \"Choose a mode, then list subreddits or post URLs. Community profiles, rules, wiki pages, posts and capped comment trees all work without an API key or login.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"What to scrape\",\n      \"type\": \"string\",\n      \"description\": \"Pick the result you want. 'Communities' returns one profile per subreddit (plus optional posts and comments). 'Discover' finds communities by keyword or browse. 'Posts' returns post records only. 'Comments' returns capped comment trees for post URLs or a subreddit's top posts.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"communities\",\n        \"discover\",\n        \"posts\",\n        \"comments\"\n      ],\n      \"enumTitles\": [\n        \"Community profiles (plus optional posts/comments)\",\n        \"Discover communities by keyword or browse\",\n        \"Posts from subreddits\",\n        \"Comments from post URLs or top posts\"\n      ],\n      \"default\": \"communities\",\n      \"prefill\": \"communities\",\n      \"sectionCaption\": \"Mode and sources\"\n    },\n    \"subreddits\": {\n      \"title\": \"Subreddits\",\n      \"type\": \"array\",\n      \"description\": \"Subreddit names to scrape. Accepts bare names, r/ names or full URLs. Use the name as shown in the subreddit URL (Reddit redirects are challenged on some networks). Not needed when 'postUrls' is set or when discovery finds enough communities.\",\n      \"editor\": \"stringList\",\n      \"example\": [\n        \"python\",\n        \"r/programming\",\n        \"https://www.reddit.com/r/webdev/\"\n      ],\n      \"prefill\": [\n        \"Python\"\n      ]\n    },\n    \"postUrls\": {\n      \"title\": \"Post URLs (comments mode)\",\n      \"type\": \"array\",\n      \"description\": \"Reddit post or comment URLs (or bare post IDs) to scrape in comments mode. When set, these take priority over subreddit top posts. Example: https://www.reddit.com/r/pics/comments/1x1xbpb/\",\n      \"editor\": \"stringList\",\n      \"example\": [\n        \"https://www.reddit.com/r/pics/comments/1x1xbpb/expressing_multiple_emotions_at_one_time/\"\n      ]\n    },\n    \"discoverMode\": {\n      \"title\": \"Discovery source\",\n      \"type\": \"string\",\n      \"description\": \"How to find extra communities. 'Keyword search' uses the field below. 'Currently popular' and 'Newest' browse Reddit's curated lists (best-effort: those pages expose only a few communities).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"popular\",\n        \"new\"\n      ],\n      \"enumTitles\": [\n        \"Keyword search\",\n        \"Currently popular communities\",\n        \"Newest communities\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"discoverQuery\": {\n      \"title\": \"Discover communities by keyword\",\n      \"type\": \"string\",\n      \"description\": \"Search Reddit's community directory for this keyword and add the matching communities to the run. Only used with 'Keyword search'. Leave empty to skip discovery.\",\n      \"editor\": \"textfield\",\n      \"example\": \"machine learning\"\n    },\n    \"discoverSort\": {\n      \"title\": \"Discovery ranking\",\n      \"type\": \"string\",\n      \"description\": \"How to rank keyword-discovered communities: relevance keeps Reddit's order, activity sorts by weekly active users.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"relevance\",\n        \"activity\"\n      ],\n      \"enumTitles\": [\n        \"Relevance\",\n        \"Activity (most weekly visitors first)\"\n      ],\n      \"default\": \"relevance\",\n      \"prefill\": \"relevance\"\n    },\n    \"maxDiscoverResults\": {\n      \"title\": \"Maximum discovered communities\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of communities to add from keyword search or browse (1-100).\",\n      \"minimum\": 1,\n      \"maximum\": 100,\n      \"default\": 10,\n      \"prefill\": 10\n    },\n    \"includeRules\": {\n      \"title\": \"Include community rules\",\n      \"type\": \"boolean\",\n      \"description\": \"Add posting rules (name, description, priority) to community profiles in communities mode.\",\n      \"default\": true,\n      \"prefill\": true,\n      \"sectionCaption\": \"Community profile\"\n    },\n    \"includeWiki\": {\n      \"title\": \"Include wiki pages\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch the community wiki index and each page's Markdown source. Wiki pages are omitted when the wiki is disabled or empty.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxWikiPages\": {\n      \"title\": \"Maximum wiki pages\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of wiki pages to fetch per community when 'Include wiki pages' is on (0-200).\",\n      \"minimum\": 0,\n      \"maximum\": 200,\n      \"default\": 20,\n      \"prefill\": 20\n    },\n    \"includeWeeklyStats\": {\n      \"title\": \"Include weekly activity\",\n      \"type\": \"boolean\",\n      \"description\": \"Include Reddit's weekly active users and weekly contributions from the community header.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includePosts\": {\n      \"title\": \"Include recent posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Also scrape the community's recent posts, with the full filter set below.\",\n      \"default\": true,\n      \"prefill\": false,\n      \"sectionCaption\": \"Posts\"\n    },\n    \"maxPosts\": {\n      \"title\": \"Maximum posts per subreddit\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum posts to collect per subreddit (1-1,000). The global 'Maximum records' cap still applies.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 25,\n      \"prefill\": 25\n    },\n    \"sort\": {\n      \"title\": \"Sort posts by\",\n      \"type\": \"string\",\n      \"description\": \"How to order the post feed.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"hot\",\n        \"new\",\n        \"top\",\n        \"rising\",\n        \"controversial\",\n        \"best\"\n      ],\n      \"enumTitles\": [\n        \"Hot\",\n        \"New\",\n        \"Top\",\n        \"Rising\",\n        \"Controversial\",\n        \"Best\"\n      ],\n      \"default\": \"hot\",\n      \"prefill\": \"hot\"\n    },\n    \"timeFilter\": {\n      \"title\": \"Time window for top/controversial\",\n      \"type\": \"string\",\n      \"description\": \"Time window used when sorting posts by top or controversial.\",\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    \"includeNSFW\": {\n      \"title\": \"Include NSFW (18+) posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep posts marked NSFW. NSFW-only communities are gated for signed-out visitors and return nothing regardless of this setting.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"onlyWithFlair\": {\n      \"title\": \"Only posts with a flair\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts that have no flair tag.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"postType\": {\n      \"title\": \"Only this post type\",\n      \"type\": \"string\",\n      \"description\": \"Keep only one content type. Leave unset to keep all types.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"self\",\n        \"link\",\n        \"image\",\n        \"video\",\n        \"gallery\",\n        \"poll\"\n      ],\n      \"enumTitles\": [\n        \"Text (self post)\",\n        \"Link\",\n        \"Image\",\n        \"Video\",\n        \"Gallery\",\n        \"Poll\"\n      ]\n    },\n    \"minScore\": {\n      \"title\": \"Minimum score\",\n      \"type\": \"integer\",\n      \"description\": \"Keep posts with a score (upvotes minus downvotes) at or above this value. Leave unset to keep all scores.\",\n      \"minimum\": -1000000,\n      \"maximum\": 1000000,\n      \"example\": 10\n    },\n    \"maxScore\": {\n      \"title\": \"Maximum score\",\n      \"type\": \"integer\",\n      \"description\": \"Keep posts with a score at or below this value. Useful for finding overlooked posts. Leave unset to keep all scores.\",\n      \"minimum\": -1000000,\n      \"maximum\": 1000000,\n      \"example\": 1000\n    },\n    \"minComments\": {\n      \"title\": \"Minimum number of comments\",\n      \"type\": \"integer\",\n      \"description\": \"Keep posts with at least this many comments. Leave unset to keep all posts.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"example\": 5\n    },\n    \"maxComments\": {\n      \"title\": \"Maximum number of comments\",\n      \"type\": \"integer\",\n      \"description\": \"Keep posts with at most this many comments. Leave unset to keep all posts.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"example\": 500\n    },\n    \"excludeStickied\": {\n      \"title\": \"Exclude stickied posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts pinned by moderators (rules, weekly threads, announcements).\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"minUpvoteRatio\": {\n      \"title\": \"Minimum upvote ratio\",\n      \"type\": \"number\",\n      \"description\": \"Keep posts whose upvote ratio (0-1) is at or above this value. Leave unset to keep all ratios.\",\n      \"minimum\": 0,\n      \"maximum\": 1,\n      \"example\": 0.8\n    },\n    \"excludeRemoved\": {\n      \"title\": \"Exclude removed/deleted posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts removed by a moderator or Reddit. Deleted post markers are only visible on post detail pages.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeCrossposts\": {\n      \"title\": \"Exclude crossposts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop crossposts from another community, keeping original submissions.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeSpoilers\": {\n      \"title\": \"Exclude spoiler-tagged posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts marked as a spoiler by their author.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeLocked\": {\n      \"title\": \"Exclude locked posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts whose comments were locked by a moderator.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeDeletedAuthor\": {\n      \"title\": \"Exclude deleted authors\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts whose author appears as [deleted] or [removed].\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"onlyOriginalContent\": {\n      \"title\": \"Only original content (OC)\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only posts the author tagged as original content.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"minAwards\": {\n      \"title\": \"Minimum awards\",\n      \"type\": \"integer\",\n      \"description\": \"Keep posts with at least this many total awards. Leave unset to keep all posts.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"example\": 1\n    },\n    \"titleContains\": {\n      \"title\": \"Title contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts whose title contains this text (case-insensitive). Leave empty to keep all titles.\",\n      \"editor\": \"textfield\",\n      \"example\": \"launch\"\n    },\n    \"contentContains\": {\n      \"title\": \"Post text contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep self posts whose body contains this text (case-insensitive). Requires 'Fetch full post details' so post bodies are available; link/image posts are excluded.\",\n      \"editor\": \"textfield\",\n      \"example\": \"tutorial\"\n    },\n    \"flairContains\": {\n      \"title\": \"Flair contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts whose flair text contains this text (case-insensitive). Leave empty to keep all flairs.\",\n      \"editor\": \"textfield\",\n      \"example\": \"Discussion\"\n    },\n    \"authorFlairContains\": {\n      \"title\": \"Author flair contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts whose author flair text contains this text (case-insensitive).\",\n      \"editor\": \"textfield\",\n      \"example\": \"Moderator\"\n    },\n    \"authors\": {\n      \"title\": \"Only these authors\",\n      \"type\": \"array\",\n      \"description\": \"Keep posts submitted by one of these usernames (bare or u/-prefixed, case-insensitive).\",\n      \"editor\": \"stringList\",\n      \"example\": [\n        \"spez\"\n      ]\n    },\n    \"domain\": {\n      \"title\": \"Domain contains\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts whose link domain contains this text (case-insensitive), e.g. youtube.com or self.python.\",\n      \"editor\": \"textfield\",\n      \"example\": \"youtube.com\"\n    },\n    \"distinguished\": {\n      \"title\": \"Official posts only\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts distinguished by Reddit as moderator, admin or special, or keep only regular posts. Leave unset to keep all.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"moderator\",\n        \"admin\",\n        \"special\",\n        \"none\"\n      ],\n      \"enumTitles\": [\n        \"Moderator posts only\",\n        \"Admin posts only\",\n        \"Special (official) posts only\",\n        \"Regular posts only\"\n      ]\n    },\n    \"postedAfter\": {\n      \"title\": \"Created on or after\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts created on or after this date (UTC). When set, the post feed is walked from newest first.\",\n      \"editor\": \"datepicker\",\n      \"example\": \"2025-01-01\"\n    },\n    \"postedBefore\": {\n      \"title\": \"Created on or before\",\n      \"type\": \"string\",\n      \"description\": \"Keep posts created on or before this date (end of day, UTC).\",\n      \"editor\": \"datepicker\",\n      \"example\": \"2025-12-31\"\n    },\n    \"includeComments\": {\n      \"title\": \"Include comments for collected posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch capped comment trees for every post collected in communities or posts mode. In comments mode this is always on.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"sectionCaption\": \"Comments\"\n    },\n    \"maxCommentsPerPost\": {\n      \"title\": \"Maximum comments per post\",\n      \"type\": \"integer\",\n      \"description\": \"Stop collecting a thread after this many comments (1-10,000). The global 'Maximum records' cap still applies.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 25,\n      \"prefill\": 25\n    },\n    \"commentSort\": {\n      \"title\": \"Sort comments by\",\n      \"type\": \"string\",\n      \"description\": \"How Reddit orders the comment tree. 'Confidence' is Reddit's default best-first order; the other four are the verified alternate sorts.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"confidence\",\n        \"top\",\n        \"new\",\n        \"controversial\",\n        \"old\"\n      ],\n      \"enumTitles\": [\n        \"Confidence (best first)\",\n        \"Top\",\n        \"New\",\n        \"Controversial\",\n        \"Old\"\n      ],\n      \"default\": \"confidence\",\n      \"prefill\": \"confidence\"\n    },\n    \"maxCommentDepth\": {\n      \"title\": \"Maximum comment depth\",\n      \"type\": \"integer\",\n      \"description\": \"Keep comments up to this nesting depth. 0 keeps top-level comments only; each extra level adds replies (0-100).\",\n      \"minimum\": 0,\n      \"maximum\": 100,\n      \"default\": 3,\n      \"prefill\": 3\n    },\n    \"includePostDetails\": {\n      \"title\": \"Fetch full post details\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each collected post page to fill body, media and detail-only flags. In comments mode this also saves the parent post record. Slower: one extra page per post.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum records\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on all records pushed by the run (communities, posts and comments together). The run stops cleanly when it is reached.\",\n      \"minimum\": 1,\n      \"maximum\": 100000,\n      \"default\": 1000,\n      \"prefill\": 1,\n      \"sectionCaption\": \"Output control\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Reddit Community, Posts & Comments Scraper\n\nScrape **Reddit communities** without an account: profile details, weekly activity, posting rules, wiki pages, filtered post feeds and capped comment trees. Find communities by keyword, collect a subreddit's recent posts, or follow post URLs into their comment threads. No API key, login or proxy setup.\n\n## What this actor does\n\n- **Four modes:** `communities` (default), `discover`, `posts` and `comments`\n- **Community intelligence:** name, description, creation date, community type, weekly active users, weekly contributions, rules and wiki pages\n- **Filtered feeds:** sort, time window, date range, score/comment/award thresholds, post type, flair/title/body keywords, author allowlist, domain, and exclusion flags\n- **Comment trees:** 20-25 comments per page with \"load more\" expansion, four alternate sort orders, per-post and depth caps\n- **Keyword discovery:** search Reddit's community directory and optionally scrape posts from everything it finds (discovery records are search snapshots; use communities mode for full profiles)\n- **Empty fields are omitted** — records only contain values Reddit actually returned\n\n## Output: community records (`dataType: \"community\"`)\n\nOne record per community in `communities` and `discover` modes.\n\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `url` — identity\n- `description`, `public_description`, `community_icon`, `icon_img` — presentation\n- `created_utc`, `created_at`, `subreddit_type`, `wiki_enabled` — metadata\n- `weekly_active_users`, `weekly_contributions` — Reddit's weekly activity metrics\n- `subscribers`, `active_user_count` and the extended community settings — best-effort: included when Reddit's public metadata endpoint is reachable from the run's network, otherwise omitted\n- `rules[]` — `short_name`, `description`, `description_html`, `priority`\n- `wiki_pages[]` — `name`, `content_md` (Markdown source)\n- `stickies[]` — up to two pinned/highlighted posts using the post fields below (when posts are collected)\n- `search_term` — the discovery keyword that surfaced the community\n- `crawled_at`, `source` — fetch timestamp and data source\n\n## Output: post records (`dataType: \"post\"`)\n\nOne record per collected post in `communities`, `discover` and `posts` modes.\n\n- `post_id`, `post_name`, `subreddit`, `subreddit_prefixed`, `subreddit_id` — identity\n- `title`, `content`, `content_html`, `content_url`, `url`, `permalink`, `domain`, `post_type`, `media_type` — content\n- `author`, `author_id`, `link_flair`, `author_flair`, `author_flair_*` — author and flair\n- `score`, `ups`, `upvote_ratio`, `num_comments`, `total_awards_received`, `awards[]` — engagement\n- `images[]`, `gallery_images[]`, `gallery_count`, `video_url`, `thumbnail_url`, `has_media` — media\n- `is_stickied`, `is_locked`, `is_archived`, `is_pinned`, `is_nsfw`, `is_spoiler`, `is_original_content`, `is_crosspost`, `distinguished`, `removed_by_category` — flags\n- `poll_data`, `crosspost_parent_id`, `language`, `created_utc`, `created_at`, `edited`, `edited_at` — extras\n- `crawled_at`, `source` — fetch timestamp and data source\n\n## Output: comment records (`dataType: \"comment\"`)\n\nOne record per comment in `comments` mode, or when \"Include comments for collected posts\" is on.\n\n- `comment_id`, `comment_name`, `post_id`, `post_title`, `post_url`, `link_id` — identity\n- `author`, `body`, `body_html`, `content_type` — content\n- `score`, `total_awards_received`, `depth`, `position`, `parent_positions`, `parent_id`, `parent_kind` — engagement and tree position\n- `is_op`, `is_stickied`, `is_locked`, `collapsed`, `is_highlighted` — flags\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `permalink` — context\n- `created_utc`, `created_at`, `edited`, `edited_at` — timing\n- `crawled_at`, `source` — fetch timestamp and data source\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `communities` | `communities`, `discover`, `posts` or `comments` |\n| `subreddits` | array | – | Names, `r/` names or full URLs (prefill: `python`) |\n| `postUrls` | array | – | Post/comment URLs or bare IDs for `comments` mode |\n| `discoverMode` | string | `search` | `search`, `popular` or `new` |\n| `discoverQuery` | string | – | Keyword for community discovery |\n| `discoverSort` | string | `relevance` | `relevance` or `activity` |\n| `maxDiscoverResults` | int | `10` | Discovered communities cap (1-100) |\n| `includeRules` | bool | `true` | Add community rules |\n| `includeWiki` | bool | `false` | Add wiki pages and Markdown |\n| `maxWikiPages` | int | `20` | Wiki pages per community (0-200) |\n| `includeWeeklyStats` | bool | `true` | Weekly active users and contributions |\n| `includePosts` | bool | `true` | Collect recent posts |\n| `maxPosts` | int | `25` | Posts per subreddit (1-1,000) |\n| `sort` | string | `hot` | `hot`, `new`, `top`, `rising`, `controversial`, `best` |\n| `timeFilter` | string | `day` | `hour`/`day`/`week`/`month`/`year`/`all` |\n| `includeNSFW` | bool | `false` | Keep NSFW posts |\n| `onlyWithFlair` | bool | `false` | Keep only posts with a flair |\n| `postType` | string | – | `self`/`link`/`image`/`video`/`gallery`/`poll` |\n| `minScore` / `maxScore` | int | – | Score range |\n| `minComments` / `maxComments` | int | – | Comment-count range |\n| `excludeStickied` | bool | `false` | Drop pinned posts |\n| `minUpvoteRatio` | number | – | Minimum upvote ratio (0-1) |\n| `excludeRemoved` | bool | `false` | Drop removed posts |\n| `excludeCrossposts` | bool | `false` | Drop crossposts |\n| `excludeSpoilers` | bool | `false` | Drop spoilers |\n| `excludeLocked` | bool | `false` | Drop locked posts |\n| `excludeDeletedAuthor` | bool | `false` | Drop deleted authors |\n| `onlyOriginalContent` | bool | `false` | Keep only OC posts |\n| `minAwards` | int | – | Minimum total awards |\n| `titleContains` | string | – | Title substring (case-insensitive) |\n| `contentContains` | string | – | Body substring (requires post details) |\n| `flairContains` | string | – | Flair substring |\n| `authorFlairContains` | string | – | Author-flair substring |\n| `authors` | array | – | Author allowlist |\n| `domain` | string | – | Link-domain substring |\n| `distinguished` | string | – | `moderator`/`admin`/`special`/`none` |\n| `postedAfter` / `postedBefore` | date | – | Creation-date window (UTC) |\n| `includeComments` | bool | `false` | Comments for collected posts |\n| `maxCommentsPerPost` | int | `25` | Comments per post (1-10,000) |\n| `commentSort` | string | `confidence` | `confidence`, `top`, `new`, `controversial`, `old` |\n| `maxCommentDepth` | int | `3` | Keep replies up to this depth (0 = top-level only) |\n| `includePostDetails` | bool | `false` | Open post pages for body/media/flags |\n| `maxItems` | int | `1000` | Hard cap across all record types |\n\n### Example: community profile with rules and weekly activity\n\n```json\n{\n  \"mode\": \"communities\",\n  \"subreddits\": [\"python\", \"learnpython\"],\n  \"includeRules\": true,\n  \"includeWeeklyStats\": true,\n  \"includePosts\": false\n}\n```\n\n### Example: top posts from several communities\n\n```json\n{\n  \"mode\": \"posts\",\n  \"subreddits\": [\"technology\", \"programming\"],\n  \"sort\": \"top\",\n  \"timeFilter\": \"week\",\n  \"maxPosts\": 100,\n  \"minScore\": 500,\n  \"minComments\": 50,\n  \"postType\": \"self\",\n  \"excludeStickied\": true,\n  \"maxItems\": 200\n}\n```\n\n### Example: discover communities by keyword\n\n```json\n{\n  \"mode\": \"discover\",\n  \"discoverMode\": \"search\",\n  \"discoverQuery\": \"machine learning\",\n  \"discoverSort\": \"activity\",\n  \"maxDiscoverResults\": 15,\n  \"includePosts\": false\n}\n```\n\n### Example: comment trees from post URLs\n\n```json\n{\n  \"mode\": \"comments\",\n  \"postUrls\": [\n    \"https://www.reddit.com/r/pics/comments/1x1xbpb/expressing_multiple_emotions_at_one_time/\"\n  ],\n  \"commentSort\": \"top\",\n  \"maxCommentsPerPost\": 100,\n  \"maxCommentDepth\": 3,\n  \"includePostDetails\": true,\n  \"maxItems\": 150\n}\n```\n\n## Use cases\n\n- **Community due diligence** — profile a subreddit's rules, activity and culture before posting or advertising\n- **Brand and topic monitoring** — schedule weekly runs over niche communities and track post volume and engagement\n- **Moderation research** — compare posting rules and pinned guidance across many communities\n- **Content strategy** — find high-performing post types, flairs and domains in a target community\n- **Audience research** — follow a thread's comment tree to understand sentiment and objections\n- **Community discovery** — search by topic and get profiles for every relevant subreddit\n\n## FAQ\n\n**Do I need a Reddit account, API key or proxy?** No. The actor reads Reddit's public pages and needs no credentials. It tries a direct connection first and only falls back to proxy routes if the network is blocked.\n\n**Why are subscriber counts sometimes missing?** Reddit no longer shows member counts to signed-out visitors on the rendered page. The actor fills `subscribers` only when a public metadata endpoint happens to be reachable from the run's network; otherwise the field is omitted rather than guessed.\n\n**Why is the moderator list missing?** The public moderator list is login-gated on Reddit. Signed-out runs cannot see it, so `moderators` is normally omitted.\n\n**Why is a subreddit missing from my run?** Private, banned, NSFW-gated or nonexistent communities return nothing. The run log lists the skipped names. Public communities with no matching posts are also reported.\n\n**Why do discovery records have no rules or wiki?** Discovery mode returns the community information Reddit shows in search results (name, description, icon, weekly activity). Run communities mode with the discovered names for full rules, wiki and creation details.\n\n**Why does `contentContains` return nothing?** Post bodies are not on feed cards. Turn on \"Fetch full post details\" so the actor opens each post page before applying the body filter.\n\n**How many posts can I get?** The feed is walked page by page (24-25 posts per page) until your `maxPosts` or global `maxItems` cap is reached. Reddit may stop serving older pages for very deep walks; split by date window with `postedAfter`/`postedBefore` if you need more history.\n\n**How do comment caps work?** `maxCommentsPerPost` stops a thread after N comments, `maxCommentDepth` drops deeper replies, and `maxItems` caps the whole run. Setting depth to 0 keeps top-level comments only. `postUrls` can also point at a comment permalink.\n\n**Why does comments mode return nothing on Apify cloud?** Reddit currently challenges individual post/comment pages on Apify's residential exits even though community feeds, search and about pages load normally. This is a confirmed cloud hard limit, not an input error or a transient retry issue: the actor stops after two challenged post pages and reports it in the status message. Community, post and discovery modes are unaffected. Comment trees are verified from non-cloud networks.\n\n**Can I export the data?** Yes — JSON, CSV, Excel, XML or HTML, plus REST API and integrations with n8n, Zapier, Make and AI agents via the Apify MCP server.\n\n**Is this affiliated with Reddit?** No. It is a third-party actor that reads publicly visible pages.\n\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "reddit-subreddit-profile-rules-and-post-filter",
      "title": "Reddit Community, Posts & Comments Scraper",
      "description": "Scrape Reddit communities without login: profiles, rules, wiki, weekly activity, filtered posts, keyword discovery and capped comment trees. No API key or credentials.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Reddit Community, Posts & Comments Scraper\n\nScrape **Reddit communities** without an account: profile details, weekly activity, posting rules, wiki pages, filtered post feeds and capped comment trees. Find communities by keyword, collect a subreddit's recent posts, or follow post URLs into their comment threads. No API key, login or proxy setup.\n\n## What this actor does\n\n- **Four modes:** `communities` (default), `discover`, `posts` and `comments`\n- **Community intelligence:** name, description, creation date, community type, weekly active users, weekly contributions, rules and wiki pages\n- **Filtered feeds:** sort, time window, date range, score/comment/award thresholds, post type, flair/title/body keywords, author allowlist, domain, and exclusion flags\n- **Comment trees:** 20-25 comments per page with \"load more\" expansion, four alternate sort orders, per-post and depth caps\n- **Keyword discovery:** search Reddit's community directory and optionally scrape posts from everything it finds (discovery records are search snapshots; use communities mode for full profiles)\n- **Empty fields are omitted** — records only contain values Reddit actually returned\n\n## Output: community records (`dataType: \"community\"`)\n\nOne record per community in `communities` and `discover` modes.\n\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `url` — identity\n- `description`, `public_description`, `community_icon`, `icon_img` — presentation\n- `created_utc`, `created_at`, `subreddit_type`, `wiki_enabled` — metadata\n- `weekly_active_users`, `weekly_contributions` — Reddit's weekly activity metrics\n- `subscribers`, `active_user_count` and the extended community settings — best-effort: included when Reddit's public metadata endpoint is reachable from the run's network, otherwise omitted\n- `rules[]` — `short_name`, `description`, `description_html`, `priority`\n- `wiki_pages[]` — `name`, `content_md` (Markdown source)\n- `stickies[]` — up to two pinned/highlighted posts using the post fields below (when posts are collected)\n- `search_term` — the discovery keyword that surfaced the community\n- `crawled_at`, `source` — fetch timestamp and data source\n\n## Output: post records (`dataType: \"post\"`)\n\nOne record per collected post in `communities`, `discover` and `posts` modes.\n\n- `post_id`, `post_name`, `subreddit`, `subreddit_prefixed`, `subreddit_id` — identity\n- `title`, `content`, `content_html`, `content_url`, `url`, `permalink`, `domain`, `post_type`, `media_type` — content\n- `author`, `author_id`, `link_flair`, `author_flair`, `author_flair_*` — author and flair\n- `score`, `ups`, `upvote_ratio`, `num_comments`, `total_awards_received`, `awards[]` — engagement\n- `images[]`, `gallery_images[]`, `gallery_count`, `video_url`, `thumbnail_url`, `has_media` — media\n- `is_stickied`, `is_locked`, `is_archived`, `is_pinned`, `is_nsfw`, `is_spoiler`, `is_original_content`, `is_crosspost`, `distinguished`, `removed_by_category` — flags\n- `poll_data`, `crosspost_parent_id`, `language`, `created_utc`, `created_at`, `edited`, `edited_at` — extras\n- `crawled_at`, `source` — fetch timestamp and data source\n\n## Output: comment records (`dataType: \"comment\"`)\n\nOne record per comment in `comments` mode, or when \"Include comments for collected posts\" is on.\n\n- `comment_id`, `comment_name`, `post_id`, `post_title`, `post_url`, `link_id` — identity\n- `author`, `body`, `body_html`, `content_type` — content\n- `score`, `total_awards_received`, `depth`, `position`, `parent_positions`, `parent_id`, `parent_kind` — engagement and tree position\n- `is_op`, `is_stickied`, `is_locked`, `collapsed`, `is_highlighted` — flags\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`, `permalink` — context\n- `created_utc`, `created_at`, `edited`, `edited_at` — timing\n- `crawled_at`, `source` — fetch timestamp and data source\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `communities` | `communities`, `discover`, `posts` or `comments` |\n| `subreddits` | array | – | Names, `r/` names or full URLs (prefill: `python`) |\n| `postUrls` | array | – | Post/comment URLs or bare IDs for `comments` mode |\n| `discoverMode` | string | `search` | `search`, `popular` or `new` |\n| `discoverQuery` | string | – | Keyword for community discovery |\n| `discoverSort` | string | `relevance` | `relevance` or `activity` |\n| `maxDiscoverResults` | int | `10` | Discovered communities cap (1-100) |\n| `includeRules` | bool | `true` | Add community rules |\n| `includeWiki` | bool | `false` | Add wiki pages and Markdown |\n| `maxWikiPages` | int | `20` | Wiki pages per community (0-200) |\n| `includeWeeklyStats` | bool | `true` | Weekly active users and contributions |\n| `includePosts` | bool | `true` | Collect recent posts |\n| `maxPosts` | int | `25` | Posts per subreddit (1-1,000) |\n| `sort` | string | `hot` | `hot`, `new`, `top`, `rising`, `controversial`, `best` |\n| `timeFilter` | string | `day` | `hour`/`day`/`week`/`month`/`year`/`all` |\n| `includeNSFW` | bool | `false` | Keep NSFW posts |\n| `onlyWithFlair` | bool | `false` | Keep only posts with a flair |\n| `postType` | string | – | `self`/`link`/`image`/`video`/`gallery`/`poll` |\n| `minScore` / `maxScore` | int | – | Score range |\n| `minComments` / `maxComments` | int | – | Comment-count range |\n| `excludeStickied` | bool | `false` | Drop pinned posts |\n| `minUpvoteRatio` | number | – | Minimum upvote ratio (0-1) |\n| `excludeRemoved` | bool | `false` | Drop removed posts |\n| `excludeCrossposts` | bool | `false` | Drop crossposts |\n| `excludeSpoilers` | bool | `false` | Drop spoilers |\n| `excludeLocked` | bool | `false` | Drop locked posts |\n| `excludeDeletedAuthor` | bool | `false` | Drop deleted authors |\n| `onlyOriginalContent` | bool | `false` | Keep only OC posts |\n| `minAwards` | int | – | Minimum total awards |\n| `titleContains` | string | – | Title substring (case-insensitive) |\n| `contentContains` | string | – | Body substring (requires post details) |\n| `flairContains` | string | – | Flair substring |\n| `authorFlairContains` | string | – | Author-flair substring |\n| `authors` | array | – | Author allowlist |\n| `domain` | string | – | Link-domain substring |\n| `distinguished` | string | – | `moderator`/`admin`/`special`/`none` |\n| `postedAfter` / `postedBefore` | date | – | Creation-date window (UTC) |\n| `includeComments` | bool | `false` | Comments for collected posts |\n| `maxCommentsPerPost` | int | `25` | Comments per post (1-10,000) |\n| `commentSort` | string | `confidence` | `confidence`, `top`, `new`, `controversial`, `old` |\n| `maxCommentDepth` | int | `3` | Keep replies up to this depth (0 = top-level only) |\n| `includePostDetails` | bool | `false` | Open post pages for body/media/flags |\n| `maxItems` | int | `1000` | Hard cap across all record types |\n\n### Example: community profile with rules and weekly activity\n\n```json\n{\n  \"mode\": \"communities\",\n  \"subreddits\": [\"python\", \"learnpython\"],\n  \"includeRules\": true,\n  \"includeWeeklyStats\": true,\n  \"includePosts\": false\n}\n```\n\n### Example: top posts from several communities\n\n```json\n{\n  \"mode\": \"posts\",\n  \"subreddits\": [\"technology\", \"programming\"],\n  \"sort\": \"top\",\n  \"timeFilter\": \"week\",\n  \"maxPosts\": 100,\n  \"minScore\": 500,\n  \"minComments\": 50,\n  \"postType\": \"self\",\n  \"excludeStickied\": true,\n  \"maxItems\": 200\n}\n```\n\n### Example: discover communities by keyword\n\n```json\n{\n  \"mode\": \"discover\",\n  \"discoverMode\": \"search\",\n  \"discoverQuery\": \"machine learning\",\n  \"discoverSort\": \"activity\",\n  \"maxDiscoverResults\": 15,\n  \"includePosts\": false\n}\n```\n\n### Example: comment trees from post URLs\n\n```json\n{\n  \"mode\": \"comments\",\n  \"postUrls\": [\n    \"https://www.reddit.com/r/pics/comments/1x1xbpb/expressing_multiple_emotions_at_one_time/\"\n  ],\n  \"commentSort\": \"top\",\n  \"maxCommentsPerPost\": 100,\n  \"maxCommentDepth\": 3,\n  \"includePostDetails\": true,\n  \"maxItems\": 150\n}\n```\n\n## Use cases\n\n- **Community due diligence** — profile a subreddit's rules, activity and culture before posting or advertising\n- **Brand and topic monitoring** — schedule weekly runs over niche communities and track post volume and engagement\n- **Moderation research** — compare posting rules and pinned guidance across many communities\n- **Content strategy** — find high-performing post types, flairs and domains in a target community\n- **Audience research** — follow a thread's comment tree to understand sentiment and objections\n- **Community discovery** — search by topic and get profiles for every relevant subreddit\n\n## FAQ\n\n**Do I need a Reddit account, API key or proxy?** No. The actor reads Reddit's public pages and needs no credentials. It tries a direct connection first and only falls back to proxy routes if the network is blocked.\n\n**Why are subscriber counts sometimes missing?** Reddit no longer shows member counts to signed-out visitors on the rendered page. The actor fills `subscribers` only when a public metadata endpoint happens to be reachable from the run's network; otherwise the field is omitted rather than guessed.\n\n**Why is the moderator list missing?** The public moderator list is login-gated on Reddit. Signed-out runs cannot see it, so `moderators` is normally omitted.\n\n**Why is a subreddit missing from my run?** Private, banned, NSFW-gated or nonexistent communities return nothing. The run log lists the skipped names. Public communities with no matching posts are also reported.\n\n**Why do discovery records have no rules or wiki?** Discovery mode returns the community information Reddit shows in search results (name, description, icon, weekly activity). Run communities mode with the discovered names for full rules, wiki and creation details.\n\n**Why does `contentContains` return nothing?** Post bodies are not on feed cards. Turn on \"Fetch full post details\" so the actor opens each post page before applying the body filter.\n\n**How many posts can I get?** The feed is walked page by page (24-25 posts per page) until your `maxPosts` or global `maxItems` cap is reached. Reddit may stop serving older pages for very deep walks; split by date window with `postedAfter`/`postedBefore` if you need more history.\n\n**How do comment caps work?** `maxCommentsPerPost` stops a thread after N comments, `maxCommentDepth` drops deeper replies, and `maxItems` caps the whole run. Setting depth to 0 keeps top-level comments only. `postUrls` can also point at a comment permalink.\n\n**Why does comments mode return nothing on Apify cloud?** Reddit currently challenges individual post/comment pages on Apify's residential exits even though community feeds, search and about pages load normally. This is a confirmed cloud hard limit, not an input error or a transient retry issue: the actor stops after two challenged post pages and reports it in the status message. Community, post and discovery modes are unaffected. Comment trees are verified from non-cloud networks.\n\n**Can I export the data?** Yes — JSON, CSV, Excel, XML or HTML, plus REST API and integrations with n8n, Zapier, Make and AI agents via the Apify MCP server.\n\n**Is this affiliated with Reddit?** No. It is a third-party actor that reads publicly visible pages.\n\n",
      "input": {
        "title": "Reddit Community Scraper Input",
        "description": "Choose a mode, then list subreddits or post URLs. Community profiles, rules, wiki pages, posts and capped comment trees all work without an API key or login.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "What to scrape",
            "type": "string",
            "description": "Pick the result you want. 'Communities' returns one profile per subreddit (plus optional posts and comments). 'Discover' finds communities by keyword or browse. 'Posts' returns post records only. 'Comments' returns capped comment trees for post URLs or a subreddit's top posts.",
            "editor": "select",
            "enum": [
              "communities",
              "discover",
              "posts",
              "comments"
            ],
            "enumTitles": [
              "Community profiles (plus optional posts/comments)",
              "Discover communities by keyword or browse",
              "Posts from subreddits",
              "Comments from post URLs or top posts"
            ],
            "default": "communities",
            "prefill": "communities",
            "sectionCaption": "Mode and sources"
          },
          "subreddits": {
            "title": "Subreddits",
            "type": "array",
            "description": "Subreddit names to scrape. Accepts bare names, r/ names or full URLs. Use the name as shown in the subreddit URL (Reddit redirects are challenged on some networks). Not needed when 'postUrls' is set or when discovery finds enough communities.",
            "editor": "stringList",
            "example": [
              "python",
              "r/programming",
              "https://www.reddit.com/r/webdev/"
            ],
            "prefill": [
              "Python"
            ]
          },
          "postUrls": {
            "title": "Post URLs (comments mode)",
            "type": "array",
            "description": "Reddit post or comment URLs (or bare post IDs) to scrape in comments mode. When set, these take priority over subreddit top posts. Example: https://www.reddit.com/r/pics/comments/1x1xbpb/",
            "editor": "stringList",
            "example": [
              "https://www.reddit.com/r/pics/comments/1x1xbpb/expressing_multiple_emotions_at_one_time/"
            ]
          },
          "discoverMode": {
            "title": "Discovery source",
            "type": "string",
            "description": "How to find extra communities. 'Keyword search' uses the field below. 'Currently popular' and 'Newest' browse Reddit's curated lists (best-effort: those pages expose only a few communities).",
            "editor": "select",
            "enum": [
              "search",
              "popular",
              "new"
            ],
            "enumTitles": [
              "Keyword search",
              "Currently popular communities",
              "Newest communities"
            ],
            "default": "search",
            "prefill": "search"
          },
          "discoverQuery": {
            "title": "Discover communities by keyword",
            "type": "string",
            "description": "Search Reddit's community directory for this keyword and add the matching communities to the run. Only used with 'Keyword search'. Leave empty to skip discovery.",
            "editor": "textfield",
            "example": "machine learning"
          },
          "discoverSort": {
            "title": "Discovery ranking",
            "type": "string",
            "description": "How to rank keyword-discovered communities: relevance keeps Reddit's order, activity sorts by weekly active users.",
            "editor": "select",
            "enum": [
              "relevance",
              "activity"
            ],
            "enumTitles": [
              "Relevance",
              "Activity (most weekly visitors first)"
            ],
            "default": "relevance",
            "prefill": "relevance"
          },
          "maxDiscoverResults": {
            "title": "Maximum discovered communities",
            "type": "integer",
            "description": "Maximum number of communities to add from keyword search or browse (1-100).",
            "minimum": 1,
            "maximum": 100,
            "default": 10,
            "prefill": 10
          },
          "includeRules": {
            "title": "Include community rules",
            "type": "boolean",
            "description": "Add posting rules (name, description, priority) to community profiles in communities mode.",
            "default": true,
            "prefill": true,
            "sectionCaption": "Community profile"
          },
          "includeWiki": {
            "title": "Include wiki pages",
            "type": "boolean",
            "description": "Fetch the community wiki index and each page's Markdown source. Wiki pages are omitted when the wiki is disabled or empty.",
            "default": false,
            "prefill": false
          },
          "maxWikiPages": {
            "title": "Maximum wiki pages",
            "type": "integer",
            "description": "Maximum number of wiki pages to fetch per community when 'Include wiki pages' is on (0-200).",
            "minimum": 0,
            "maximum": 200,
            "default": 20,
            "prefill": 20
          },
          "includeWeeklyStats": {
            "title": "Include weekly activity",
            "type": "boolean",
            "description": "Include Reddit's weekly active users and weekly contributions from the community header.",
            "default": true,
            "prefill": false
          },
          "includePosts": {
            "title": "Include recent posts",
            "type": "boolean",
            "description": "Also scrape the community's recent posts, with the full filter set below.",
            "default": true,
            "prefill": false,
            "sectionCaption": "Posts"
          },
          "maxPosts": {
            "title": "Maximum posts per subreddit",
            "type": "integer",
            "description": "Maximum posts to collect per subreddit (1-1,000). The global 'Maximum records' cap still applies.",
            "minimum": 1,
            "maximum": 1000,
            "default": 25,
            "prefill": 25
          },
          "sort": {
            "title": "Sort posts by",
            "type": "string",
            "description": "How to order the post feed.",
            "editor": "select",
            "enum": [
              "hot",
              "new",
              "top",
              "rising",
              "controversial",
              "best"
            ],
            "enumTitles": [
              "Hot",
              "New",
              "Top",
              "Rising",
              "Controversial",
              "Best"
            ],
            "default": "hot",
            "prefill": "hot"
          },
          "timeFilter": {
            "title": "Time window for top/controversial",
            "type": "string",
            "description": "Time window used when sorting posts by top or controversial.",
            "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"
          },
          "includeNSFW": {
            "title": "Include NSFW (18+) posts",
            "type": "boolean",
            "description": "Keep posts marked NSFW. NSFW-only communities are gated for signed-out visitors and return nothing regardless of this setting.",
            "default": false,
            "prefill": false
          },
          "onlyWithFlair": {
            "title": "Only posts with a flair",
            "type": "boolean",
            "description": "Drop posts that have no flair tag.",
            "default": false,
            "prefill": false
          },
          "postType": {
            "title": "Only this post type",
            "type": "string",
            "description": "Keep only one content type. Leave unset to keep all types.",
            "editor": "select",
            "enum": [
              "self",
              "link",
              "image",
              "video",
              "gallery",
              "poll"
            ],
            "enumTitles": [
              "Text (self post)",
              "Link",
              "Image",
              "Video",
              "Gallery",
              "Poll"
            ]
          },
          "minScore": {
            "title": "Minimum score",
            "type": "integer",
            "description": "Keep posts with a score (upvotes minus downvotes) at or above this value. Leave unset to keep all scores.",
            "minimum": -1000000,
            "maximum": 1000000,
            "example": 10
          },
          "maxScore": {
            "title": "Maximum score",
            "type": "integer",
            "description": "Keep posts with a score at or below this value. Useful for finding overlooked posts. Leave unset to keep all scores.",
            "minimum": -1000000,
            "maximum": 1000000,
            "example": 1000
          },
          "minComments": {
            "title": "Minimum number of comments",
            "type": "integer",
            "description": "Keep posts with at least this many comments. Leave unset to keep all posts.",
            "minimum": 0,
            "maximum": 1000000,
            "example": 5
          },
          "maxComments": {
            "title": "Maximum number of comments",
            "type": "integer",
            "description": "Keep posts with at most this many comments. Leave unset to keep all posts.",
            "minimum": 0,
            "maximum": 1000000,
            "example": 500
          },
          "excludeStickied": {
            "title": "Exclude stickied posts",
            "type": "boolean",
            "description": "Drop posts pinned by moderators (rules, weekly threads, announcements).",
            "default": false,
            "prefill": false
          },
          "minUpvoteRatio": {
            "title": "Minimum upvote ratio",
            "type": "number",
            "description": "Keep posts whose upvote ratio (0-1) is at or above this value. Leave unset to keep all ratios.",
            "minimum": 0,
            "maximum": 1,
            "example": 0.8
          },
          "excludeRemoved": {
            "title": "Exclude removed/deleted posts",
            "type": "boolean",
            "description": "Drop posts removed by a moderator or Reddit. Deleted post markers are only visible on post detail pages.",
            "default": false,
            "prefill": false
          },
          "excludeCrossposts": {
            "title": "Exclude crossposts",
            "type": "boolean",
            "description": "Drop crossposts from another community, keeping original submissions.",
            "default": false,
            "prefill": false
          },
          "excludeSpoilers": {
            "title": "Exclude spoiler-tagged posts",
            "type": "boolean",
            "description": "Drop posts marked as a spoiler by their author.",
            "default": false,
            "prefill": false
          },
          "excludeLocked": {
            "title": "Exclude locked posts",
            "type": "boolean",
            "description": "Drop posts whose comments were locked by a moderator.",
            "default": false,
            "prefill": false
          },
          "excludeDeletedAuthor": {
            "title": "Exclude deleted authors",
            "type": "boolean",
            "description": "Drop posts whose author appears as [deleted] or [removed].",
            "default": false,
            "prefill": false
          },
          "onlyOriginalContent": {
            "title": "Only original content (OC)",
            "type": "boolean",
            "description": "Keep only posts the author tagged as original content.",
            "default": false,
            "prefill": false
          },
          "minAwards": {
            "title": "Minimum awards",
            "type": "integer",
            "description": "Keep posts with at least this many total awards. Leave unset to keep all posts.",
            "minimum": 0,
            "maximum": 1000000,
            "example": 1
          },
          "titleContains": {
            "title": "Title contains",
            "type": "string",
            "description": "Keep posts whose title contains this text (case-insensitive). Leave empty to keep all titles.",
            "editor": "textfield",
            "example": "launch"
          },
          "contentContains": {
            "title": "Post text contains",
            "type": "string",
            "description": "Keep self posts whose body contains this text (case-insensitive). Requires 'Fetch full post details' so post bodies are available; link/image posts are excluded.",
            "editor": "textfield",
            "example": "tutorial"
          },
          "flairContains": {
            "title": "Flair contains",
            "type": "string",
            "description": "Keep posts whose flair text contains this text (case-insensitive). Leave empty to keep all flairs.",
            "editor": "textfield",
            "example": "Discussion"
          },
          "authorFlairContains": {
            "title": "Author flair contains",
            "type": "string",
            "description": "Keep posts whose author flair text contains this text (case-insensitive).",
            "editor": "textfield",
            "example": "Moderator"
          },
          "authors": {
            "title": "Only these authors",
            "type": "array",
            "description": "Keep posts submitted by one of these usernames (bare or u/-prefixed, case-insensitive).",
            "editor": "stringList",
            "example": [
              "spez"
            ]
          },
          "domain": {
            "title": "Domain contains",
            "type": "string",
            "description": "Keep posts whose link domain contains this text (case-insensitive), e.g. youtube.com or self.python.",
            "editor": "textfield",
            "example": "youtube.com"
          },
          "distinguished": {
            "title": "Official posts only",
            "type": "string",
            "description": "Keep posts distinguished by Reddit as moderator, admin or special, or keep only regular posts. Leave unset to keep all.",
            "editor": "select",
            "enum": [
              "moderator",
              "admin",
              "special",
              "none"
            ],
            "enumTitles": [
              "Moderator posts only",
              "Admin posts only",
              "Special (official) posts only",
              "Regular posts only"
            ]
          },
          "postedAfter": {
            "title": "Created on or after",
            "type": "string",
            "description": "Keep posts created on or after this date (UTC). When set, the post feed is walked from newest first.",
            "editor": "datepicker",
            "example": "2025-01-01"
          },
          "postedBefore": {
            "title": "Created on or before",
            "type": "string",
            "description": "Keep posts created on or before this date (end of day, UTC).",
            "editor": "datepicker",
            "example": "2025-12-31"
          },
          "includeComments": {
            "title": "Include comments for collected posts",
            "type": "boolean",
            "description": "Fetch capped comment trees for every post collected in communities or posts mode. In comments mode this is always on.",
            "default": false,
            "prefill": false,
            "sectionCaption": "Comments"
          },
          "maxCommentsPerPost": {
            "title": "Maximum comments per post",
            "type": "integer",
            "description": "Stop collecting a thread after this many comments (1-10,000). The global 'Maximum records' cap still applies.",
            "minimum": 1,
            "maximum": 10000,
            "default": 25,
            "prefill": 25
          },
          "commentSort": {
            "title": "Sort comments by",
            "type": "string",
            "description": "How Reddit orders the comment tree. 'Confidence' is Reddit's default best-first order; the other four are the verified alternate sorts.",
            "editor": "select",
            "enum": [
              "confidence",
              "top",
              "new",
              "controversial",
              "old"
            ],
            "enumTitles": [
              "Confidence (best first)",
              "Top",
              "New",
              "Controversial",
              "Old"
            ],
            "default": "confidence",
            "prefill": "confidence"
          },
          "maxCommentDepth": {
            "title": "Maximum comment depth",
            "type": "integer",
            "description": "Keep comments up to this nesting depth. 0 keeps top-level comments only; each extra level adds replies (0-100).",
            "minimum": 0,
            "maximum": 100,
            "default": 3,
            "prefill": 3
          },
          "includePostDetails": {
            "title": "Fetch full post details",
            "type": "boolean",
            "description": "Open each collected post page to fill body, media and detail-only flags. In comments mode this also saves the parent post record. Slower: one extra page per post.",
            "default": false,
            "prefill": false
          },
          "maxItems": {
            "title": "Maximum records",
            "type": "integer",
            "description": "Hard cap on all records pushed by the run (communities, posts and comments together). The run stops cleanly when it is reached.",
            "minimum": 1,
            "maximum": 100000,
            "default": 1000,
            "prefill": 1,
            "sectionCaption": "Output control"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Reddit Community, Posts & Comments Scraper Output",
        "description": "Community profiles (with rules, wiki and weekly activity), filtered posts and capped comment trees from Reddit's public pages. Records are distinguished by the `dataType` field.",
        "properties": {
          "records": {
            "type": "string",
            "title": "Community, post & comment records",
            "description": "Dataset with one record per community, one per collected post and one per comment. Records are distinguished by `dataType`: `community`, `post` or `comment`. Empty fields are omitted.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Community, post & comment records",
              "transformation": {
                "fields": [
                  "dataType",
                  "subreddit_prefixed",
                  "title",
                  "post_title",
                  "author",
                  "score",
                  "num_comments",
                  "weekly_active_users",
                  "created_at",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {},
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "f822328bbd7bece5ad69e768e6bb2fcae8f93ecdf92498ef85f7ef1aa1d7ea62",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.04638222222222222
    }
  }
}