{
  "data": {
    "id": "BLjZQoaYOw4cv3DKH",
    "actId": "BDohv5moYWUVpwVMB",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-05T07:21:33.152Z",
    "finishedAt": "2026-11-05T07:21:41.328Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 8044,
      "runTimeSecs": 8.044,
      "computeUnits": 0.008937777777777777,
      "imageSizeBytes": 304031232
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Reddit Subreddit Post Filter & Moderation Scraper Input\",\n  \"description\": \"Scrape public subreddit listings and keep only the posts you want. Filter by keywords, score, comments, upvote ratio, age, flair, post type, author, domain, NSFW and stickied status. No login, API key or proxy setup.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"subreddits\": {\n      \"title\": \"Subreddits\",\n      \"type\": \"array\",\n      \"description\": \"Public subreddits to scrape. Accepts names, r/ names or full Reddit URLs.\",\n      \"editor\": \"stringList\",\n      \"example\": [\n        \"python\",\n        \"programming\"\n      ],\n      \"prefill\": [\n        \"python\"\n      ],\n      \"sectionCaption\": \"Subreddits & sorting\",\n      \"sectionDescription\": \"Pick the communities and how their posts should be ordered.\"\n    },\n    \"sort\": {\n      \"title\": \"Sort posts by\",\n      \"type\": \"string\",\n      \"description\": \"How to order posts in each subreddit. Top and controversial use the time filter.\",\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\": \"new\"\n    },\n    \"timeFilter\": {\n      \"title\": \"Time range for top / controversial\",\n      \"type\": \"string\",\n      \"description\": \"Time window used when Sort is Top or Controversial. Ignored for other sorts.\",\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    \"maxPosts\": {\n      \"title\": \"Max matching posts per subreddit\",\n      \"type\": \"integer\",\n      \"description\": \"Stop after this many posts pass your filters. The actor keeps paging until it finds them or reaches Reddit's listing limit.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 25,\n      \"prefill\": 3\n    },\n    \"maxItems\": {\n      \"title\": \"Max posts in total\",\n      \"type\": \"integer\",\n      \"description\": \"Overall cap across all subreddits.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 1000,\n      \"prefill\": 10\n    },\n    \"includeKeywords\": {\n      \"title\": \"Include keywords\",\n      \"type\": \"array\",\n      \"description\": \"Keep posts containing at least one of these words or phrases. Matching is case-insensitive.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"example\": [\n        \"release\",\n        \"python\"\n      ],\n      \"sectionCaption\": \"Post filters\",\n      \"sectionDescription\": \"Filters are applied before Max matching posts per subreddit is counted.\"\n    },\n    \"excludeKeywords\": {\n      \"title\": \"Exclude keywords\",\n      \"type\": \"array\",\n      \"description\": \"Drop posts containing any of these words or phrases.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"keywordMatch\": {\n      \"title\": \"Keyword matching\",\n      \"type\": \"string\",\n      \"description\": \"Any keyword, all keywords, or the exact phrase formed by joining the include keywords.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"all\",\n        \"exact\"\n      ],\n      \"enumTitles\": [\n        \"Any keyword\",\n        \"All keywords\",\n        \"Exact phrase\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"searchIn\": {\n      \"title\": \"Search keywords in\",\n      \"type\": \"string\",\n      \"description\": \"Search the title, the body, or both.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"title-and-body\",\n        \"title\",\n        \"body\"\n      ],\n      \"enumTitles\": [\n        \"Title and body\",\n        \"Title only\",\n        \"Body only\"\n      ],\n      \"default\": \"title-and-body\",\n      \"prefill\": \"title-and-body\"\n    },\n    \"minScore\": {\n      \"title\": \"Minimum score\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with a lower score. Leave empty for no minimum.\",\n      \"minimum\": -10000,\n      \"maximum\": 10000000\n    },\n    \"maxScore\": {\n      \"title\": \"Maximum score\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with a higher score. Leave empty for no maximum.\",\n      \"minimum\": -10000,\n      \"maximum\": 10000000\n    },\n    \"minComments\": {\n      \"title\": \"Minimum comments\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer comments. Leave empty for no minimum.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"maxComments\": {\n      \"title\": \"Maximum comments\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with more comments. Leave empty for no maximum.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"minUpvoteRatio\": {\n      \"title\": \"Minimum upvote ratio\",\n      \"type\": \"number\",\n      \"description\": \"Keep posts with at least this upvote ratio, from 0 to 1. Leave empty for no minimum.\",\n      \"minimum\": 0,\n      \"maximum\": 1\n    },\n    \"postedAfter\": {\n      \"title\": \"Posts created on or after\",\n      \"type\": \"string\",\n      \"description\": \"ISO date (2026-10-01) or a relative value such as 7 days or 24 hours. Leave empty for no lower bound.\",\n      \"editor\": \"textfield\"\n    },\n    \"postedBefore\": {\n      \"title\": \"Posts created on or before\",\n      \"type\": \"string\",\n      \"description\": \"ISO date or a relative value such as 7 days. Leave empty for no upper bound.\",\n      \"editor\": \"textfield\"\n    },\n    \"maxAgeDays\": {\n      \"title\": \"Maximum post age in days\",\n      \"type\": \"integer\",\n      \"description\": \"Shortcut for keeping only recent posts. Posted after can also be used.\",\n      \"minimum\": 1,\n      \"maximum\": 36500\n    },\n    \"flairAllowlist\": {\n      \"title\": \"Only these post flairs\",\n      \"type\": \"array\",\n      \"description\": \"Case-insensitive exact flair names. Leave empty for any flair.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"example\": [\n        \"Discussion\",\n        \"News\"\n      ]\n    },\n    \"postType\": {\n      \"title\": \"Post type\",\n      \"type\": \"string\",\n      \"description\": \"Keep one post type or all types.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"text\",\n        \"link\",\n        \"image\",\n        \"video\",\n        \"gallery\",\n        \"poll\",\n        \"crosspost\",\n        \"gif\",\n        \"multi_media\"\n      ],\n      \"enumTitles\": [\n        \"All types\",\n        \"Text\",\n        \"Link\",\n        \"Image\",\n        \"Video\",\n        \"Gallery\",\n        \"Poll\",\n        \"Crosspost\",\n        \"GIF\",\n        \"Multi-media\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\"\n    },\n    \"excludeStickied\": {\n      \"title\": \"Exclude stickied posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop pinned moderator/announcement posts.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeNsfw\": {\n      \"title\": \"Exclude NSFW posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts marked NSFW. NSFW-only communities are hidden anonymously, so this is a per-post filter.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"authorAllowlist\": {\n      \"title\": \"Only these authors\",\n      \"type\": \"array\",\n      \"description\": \"Case-insensitive usernames. Leave empty for any author.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"sectionCaption\": \"Authors & domains\",\n      \"sectionDescription\": \"Optional allow and block lists. Self-posts always pass domain filters.\"\n    },\n    \"authorBlocklist\": {\n      \"title\": \"Block these authors\",\n      \"type\": \"array\",\n      \"description\": \"Case-insensitive usernames to drop.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"domainAllowlist\": {\n      \"title\": \"Only these link domains\",\n      \"type\": \"array\",\n      \"description\": \"Keep posts linking to these domains. Self-posts always pass. Accepts bare domains or URLs.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"example\": [\n        \"github.com\",\n        \"arxiv.org\"\n      ]\n    },\n    \"domainBlocklist\": {\n      \"title\": \"Block these link domains\",\n      \"type\": \"array\",\n      \"description\": \"Drop posts linking to these domains. Self-posts always pass.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"includeSubredditInfo\": {\n      \"title\": \"Include subreddit info records\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit one extra record per subreddit with its description, weekly active users and weekly contributions. Adds one request per subreddit.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"sectionCaption\": \"Advanced\",\n      \"sectionDescription\": \"Optional extra output. The post scrape works without it.\"\n    }\n  },\n  \"required\": [\n    \"subreddits\"\n  ]\n}",
    "readme": "# Reddit Subreddit Post Filter & Moderation Scraper\r\n\r\nPull posts from public subreddits, then keep only the ones that matter. This actor reads Reddit's public subreddit listings, applies a full set of filters before it counts toward your limit, and writes clean post records with score, comments, flair, media, gallery, video, poll and crosspost data.\r\n\r\nNo Reddit login, API key, cookie or proxy setup is required.\r\n\r\n## What it does\r\n\r\n- Scrapes one or many public subreddits, sorted hot, new, top, rising, controversial or best.\r\n- Applies the time filter for top and controversial.\r\n- Keeps paging until it finds the requested number of **matching** posts or reaches Reddit's listing limit.\r\n- Filters by keywords, score, comment count, upvote ratio, date/age, flair, post type, author, domain, NSFW and stickied status.\r\n- Emits explicit `status` or `error` records when a subreddit is blocked, private, banned, missing or empty, instead of silently returning nothing.\r\n- Optionally emits one community metadata record per subreddit.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `subreddits` | array | — | Subreddit names, `r/` names or full Reddit URLs. Required. |\r\n| `sort` | select | `hot` | `hot`, `new`, `top`, `rising`, `controversial` or `best`. |\r\n| `timeFilter` | select | `day` | `hour`, `day`, `week`, `month`, `year` or `all`; used with top/controversial. |\r\n| `maxPosts` | integer | `25` | Maximum matching posts per subreddit (1–1000). |\r\n| `maxItems` | integer | `1000` | Overall cap across all subreddits (1–10,000). |\r\n| `includeKeywords` | array | `[]` | Keep posts containing any/all of these words or phrases. |\r\n| `excludeKeywords` | array | `[]` | Drop posts containing any of these words or phrases. |\r\n| `keywordMatch` | select | `any` | `any`, `all` or `exact` (join include keywords into one phrase). |\r\n| `searchIn` | select | `title-and-body` | `title-and-body`, `title` or `body`. |\r\n| `minScore` / `maxScore` | integer | empty | Score range. |\r\n| `minComments` / `maxComments` | integer | empty | Comment-count range. |\r\n| `minUpvoteRatio` | number | empty | Minimum upvote ratio, 0–1. |\r\n| `postedAfter` / `postedBefore` | string | empty | ISO date or relative value such as `7 days` or `24 hours`. |\r\n| `maxAgeDays` | integer | empty | Shortcut for a recent-post cutoff. |\r\n| `flairAllowlist` | array | `[]` | Only these exact flair names (case-insensitive). |\r\n| `postType` | select | `all` | `all`, `text`, `link`, `image`, `video`, `gallery`, `poll`, `crosspost`, `gif` or `multi_media`. |\r\n| `excludeStickied` | boolean | `false` | Drop pinned posts. |\r\n| `excludeNsfw` | boolean | `false` | Drop posts marked NSFW. |\r\n| `authorAllowlist` / `authorBlocklist` | array | `[]` | Username allow/block lists. |\r\n| `domainAllowlist` / `domainBlocklist` | array | `[]` | Link-domain allow/block lists. Self-posts pass. |\r\n| `includeSubredditInfo` | boolean | `false` | Emit one community metadata record per subreddit. |\r\n\r\n### Examples\r\n\r\nHigh-score, clean posts:\r\n\r\n```json\r\n{\r\n  \"subreddits\": [\"python\", \"programming\"],\r\n  \"sort\": \"top\",\r\n  \"timeFilter\": \"week\",\r\n  \"minScore\": 100,\r\n  \"excludeNsfw\": true,\r\n  \"excludeStickied\": true,\r\n  \"maxPosts\": 50\r\n}\r\n```\r\n\r\nKeyword monitoring:\r\n\r\n```json\r\n{\r\n  \"subreddits\": [\"technology\", \"artificial\"],\r\n  \"sort\": \"new\",\r\n  \"includeKeywords\": [\"regulation\", \"policy\"],\r\n  \"excludeKeywords\": [\"giveaway\"],\r\n  \"postedAfter\": \"7 days\",\r\n  \"maxPosts\": 100\r\n}\r\n```\r\n\r\nTrusted-domain links only:\r\n\r\n```json\r\n{\r\n  \"subreddits\": [\"machinelearning\"],\r\n  \"sort\": \"hot\",\r\n  \"domainAllowlist\": [\"arxiv.org\", \"github.com\"],\r\n  \"maxPosts\": 30\r\n}\r\n```\r\n\r\n## Output\r\n\r\nEach post record includes:\r\n\r\n- `recordType` (`post`), `post_id`, `post_name`, `title`\r\n- `author`, `author_fullname`, `author_id`\r\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`\r\n- `content`, `content_length` (self-post body; `content` is capped at 1,000 characters)\r\n- `score`, `num_comments`, `upvote_ratio`\r\n- `url`, `permalink`, `old_reddit_url`, `external_url`, `domain`\r\n- `post_type`, `post_hint`, `language`\r\n- `link_flair`, `link_flair_background_color`\r\n- `thumbnail_url`, `preview_url`, `image_url`, `image_urls`\r\n- `gallery_id`, `gallery_images`, `gallery_count`\r\n- `is_self`, `is_stickied`, `is_nsfw`, `is_spoiler`, `is_gallery`, `is_crosspost`\r\n- `crosspost_parent`, `crosspost_parent_id`, `crosspost_parent_subreddit`, `crosspost_parent_url`\r\n- `total_awards_received`, `top_award_id`, `top_award_icon_url`\r\n- `has_media`, `media_type`\r\n- `video_url`, `video_hls_url`, `video_mp4_url`, `video_poster_url`, `video_duration_seconds`, `video_width`, `video_height`, `video_bitrate_kbps`\r\n- `embed_provider`, `embed_html`, `embed_title`\r\n- `poll_data` (closed state, total votes, option positions/votes where rendered)\r\n- `title_word_count`, `post_age_seconds`, `created_utc`, `created_at`, `crawled_at`\r\n\r\nOptional community record (`recordType: \"subreddit\"`): `subreddit`, `subreddit_prefixed`, `subreddit_id`, `display_name`, `description`, `subscribers`, `created_utc`, `created_at`, `crawled_at`. `weekly_active_users` and `weekly_contributions` are included only when the direct Reddit page header provides them; the Arctic Shift metadata fallback does not expose those two values, so they are omitted rather than fabricated.\r\n\r\nStatus/error records explain what happened without failing the run:\r\n\r\n- `recordType: \"error\"` with `reason` (`blocked`, `login_required`, `private`, `banned`, `not_found`, `nsfw_gated`, `rate_limited`, `http_error`), `message`, `subreddit`, optional `page_title` and `httpStatus`.\r\n- `recordType: \"status\"` with `reason` (`empty`, `no_matches`, `rising_cap`, `info_unavailable`), `message`, `postCount`, `filteredCount`.\r\n\r\nFields Reddit does not expose anonymously are never fabricated. `is_promoted`, `is_original_content`, `gilded_count` and `num_crossposts` remain documented for compatibility but are omitted because the public listing does not carry reliable values. `old_reddit_url` may redirect to a login page on old Reddit.\r\n\r\n## Limits and behavior\r\n\r\n- Reddit's full HTML listing feeds stop at roughly **1,000 posts** for hot/new and roughly **500** for top/controversial. The cloud RSS fallback is capped at **100 posts per subreddit**. Split by sort, time range or subreddit to collect more.\r\n- `rising` is a small live listing; it may return fewer posts than `maxPosts`.\r\n- `maxPosts` counts **matching** posts, not scanned posts. If a filter is restrictive, the actor pages deeper until it finds matches or reaches the listing ceiling.\r\n- NSFW-only communities are age-gated for anonymous visitors and may appear as `not_found` or `nsfw_gated`. Per-post NSFW filtering works when the listing carries the flag.\r\n- Poll option labels are not always rendered in the public listing; vote counts and positions are captured when present.\r\n- Video HLS/MP4 URLs can be signed and expire. `video_url` uses a stable low-resolution fallback; the HLS/MP4 fields are provided for convenience.\r\n- If Reddit blocks the direct listing, the actor first reads the same listing through a Google Translate mirror. That mirror keeps the full post fields. If it is unavailable, the actor falls back to the public Atom/RSS feed. The RSS fallback carries title, author, URL, body and timestamps, but not score, comment count, media, gallery, video or poll fields; the run status message says when it is used.\r\n- If score, comment-count or upvote-ratio filters are set and only RSS is available, the actor does **not** silently pass those filters. It emits a clear `metrics_unavailable` error record for that subreddit and skips it, rather than returning unfiltered posts as if they matched.\r\n- When `includeSubredditInfo` is enabled, the actor tries the direct subreddit page header first and falls back to Arctic Shift's public `subreddits/search` endpoint. Arctic supplies subscribers, description and creation time; weekly active users and weekly contributions are not available there, so those fields are omitted.\r\n- The actor paces requests and backs off on rate limits. It never uses a wall-clock stop that silently under-delivers rows.\r\n\r\n## FAQ\r\n\r\n**Do I need a Reddit account, API key or proxy?**\r\nNo. The actor reads public listing HTML directly and escalates its own internal proxy only if Reddit blocks the request.\r\n\r\n**Why did I get a status or error record instead of posts?**\r\nThe subreddit may be private, banned, missing, age-gated, temporarily blocked or empty. The record's `reason` and `message` explain which case applies. The rest of the run continues.\r\n\r\n**Why did I get a `metrics_unavailable` error?**\r\nReddit’s RSS fallback has no score, comment count or upvote ratio. The actor will not pretend a metric filter passed on RSS-only data. It skips that subreddit and emits the error; retry when the full listing or Translate mirror is available, or remove the metric filter.\r\n\r\n**Why are my filters returning fewer posts than `maxPosts`?**\r\n`maxPosts` is the number of posts that pass your filters. If the source runs out before that, the actor returns what exists. The run status message reports filtered outages.\r\n\r\n**Can I scrape comments?**\r\nNo. This actor is focused on subreddit posts and moderation filters. Use a dedicated Reddit comment scraper for threads.\r\n\r\n**Is this affiliated with Reddit?**\r\nNo. This is an independent, third-party actor that reads public Reddit pages. It is not affiliated with or endorsed by Reddit, Inc.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "reddit-subreddit-post-filter-and-moderation",
      "title": "Reddit Subreddit Post Filter & Moderation Scraper",
      "description": "Scrape public subreddit listings and filter posts by keyword, score, comments, upvote ratio, age, flair, type, author, domain, NSFW or stickied status. Returns media, gallery, video, poll and crosspost fields. No login or API key.",
      "version": "1.1",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Reddit Subreddit Post Filter & Moderation Scraper\r\n\r\nPull posts from public subreddits, then keep only the ones that matter. This actor reads Reddit's public subreddit listings, applies a full set of filters before it counts toward your limit, and writes clean post records with score, comments, flair, media, gallery, video, poll and crosspost data.\r\n\r\nNo Reddit login, API key, cookie or proxy setup is required.\r\n\r\n## What it does\r\n\r\n- Scrapes one or many public subreddits, sorted hot, new, top, rising, controversial or best.\r\n- Applies the time filter for top and controversial.\r\n- Keeps paging until it finds the requested number of **matching** posts or reaches Reddit's listing limit.\r\n- Filters by keywords, score, comment count, upvote ratio, date/age, flair, post type, author, domain, NSFW and stickied status.\r\n- Emits explicit `status` or `error` records when a subreddit is blocked, private, banned, missing or empty, instead of silently returning nothing.\r\n- Optionally emits one community metadata record per subreddit.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `subreddits` | array | — | Subreddit names, `r/` names or full Reddit URLs. Required. |\r\n| `sort` | select | `hot` | `hot`, `new`, `top`, `rising`, `controversial` or `best`. |\r\n| `timeFilter` | select | `day` | `hour`, `day`, `week`, `month`, `year` or `all`; used with top/controversial. |\r\n| `maxPosts` | integer | `25` | Maximum matching posts per subreddit (1–1000). |\r\n| `maxItems` | integer | `1000` | Overall cap across all subreddits (1–10,000). |\r\n| `includeKeywords` | array | `[]` | Keep posts containing any/all of these words or phrases. |\r\n| `excludeKeywords` | array | `[]` | Drop posts containing any of these words or phrases. |\r\n| `keywordMatch` | select | `any` | `any`, `all` or `exact` (join include keywords into one phrase). |\r\n| `searchIn` | select | `title-and-body` | `title-and-body`, `title` or `body`. |\r\n| `minScore` / `maxScore` | integer | empty | Score range. |\r\n| `minComments` / `maxComments` | integer | empty | Comment-count range. |\r\n| `minUpvoteRatio` | number | empty | Minimum upvote ratio, 0–1. |\r\n| `postedAfter` / `postedBefore` | string | empty | ISO date or relative value such as `7 days` or `24 hours`. |\r\n| `maxAgeDays` | integer | empty | Shortcut for a recent-post cutoff. |\r\n| `flairAllowlist` | array | `[]` | Only these exact flair names (case-insensitive). |\r\n| `postType` | select | `all` | `all`, `text`, `link`, `image`, `video`, `gallery`, `poll`, `crosspost`, `gif` or `multi_media`. |\r\n| `excludeStickied` | boolean | `false` | Drop pinned posts. |\r\n| `excludeNsfw` | boolean | `false` | Drop posts marked NSFW. |\r\n| `authorAllowlist` / `authorBlocklist` | array | `[]` | Username allow/block lists. |\r\n| `domainAllowlist` / `domainBlocklist` | array | `[]` | Link-domain allow/block lists. Self-posts pass. |\r\n| `includeSubredditInfo` | boolean | `false` | Emit one community metadata record per subreddit. |\r\n\r\n### Examples\r\n\r\nHigh-score, clean posts:\r\n\r\n```json\r\n{\r\n  \"subreddits\": [\"python\", \"programming\"],\r\n  \"sort\": \"top\",\r\n  \"timeFilter\": \"week\",\r\n  \"minScore\": 100,\r\n  \"excludeNsfw\": true,\r\n  \"excludeStickied\": true,\r\n  \"maxPosts\": 50\r\n}\r\n```\r\n\r\nKeyword monitoring:\r\n\r\n```json\r\n{\r\n  \"subreddits\": [\"technology\", \"artificial\"],\r\n  \"sort\": \"new\",\r\n  \"includeKeywords\": [\"regulation\", \"policy\"],\r\n  \"excludeKeywords\": [\"giveaway\"],\r\n  \"postedAfter\": \"7 days\",\r\n  \"maxPosts\": 100\r\n}\r\n```\r\n\r\nTrusted-domain links only:\r\n\r\n```json\r\n{\r\n  \"subreddits\": [\"machinelearning\"],\r\n  \"sort\": \"hot\",\r\n  \"domainAllowlist\": [\"arxiv.org\", \"github.com\"],\r\n  \"maxPosts\": 30\r\n}\r\n```\r\n\r\n## Output\r\n\r\nEach post record includes:\r\n\r\n- `recordType` (`post`), `post_id`, `post_name`, `title`\r\n- `author`, `author_fullname`, `author_id`\r\n- `subreddit`, `subreddit_prefixed`, `subreddit_id`\r\n- `content`, `content_length` (self-post body; `content` is capped at 1,000 characters)\r\n- `score`, `num_comments`, `upvote_ratio`\r\n- `url`, `permalink`, `old_reddit_url`, `external_url`, `domain`\r\n- `post_type`, `post_hint`, `language`\r\n- `link_flair`, `link_flair_background_color`\r\n- `thumbnail_url`, `preview_url`, `image_url`, `image_urls`\r\n- `gallery_id`, `gallery_images`, `gallery_count`\r\n- `is_self`, `is_stickied`, `is_nsfw`, `is_spoiler`, `is_gallery`, `is_crosspost`\r\n- `crosspost_parent`, `crosspost_parent_id`, `crosspost_parent_subreddit`, `crosspost_parent_url`\r\n- `total_awards_received`, `top_award_id`, `top_award_icon_url`\r\n- `has_media`, `media_type`\r\n- `video_url`, `video_hls_url`, `video_mp4_url`, `video_poster_url`, `video_duration_seconds`, `video_width`, `video_height`, `video_bitrate_kbps`\r\n- `embed_provider`, `embed_html`, `embed_title`\r\n- `poll_data` (closed state, total votes, option positions/votes where rendered)\r\n- `title_word_count`, `post_age_seconds`, `created_utc`, `created_at`, `crawled_at`\r\n\r\nOptional community record (`recordType: \"subreddit\"`): `subreddit`, `subreddit_prefixed`, `subreddit_id`, `display_name`, `description`, `subscribers`, `created_utc`, `created_at`, `crawled_at`. `weekly_active_users` and `weekly_contributions` are included only when the direct Reddit page header provides them; the Arctic Shift metadata fallback does not expose those two values, so they are omitted rather than fabricated.\r\n\r\nStatus/error records explain what happened without failing the run:\r\n\r\n- `recordType: \"error\"` with `reason` (`blocked`, `login_required`, `private`, `banned`, `not_found`, `nsfw_gated`, `rate_limited`, `http_error`), `message`, `subreddit`, optional `page_title` and `httpStatus`.\r\n- `recordType: \"status\"` with `reason` (`empty`, `no_matches`, `rising_cap`, `info_unavailable`), `message`, `postCount`, `filteredCount`.\r\n\r\nFields Reddit does not expose anonymously are never fabricated. `is_promoted`, `is_original_content`, `gilded_count` and `num_crossposts` remain documented for compatibility but are omitted because the public listing does not carry reliable values. `old_reddit_url` may redirect to a login page on old Reddit.\r\n\r\n## Limits and behavior\r\n\r\n- Reddit's full HTML listing feeds stop at roughly **1,000 posts** for hot/new and roughly **500** for top/controversial. The cloud RSS fallback is capped at **100 posts per subreddit**. Split by sort, time range or subreddit to collect more.\r\n- `rising` is a small live listing; it may return fewer posts than `maxPosts`.\r\n- `maxPosts` counts **matching** posts, not scanned posts. If a filter is restrictive, the actor pages deeper until it finds matches or reaches the listing ceiling.\r\n- NSFW-only communities are age-gated for anonymous visitors and may appear as `not_found` or `nsfw_gated`. Per-post NSFW filtering works when the listing carries the flag.\r\n- Poll option labels are not always rendered in the public listing; vote counts and positions are captured when present.\r\n- Video HLS/MP4 URLs can be signed and expire. `video_url` uses a stable low-resolution fallback; the HLS/MP4 fields are provided for convenience.\r\n- If Reddit blocks the direct listing, the actor first reads the same listing through a Google Translate mirror. That mirror keeps the full post fields. If it is unavailable, the actor falls back to the public Atom/RSS feed. The RSS fallback carries title, author, URL, body and timestamps, but not score, comment count, media, gallery, video or poll fields; the run status message says when it is used.\r\n- If score, comment-count or upvote-ratio filters are set and only RSS is available, the actor does **not** silently pass those filters. It emits a clear `metrics_unavailable` error record for that subreddit and skips it, rather than returning unfiltered posts as if they matched.\r\n- When `includeSubredditInfo` is enabled, the actor tries the direct subreddit page header first and falls back to Arctic Shift's public `subreddits/search` endpoint. Arctic supplies subscribers, description and creation time; weekly active users and weekly contributions are not available there, so those fields are omitted.\r\n- The actor paces requests and backs off on rate limits. It never uses a wall-clock stop that silently under-delivers rows.\r\n\r\n## FAQ\r\n\r\n**Do I need a Reddit account, API key or proxy?**\r\nNo. The actor reads public listing HTML directly and escalates its own internal proxy only if Reddit blocks the request.\r\n\r\n**Why did I get a status or error record instead of posts?**\r\nThe subreddit may be private, banned, missing, age-gated, temporarily blocked or empty. The record's `reason` and `message` explain which case applies. The rest of the run continues.\r\n\r\n**Why did I get a `metrics_unavailable` error?**\r\nReddit’s RSS fallback has no score, comment count or upvote ratio. The actor will not pretend a metric filter passed on RSS-only data. It skips that subreddit and emits the error; retry when the full listing or Translate mirror is available, or remove the metric filter.\r\n\r\n**Why are my filters returning fewer posts than `maxPosts`?**\r\n`maxPosts` is the number of posts that pass your filters. If the source runs out before that, the actor returns what exists. The run status message reports filtered outages.\r\n\r\n**Can I scrape comments?**\r\nNo. This actor is focused on subreddit posts and moderation filters. Use a dedicated Reddit comment scraper for threads.\r\n\r\n**Is this affiliated with Reddit?**\r\nNo. This is an independent, third-party actor that reads public Reddit pages. It is not affiliated with or endorsed by Reddit, Inc.\r\n",
      "input": {
        "title": "Reddit Subreddit Post Filter & Moderation Scraper Input",
        "description": "Scrape public subreddit listings and keep only the posts you want. Filter by keywords, score, comments, upvote ratio, age, flair, post type, author, domain, NSFW and stickied status. No login, API key or proxy setup.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "subreddits": {
            "title": "Subreddits",
            "type": "array",
            "description": "Public subreddits to scrape. Accepts names, r/ names or full Reddit URLs.",
            "editor": "stringList",
            "example": [
              "python",
              "programming"
            ],
            "prefill": [
              "python"
            ],
            "sectionCaption": "Subreddits & sorting",
            "sectionDescription": "Pick the communities and how their posts should be ordered."
          },
          "sort": {
            "title": "Sort posts by",
            "type": "string",
            "description": "How to order posts in each subreddit. Top and controversial use the time filter.",
            "editor": "select",
            "enum": [
              "hot",
              "new",
              "top",
              "rising",
              "controversial",
              "best"
            ],
            "enumTitles": [
              "Hot",
              "New",
              "Top",
              "Rising",
              "Controversial",
              "Best"
            ],
            "default": "hot",
            "prefill": "new"
          },
          "timeFilter": {
            "title": "Time range for top / controversial",
            "type": "string",
            "description": "Time window used when Sort is Top or Controversial. Ignored for other sorts.",
            "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"
          },
          "maxPosts": {
            "title": "Max matching posts per subreddit",
            "type": "integer",
            "description": "Stop after this many posts pass your filters. The actor keeps paging until it finds them or reaches Reddit's listing limit.",
            "minimum": 1,
            "maximum": 1000,
            "default": 25,
            "prefill": 3
          },
          "maxItems": {
            "title": "Max posts in total",
            "type": "integer",
            "description": "Overall cap across all subreddits.",
            "minimum": 1,
            "maximum": 10000,
            "default": 1000,
            "prefill": 10
          },
          "includeKeywords": {
            "title": "Include keywords",
            "type": "array",
            "description": "Keep posts containing at least one of these words or phrases. Matching is case-insensitive.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "example": [
              "release",
              "python"
            ],
            "sectionCaption": "Post filters",
            "sectionDescription": "Filters are applied before Max matching posts per subreddit is counted."
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop posts containing any of these words or phrases.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "keywordMatch": {
            "title": "Keyword matching",
            "type": "string",
            "description": "Any keyword, all keywords, or the exact phrase formed by joining the include keywords.",
            "editor": "select",
            "enum": [
              "any",
              "all",
              "exact"
            ],
            "enumTitles": [
              "Any keyword",
              "All keywords",
              "Exact phrase"
            ],
            "default": "any",
            "prefill": "any"
          },
          "searchIn": {
            "title": "Search keywords in",
            "type": "string",
            "description": "Search the title, the body, or both.",
            "editor": "select",
            "enum": [
              "title-and-body",
              "title",
              "body"
            ],
            "enumTitles": [
              "Title and body",
              "Title only",
              "Body only"
            ],
            "default": "title-and-body",
            "prefill": "title-and-body"
          },
          "minScore": {
            "title": "Minimum score",
            "type": "integer",
            "description": "Drop posts with a lower score. Leave empty for no minimum.",
            "minimum": -10000,
            "maximum": 10000000
          },
          "maxScore": {
            "title": "Maximum score",
            "type": "integer",
            "description": "Drop posts with a higher score. Leave empty for no maximum.",
            "minimum": -10000,
            "maximum": 10000000
          },
          "minComments": {
            "title": "Minimum comments",
            "type": "integer",
            "description": "Drop posts with fewer comments. Leave empty for no minimum.",
            "minimum": 0,
            "maximum": 10000000
          },
          "maxComments": {
            "title": "Maximum comments",
            "type": "integer",
            "description": "Drop posts with more comments. Leave empty for no maximum.",
            "minimum": 0,
            "maximum": 10000000
          },
          "minUpvoteRatio": {
            "title": "Minimum upvote ratio",
            "type": "number",
            "description": "Keep posts with at least this upvote ratio, from 0 to 1. Leave empty for no minimum.",
            "minimum": 0,
            "maximum": 1
          },
          "postedAfter": {
            "title": "Posts created on or after",
            "type": "string",
            "description": "ISO date (2026-10-01) or a relative value such as 7 days or 24 hours. Leave empty for no lower bound.",
            "editor": "textfield"
          },
          "postedBefore": {
            "title": "Posts created on or before",
            "type": "string",
            "description": "ISO date or a relative value such as 7 days. Leave empty for no upper bound.",
            "editor": "textfield"
          },
          "maxAgeDays": {
            "title": "Maximum post age in days",
            "type": "integer",
            "description": "Shortcut for keeping only recent posts. Posted after can also be used.",
            "minimum": 1,
            "maximum": 36500
          },
          "flairAllowlist": {
            "title": "Only these post flairs",
            "type": "array",
            "description": "Case-insensitive exact flair names. Leave empty for any flair.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "example": [
              "Discussion",
              "News"
            ]
          },
          "postType": {
            "title": "Post type",
            "type": "string",
            "description": "Keep one post type or all types.",
            "editor": "select",
            "enum": [
              "all",
              "text",
              "link",
              "image",
              "video",
              "gallery",
              "poll",
              "crosspost",
              "gif",
              "multi_media"
            ],
            "enumTitles": [
              "All types",
              "Text",
              "Link",
              "Image",
              "Video",
              "Gallery",
              "Poll",
              "Crosspost",
              "GIF",
              "Multi-media"
            ],
            "default": "all",
            "prefill": "all"
          },
          "excludeStickied": {
            "title": "Exclude stickied posts",
            "type": "boolean",
            "description": "Drop pinned moderator/announcement posts.",
            "default": false,
            "prefill": false
          },
          "excludeNsfw": {
            "title": "Exclude NSFW posts",
            "type": "boolean",
            "description": "Drop posts marked NSFW. NSFW-only communities are hidden anonymously, so this is a per-post filter.",
            "default": false,
            "prefill": false
          },
          "authorAllowlist": {
            "title": "Only these authors",
            "type": "array",
            "description": "Case-insensitive usernames. Leave empty for any author.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "sectionCaption": "Authors & domains",
            "sectionDescription": "Optional allow and block lists. Self-posts always pass domain filters."
          },
          "authorBlocklist": {
            "title": "Block these authors",
            "type": "array",
            "description": "Case-insensitive usernames to drop.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "domainAllowlist": {
            "title": "Only these link domains",
            "type": "array",
            "description": "Keep posts linking to these domains. Self-posts always pass. Accepts bare domains or URLs.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "example": [
              "github.com",
              "arxiv.org"
            ]
          },
          "domainBlocklist": {
            "title": "Block these link domains",
            "type": "array",
            "description": "Drop posts linking to these domains. Self-posts always pass.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "includeSubredditInfo": {
            "title": "Include subreddit info records",
            "type": "boolean",
            "description": "Emit one extra record per subreddit with its description, weekly active users and weekly contributions. Adds one request per subreddit.",
            "default": false,
            "prefill": false,
            "sectionCaption": "Advanced",
            "sectionDescription": "Optional extra output. The post scrape works without it."
          }
        },
        "required": [
          "subreddits"
        ]
      },
      "output": {
        "title": "Reddit Subreddit Post Filter & Moderation Scraper Output",
        "type": "object",
        "schemaVersion": 1,
        "actorOutputSchemaVersion": 1,
        "description": "One record per post that passes your filters. Error and status records explain blocked, private, empty or no-match subreddits. Optional subreddit records add community metadata.",
        "properties": {
          "recordType": {
            "title": "Record type",
            "type": "string",
            "description": "post, error, status or subreddit.",
            "template": "{{recordType}}"
          },
          "type": {
            "title": "Internal record type",
            "type": "string",
            "description": "Set on error and status records.",
            "template": "{{type}}"
          },
          "reason": {
            "title": "Reason",
            "type": "string",
            "description": "Why an error or status record was emitted, for example blocked, private, empty, no_matches or info_unavailable.",
            "template": "{{reason}}"
          },
          "message": {
            "title": "Message",
            "type": "string",
            "description": "Human-readable explanation for an error or status record.",
            "template": "{{message}}"
          },
          "page_title": {
            "title": "Page title",
            "type": "string",
            "description": "Title of the Reddit page that could not be read.",
            "template": "{{page_title}}"
          },
          "httpStatus": {
            "title": "HTTP status",
            "type": "string",
            "description": "HTTP status from the failed request.",
            "template": "{{httpStatus}}"
          },
          "postCount": {
            "title": "Post count",
            "type": "string",
            "description": "Number of posts emitted for a status record.",
            "template": "{{postCount}}"
          },
          "filteredCount": {
            "title": "Filtered count",
            "type": "string",
            "description": "Number of fetched posts removed by filters.",
            "template": "{{filteredCount}}"
          },
          "scrapedAt": {
            "title": "Scraped at",
            "type": "string",
            "description": "ISO 8601 timestamp for an error or status record.",
            "template": "{{scrapedAt}}"
          },
          "post_id": {
            "title": "Post ID",
            "type": "string",
            "description": "Reddit post ID without the t3_ prefix.",
            "template": "{{post_id}}"
          },
          "post_name": {
            "title": "Post name",
            "type": "string",
            "description": "Full Reddit post name, for example t3_abc123.",
            "template": "{{post_name}}"
          },
          "title": {
            "title": "Title",
            "type": "string",
            "description": "Post title.",
            "template": "{{title}}"
          },
          "author": {
            "title": "Author",
            "type": "string",
            "description": "Post author username.",
            "template": "{{author}}"
          },
          "author_fullname": {
            "title": "Author fullname",
            "type": "string",
            "description": "Author account fullname, for example t2_abc123.",
            "template": "{{author_fullname}}"
          },
          "author_id": {
            "title": "Author ID",
            "type": "string",
            "description": "Author account ID.",
            "template": "{{author_id}}"
          },
          "subreddit": {
            "title": "Subreddit",
            "type": "string",
            "description": "Subreddit name without r/.",
            "template": "{{subreddit}}"
          },
          "subreddit_prefixed": {
            "title": "Subreddit prefixed",
            "type": "string",
            "description": "Subreddit name with the r/ prefix.",
            "template": "{{subreddit_prefixed}}"
          },
          "subreddit_id": {
            "title": "Subreddit ID",
            "type": "string",
            "description": "Subreddit fullname, for example t5_abc123.",
            "template": "{{subreddit_id}}"
          },
          "display_name": {
            "title": "Display name",
            "type": "string",
            "description": "Subreddit display name on an optional subreddit record.",
            "template": "{{display_name}}"
          },
          "description": {
            "title": "Description",
            "type": "string",
            "description": "Subreddit description on an optional subreddit record.",
            "template": "{{description}}"
          },
          "weekly_active_users": {
            "title": "Weekly active users",
            "type": "string",
            "description": "Reddit's weekly active user count on an optional subreddit record.",
            "template": "{{weekly_active_users}}"
          },
          "weekly_contributions": {
            "title": "Weekly contributions",
            "type": "string",
            "description": "Reddit's weekly contribution count on an optional subreddit record.",
            "template": "{{weekly_contributions}}"
          },
          "subscribers": {
            "title": "Subscribers",
            "type": "string",
            "description": "Subreddit subscriber count when the metadata source provides it.",
            "template": "{{subscribers}}"
          },
          "content": {
            "title": "Content",
            "type": "string",
            "description": "Text body of a self post, first 1000 characters. Omitted for posts without a body.",
            "template": "{{content}}"
          },
          "content_length": {
            "title": "Content length",
            "type": "string",
            "description": "Full character length of the text body.",
            "template": "{{content_length}}"
          },
          "score": {
            "title": "Score",
            "type": "string",
            "description": "Post score.",
            "template": "{{score}}"
          },
          "num_comments": {
            "title": "Number of comments",
            "type": "string",
            "description": "Reported comment count.",
            "template": "{{num_comments}}"
          },
          "upvote_ratio": {
            "title": "Upvote ratio",
            "type": "string",
            "description": "Upvote ratio from 0 to 1.",
            "template": "{{upvote_ratio}}"
          },
          "url": {
            "title": "URL",
            "type": "string",
            "description": "Reddit permalink of the post.",
            "template": "{{url}}"
          },
          "permalink": {
            "title": "Permalink",
            "type": "string",
            "description": "Reddit permalink of the post.",
            "template": "{{permalink}}"
          },
          "old_reddit_url": {
            "title": "Old Reddit URL",
            "type": "string",
            "description": "Old Reddit permalink. Old Reddit may require a login.",
            "template": "{{old_reddit_url}}"
          },
          "external_url": {
            "title": "External URL",
            "type": "string",
            "description": "Off-Reddit link, image, gallery or video URL when distinct from the permalink.",
            "template": "{{external_url}}"
          },
          "domain": {
            "title": "Domain",
            "type": "string",
            "description": "Link domain, self.<subreddit> for text posts, or reddit.com for galleries.",
            "template": "{{domain}}"
          },
          "post_type": {
            "title": "Post type",
            "type": "string",
            "description": "text, link, image, video, gallery, poll, crosspost, gif or multi_media.",
            "template": "{{post_type}}"
          },
          "post_hint": {
            "title": "Post hint",
            "type": "string",
            "description": "Normalized post classification: self, image, gallery, hosted:video, rich:video or link.",
            "template": "{{post_hint}}"
          },
          "link_flair": {
            "title": "Link flair",
            "type": "string",
            "description": "Post flair text when the post has one.",
            "template": "{{link_flair}}"
          },
          "link_flair_background_color": {
            "title": "Link flair background",
            "type": "string",
            "description": "Flair background color when Reddit provides one.",
            "template": "{{link_flair_background_color}}"
          },
          "thumbnail_url": {
            "title": "Thumbnail URL",
            "type": "string",
            "description": "Post thumbnail or external preview image.",
            "template": "{{thumbnail_url}}"
          },
          "preview_url": {
            "title": "Preview URL",
            "type": "string",
            "description": "Reddit preview image.",
            "template": "{{preview_url}}"
          },
          "image_url": {
            "title": "Image URL",
            "type": "string",
            "description": "Full image URL for image and GIF posts.",
            "template": "{{image_url}}"
          },
          "image_urls": {
            "title": "Image URLs",
            "type": "string",
            "description": "Image URLs belonging to the post, including gallery renditions.",
            "template": "{{image_urls}}"
          },
          "gallery_id": {
            "title": "Gallery ID",
            "type": "string",
            "description": "Gallery identifier for gallery posts.",
            "template": "{{gallery_id}}"
          },
          "gallery_images": {
            "title": "Gallery images",
            "type": "string",
            "description": "Full-size gallery image URLs.",
            "template": "{{gallery_images}}"
          },
          "gallery_count": {
            "title": "Gallery count",
            "type": "string",
            "description": "Number of gallery images captured.",
            "template": "{{gallery_count}}"
          },
          "is_self": {
            "title": "Is self post",
            "type": "string",
            "description": "True for text and poll posts.",
            "template": "{{is_self}}"
          },
          "is_stickied": {
            "title": "Is stickied",
            "type": "string",
            "description": "True when the post is pinned.",
            "template": "{{is_stickied}}"
          },
          "is_nsfw": {
            "title": "Is NSFW",
            "type": "string",
            "description": "True when the post is marked NSFW.",
            "template": "{{is_nsfw}}"
          },
          "is_spoiler": {
            "title": "Is spoiler",
            "type": "string",
            "description": "True when the post is marked as a spoiler.",
            "template": "{{is_spoiler}}"
          },
          "is_promoted": {
            "title": "Is promoted",
            "type": "string",
            "description": "Not exposed by anonymous Reddit listings; omitted.",
            "template": "{{is_promoted}}"
          },
          "is_original_content": {
            "title": "Is original content",
            "type": "string",
            "description": "Not exposed by anonymous Reddit listings; omitted.",
            "template": "{{is_original_content}}"
          },
          "is_gallery": {
            "title": "Is gallery",
            "type": "string",
            "description": "True for gallery posts.",
            "template": "{{is_gallery}}"
          },
          "is_crosspost": {
            "title": "Is crosspost",
            "type": "string",
            "description": "True for crossposts.",
            "template": "{{is_crosspost}}"
          },
          "gilded_count": {
            "title": "Gilded count",
            "type": "string",
            "description": "Not exposed as a gilded breakdown by anonymous Reddit listings; omitted.",
            "template": "{{gilded_count}}"
          },
          "num_crossposts": {
            "title": "Number of crossposts",
            "type": "string",
            "description": "Not exposed by anonymous Reddit listings; omitted.",
            "template": "{{num_crossposts}}"
          },
          "crosspost_parent": {
            "title": "Crosspost parent",
            "type": "string",
            "description": "Parent post of a crosspost.",
            "template": "{{crosspost_parent}}"
          },
          "crosspost_parent_id": {
            "title": "Crosspost parent ID",
            "type": "string",
            "description": "Parent post ID for a crosspost.",
            "template": "{{crosspost_parent_id}}"
          },
          "crosspost_parent_subreddit": {
            "title": "Crosspost parent subreddit",
            "type": "string",
            "description": "Parent subreddit for a crosspost.",
            "template": "{{crosspost_parent_subreddit}}"
          },
          "crosspost_parent_url": {
            "title": "Crosspost parent URL",
            "type": "string",
            "description": "Parent post URL for a crosspost.",
            "template": "{{crosspost_parent_url}}"
          },
          "total_awards_received": {
            "title": "Total awards",
            "type": "string",
            "description": "Award count reported by Reddit.",
            "template": "{{total_awards_received}}"
          },
          "top_award_id": {
            "title": "Top award ID",
            "type": "string",
            "description": "ID of the top award when Reddit provides one.",
            "template": "{{top_award_id}}"
          },
          "top_award_icon_url": {
            "title": "Top award icon URL",
            "type": "string",
            "description": "Icon URL of the top award when Reddit provides one.",
            "template": "{{top_award_icon_url}}"
          },
          "has_media": {
            "title": "Has media",
            "type": "string",
            "description": "True when the post has an image, gallery, video, embed or poll.",
            "template": "{{has_media}}"
          },
          "media_type": {
            "title": "Media type",
            "type": "string",
            "description": "image, gallery, video, gif, poll or embed.",
            "template": "{{media_type}}"
          },
          "video_url": {
            "title": "Video URL",
            "type": "string",
            "description": "Stable direct video URL when available.",
            "template": "{{video_url}}"
          },
          "video_hls_url": {
            "title": "Video HLS URL",
            "type": "string",
            "description": "HLS playlist URL. Signed URLs may expire.",
            "template": "{{video_hls_url}}"
          },
          "video_mp4_url": {
            "title": "Video MP4 URL",
            "type": "string",
            "description": "MP4 rendition URL. Signed URLs may expire.",
            "template": "{{video_mp4_url}}"
          },
          "video_poster_url": {
            "title": "Video poster URL",
            "type": "string",
            "description": "Video poster image URL.",
            "template": "{{video_poster_url}}"
          },
          "video_duration_seconds": {
            "title": "Video duration",
            "type": "string",
            "description": "Video duration in seconds.",
            "template": "{{video_duration_seconds}}"
          },
          "video_width": {
            "title": "Video width",
            "type": "string",
            "description": "Video width in pixels.",
            "template": "{{video_width}}"
          },
          "video_height": {
            "title": "Video height",
            "type": "string",
            "description": "Video height in pixels.",
            "template": "{{video_height}}"
          },
          "video_bitrate_kbps": {
            "title": "Video bitrate",
            "type": "string",
            "description": "Video bitrate in kilobits per second.",
            "template": "{{video_bitrate_kbps}}"
          },
          "embed_provider": {
            "title": "Embed provider",
            "type": "string",
            "description": "Provider name for an external embed, for example YouTube.",
            "template": "{{embed_provider}}"
          },
          "embed_html": {
            "title": "Embed HTML",
            "type": "string",
            "description": "Embed iframe HTML when Reddit provides it.",
            "template": "{{embed_html}}"
          },
          "embed_title": {
            "title": "Embed title",
            "type": "string",
            "description": "Title from the embed iframe.",
            "template": "{{embed_title}}"
          },
          "poll_data": {
            "title": "Poll data",
            "type": "string",
            "description": "Poll state. Vote counts and option positions are captured; option labels are not always rendered anonymously.",
            "template": "{{poll_data}}"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Post language code reported by Reddit.",
            "template": "{{language}}"
          },
          "title_word_count": {
            "title": "Title word count",
            "type": "string",
            "description": "Number of words in the title.",
            "template": "{{title_word_count}}"
          },
          "post_age_seconds": {
            "title": "Post age",
            "type": "string",
            "description": "Age of the post in seconds at scrape time.",
            "template": "{{post_age_seconds}}"
          },
          "created_utc": {
            "title": "Created UTC",
            "type": "string",
            "description": "Unix timestamp of post creation.",
            "template": "{{created_utc}}"
          },
          "created_at": {
            "title": "Created at",
            "type": "string",
            "description": "ISO 8601 creation time.",
            "template": "{{created_at}}"
          },
          "crawled_at": {
            "title": "Crawled at",
            "type": "string",
            "description": "ISO 8601 timestamp of this scrape.",
            "template": "{{crawled_at}}"
          }
        },
        "required": [
          "recordType"
        ]
      },
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 900,
        "memoryMbytes": 1024
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Reddit Posts (Pro)",
              "transformation": {
                "fields": [
                  "recordType",
                  "subreddit_prefixed",
                  "title",
                  "author",
                  "score",
                  "upvote_ratio",
                  "num_comments",
                  "post_type",
                  "created_at",
                  "link_flair",
                  "url",
                  "display_name",
                  "description",
                  "subscribers"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.1.1",
    "imageDigest": "027a4430b4fd9ac53d829d378302c76fa5a6d14bbd0dd153a99e1b59ef0d0297",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.008937777777777777
    }
  }
}