Scrape TikTok video comments AND their threaded replies in one Actor. Get text, like counts, reply counts, commenter handles, timestamps. Built for sentiment analysis, customer voice research, brand monitoring, and creator engagement audits. No login, no API key.
All notable changes to this Actor are documented here.
Dates use ISO 8601 (YYYY-MM-DD). This project follows Semantic Versioning:
MAJOR.MINOR.PATCH where MINOR bumps ship additive, backwards-compatible changes.
[1.3.5] - 2026-08-14
Changed
max_comment_pages prefill bumped from 3 to 15. First-time interactive users now see a more useful starting value (~300-750 comments) instead of a bare-minimum 3-batch sample. QA is still safe: 15 batches on the prefilled video finishes in ~60 seconds, well under the 5-minute cap. default stays 0 so API users omitting the field get the original unlimited behavior.
Notes
Input-schema-only. No code, no output shape, no billing changes.
[1.3.4] - 2026-08-14
Fixed
Apify QA "Under maintenance" flag. v1.2.4 removed the prefill URL from video_urls because the previous one was dead - that made first-time users see a 0-row demo. Side effect: Apify's automated QA runs the Actor daily with whatever's in the prefill, got "No TikTok video URLs provided", failed three days in a row, and flagged the Actor. Restored a prefill (lycomps2/video/7665012083515378947, verified live with 400+ comments) plus a default value so both the UI prefill AND API calls that omit the field work.
QA runtime safety.max_comment_pages prefill dropped from 0 (unlimited) to 3. Keeps automated QA under the 5-minute cap even if the prefilled video ever grows to viral levels. The default stays 0 so API users who omit the field get the original unlimited behavior.
Notes
Input-schema-only. No code, no output shape, no billing changes.
If the prefill URL ever goes dead again, QA fails again - swap it for another live video URL. This is a recurring maintenance item.
[1.3.3] - 2026-08-11
Changed
date_from and date_to inputs now render as date pickers in Apify's UI instead of free-text fields. Users click a calendar instead of typing a YYYY-MM-DD string. Behavior is identical - the underlying value is still the same ISO date string, parsed by the same parseDateInput helper.
Notes
Input-schema-only. No code, no output shape, no billing changes. If Apify's schema validator rejects editor: "datepicker" on the build, we'll fall back to textfield with a pattern regex.
[1.3.2] - 2026-08-11
Changed
translation_target_language dropdown expanded from 20 to 50 languages. New additions cover major South Asian, Southeast Asian, African, and Eastern European languages: Afrikaans, Bengali, Bulgarian, Burmese, Croatian, Czech, Danish, Filipino / Tagalog, Finnish, Greek, Gujarati, Hungarian, Kannada, Khmer, Malay, Malayalam, Marathi, Nepali, Norwegian, Persian / Farsi, Punjabi, Romanian, Serbian, Sinhala, Slovak, Swahili, Tamil, Telugu, Ukrainian, Urdu.
List is now alphabetized by language name for easier scanning.
Default stays en (English). Existing runs that had a language explicitly set are unaffected.
Notes
Input-schema-only release. No code, no output shape, no billing changes.
[1.3.1] - 2026-08-11
Changed
translation_target_language input is now a dropdown (20 languages) instead of a free-text field. No more typos, no more guessing the right ISO code. Options: English, Spanish, French, German, Italian, Portuguese, Russian, Japanese, Chinese, Korean, Arabic, Hindi, Indonesian, Turkish, Vietnamese, Thai, Dutch, Polish, Swedish, Hebrew.
Default stays en (English). Existing runs that had en explicitly set are unaffected.
Notes
Doc-only / input-schema-only release. No code, no output shape, no billing changes.
[1.3.0] - 2026-08-11
Added
Translation (enable_translation + translation_target_language). Adds translated_text to every comment and reply row. Batched together with sentiment / intent / bot detection in a single LLM call, so if any other row-level enrichment is also on, translation is essentially free at the LLM level and does not multiply the enriched-comment event count. Default target language is en.
Bot / spam detection (enable_bot_detection). Adds is_bot_likely (boolean) + bot_confidence (0-1) to every row. Same batched-with-classifier approach as translation.
Date range filter (date_from, date_to). ISO date strings (YYYY-MM-DD). Filters comments client-side after upstream fetch, before any LLM classification or dataset write - so filtered-out rows never incur enrichment cost. Upstream credits are still consumed for filtered-out rows; noted in the input description.
Exclude pinned (exclude_pinned). Drops the video creator's pinned comment(s) from output. Uses TikTok's author_pin flag. Client-side, same cost behavior as date filters.
Dataset field declarations for translated_text, is_bot_likely, bot_confidence.
Changed
enriched-comment billable event scope broadened. Previously fired for sentiment / intent only. Now fires for any row-level LLM enrichment (sentiment, intent, translation, and/or bot detection). Because all four are computed in one shared LLM call per batch, the event count per row is unchanged when combining flags - a row with all four enrichments still fires exactly one enriched-comment event.
Notes
No change to result or video-summary billing.
No change to dataset row shape when all new flags are off - existing paying users see byte-for-byte identical output.
Input validation: date_from after date_to fails fast at run start with a clear error.
[1.2.4] - 2026-08-11
Changed
Actor title:TikTok Comments & Replies Scraper - Full Threads with Authors (No Login) -> TikTok Comments Scraper API - Replies, Handles, No Login. Leads with the primary search keyword ("TikTok Comments Scraper API") for better SEO ranking. Character count drops from 73 to 57.
Actor description: rewritten to surface the v1.2 AI enrichment tier alongside the base scrape, and to lead with the "no cookies, no login" differentiator.
Category: added SOCIAL_MEDIA alongside existing MARKETING_AUTOMATION and BUSINESS.
README top-of-page: restructured to lead with H2-per-question sections (What does this return? / How many comments? / Reply threads? / Bulk URLs? / CSV export? / TikTok API? / Login? / Sentiment? / Cost? / Limitations / Comparison). Preserves every existing legal / ToS block verbatim.
README FAQ: trimmed - operational questions moved up into the H2 section; legal / edge-case Qs stay in FAQ verbatim.
README H1: updated to match the new Actor title.
input_schema.json: removed the dead prefill / default URL (was pointing at a video that returned 0 comments). New users now paste their own URL - clearer error than a 0-row demo.
Notes
No code behavior change. No schema change to output. Existing paying users see the same billable events, same fields, same output shape.
Rebuild the Actor on Apify to pick up the new title, description, category, and keywords.
[1.2.3] - 2026-08-11
Added
New "Clean" dataset view, defined first so Apify's dataset viewer opens on it by default. Shows only the columns most users actually read: Handle, Comment, Sentiment, Score, Intent, Likes, Replies, Created, Pinned, Buyer intent, Lang, Type. Everything else stays available in the other views.
Notes
Dataset-schema-only release. No code changes, no input changes, no field changes, no billing changes. The underlying dataset shape is byte-for-byte identical to v1.2.2.
[1.2.2] - 2026-08-11
Documentation
README: added a "Typical bill" table to the LLM enrichment tier section with concrete dollar amounts for realistic runs (100 / 500 / 1,000 comments across all four enrichment permutations). Preempts sticker-shock questions about the $2,000 / 1,000 display Apify renders for the flat-priced video-summary event.
README: enable_audience_summary input row now explicitly notes that the pricing is $2 per video summary (not $2,000 per run), so first-time users looking at the pricing panel don't panic.
Notes
Doc-only release. No code changes, no schema changes, no behavior changes. Runs cost the same as v1.2.1.
[1.2.1] - 2026-08-11
Changed
Anthropic API key is now provided by the end user via a new anthropic_api_key input field (marked as a secret), not by the Actor developer via an environment variable. The end user brings their own Anthropic account; Anthropic charges them directly for the tokens used. This Actor's enriched-comment and video-summary billable events cover the pipeline, batching, and result curation - not the raw LLM cost.
Fail-fast error message updated to point users at the input field instead of an env var.
Env var ANTHROPIC_API_KEY still works as a fallback (useful for local dev testing), but the input field takes precedence.
Notes
No behavior change for runs that leave the LLM flags off. Still no LLM cost, still bills only the results event.
[1.2.0] - 2026-08-11
Added
LLM enrichment tier. Three new opt-in input flags that route runs through Claude Haiku for per-row classification and per-video summarization. All default false so runs without these flags remain byte-for-byte unchanged and stay on the existing results billable event.
enable_sentiment -> adds sentiment_score (-1 to 1) + sentiment_label (positive/neutral/negative) to every comment and reply row.
enable_intent_classification -> adds intent (question/complaint/praise/spam/purchase_intent/mention/other) to every row. Batched together with sentiment when both are on, so one LLM call handles both.
enable_audience_summary -> writes one video_summary row per processed video with themes[], top_questions[], sentiment_breakdown (positive/neutral/negative counts), and buyer_intent_count. Uses the top 200 comments by likes to control cost on huge videos.
New row type video_summary and two new dataset views: enriched (comment + sentiment + intent) and video_summaries (per-video rows only).
New billable events emitted via Actor.charge: enriched-comment (one per row that received sentiment/intent) and video-summary (one per summary written). Both must be configured in the Apify Console pricing model; if the event is missing, the run continues without charging and logs a warning.
Required for the LLM tier
ANTHROPIC_API_KEY env var set as an Apify Secret on the Actor. If any of the three LLM flags is on but the key is missing, the run fails fast with a clear message.
Notes
The classifier is batched in groups of 50 rows per Anthropic call to keep cost low. Failed batches log a warning and continue - rows still push without enrichment rather than failing the run.
Summaries cap input at 200 comments (top-liked). Even mega-viral videos incur one small LLM call.
Existing paying users on the results event are grandfathered - they do not touch the LLM code path or the new events.
Apify Console follow-up
Configure the two new billable events (enriched-comment at $10/1k, video-summary at $2/summary suggested) in the Actor's pricing model. Rebuild the Actor so the new schema takes effect.
[1.1.0] - 2026-08-11
Added
Opt-in enrichment fields, all sourced free from the two existing upstream calls. Every flag defaults to false so existing runs are byte-for-byte unchanged.
include_video_metadata -> adds video_id, video_url, is_pinned (from author_pin), is_author_liked (from is_author_digged), language (from comment_language), share_url, sort_tags (parsed JSON), is_translatable, plus is_high_purchase_intent, reply_to_reply_id, thread_id on reply rows.
include_parsed_text -> adds mentions[] and hashtags[] parsed from the comment text_extra structure.
include_algorithm_scores -> adds algorithm_score.reply_score + algorithm_score.show_more_score (TikTok's own ranking numbers).
include_experimental_fields -> adds user.predicted_age_group. Raw string, value mapping not published by TikTok, gated behind its own flag because of minor-protection sensitivity.
New dataset view authors that leads with author-focused columns (best when include_author_details is on).
Field declarations for every new field added to .actor/dataset_schema.json so all views render them correctly.
Notes
No behavior change for runs that leave the new flags off: same input keys, same output shape, same pricing event, same billable count.
No extra upstream credits and no LLM cost per row for these fields; they were already in the raw payload we receive.
Existing paying users are grandfathered: their runs bill exactly as before under the results event at $4.00 per 1,000.
[1.0.x] - through 2026-08-10
Prior changes shipped incrementally on the 1.0 line. Highlights:
Raised the max_comment_pages and max_reply_pages_per_comment safety caps to 50000 batches (roughly 1M-2.5M comments/replies per video). 0 = unlimited on both.
Replaced silent input clamping with clear runtime errors that explain the cap, offer the 0 = unlimited escape hatch, and state the cap is a mis-typed-run protection, not a technical limit.
Reworked all input UX: renamed to human-friendly wording, moved the "0 = ..." hint into each field title, grouped reply-related settings under a "Reply threads (optional)" section, dropped API jargon (pages -> batches) with an inline definition.
Merged video_urls + comment_ids_to_expand into a single video_urls list that accepts either bare URLs or URL::commentId pairs (URL::CID skips the top-level scrape for that video and fetches only the specified reply thread).
Set default and prefill of all limit inputs to 0 (= everything).
Updated pricing from $5.00 to $4.00 per 1,000 results.
Hardened all user-visible surfaces (logs, dataset error rows, status messages, KV records) against leaking the upstream API key or credit status. Error messages route through a sanitizer that drops raw HTTP status and replaces credit / billing / auth language with a generic 'Upstream rejected the request' message.
Added SEO-optimized README additions: primary keyword in hook, ## Demo video section (scheduling + integrations embeds), 8 FAQ entries covering pricing, API, CSV export, bulk URLs, GitHub / Python usage, and by-user search. All additive - every existing legal / ToS block preserved verbatim.
Added .actor/output_schema.json pointing at the dataset overview view + the SUMMARY KV record.
Added .actor/dataset_schema.json with 4 views (overview, top_level_comments, replies, errors).
Added .actor/key_value_store_schema.json grouping keys into user-facing (OUTPUT, SUMMARY, ERRORS) vs internal (STATE, INPUT) collections.
Added .actor/web_server_openapi.json documenting the live-view HTTP API (/health, /progress, /cap, /summary).
[1.0.0] - initial
Initial publication. TypeScript Actor. Wraps the two Scrape Creators TikTok comment endpoints. Bulk video_urls input with sequential, isolated per-URL error handling. Free-plan cap at 50 dataset items with a graceful SUCCEEDED exit.