{
  "data": {
    "id": "5xR7gMTgKlauNkvWC",
    "actId": "vHUfV4HYEI8naCh9G",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-18T04:55:35.662Z",
    "finishedAt": "2026-10-18T04:55:39.396Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 3617,
      "runTimeSecs": 3.617,
      "computeUnits": 0.004018888888888889,
      "imageSizeBytes": 318094848
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"TikTok Comment & Reply Thread Extractor Input\",\n  \"description\": \"Scrape comments and full reply threads from TikTok videos. Provide video URLs/IDs and/or profiles.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"postUrls\": {\n      \"title\": \"Video URLs\",\n      \"type\": \"array\",\n      \"description\": \"TikTok video or photo URLs to scrape comments from (e.g. https://www.tiktok.com/@user/video/123...).\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"https://www.tiktok.com/@khaby.lame/video/7574844184952081686\"\n      ]\n    },\n    \"postIds\": {\n      \"title\": \"Video IDs\",\n      \"type\": \"array\",\n      \"description\": \"Numeric TikTok video IDs (15-20 digits) as an alternative to URLs.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"profiles\": {\n      \"title\": \"Profiles (comments on their newest videos)\",\n      \"type\": \"array\",\n      \"description\": \"TikTok usernames or profile URLs. The actor scrapes comments from their newest videos, up to 'Max videos per profile'.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"maxVideosPerProfile\": {\n      \"title\": \"Max videos per profile\",\n      \"type\": \"integer\",\n      \"description\": \"How many of each profile's newest videos to scrape comments from.\",\n      \"default\": 10,\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"prefill\": 5\n    },\n    \"maxCommentsPerPost\": {\n      \"title\": \"Max comment rows per video\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of rows per video, counting replies when 'Include replies' is on. The actor walks the comment section as deep as TikTok serves it.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"prefill\": 5\n    },\n    \"includeReplies\": {\n      \"title\": \"Include replies\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch the reply thread under each root comment and emit each reply as its own row right after its parent.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"maxRepliesPerComment\": {\n      \"title\": \"Max replies per comment\",\n      \"type\": \"integer\",\n      \"description\": \"Cap the replies fetched for any single root comment. Set to 0 for all replies (still bounded by 'Max comment rows per video').\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 5000,\n      \"prefill\": 5\n    },\n    \"maxItems\": {\n      \"title\": \"Max total rows\",\n      \"type\": \"integer\",\n      \"description\": \"Global cap on the number of rows in the run (comments + replies). Set to 0 for no global cap.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"prefill\": 0\n    },\n    \"minLikes\": {\n      \"title\": \"Minimum likes\",\n      \"type\": \"integer\",\n      \"description\": \"Only keep comments and replies with at least this many likes. Comments below the threshold are skipped before their replies are fetched.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 1000000,\n      \"prefill\": 0\n    },\n    \"includeVideoMetadata\": {\n      \"title\": \"Include video metadata\",\n      \"type\": \"boolean\",\n      \"description\": \"Add a 'video' object (caption, author, view/like/comment counts) to every row.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeCommenterDetails\": {\n      \"title\": \"Include commenter details (region, bio)\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the commenter's region code and bio to user.region / user.bio, matched by comment ID from TikTok's app-style view of the page.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeCommenterStats\": {\n      \"title\": \"Include commenter follower counts\",\n      \"type\": \"boolean\",\n      \"description\": \"Add exact follower, following, heart and video counts to user.* for every commenter. Each commenter's public profile is looked up once; private or banned accounts are omitted.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxCommenterLookups\": {\n      \"title\": \"Max commenter lookups\",\n      \"type\": \"integer\",\n      \"description\": \"Cap on how many commenters are enriched when 'Include commenter follower counts' is on. Set to 0 for no cap.\",\n      \"default\": 100,\n      \"minimum\": 0,\n      \"maximum\": 10000,\n      \"prefill\": 100\n    },\n    \"deepWalk\": {\n      \"title\": \"Deep walk (higher comment coverage)\",\n      \"type\": \"boolean\",\n      \"description\": \"Read TikTok's app-style view of the comment list, which reaches far more comments on many videos, and restore image/sticker data from the standard view per comment. Off keeps the standard walk.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  },\n  \"required\": []\n}",
    "readme": "# TikTok Comment & Reply Thread Extractor\n\nPull the comment section of any public TikTok video — including the full reply thread under each comment — with no TikTok account, no cookies and no proxy setup. Every comment and reply becomes one dataset row, with its author, like count, timestamps and creator-engagement flags.\n\n## What this actor does\n\n- Accepts TikTok video URLs, numeric video IDs, and/or profile names (scrapes the newest videos of each profile)\n- Walks the comment section as deep as TikTok serves it, recovering far past the first few hundred comments on huge videos\n- Fetches the reply thread under every root comment — replies are paged past TikTok's first reply batch, not truncated\n- Emits each root comment followed immediately by its own replies, linked by `replyToCommentId` (and `replyToReplyId` for nested answers)\n- Flags pinned comments, creator-hearted comments, and translation availability\n- Captures commenter handle, display name, numeric user ID, secUid and avatar, plus image and sticker comments\n- Optionally attaches the source video's caption and stats (`includeVideoMetadata`)\n- Optionally adds each commenter's region code and bio (`includeCommenterDetails`) and exact follower/following/heart/video counts (`includeCommenterStats`)\n- `deepWalk` mode recovers far more comments on videos where TikTok's default list stops early, restoring image/sticker data from the web payload per comment ID\n- Reports videos that are deleted, private or nonexistent as \"unavailable\" instead of silently empty\n- Filters by minimum likes (`minLikes`) and caps rows per video (`maxCommentsPerPost`) or per run (`maxItems`)\n- Omits empty fields everywhere — no nulls, no placeholders\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `postUrls` | array | — | TikTok video/photo URLs to scrape comments from |\n| `postIds` | array | — | Numeric video IDs (15–20 digits), alternative to URLs |\n| `profiles` | array | — | Usernames or profile URLs — comments on their newest videos |\n| `maxVideosPerProfile` | integer | `10` | How many of each profile's newest videos to scrape |\n| `maxCommentsPerPost` | integer | – (100 if not set) | Maximum rows per video (replies included) |\n| `includeReplies` | boolean | `true` | Fetch and emit reply threads |\n| `maxRepliesPerComment` | integer | `0` | Cap replies per root comment; `0` = all |\n| `maxItems` | integer | `0` | Global row cap for the run; `0` = no cap |\n| `minLikes` | integer | `0` | Keep only comments/replies with at least this many likes |\n| `includeVideoMetadata` | boolean | `false` | Attach a `video` object (caption, author, stats) to every row |\n| `includeCommenterDetails` | boolean | `false` | Add `user.region` and `user.bio` to every row |\n| `includeCommenterStats` | boolean | `false` | Add exact `user.followerCount` / `followingCount` / `heartCount` / `videoCount` |\n| `maxCommenterLookups` | integer | `100` | Cap on how many commenters are enriched by `includeCommenterStats`; `0` = no cap |\n| `deepWalk` | boolean | `false` | Read TikTok's app-style view of the comment list (much higher coverage on many videos) and restore image/sticker fields per comment; off keeps the standard walk |\n\n### Example: comments and replies for one video\n\n```json\n{\n  \"postUrls\": [\"https://www.tiktok.com/@khaby.lame/video/7574844184952081686\"],\n  \"maxCommentsPerPost\": 500,\n  \"includeReplies\": true\n}\n```\n\n### Example: top comments only, no replies\n\n```json\n{\n  \"postUrls\": [\"https://www.tiktok.com/@natgeo/video/7640880319159094559\"],\n  \"maxCommentsPerPost\": 200,\n  \"includeReplies\": false\n}\n```\n\n### Example: comments from a profile's newest videos\n\n```json\n{\n  \"profiles\": [\"mrbeast\"],\n  \"maxVideosPerProfile\": 3,\n  \"maxCommentsPerPost\": 200,\n  \"maxItems\": 1000\n}\n```\n\n### Example: only highly-liked comments, with video metadata\n\n```json\n{\n  \"postIds\": [\"7574844184952081686\", \"7640880319159094559\"],\n  \"minLikes\": 100,\n  \"includeVideoMetadata\": true\n}\n```\n\n## Output per comment or reply\n\n- `rowType` — `comment` for top-level comments, `reply` for replies\n- `commentId` — unique TikTok comment ID\n- `postId` — ID of the video the comment belongs to\n- `postUrl` — URL of the video\n- `text` — comment text (absent on image/sticker-only comments)\n- `createTime` / `createdAt` — Unix and ISO 8601 creation time\n- `likeCount` — likes on the comment\n- `replyCount` — replies TikTok reports for this comment (comments only)\n- `isPinnedByAuthor` — pinned by the video creator\n- `isLikedByAuthor` — hearted by the video creator\n- `isReply` — true on reply rows\n- `replyToCommentId` — root comment ID (reply rows)\n- `replyToReplyId` — the reply being answered (nested replies)\n- `replyToUsername` / `replyToNickname` / `replyToUserId` — who the reply answers\n- `threadId` — TikTok's thread identifier for the reply chain\n- `language` — detected comment language\n- `isTranslatable` — TikTok offers a translation\n- `shareUrl` — share link that opens the comment\n- `user.id` / `user.secUid` / `user.username` / `user.displayName` / `user.avatarUrl` — commenter details\n- `user.verified` — present (true) when the commenter carries a verification badge\n- `user.region` / `user.bio` — commenter country/region code and profile bio (only with `includeCommenterDetails`)\n- `user.followerCount` / `user.followingCount` / `user.heartCount` / `user.videoCount` — exact commenter stats (only with `includeCommenterStats`)\n- `images` — raw image list for image comments\n- `stickers` — raw sticker data for sticker comments\n- `labels` / `textExtra` — raw TikTok annotations (mentions, hashtags, labels)\n- `video` — caption and stats of the source video (only with `includeVideoMetadata`)\n- `scrapedAt` — ISO 8601 collection time\n\n## Use cases\n\n- **Sentiment & topic analysis** — build comment corpora per video, per creator or per campaign\n- **Creator engagement audits** — pinned and creator-hearted comments surface the conversations a creator endorses\n- **Reply-thread research** — reconstruct who answered whom with `replyToCommentId` / `replyToReplyId`\n- **Brand monitoring** — sweep a profile's newest videos and catch complaints or questions early\n- **Moderation exports** — pull full threads into CSV/JSON for review tooling\n- **Academic research** — comment and reply networks with exact timestamps and stable IDs\n\n## FAQ\n\n**Do I need a TikTok account, cookies or a proxy?**\nNo. The actor reads TikTok's public comment data anonymously — no login, no cookies, no proxy setup. Pacing and retries are handled automatically.\n\n**How many comments can I get from one video?**\nAs many as TikTok serves. The actor keeps walking the comment list past the point where a basic scraper stops. With `deepWalk` it reads TikTok's app-style view of the list, which exposes far more comments on many videos (for one video: ~42 via the standard walk, 131–160 via the app view), and restores image and sticker data from the standard view for each comment. Coverage still varies by network exit and by how many comments TikTok filters (spam, deleted, region-restricted) or withholds from anonymous readers, and the count shown in the app is live and can change during a run. The actor never invents rows.\n\n**How complete are reply threads?**\nReplies are fetched per comment with their own cursor walk and capped only by your inputs. A thread with thousands of replies is collected across pages until it ends or your cap is reached.\n\n**What happens with deleted, private or comment-disabled videos?**\nDeleted, private and nonexistent videos are detected from the video page and reported as **unavailable** in the status message; videos that exist but have no (or disabled) comments are reported as empty. Either way the actor emits no rows for that video and moves on.\n\n**Can I sort or filter comments?**\nSorting and date filters are not available: TikTok returns comments in its own engagement-based ranking order and ignores sort/date parameters, so the actor offers none instead of silently dropping rows. You can trim by likes with `minLikes` — comments and replies below the threshold are left out; keyword filtering is best done in your own pipeline on the exported text.\n\n**How do I get commenter details and follower counts?**\nTwo optional toggles. `includeCommenterDetails` adds the commenter's region code and bio (`user.region`, `user.bio`). `includeCommenterStats` adds exact follower, following, heart and video counts (`user.followerCount`, …) by looking up each unique commenter's public profile once; private or banned accounts are omitted, never guessed, and `maxCommenterLookups` caps how many commenters are enriched per run.\n\n**Can comments be translated?**\nNo. TikTok's payload carries no translated text and the translation endpoint requires signed requests; the actor exports the original text plus `language` and `isTranslatable` for downstream translation.\n\n**Why do some comments have no `text`, and do media URLs expire?**\nImage-only and sticker-only comments have no text; their attachments are in `images` / `stickers`. Avatar and sticker URLs are signed TikTok CDN links that work when exported but expire after roughly a day or two — use `commentId`, `user.username`, `shareUrl` and `postUrl` as the durable keys.\n\n**Is this affiliated with TikTok?**\nNo. This is an independent, third-party actor that reads TikTok's publicly available comment data; it is not affiliated with, endorsed by, or operated by TikTok.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "tiktok-comment-and-reply-thread-extractor",
      "title": "TikTok Comment & Reply Thread Extractor",
      "description": "Pull comments and full reply threads from TikTok videos by URL, ID or profile. Includes pinned/hearted flags, reply threading, commenter details and optional video metadata. No TikTok account, cookies or proxy setup required.",
      "version": "2.0",
      "build": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# TikTok Comment & Reply Thread Extractor\n\nPull the comment section of any public TikTok video — including the full reply thread under each comment — with no TikTok account, no cookies and no proxy setup. Every comment and reply becomes one dataset row, with its author, like count, timestamps and creator-engagement flags.\n\n## What this actor does\n\n- Accepts TikTok video URLs, numeric video IDs, and/or profile names (scrapes the newest videos of each profile)\n- Walks the comment section as deep as TikTok serves it, recovering far past the first few hundred comments on huge videos\n- Fetches the reply thread under every root comment — replies are paged past TikTok's first reply batch, not truncated\n- Emits each root comment followed immediately by its own replies, linked by `replyToCommentId` (and `replyToReplyId` for nested answers)\n- Flags pinned comments, creator-hearted comments, and translation availability\n- Captures commenter handle, display name, numeric user ID, secUid and avatar, plus image and sticker comments\n- Optionally attaches the source video's caption and stats (`includeVideoMetadata`)\n- Optionally adds each commenter's region code and bio (`includeCommenterDetails`) and exact follower/following/heart/video counts (`includeCommenterStats`)\n- `deepWalk` mode recovers far more comments on videos where TikTok's default list stops early, restoring image/sticker data from the web payload per comment ID\n- Reports videos that are deleted, private or nonexistent as \"unavailable\" instead of silently empty\n- Filters by minimum likes (`minLikes`) and caps rows per video (`maxCommentsPerPost`) or per run (`maxItems`)\n- Omits empty fields everywhere — no nulls, no placeholders\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `postUrls` | array | — | TikTok video/photo URLs to scrape comments from |\n| `postIds` | array | — | Numeric video IDs (15–20 digits), alternative to URLs |\n| `profiles` | array | — | Usernames or profile URLs — comments on their newest videos |\n| `maxVideosPerProfile` | integer | `10` | How many of each profile's newest videos to scrape |\n| `maxCommentsPerPost` | integer | – (100 if not set) | Maximum rows per video (replies included) |\n| `includeReplies` | boolean | `true` | Fetch and emit reply threads |\n| `maxRepliesPerComment` | integer | `0` | Cap replies per root comment; `0` = all |\n| `maxItems` | integer | `0` | Global row cap for the run; `0` = no cap |\n| `minLikes` | integer | `0` | Keep only comments/replies with at least this many likes |\n| `includeVideoMetadata` | boolean | `false` | Attach a `video` object (caption, author, stats) to every row |\n| `includeCommenterDetails` | boolean | `false` | Add `user.region` and `user.bio` to every row |\n| `includeCommenterStats` | boolean | `false` | Add exact `user.followerCount` / `followingCount` / `heartCount` / `videoCount` |\n| `maxCommenterLookups` | integer | `100` | Cap on how many commenters are enriched by `includeCommenterStats`; `0` = no cap |\n| `deepWalk` | boolean | `false` | Read TikTok's app-style view of the comment list (much higher coverage on many videos) and restore image/sticker fields per comment; off keeps the standard walk |\n\n### Example: comments and replies for one video\n\n```json\n{\n  \"postUrls\": [\"https://www.tiktok.com/@khaby.lame/video/7574844184952081686\"],\n  \"maxCommentsPerPost\": 500,\n  \"includeReplies\": true\n}\n```\n\n### Example: top comments only, no replies\n\n```json\n{\n  \"postUrls\": [\"https://www.tiktok.com/@natgeo/video/7640880319159094559\"],\n  \"maxCommentsPerPost\": 200,\n  \"includeReplies\": false\n}\n```\n\n### Example: comments from a profile's newest videos\n\n```json\n{\n  \"profiles\": [\"mrbeast\"],\n  \"maxVideosPerProfile\": 3,\n  \"maxCommentsPerPost\": 200,\n  \"maxItems\": 1000\n}\n```\n\n### Example: only highly-liked comments, with video metadata\n\n```json\n{\n  \"postIds\": [\"7574844184952081686\", \"7640880319159094559\"],\n  \"minLikes\": 100,\n  \"includeVideoMetadata\": true\n}\n```\n\n## Output per comment or reply\n\n- `rowType` — `comment` for top-level comments, `reply` for replies\n- `commentId` — unique TikTok comment ID\n- `postId` — ID of the video the comment belongs to\n- `postUrl` — URL of the video\n- `text` — comment text (absent on image/sticker-only comments)\n- `createTime` / `createdAt` — Unix and ISO 8601 creation time\n- `likeCount` — likes on the comment\n- `replyCount` — replies TikTok reports for this comment (comments only)\n- `isPinnedByAuthor` — pinned by the video creator\n- `isLikedByAuthor` — hearted by the video creator\n- `isReply` — true on reply rows\n- `replyToCommentId` — root comment ID (reply rows)\n- `replyToReplyId` — the reply being answered (nested replies)\n- `replyToUsername` / `replyToNickname` / `replyToUserId` — who the reply answers\n- `threadId` — TikTok's thread identifier for the reply chain\n- `language` — detected comment language\n- `isTranslatable` — TikTok offers a translation\n- `shareUrl` — share link that opens the comment\n- `user.id` / `user.secUid` / `user.username` / `user.displayName` / `user.avatarUrl` — commenter details\n- `user.verified` — present (true) when the commenter carries a verification badge\n- `user.region` / `user.bio` — commenter country/region code and profile bio (only with `includeCommenterDetails`)\n- `user.followerCount` / `user.followingCount` / `user.heartCount` / `user.videoCount` — exact commenter stats (only with `includeCommenterStats`)\n- `images` — raw image list for image comments\n- `stickers` — raw sticker data for sticker comments\n- `labels` / `textExtra` — raw TikTok annotations (mentions, hashtags, labels)\n- `video` — caption and stats of the source video (only with `includeVideoMetadata`)\n- `scrapedAt` — ISO 8601 collection time\n\n## Use cases\n\n- **Sentiment & topic analysis** — build comment corpora per video, per creator or per campaign\n- **Creator engagement audits** — pinned and creator-hearted comments surface the conversations a creator endorses\n- **Reply-thread research** — reconstruct who answered whom with `replyToCommentId` / `replyToReplyId`\n- **Brand monitoring** — sweep a profile's newest videos and catch complaints or questions early\n- **Moderation exports** — pull full threads into CSV/JSON for review tooling\n- **Academic research** — comment and reply networks with exact timestamps and stable IDs\n\n## FAQ\n\n**Do I need a TikTok account, cookies or a proxy?**\nNo. The actor reads TikTok's public comment data anonymously — no login, no cookies, no proxy setup. Pacing and retries are handled automatically.\n\n**How many comments can I get from one video?**\nAs many as TikTok serves. The actor keeps walking the comment list past the point where a basic scraper stops. With `deepWalk` it reads TikTok's app-style view of the list, which exposes far more comments on many videos (for one video: ~42 via the standard walk, 131–160 via the app view), and restores image and sticker data from the standard view for each comment. Coverage still varies by network exit and by how many comments TikTok filters (spam, deleted, region-restricted) or withholds from anonymous readers, and the count shown in the app is live and can change during a run. The actor never invents rows.\n\n**How complete are reply threads?**\nReplies are fetched per comment with their own cursor walk and capped only by your inputs. A thread with thousands of replies is collected across pages until it ends or your cap is reached.\n\n**What happens with deleted, private or comment-disabled videos?**\nDeleted, private and nonexistent videos are detected from the video page and reported as **unavailable** in the status message; videos that exist but have no (or disabled) comments are reported as empty. Either way the actor emits no rows for that video and moves on.\n\n**Can I sort or filter comments?**\nSorting and date filters are not available: TikTok returns comments in its own engagement-based ranking order and ignores sort/date parameters, so the actor offers none instead of silently dropping rows. You can trim by likes with `minLikes` — comments and replies below the threshold are left out; keyword filtering is best done in your own pipeline on the exported text.\n\n**How do I get commenter details and follower counts?**\nTwo optional toggles. `includeCommenterDetails` adds the commenter's region code and bio (`user.region`, `user.bio`). `includeCommenterStats` adds exact follower, following, heart and video counts (`user.followerCount`, …) by looking up each unique commenter's public profile once; private or banned accounts are omitted, never guessed, and `maxCommenterLookups` caps how many commenters are enriched per run.\n\n**Can comments be translated?**\nNo. TikTok's payload carries no translated text and the translation endpoint requires signed requests; the actor exports the original text plus `language` and `isTranslatable` for downstream translation.\n\n**Why do some comments have no `text`, and do media URLs expire?**\nImage-only and sticker-only comments have no text; their attachments are in `images` / `stickers`. Avatar and sticker URLs are signed TikTok CDN links that work when exported but expire after roughly a day or two — use `commentId`, `user.username`, `shareUrl` and `postUrl` as the durable keys.\n\n**Is this affiliated with TikTok?**\nNo. This is an independent, third-party actor that reads TikTok's publicly available comment data; it is not affiliated with, endorsed by, or operated by TikTok.\n",
      "input": {
        "title": "TikTok Comment & Reply Thread Extractor Input",
        "description": "Scrape comments and full reply threads from TikTok videos. Provide video URLs/IDs and/or profiles.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "postUrls": {
            "title": "Video URLs",
            "type": "array",
            "description": "TikTok video or photo URLs to scrape comments from (e.g. https://www.tiktok.com/@user/video/123...).",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "prefill": [
              "https://www.tiktok.com/@khaby.lame/video/7574844184952081686"
            ]
          },
          "postIds": {
            "title": "Video IDs",
            "type": "array",
            "description": "Numeric TikTok video IDs (15-20 digits) as an alternative to URLs.",
            "editor": "stringList",
            "items": {
              "type": "string"
            }
          },
          "profiles": {
            "title": "Profiles (comments on their newest videos)",
            "type": "array",
            "description": "TikTok usernames or profile URLs. The actor scrapes comments from their newest videos, up to 'Max videos per profile'.",
            "editor": "stringList",
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerProfile": {
            "title": "Max videos per profile",
            "type": "integer",
            "description": "How many of each profile's newest videos to scrape comments from.",
            "default": 10,
            "minimum": 1,
            "maximum": 500,
            "prefill": 5
          },
          "maxCommentsPerPost": {
            "title": "Max comment rows per video",
            "type": "integer",
            "description": "Maximum number of rows per video, counting replies when 'Include replies' is on. The actor walks the comment section as deep as TikTok serves it.",
            "minimum": 1,
            "maximum": 10000,
            "prefill": 5
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Fetch the reply thread under each root comment and emit each reply as its own row right after its parent.",
            "default": true,
            "prefill": true
          },
          "maxRepliesPerComment": {
            "title": "Max replies per comment",
            "type": "integer",
            "description": "Cap the replies fetched for any single root comment. Set to 0 for all replies (still bounded by 'Max comment rows per video').",
            "default": 0,
            "minimum": 0,
            "maximum": 5000,
            "prefill": 5
          },
          "maxItems": {
            "title": "Max total rows",
            "type": "integer",
            "description": "Global cap on the number of rows in the run (comments + replies). Set to 0 for no global cap.",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000,
            "prefill": 0
          },
          "minLikes": {
            "title": "Minimum likes",
            "type": "integer",
            "description": "Only keep comments and replies with at least this many likes. Comments below the threshold are skipped before their replies are fetched.",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000,
            "prefill": 0
          },
          "includeVideoMetadata": {
            "title": "Include video metadata",
            "type": "boolean",
            "description": "Add a 'video' object (caption, author, view/like/comment counts) to every row.",
            "default": false,
            "prefill": false
          },
          "includeCommenterDetails": {
            "title": "Include commenter details (region, bio)",
            "type": "boolean",
            "description": "Add the commenter's region code and bio to user.region / user.bio, matched by comment ID from TikTok's app-style view of the page.",
            "default": false,
            "prefill": false
          },
          "includeCommenterStats": {
            "title": "Include commenter follower counts",
            "type": "boolean",
            "description": "Add exact follower, following, heart and video counts to user.* for every commenter. Each commenter's public profile is looked up once; private or banned accounts are omitted.",
            "default": false,
            "prefill": false
          },
          "maxCommenterLookups": {
            "title": "Max commenter lookups",
            "type": "integer",
            "description": "Cap on how many commenters are enriched when 'Include commenter follower counts' is on. Set to 0 for no cap.",
            "default": 100,
            "minimum": 0,
            "maximum": 10000,
            "prefill": 100
          },
          "deepWalk": {
            "title": "Deep walk (higher comment coverage)",
            "type": "boolean",
            "description": "Read TikTok's app-style view of the comment list, which reaches far more comments on many videos, and restore image/sticker data from the standard view per comment. Off keeps the standard walk.",
            "default": false,
            "prefill": false
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "TikTok Comment & Reply Thread Extractor Output",
        "type": "object",
        "description": "One record per TikTok comment or reply, with text, like/reply counts, pinned/hearted flags, reply-thread links, and commenter details.",
        "properties": {
          "commentId": {
            "title": "Comment ID",
            "type": "string",
            "description": "Unique numeric ID of the comment or reply.",
            "template": "{{commentId}}"
          },
          "postId": {
            "title": "Post ID",
            "type": "string",
            "description": "Numeric ID of the TikTok video this comment belongs to.",
            "template": "{{postId}}"
          },
          "postUrl": {
            "title": "Post URL",
            "type": "string",
            "description": "URL of the TikTok video.",
            "template": "{{postUrl}}"
          },
          "rowType": {
            "title": "Row Type",
            "type": "string",
            "description": "'comment' for top-level comments, 'reply' for replies.",
            "template": "{{rowType}}"
          },
          "text": {
            "title": "Comment Text",
            "type": "string",
            "description": "The text content of the comment or reply.",
            "template": "{{text}}"
          },
          "createdAt": {
            "title": "Created At",
            "type": "string",
            "description": "ISO 8601 timestamp when the comment was posted.",
            "template": "{{createdAt}}"
          },
          "likeCount": {
            "title": "Likes",
            "type": "string",
            "description": "Number of likes on the comment.",
            "template": "{{likeCount}}"
          },
          "replyCount": {
            "title": "Reply Count",
            "type": "string",
            "description": "Total number of direct replies to this comment.",
            "template": "{{replyCount}}"
          },
          "isPinnedByAuthor": {
            "title": "Pinned by Author",
            "type": "string",
            "description": "True if the comment is pinned by the video author.",
            "template": "{{isPinnedByAuthor}}"
          },
          "isLikedByAuthor": {
            "title": "Liked by Author",
            "type": "string",
            "description": "True if the video author has liked this comment.",
            "template": "{{isLikedByAuthor}}"
          },
          "isReply": {
            "title": "Is Reply",
            "type": "string",
            "description": "True when this row is a reply to another comment rather than a top-level comment.",
            "template": "{{isReply}}"
          },
          "replyToCommentId": {
            "title": "Reply To Comment ID",
            "type": "string",
            "description": "ID of the root comment this row replies to. Present only on reply rows.",
            "template": "{{replyToCommentId}}"
          },
          "replyToReplyId": {
            "title": "Reply To Reply ID",
            "type": "string",
            "description": "For nested replies, the ID of the reply this row answers.",
            "template": "{{replyToReplyId}}"
          },
          "replyToUsername": {
            "title": "Reply To Username",
            "type": "string",
            "description": "Handle of the comment/reply being answered (reply rows).",
            "template": "{{replyToUsername}}"
          },
          "replyToNickname": {
            "title": "Reply To Nickname",
            "type": "string",
            "description": "Display name of the comment/reply being answered (reply rows).",
            "template": "{{replyToNickname}}"
          },
          "replyToUserId": {
            "title": "Reply To User ID",
            "type": "string",
            "description": "Numeric user ID of the comment/reply being answered (reply rows).",
            "template": "{{replyToUserId}}"
          },
          "threadId": {
            "title": "Thread ID",
            "type": "string",
            "description": "ID grouping a root comment with its replies, when TikTok provides one.",
            "template": "{{threadId}}"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Detected language code of the comment (e.g. 'en', 'es'). May be absent.",
            "template": "{{language}}"
          },
          "isTranslatable": {
            "title": "Is Translatable",
            "type": "string",
            "description": "Whether TikTok offers a translation for this comment.",
            "template": "{{isTranslatable}}"
          },
          "shareUrl": {
            "title": "Share URL",
            "type": "string",
            "description": "TikTok share link that opens this comment.",
            "template": "{{shareUrl}}"
          },
          "scrapedAt": {
            "title": "Scraped At",
            "type": "string",
            "description": "ISO 8601 timestamp when the row was collected.",
            "template": "{{scrapedAt}}"
          },
          "video": {
            "title": "Video Metadata",
            "type": "string",
            "description": "Caption, author and stats of the source video (only when 'Include video metadata' is on).",
            "template": "{{video}}"
          }
        },
        "required": [
          "commentId",
          "postId",
          "createdAt",
          "likeCount",
          "replyCount",
          "isPinnedByAuthor",
          "isLikedByAuthor",
          "isReply",
          "postUrl"
        ]
      },
      "categories": [
        "SOCIAL_MEDIA"
      ],
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "TikTok Comments & Replies",
          "views": {
            "overview": {
              "title": "Comments Overview",
              "description": "TikTok comments with engagement metrics and author info.",
              "transformation": {
                "fields": [
                  "rowType",
                  "commentId",
                  "postId",
                  "text",
                  "createdAt",
                  "likeCount",
                  "replyCount",
                  "isReply",
                  "replyToCommentId",
                  "user"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "rowType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "commentId": {
                    "label": "Comment ID",
                    "format": "text"
                  },
                  "postId": {
                    "label": "Post ID",
                    "format": "text"
                  },
                  "text": {
                    "label": "Comment Text",
                    "format": "text"
                  },
                  "createdAt": {
                    "label": "Created At",
                    "format": "text"
                  },
                  "likeCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "replyCount": {
                    "label": "Replies",
                    "format": "number"
                  },
                  "isReply": {
                    "label": "Is Reply",
                    "format": "text"
                  },
                  "replyToCommentId": {
                    "label": "Reply To",
                    "format": "text"
                  },
                  "user": {
                    "label": "User",
                    "format": "text"
                  }
                }
              }
            },
            "replies": {
              "title": "Replies",
              "description": "Only reply rows, keyed by the root comment they answer.",
              "transformation": {
                "fields": [
                  "commentId",
                  "postId",
                  "replyToCommentId",
                  "replyToReplyId",
                  "replyToUsername",
                  "text",
                  "createdAt",
                  "likeCount",
                  "user",
                  "postUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "commentId": {
                    "label": "Reply ID",
                    "format": "text"
                  },
                  "postId": {
                    "label": "Post ID",
                    "format": "text"
                  },
                  "replyToCommentId": {
                    "label": "Root Comment",
                    "format": "text"
                  },
                  "replyToReplyId": {
                    "label": "Answers Reply",
                    "format": "text"
                  },
                  "replyToUsername": {
                    "label": "Answers User",
                    "format": "text"
                  },
                  "text": {
                    "label": "Text",
                    "format": "text"
                  },
                  "createdAt": {
                    "label": "Created At",
                    "format": "text"
                  },
                  "likeCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "user": {
                    "label": "User",
                    "format": "text"
                  },
                  "postUrl": {
                    "label": "Video",
                    "format": "text"
                  }
                }
              }
            },
            "withVideo": {
              "title": "With Video Metadata",
              "description": "Rows enriched with the source video's caption and stats.",
              "transformation": {
                "fields": [
                  "rowType",
                  "commentId",
                  "text",
                  "likeCount",
                  "createdAt",
                  "video",
                  "postUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "rowType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "commentId": {
                    "label": "Comment ID",
                    "format": "text"
                  },
                  "text": {
                    "label": "Comment Text",
                    "format": "text"
                  },
                  "likeCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "createdAt": {
                    "label": "Created At",
                    "format": "text"
                  },
                  "video": {
                    "label": "Video",
                    "format": "text"
                  },
                  "postUrl": {
                    "label": "Video URL",
                    "format": "text"
                  }
                }
              }
            }
          },
          "fields": {
            "commentId": {
              "type": "string",
              "title": "Comment ID",
              "description": "TikTok's unique comment ID (cid field)"
            },
            "postId": {
              "type": "string",
              "title": "Post ID",
              "description": "TikTok post/video ID this comment belongs to"
            },
            "postUrl": {
              "type": "string",
              "title": "Post URL",
              "description": "URL of the TikTok post"
            },
            "rowType": {
              "type": "string",
              "title": "Row Type",
              "description": "'comment' for top-level comments, 'reply' for replies"
            },
            "text": {
              "type": "string",
              "title": "Comment Text",
              "description": "Raw comment text content"
            },
            "createTime": {
              "type": "integer",
              "title": "Create Time (Unix)",
              "description": "Unix timestamp when the comment was posted"
            },
            "createdAt": {
              "type": "string",
              "title": "Created At",
              "description": "ISO 8601 UTC datetime when the comment was posted"
            },
            "likeCount": {
              "type": "integer",
              "title": "Like Count",
              "description": "Number of likes/diggs on this comment"
            },
            "replyCount": {
              "type": "integer",
              "title": "Reply Count",
              "description": "Total number of replies to this comment"
            },
            "isPinnedByAuthor": {
              "type": "boolean",
              "title": "Pinned By Author",
              "description": "Whether the post author pinned this comment"
            },
            "isLikedByAuthor": {
              "type": "boolean",
              "title": "Liked By Author",
              "description": "Whether the post author liked this comment (heart)"
            },
            "isTranslatable": {
              "type": "boolean",
              "title": "Is Translatable",
              "description": "Whether TikTok offers a translation for this comment"
            },
            "language": {
              "type": "string",
              "title": "Language",
              "description": "Detected language code of the comment text"
            },
            "isReply": {
              "type": "boolean",
              "title": "Is Reply",
              "description": "True if this is a reply to another comment"
            },
            "replyToCommentId": {
              "type": "string",
              "title": "Reply To Comment ID",
              "description": "ID of the root comment this row replies to (reply rows)"
            },
            "replyToReplyId": {
              "type": "string",
              "title": "Reply To Reply ID",
              "description": "For nested replies, the ID of the reply this row answers"
            },
            "replyToUsername": {
              "type": "string",
              "title": "Reply To Username",
              "description": "Handle of the comment/reply being answered"
            },
            "replyToNickname": {
              "type": "string",
              "title": "Reply To Nickname",
              "description": "Display name of the comment/reply being answered"
            },
            "replyToUserId": {
              "type": "string",
              "title": "Reply To User ID",
              "description": "Numeric user ID of the comment/reply being answered"
            },
            "threadId": {
              "type": "string",
              "title": "Thread ID",
              "description": "Thread identifier grouping root comment + all its replies"
            },
            "shareUrl": {
              "type": "string",
              "title": "Share URL",
              "description": "TikTok share link that opens this comment"
            },
            "scrapedAt": {
              "type": "string",
              "title": "Scraped At",
              "description": "ISO 8601 timestamp when the row was collected"
            },
            "user": {
              "type": "object",
              "title": "User",
              "description": "Author of the comment",
              "properties": {
                "id": {
                  "type": "string",
                  "title": "User ID"
                },
                "secUid": {
                  "type": "string",
                  "title": "Secure UID"
                },
                "username": {
                  "type": "string",
                  "title": "Username"
                },
                "displayName": {
                  "type": "string",
                  "title": "Display Name"
                },
                "avatarUrl": {
                  "type": "string",
                  "title": "Avatar URL"
                },
                "verified": {
                  "type": "boolean",
                  "title": "Verified"
                },
                "region": {
                  "type": "string",
                  "title": "Region",
                  "description": "Country/region code TikTok reports for the commenter (with 'Include commenter details')"
                },
                "bio": {
                  "type": "string",
                  "title": "Bio",
                  "description": "Commenter profile bio when set (with 'Include commenter details')"
                },
                "followerCount": {
                  "type": "integer",
                  "title": "Follower Count",
                  "description": "Commenter's exact follower count (with 'Include commenter follower counts')"
                },
                "followingCount": {
                  "type": "integer",
                  "title": "Following Count",
                  "description": "Commenter's exact following count (with 'Include commenter follower counts')"
                },
                "heartCount": {
                  "type": "integer",
                  "title": "Heart Count",
                  "description": "Total likes received by the commenter (with 'Include commenter follower counts')"
                },
                "videoCount": {
                  "type": "integer",
                  "title": "Video Count",
                  "description": "Number of public videos on the commenter's profile (with 'Include commenter follower counts')"
                }
              }
            },
            "images": {
              "type": "array",
              "title": "Images",
              "description": "Raw image_list from TikTok for comments with image attachments"
            },
            "stickers": {
              "type": "object",
              "title": "Stickers",
              "description": "Raw cmt_sticker_struct when the comment uses a sticker"
            },
            "labels": {
              "type": "array",
              "title": "Labels",
              "description": "Raw label_list entries TikTok attaches to the comment"
            },
            "textExtra": {
              "type": "array",
              "title": "Text Extra",
              "description": "Raw textExtra entries from TikTok API — contains hashtags, mentions, and other inline annotations in the comment text"
            },
            "video": {
              "type": "object",
              "title": "Video Metadata",
              "description": "Caption, author and stats of the source video (only when 'Include video metadata' is on)",
              "properties": {
                "id": {
                  "type": "string",
                  "title": "Video ID"
                },
                "desc": {
                  "type": "string",
                  "title": "Caption"
                },
                "createTime": {
                  "type": "integer",
                  "title": "Create Time (Unix)"
                },
                "createdAt": {
                  "type": "string",
                  "title": "Created At"
                },
                "authorUsername": {
                  "type": "string",
                  "title": "Author Username"
                },
                "authorNickname": {
                  "type": "string",
                  "title": "Author Nickname"
                },
                "commentCount": {
                  "type": "integer",
                  "title": "Comment Count"
                },
                "likeCount": {
                  "type": "integer",
                  "title": "Like Count"
                },
                "playCount": {
                  "type": "integer",
                  "title": "Play Count"
                },
                "shareCount": {
                  "type": "integer",
                  "title": "Share Count"
                },
                "collectCount": {
                  "type": "integer",
                  "title": "Collect Count"
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "2.0.1",
    "imageDigest": "e30651ac144c3022a1c1c344e2f71c7ca041476a5b1ea2d98b2b9fb71a2c520b",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.004018888888888889
    }
  }
}