# Changelog of TikTok Comments Scraper API - Replies, Handles, No Login ✅ (`unseenuser/tiktok-comments-replies-scraper`) Actor

- **URL**: https://apify.com/unseenuser/tiktok-comments-replies-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/unseenuser/tiktok-comments-replies-scraper.md

## Changelog

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`.
- **Keywords:** extended with `tiktok comments api`, `tiktok comment threads`, `tiktok sentiment analysis`, `tiktok comment export`.
- **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_author_details` -> adds `user.verified` (bool), `user.verify_reason` (string, combined from `custom_verify` + `enterprise_verify_reason`), `user.sec_uid`.
  - `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.
