{
  "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.",
  "properties": {
    "authorAllowlist": {
      "default": [],
      "description": "Case-insensitive usernames. Leave empty for any author.",
      "editor": "stringList",
      "prefill": [],
      "sectionCaption": "Authors & domains",
      "sectionDescription": "Optional allow and block lists. Self-posts always pass domain filters.",
      "title": "Only these authors",
      "type": "array"
    },
    "authorBlocklist": {
      "default": [],
      "description": "Case-insensitive usernames to drop.",
      "editor": "stringList",
      "prefill": [],
      "title": "Block these authors",
      "type": "array"
    },
    "domainAllowlist": {
      "default": [],
      "description": "Keep posts linking to these domains. Self-posts always pass. Accepts bare domains or URLs.",
      "editor": "stringList",
      "example": [
        "github.com",
        "arxiv.org"
      ],
      "prefill": [],
      "title": "Only these link domains",
      "type": "array"
    },
    "domainBlocklist": {
      "default": [],
      "description": "Drop posts linking to these domains. Self-posts always pass.",
      "editor": "stringList",
      "prefill": [],
      "title": "Block these link domains",
      "type": "array"
    },
    "excludeKeywords": {
      "default": [],
      "description": "Drop posts containing any of these words or phrases.",
      "editor": "stringList",
      "prefill": [],
      "title": "Exclude keywords",
      "type": "array"
    },
    "excludeNsfw": {
      "default": false,
      "description": "Drop posts marked NSFW. NSFW-only communities are hidden anonymously, so this is a per-post filter.",
      "prefill": false,
      "title": "Exclude NSFW posts",
      "type": "boolean"
    },
    "excludeStickied": {
      "default": false,
      "description": "Drop pinned moderator/announcement posts.",
      "prefill": false,
      "title": "Exclude stickied posts",
      "type": "boolean"
    },
    "flairAllowlist": {
      "default": [],
      "description": "Case-insensitive exact flair names. Leave empty for any flair.",
      "editor": "stringList",
      "example": [
        "Discussion",
        "News"
      ],
      "prefill": [],
      "title": "Only these post flairs",
      "type": "array"
    },
    "includeKeywords": {
      "default": [],
      "description": "Keep posts containing at least one of these words or phrases. Matching is case-insensitive.",
      "editor": "stringList",
      "example": [
        "release",
        "python"
      ],
      "prefill": [],
      "sectionCaption": "Post filters",
      "sectionDescription": "Filters are applied before Max matching posts per subreddit is counted.",
      "title": "Include keywords",
      "type": "array"
    },
    "includeSubredditInfo": {
      "default": false,
      "description": "Emit one extra record per subreddit with its description, weekly active users and weekly contributions. Adds one request per subreddit.",
      "prefill": false,
      "sectionCaption": "Advanced",
      "sectionDescription": "Optional extra output. The post scrape works without it.",
      "title": "Include subreddit info records",
      "type": "boolean"
    },
    "keywordMatch": {
      "default": "any",
      "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"
      ],
      "prefill": "any",
      "title": "Keyword matching",
      "type": "string"
    },
    "maxAgeDays": {
      "description": "Shortcut for keeping only recent posts. Posted after can also be used.",
      "maximum": 36500,
      "minimum": 1,
      "title": "Maximum post age in days",
      "type": "integer"
    },
    "maxComments": {
      "description": "Drop posts with more comments. Leave empty for no maximum.",
      "maximum": 10000000,
      "minimum": 0,
      "title": "Maximum comments",
      "type": "integer"
    },
    "maxItems": {
      "default": 1000,
      "description": "Overall cap across all subreddits.",
      "maximum": 10000,
      "minimum": 1,
      "prefill": 10,
      "title": "Max posts in total",
      "type": "integer"
    },
    "maxPosts": {
      "default": 25,
      "description": "Stop after this many posts pass your filters. The actor keeps paging until it finds them or reaches Reddit's listing limit.",
      "maximum": 1000,
      "minimum": 1,
      "prefill": 3,
      "title": "Max matching posts per subreddit",
      "type": "integer"
    },
    "maxScore": {
      "description": "Drop posts with a higher score. Leave empty for no maximum.",
      "maximum": 10000000,
      "minimum": -10000,
      "title": "Maximum score",
      "type": "integer"
    },
    "minComments": {
      "description": "Drop posts with fewer comments. Leave empty for no minimum.",
      "maximum": 10000000,
      "minimum": 0,
      "title": "Minimum comments",
      "type": "integer"
    },
    "minScore": {
      "description": "Drop posts with a lower score. Leave empty for no minimum.",
      "maximum": 10000000,
      "minimum": -10000,
      "title": "Minimum score",
      "type": "integer"
    },
    "minUpvoteRatio": {
      "description": "Keep posts with at least this upvote ratio, from 0 to 1. Leave empty for no minimum.",
      "maximum": 1,
      "minimum": 0,
      "title": "Minimum upvote ratio",
      "type": "number"
    },
    "postType": {
      "default": "all",
      "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"
      ],
      "prefill": "all",
      "title": "Post type",
      "type": "string"
    },
    "postedAfter": {
      "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",
      "title": "Posts created on or after",
      "type": "string"
    },
    "postedBefore": {
      "description": "ISO date or a relative value such as 7 days. Leave empty for no upper bound.",
      "editor": "textfield",
      "title": "Posts created on or before",
      "type": "string"
    },
    "searchIn": {
      "default": "title-and-body",
      "description": "Search the title, the body, or both.",
      "editor": "select",
      "enum": [
        "title-and-body",
        "title",
        "body"
      ],
      "enumTitles": [
        "Title and body",
        "Title only",
        "Body only"
      ],
      "prefill": "title-and-body",
      "title": "Search keywords in",
      "type": "string"
    },
    "sort": {
      "default": "hot",
      "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"
      ],
      "prefill": "new",
      "title": "Sort posts by",
      "type": "string"
    },
    "subreddits": {
      "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.",
      "title": "Subreddits",
      "type": "array"
    },
    "timeFilter": {
      "default": "day",
      "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"
      ],
      "prefill": "day",
      "title": "Time range for top / controversial",
      "type": "string"
    }
  },
  "required": [
    "subreddits"
  ],
  "schemaVersion": 1,
  "title": "Reddit Subreddit Post Filter & Moderation Scraper Input",
  "type": "object"
}
