{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/rumoro-dev/json-schema/rumoro-dev-filter-group-schema.json",
  "title": "FilterGroup",
  "description": "A set of conditions that must all be true. It uses the same fields as a view filter, except anyOf.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/rumoro-dev-openapi.json#/components/schemas/FilterGroup",
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Searches post text and author names."
    },
    "keywordIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "maxItems": 50,
      "description": "Keeps matches of these keywords only."
    },
    "notKeywordIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "maxItems": 50,
      "description": "Keyword ids to exclude."
    },
    "keywordKinds": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "brand",
          "competitor",
          "topic"
        ]
      },
      "maxItems": 3,
      "description": "Keyword kinds to keep, out of brand, competitor and topic."
    },
    "groupIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "maxItems": 50,
      "description": "Limits to keywords from these groups (grp_...)."
    },
    "notGroupIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "maxItems": 50,
      "description": "Hides matches from keywords that belong to these groups."
    },
    "platforms": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "bluesky",
          "hackernews",
          "github",
          "stackoverflow",
          "devto",
          "reddit",
          "x",
          "youtube",
          "news",
          "linkedin",
          "tiktok",
          "instagram",
          "appstore",
          "googleplay",
          "trustpilot",
          "googlemaps",
          "rss"
        ],
        "description": "The platform. Review platforms are appstore, googleplay, trustpilot and googlemaps (a place's Google reviews)."
      },
      "maxItems": 20,
      "description": "Keeps posts from these platforms only."
    },
    "notPlatforms": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "bluesky",
          "hackernews",
          "github",
          "stackoverflow",
          "devto",
          "reddit",
          "x",
          "youtube",
          "news",
          "linkedin",
          "tiktok",
          "instagram",
          "appstore",
          "googleplay",
          "trustpilot",
          "googlemaps",
          "rss"
        ],
        "description": "The platform. Review platforms are appstore, googleplay, trustpilot and googlemaps (a place's Google reviews)."
      },
      "maxItems": 20,
      "description": "Platforms to exclude."
    },
    "status": {
      "type": "string",
      "enum": [
        "open",
        "ignored",
        "done"
      ],
      "description": "Keeps mentions with this status only (open, ignored or done)."
    },
    "relevant": {
      "type": "boolean",
      "description": "Filter on the classifier's verdict. true keeps relevant mentions, false the rest."
    },
    "minRelevance": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100,
      "description": "Minimum relevance score a mention needs."
    },
    "minConfidence": {
      "type": "number",
      "minimum": 0,
      "maximum": 1,
      "description": "Keeps mentions whose classifier confidence is this value or higher."
    },
    "sentiments": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "positive",
          "neutral",
          "negative"
        ],
        "description": "The sentiment the classifier assigned."
      },
      "maxItems": 3,
      "description": "Keeps mentions with these sentiments only."
    },
    "notSentiments": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "positive",
          "neutral",
          "negative"
        ],
        "description": "The sentiment the classifier assigned."
      },
      "maxItems": 3,
      "description": "Hides these sentiments. Unscored mentions stay."
    },
    "intents": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 40
      },
      "maxItems": 20,
      "description": "Keeps mentions tagged with one of these intents or topics."
    },
    "notIntents": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 40
      },
      "maxItems": 20,
      "description": "Hides mentions with these tags."
    },
    "automated": {
      "type": "boolean",
      "description": "true keeps posts that look machine-made. false keeps the others."
    },
    "languages": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[a-z]{2}$"
      },
      "maxItems": 20,
      "description": "Keeps posts in these languages only, as ISO 639-1 codes."
    },
    "notLanguages": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[a-z]{2}$"
      },
      "maxItems": 20,
      "description": "Leaves out posts in these languages. Posts with an unknown language are kept."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 40
      },
      "maxItems": 20,
      "description": "Keeps authors your workspace gave one of these tags."
    },
    "notTags": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 40
      },
      "maxItems": 20,
      "description": "Leaves out authors with one of these tags."
    },
    "linkHosts": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "maxItems": 20,
      "description": "Keeps posts that link to one of these hosts or its subdomains."
    },
    "notLinkHosts": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "maxItems": 20,
      "description": "Leaves out posts that link to these hosts."
    },
    "minFollowers": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps authors with this many followers or more. Unknown counts are left out."
    },
    "maxFollowers": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps authors with this many followers or fewer. Unknown counts are left out."
    },
    "isReply": {
      "type": "boolean",
      "description": "true keeps replies and comments. false keeps posts that are not replies."
    },
    "kind": {
      "type": "string",
      "enum": [
        "post",
        "comment",
        "repository"
      ],
      "description": "Only posts (post) or only comments (comment: replies, comments and answers). repository (GitHub repository events) is accepted and matches nothing, since Rumoro does not collect them. Omitted: all."
    },
    "excludeAuthors": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "maxItems": 200,
      "description": "Leaves out these authors, given as display names, handles or profile links."
    },
    "ratings": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1,
        "maximum": 5
      },
      "maxItems": 5,
      "description": "Keeps reviews with one of these star ratings. Posts that are not reviews are left out."
    },
    "notRatings": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1,
        "maximum": 5
      },
      "maxItems": 5,
      "description": "Hides reviews with these star ratings. Other posts are not affected."
    },
    "minLikes": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps posts with this many likes (upvotes, reactions) or more, counted when the post was collected. Posts without a like count are left out."
    },
    "minReposts": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps posts with this many reposts (shares, retweets) or more, counted when the post was collected. Posts without a repost count are left out."
    },
    "minReplies": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps posts with this many replies (comments) or more, counted when the post was collected. Posts without a reply count are left out."
    },
    "minQuotes": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps posts with this many quotes or more, counted when the post was collected. Posts without a quote count are left out."
    },
    "minViews": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps posts with this many views (plays) or more, counted when the post was collected. Posts without a view count are left out."
    },
    "minBookmarks": {
      "type": "integer",
      "minimum": 0,
      "description": "Keeps posts with this many bookmarks (saves) or more, counted when the post was collected. Posts without a bookmark count are left out."
    }
  },
  "additionalProperties": false
}