{
  "title": "TikTok creator and video tracking",
  "description": "Start with one public creator. The Actor checks a small selection exposed by the public embed and reads each selected video page. Repeat with comparison enabled to measure observed count changes. Private, restricted and challenge-protected content is unavailable.",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "profiles": {
      "title": "Creator handles or profile URLs",
      "type": "array",
      "editor": "stringList",
      "description": "Up to 10 public creator handles (duolingo or @duolingo) or direct https://www.tiktok.com/@handle URLs. With no profiles or video URLs, the first run checks nba. Shortened URLs and query strings are not accepted.",
      "prefill": [
        "nba"
      ],
      "items": {
        "type": "string"
      }
    },
    "maxVideosPerProfile": {
      "title": "Videos per creator",
      "type": "integer",
      "editor": "number",
      "minimum": 1,
      "maximum": 10,
      "default": 3,
      "description": "Read the first 1-10 videos supplied in each creator embed. The selection can contain pinned or older videos and is not a complete or guaranteed chronological profile archive."
    },
    "videoUrls": {
      "title": "Exact video URLs (optional)",
      "type": "array",
      "editor": "stringList",
      "sectionCaption": "Advanced video watchlist",
      "sectionDescription": "Use exact public video URLs when you need the same videos checked each time.",
      "description": "Up to 30 direct https://www.tiktok.com/@handle/video/ID URLs. Added to profile selections, deduplicated by video ID. Set profiles to [] for a video-only watchlist. Photo posts and shortened/share URLs are not supported.",
      "items": {
        "type": "string"
      }
    },
    "comparePrevious": {
      "title": "Compare with previous saved observations",
      "type": "boolean",
      "editor": "checkbox",
      "default": false,
      "sectionCaption": "Changes and history",
      "sectionDescription": "History is private to your named store. Use one writer per snapshot name and scope.",
      "description": "First comparison emits new observations and establishes history only after output is saved. Later runs emit changed or unchanged rows with prior values, count deltas and observation interval. Missing videos never imply deletion."
    },
    "onlyChanges": {
      "title": "Save only new or changed observations",
      "type": "boolean",
      "editor": "checkbox",
      "default": false,
      "description": "Also enables comparison. An unchanged repeat can save zero rows successfully. Changing the selected profile/video scope or per-profile sample size creates a separate baseline."
    },
    "snapshotName": {
      "title": "History name",
      "type": "string",
      "editor": "textfield",
      "default": "default",
      "pattern": "^[-\\w]{1,80}$",
      "description": "1-80 letters, digits, underscores or hyphens. Use separate names for separate workflows. Do not run overlapping writers for the same name and scope; detected conflicts preserve the other writer."
    },
    "maxResults": {
      "title": "Maximum saved video observations",
      "type": "integer",
      "editor": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 30,
      "sectionCaption": "Run limits",
      "sectionDescription": "Start with a small sample and set a maximum charge in Apify Run options.",
      "description": "Maximum confirmed saved rows. Default creator selection is only three videos. Unchanged skipped rows do not count toward this cap. Reaching the cap leaves later observations unchecked or unsaved; consult SUMMARY."
    },
    "maxRunSeconds": {
      "title": "Maximum collection time (seconds)",
      "type": "integer",
      "editor": "number",
      "minimum": 30,
      "maximum": 900,
      "default": 240,
      "description": "Own wall-clock budget, also limited by the platform timeout with a 25-second reserve. Every source HTTP request is bounded by remaining time. Source failures and deadline stops remain visible in SUMMARY."
    }
  }
}
