{
  "title": "Public UpScrolled watchlist",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "profiles": {
      "title": "Public creator handles or profile URLs",
      "type": "array",
      "editor": "stringList",
      "default": [],
      "prefill": [
        "UpScrolled",
        "Support"
      ],
      "description": "Up to 50 handles (e.g. UpScrolled) or exact https://upscrolled.com/@handle URLs. No private profiles. If both target lists are empty, observe official UpScrolled and Support profiles.",
      "sectionCaption": "1 · Public watchlist",
      "sectionDescription": "Supply creator profiles or exact post pages, then add optional literal text filters."
    },
    "postUrls": {
      "title": "Exact public post URLs",
      "type": "array",
      "editor": "stringList",
      "default": [],
      "description": "Up to 50 exact https://upscrolled.com/@handle/post-uuid URLs. This Actor reads requested pages, not profile timelines or global search."
    },
    "keywords": {
      "title": "Literal text filters",
      "type": "array",
      "editor": "stringList",
      "default": [],
      "description": "Up to 30 case-insensitive OR substrings in handle, display name and public bio/caption. Match evidence is included. Empty includes every supplied valid public target."
    },
    "maxResults": {
      "title": "Maximum saved observations",
      "type": "integer",
      "default": 20,
      "prefill": 20,
      "minimum": 1,
      "maximum": 1000,
      "description": "Cap saved profile/post observations, up to 1000; there are at most 100 requested targets. Unchanged skipped observations do not consume the saved-row cap.",
      "sectionCaption": "2 · Saved result limit",
      "sectionDescription": "One row represents one observed public profile or post."
    },
    "comparePrevious": {
      "title": "Compare with saved observations",
      "type": "boolean",
      "default": false,
      "description": "Save confirmed observations in named history; repeated runs can detect counter, bio or caption changes. First run establishes a baseline. Use one writer per snapshot scope.",
      "sectionCaption": "3 · Saved comparisons",
      "sectionDescription": "The first comparison establishes history. Reuse the same scope for later observations and avoid concurrent writers."
    },
    "onlyChanges": {
      "title": "Only new or changed observations",
      "type": "boolean",
      "default": false,
      "description": "Enable comparison and skip unchanged observations. A repeat can legitimately return no rows; the first run returns its baseline."
    },
    "snapshotName": {
      "title": "History namespace",
      "type": "string",
      "editor": "textfield",
      "default": "default",
      "description": "1–80 letters, digits, underscores or hyphens. Use a new name to reset history. Different filters create different scopes. Only confirmed saved rows advance history."
    },
    "maxRunSeconds": {
      "title": "Run budget in seconds",
      "type": "integer",
      "minimum": 30,
      "maximum": 3600,
      "default": 240,
      "description": "Own wall-clock budget, also capped by the platform deadline minus 25 seconds. Source requests, retries, output and history obey the budget.",
      "sectionCaption": "4 · Advanced run settings",
      "sectionDescription": "Adjust the time budget only when a larger collection needs it."
    }
  },
  "description": "Supply explicit public profiles or exact post URLs, add optional literal filters and compare saved observations when needed. This is a watchlist, not whole-network discovery or private-content access."
}
