# TikTok Video & Comments Scraper (`peerless_columbine/tiktok-video-scraper-independent`) Actor

Extract public TikTok video metadata, comments and replies. Optional downloads, speech transcription and experimental AI captions. Bounded profile samples; source limitations are reported.

- **URL**: https://apify.com/peerless_columbine/tiktok-video-scraper-independent.md
- **Developed by:** [tingyou333 zhuang](https://apify.com/peerless_columbine) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 2 monthly users, 61.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Video & Comments Scraper

Extract public TikTok video metadata, comments and replies without an account login. Optional source media downloads, CPU speech transcription and **experimental** AI captions are available. Source failures and incomplete coverage are reported in `SUMMARY`.

### Quick start

```json
{
  "postURLs": ["https://www.tiktok.com/@apifylife/video/7200360993149553925"],
  "hashtags": [],
  "profiles": [],
  "searchQueries": [],
  "resultsPerPage": 1,
  "commentsPerPost": 5,
  "maxRepliesPerComment": 0,
  "maxRunSeconds": 100
}
```

The input form starts with one public video and up to five top-level comments. Discovery inputs are empty and media/AI are off. This is a small real-source sample; source availability can still change. The runtime comment default remains zero when the API input omits `commentsPerPost`.

Run with 256 MB for metadata/comments. Export the Dataset as JSON, CSV or Excel, or access it through the Apify API. The main Dataset contains video rows by default: video ID/link, author, text, timestamps, engagement counts, source media links and requested comments. Missing optional source fields remain null. For media, links point to files stored in the run's Key-value store and follow Apify retention rules.

Canonical TikTok video/photo URLs and decimal video IDs are supported. Public short links are accepted only if they resolve to a real post; their availability is not guaranteed. Duplicate video IDs are collected once. Up to 100 direct post inputs per run; `resultsPerPage` caps discovery results, not supplied post URLs.

### Comments and replies

- `commentsPerPost=0` (default) collects videos without comments.
- A positive `commentsPerPost` caps **all returned comments including replies** for each video.
- `topLevelCommentsPerPost` optionally adds a cap on root comments. `maxRepliesPerComment=0` disables reply traversal.
- `commentsOnly=true` returns flat comment/reply rows in the main Dataset and incurs comment fees only. Media and AI options must be off.
- `commentsOutputMode="nested"` (default) embeds comment rows in the video row. Both the video and each comment/reply are charged.
- `commentsOutputMode="separate"` stores comments in a per-video Dataset linked by `commentsDatasetUrl`. Both the video and each comment/reply are charged once.

Comments include source text, time, likes and author; replies retain immediate parent and root-thread IDs. A satisfied capped request does **not** mean every comment was collected. Availability, pagination and completeness are recorded in `commentCoverage` and `SUMMARY`. Full comment enumeration and detailed optional mention semantics are not guaranteed.

### Pricing

No subscription rental or Actor start fee. Error/informational rows carry no result fee. **Platform computation, storage and transfer used by this Actor are included in the event rates**; separate account-level Apify plan services and storage retention policies still apply. Fees are charged after results are saved and accessible. Unavailable add-ons are not charged.

The following USD prices are per 1,000 events. Transcription uses **started minutes per video**; AI uses **started seconds of decoded video per enabled feature**. Two enabled AI features each incur their own second rate. Speech used internally by AI is not charged as a separate transcription unless the explicit transcription output is requested and delivered. Covers, avatars, native subtitle and slideshow image downloads have no separate add-on fee.

| Delivered event | Free | Starter/Bronze | Scale/Silver | Business/Gold | Platinum | Diamond |
|---|---:|---:|---:|---:|---:|---:|
| Video | $1.5 | $1 | $0.75 | $0.5 | $0.5 | $0.5 |
| Comment or reply | $0.625 | $0.5 | $0.375 | $0.25 | $0.25 | $0.25 |
| Add-on: video download | $0.65 | $0.5 | $0.4 | $0.3 | $0.3 | $0.3 |
| Add-on: transcript started minute | $24 | $20.5 | $17 | $13.5 | $13.5 | $13.5 |
| Experimental AI description second | $0.65 | $0.5 | $0.4 | $0.3 | $0.3 | $0.3 |
| Experimental extractive AI summary second | $0.65 | $0.5 | $0.4 | $0.3 | $0.3 | $0.3 |

For **Free, Starter/Bronze, Scale/Silver and Business/Gold**, these event rates are **50% of matched Clockworks rates checked on October 2, 2026**, at the same plan tier: [video/download/transcription](https://apify.com/clockworks/tiktok-video-scraper/pricing), [comments](https://apify.com/clockworks/tiktok-comments-scraper/pricing), and [AI add-ons](https://apify.com/clockworks/tiktok-scraper/pricing). Apify normalized the submitted Platinum and Diamond prices to our Business/Gold rates; those two tiers are **not** a 50% discount versus the competitor. The table shows actual effective rates. This compares event prices, not completeness or AI quality. Rounding duration to started seconds can differ from another Actor's duration measurement. See the Pricing tab for effective rates.

Example on the Free plan: one video plus 10 comments costs $0.0015 + 10 × $0.000625 = **$0.00775**, without downloads/transcription/AI. Comments-only output of 10 comments costs **$0.00625**.

Set a maximum charge per run in Apify. The Actor checks combined video, comment and add-on cost before saving a batch; if the remaining budget cannot cover it, that batch is not emitted and collection stops with diagnostics. Keep initial runs small. Partial real rows can be chargeable when `allowPartialResults=true`; their coverage flags show incompleteness.

### Bounded profile sample

```json
{
  "postURLs": [],
  "profiles": ["apifylife"],
  "profileDiscoveryMode": "public-recent-sample",
  "profileSorting": "latest",
  "resultsPerPage": 1,
  "commentsPerPost": 1,
  "maxRunSeconds": 180
}
```

This mode reads TikTok's public creator embed and chooses up to ten posts **within the observed selection**. It does not enumerate full profile history: `fullProfileEnumerated=false` and `paginationComplete=false`. It cannot establish globally newest posts or use full-history date, likes or pin filters. Set `postURLs=[]` for discovery-only runs, because Apify can insert the default direct post otherwise.

Full-profile enumeration, search, hashtags and related discovery are not currently reliable live sources; their inputs may fail with explicit diagnostics. Stories, reposts, followers/following and related-search words are unsupported. Do not choose this Actor if those features or exhaustive history are required.

### Scraping exit country

Set `proxyCountryCode="US"` for a US network exit, `"GB"` for the UK, or another two-letter country in the input selector. Omit `proxyConfiguration` to automatically use Apify RESIDENTIAL when a country is selected. `proxyCountryCode="None"` with no explicit proxy configuration preserves the existing direct path. A country in the selector is a requested location, not a claim that an authorized live exit exists there.

```json
{
  "postURLs": ["https://www.tiktok.com/@pinkster_dancer/video/7687675803689094413"],
  "proxyCountryCode": "US",
  "commentsOnly": true,
  "commentsPerPost": 40,
  "topLevelCommentsPerPost": 40,
  "commentPageSize": 20,
  "maxRepliesPerComment": 0,
  "maxConcurrency": 1,
  "maxRetries": 0,
  "maxRequests": 4,
  "maxRunSeconds": 180
}
```

For an authorized ordinary datacenter group, explicitly pass `proxyConfiguration={"useApifyProxy":true,"apifyProxyGroups":["YOUR_AUTHORIZED_GROUP"],"apifyProxyCountry":"US"}` with the same `proxyCountryCode`. For UK research, change both country settings to `GB`, or omit the advanced configuration and set only `proxyCountryCode="GB"`. Custom proxy URLs, SERP, Unblocker, conflicting country settings, and an explicitly disabled proxy with a requested country are rejected.

One randomly generated session is reused throughout each run: video discovery, share-link resolution, video/profile details, root comments, replies and all requested TikTok media, including media fetched for transcription/AI. It is not printed or stored in diagnostics. There is no direct, other-country or new-session fallback. Public model weights and Apify storage/API calls are infrastructure operations and do not use this TikTok-source proxy.

The Actor probes the fixed [Apify browser-info endpoint](https://docs.apify.com/api/v2/tools-browser-info-get) through that same proxy session before collection and before every source/media request. `SUMMARY.network.exitChecks` records observed exit IP/country and verification results, and each proxied source request references its check. Missing or mismatched geolocation stops collection. These checks observe the session immediately before each request; residential sessions can lose their IP, and the source site may use a different geolocation database. They are not proof of the destination site's internal geolocation decision.

**Exit country is not a content-country filter.** It cannot force all videos to originate in that country, prove an author's nationality, or locate a commenter. Content ranking may vary by source route. No account cookies, signature generation or challenge solving are added. Country selection does not remove access restrictions. Missing permissions, unavailable country exits or failed verification return explicit `PROXY_*` diagnostics; access-denied/challenge routes stop as before. Country mode requires SDK/cloud execution, not the credential-free `--input` local runner.

Proxy traffic is not free: [Apify residential proxies](https://docs.apify.com/proxy/residential-proxy) are metered by traffic, including large media transfers, and exit probes add a small amount of traffic. Under this Actor's current PPE configuration, consumers pay the published result/add-on events, with no new country/proxy event and no separate platform-usage charge for this run. Authors bear the actual paid-plan platform/proxy costs under [Apify PPE cost rules](https://docs.apify.com/actors/publishing/monetize/pay-per-event); this can reduce or exceed the event revenue. Owner validation is an expense, not customer revenue. Independent account services remain subject to their own billing. A consumer's maximum event charge is not an author's proxy-traffic budget. Use small `maxRequests`, `maxMediaBytes`, run deadlines and disabled media/AI for initial regional research; failed source requests can consume traffic despite producing no paid results.

### Optional downloads and transcription

Enable `shouldDownloadVideos`, `shouldDownloadCovers`, `shouldDownloadAvatars`, `shouldDownloadMusicCovers` or `shouldDownloadSlideshowImages` as needed. Actual accessible source files are saved and linked; expired or denied CDN links are reported. `downloadSubtitlesOptions="DOWNLOAD_SUBTITLES"` downloads source-provided VTT/SRT where available.

For CPU speech-to-text, use `downloadSubtitlesOptions="TRANSCRIBE_ALL_VIDEOS"` or `"DOWNLOAD_AND_TRANSCRIBE_VIDEOS_WITHOUT_SUBTITLES"`. Set cloud memory to **1024 MB** and allow model download time (`maxRunSeconds=300` is a starting point). Tiny/base speech models run locally inside the Actor; no paid inference account/key is needed. Accuracy depends on language, music, noise and source media.

### Experimental AI analysis

```json
{
  "postURLs": ["7200360993149553925"],
  "aiVideoDescription": true,
  "aiVideoSummary": true,
  "maxRunSeconds": 450
}
```

Set cloud memory to **2048 MB** and run timeout to at least 480 seconds. First use downloads public model weights. Default frame sampling scans the video and samples every second plus detected cuts, first and last frame; ceilings fail explicitly rather than silently dropping frames. `visualFrameCount>0` opts into a fixed smaller frame sample.

Descriptions are timestamped visual captions under `videoMeta.aiVideoDescription`. The summary under `videoMeta.aiVideoSummary` extracts representative captions and recognized speech; it is not a freely generated narrative. `aiAnalysisEvidence` retains sampling/model details and `fullSceneCoverage=false`, `accuracyBenchmarked=false`. Captions may misidentify objects/actions and summaries may omit salient content. Environmental sounds and slideshow AI analysis are unsupported. Treat all AI output as experimental, not verified source facts.

A bounded 22-second test completed at 2 GB; longer videos, scale and cross-region reliability have not been qualified. Video, model and CDN access can change. Strict mode fails incomplete requests; `allowPartialResults=true` can retain real rows with explicit incomplete coverage.

### Failures and limits

`emitErrorRows=true` emits `recordType="error"` records without result fees. Details and source/page coverage remain in `SUMMARY`; failure-only runs are marked FAILED. HTTP 200 with no usable data is a failure, not a successful empty result. No account cookies, request signing or challenge/CAPTCHA solving are used.

Default safety limits are 50 source requests, 100 seconds and 10 MB per media file; AI/transcription need longer explicit time budgets. Source access varies with time and region. This initial public release has bounded video/comment/media evidence, **not complete competitor parity or a reliability guarantee**. Apify automatic Store checks have not yet been observed.

# Actor input Schema

## `postURLs` (type: `array`):

Canonical video/photo URLs, public vm/vt or /t/ share links, or decimal video IDs. Empty is allowed with another discovery input.

## `scrapeRelatedVideos` (type: `boolean`):

Request the ordinary public related-video list for each direct video. Empty or blocked source responses fail explicitly.

## `resultsPerPage` (type: `integer`):

Per-discovery-input output cap. Direct input URLs are not truncated. Global profile sorting requires a complete verified source list.

## `shouldDownloadVideos` (type: `boolean`):

Store each accessible video file in KVS. Delivered downloads incur the video-download add-on shown in Pricing; platform usage is included.

## `shouldDownloadCovers` (type: `boolean`):

Tick to download TikTok video cover images (thumbnails). Note that this will increase time and costs needed to extract the data.

## `downloadSubtitlesOptions` (type: `string`):

Download source subtitles or CPU transcription. Transcription is billed per started minute per delivered video. Set cloud memory to 1024 MB for ASR.

## `shouldDownloadSlideshowImages` (type: `boolean`):

Tick to download TikTok slideshow images. Note that this will increase costs and time required for scraping.

## `videoKvStoreIdOrName` (type: `string`):

Optional existing or named KVS for media. Omit for the default KVS. Platform retention rules apply; no permanent-storage promise.

## `allowPartialResults` (type: `boolean`):

Failure remains visible in coverage and SUMMARY. The run remains incomplete.

## `dnsResolver` (type: `string`):

System DNS by default; explicit public DoH option for local synthetic DNS. Address and TLS checks remain enforced.

## `maxConcurrency` (type: `integer`):

Maximum simultaneous video targets; source requests share a global pacing interval.

## `maxRequests` (type: `integer`):

Global source-request ceiling including redirects and media; reaching it makes the run incomplete.

## `maxRunSeconds` (type: `integer`):

Graceful collection deadline; keep the platform timeout larger to persist the summary.

## `requestTimeoutSeconds` (type: `integer`):

Finite source socket deadline, clamped by remaining collection time.

## `requestIntervalMillis` (type: `integer`):

Minimum interval between sequential request starts in milliseconds.

## `maxRetries` (type: `integer`):

Bounded retries for network failures and ordinary 5xx. Never retries access denials or challenges.

## `maxMediaBytes` (type: `integer`):

Maximum stored bytes for each media file; oversize files fail explicitly.

## `saveSourceEvidence` (type: `boolean`):

Save public metadata pages/comment API bytes as SOURCE-\* Base64 JSON. When AI analysis is enabled, also save source MP4 and decoded sample PNGs for independent readback.

## `commentsPerPost` (type: `integer`):

Zero keeps video-only behavior. Positive values collect public comments; replies share this total per-video limit.

## `maxRepliesPerComment` (type: `integer`):

Zero collects only top-level comments. Positive values traverse reply pages and retain immediate-parent plus root-thread IDs.

## `topLevelCommentsPerPost` (type: `integer`):

Optional additional top-level cap. Defaults to commentsPerPost when omitted.

## `commentsOnly` (type: `boolean`):

Requires commentsPerPost above zero. Each Dataset row is a comment or reply; media-download options must be off. Otherwise videos retain a nested comments list.

## `commentPageSize` (type: `integer`):

Requested page size for both comment and reply pages. Source cursors, rather than returned row counts, drive pagination.

## `maxConsecutiveEmptyCommentPages` (type: `integer`):

Follow advancing source cursors through sparse or duplicate-only pages, with this finite no-progress bound. Zero rejects the first such page. Request and time budgets also apply.

## `hashtags` (type: `array`):

Optional public hashtag discovery. This source is currently unreliable and can fail with DISCOVERY_SOURCE_UNAVAILABLE. Leave empty for direct video/comment collection.

## `profiles` (type: `array`):

Add one or multiple TikTok usernames or user IDs you want to scrape. You can enter the usernames one by one, or use the <strong>Bulk edit</strong> section to add a prepared list.

## `profileScrapeSections` (type: `array`):

Videos supported by structured public profile lists. Reposts/stories remain explicit unsupported gaps.

## `profileSorting` (type: `string`):

Select Latest to scrape the most recent videos first, Oldest - the oldest videos first, Popular - the most popular videos first. Date filters only work with Latest and Oldest. Only supported for Videos section. Note: Popular sorting is limited by TikTok to approximately 400–500 videos per profile and may return significantly fewer results than Latest or Oldest.

## `excludePinnedPosts` (type: `boolean`):

Tick to exclude pinned posts from profiles. Pinned posts are usually the first videos on a profile's page.

## `oldestPostDateUnified` (type: `string`):

Optional filter. Only videos uploaded after or on this date will be scraped. Alternatively, specify how old the scraped videos should be in days. Putting <code>1</code> will get you only today's posts, <code>2</code> - yesterday's and today's, and so on.

## `newestPostDate` (type: `string`):

Optional filter. Only videos uploaded before or on this date will be scraped.

## `mostDiggs` (type: `integer`):

Optional filter. Scrapes only videos with less hearts than the number you add. Doesn't work with date filters

## `leastDiggs` (type: `integer`):

Optional filter. Scrapes only videos with no less hearts than the number you add. Doesn't work with date filters

## `maxFollowersPerProfile` (type: `integer`):

Reserved competitor option; nonzero is rejected because social-list acquisition is not implemented.

## `maxFollowingPerProfile` (type: `integer`):

Reserved competitor option; nonzero is rejected because social-list acquisition is not implemented.

## `searchQueries` (type: `array`):

Your keyword will apply to both videos <strong>and</strong> profiles. Use the <strong>Search sorting</strong> field below to specify whether you want your search to apply to top content, videos or users. <br> As for your query's format, you can use any query that works on TikTok.

## `searchSection` (type: `string`):

By default, this scraper will sort the search results by whatever shows up in the <strong>Top</strong> section of TikTok search. <br> But you can narrow it down: if you want to apply your search query to just videos, use <strong>Video</strong>, just profiles - <strong>Profile</strong>.

## `maxProfilesPerQuery` (type: `integer`):

Only applies to profile searches. In this case ignore the <strong> 💯 Number of videos </strong> section and choose the number of profiles you want to scrape here.

## `videoSearchSorting` (type: `string`):

Optional filter. Select how you want the search results to be sorted when searching for videos. Only valid with `/video` search section.

## `videoSearchDateFilter` (type: `string`):

Optional filter. Select a date range in which to search for videos. Only valid with `/video` search section.

## `scrapeRelatedSearchWords` (type: `boolean`):

Tick to include the keywords TikTok shows in the 'Others also searched for' section on the search results page. The words will be added to every video result.

## `scrapeAdditionalAuthorMeta` (type: `boolean`):

Tick to fetch full author profile data (createTime, roomId) for each scraped video. Note: when scraping by profile URL, this data is already included by default — this option only makes a difference for other search types (e.g. hashtags, keywords).

## `shouldDownloadAvatars` (type: `boolean`):

Store source-provided images in KVS.

## `shouldDownloadMusicCovers` (type: `boolean`):

Store source-provided images in KVS.

## `aiVideoDescription` (type: `boolean`):

CPU-generated English descriptions for time windows represented by sampled real video frames, with recognized speech. Stored under videoMeta.aiVideoDescription; aiAnalysisEvidence states sampling and unbenchmarked accuracy. Requires 2048 MB, public model download and sufficient deadline. No external inference API.

## `aiVideoSummary` (type: `boolean`):

CPU-generated English summary of sampled frame descriptions and recognized speech under videoMeta.aiVideoSummary. Requires 2048 MB. Full scene coverage and quality parity are not guaranteed.

## `proxyCountryCode` (type: `string`):

Network exit country, not author/commenter nationality or a content-country filter. None with no proxyConfiguration preserves direct requests. A country alone selects Apify RESIDENTIAL. Availability depends on proxy permissions and live exits; failed verification stops without direct/other-country fallback.

## `emitErrorRows` (type: `boolean`):

Write errorCode/input/url/error records to the Dataset. SUMMARY also retains stage and coverage details.

## `commentsOutputMode` (type: `string`):

Nested comment arrays preserve existing video output. Separate writes comments to a second Dataset and returns commentsDatasetUrl. commentsOnly still writes flat rows to the main Dataset.

## `maxPagesPerDiscovery` (type: `integer`):

Bound profile/list traversal. Hitting this bound does not establish source exhaustion or global sorting.

## `maxDiscoveredVideos` (type: `integer`):

Per-input safety ceiling on discovery enumeration, before sorting/filtering.

## `asrModel` (type: `string`):

Public faster-whisper model downloaded on first transcription. Runs on CPU with int8; no external inference API.

## `asrLanguage` (type: `string`):

Optional language code; omit for model detection.

## `maxTranscriptionSeconds` (type: `integer`):

Reject longer videos before model inference; inference shares the collection deadline.

## `maxVisualSeconds` (type: `integer`):

Checks both source metadata and decoded MP4 duration. Analysis shares the run deadline.

## `visualFrameCount` (type: `integer`):

0 (default) scans the whole decoded video, samples at the configured interval, includes first/last frames and detected hard cuts. Positive values preserve legacy uniform fixed-count sampling. No guarantee of every scene or model accuracy.

## `visualSampleIntervalSeconds` (type: `integer`):

Timeline mode samples at this interval plus detected cuts and endpoints; decode timestamp gaps are checked. Not an every-frame semantic analysis.

## `maxVisualFrames` (type: `integer`):

Fail explicitly if timeline samples and detected cuts exceed this budget; do not silently discard coverage.

## `profileDiscoveryMode` (type: `string`):

Complete retains full enumeration/global filter semantics. Public recent sample reads only the official creator embed selection (up to 10, often fewer), with observed-only latest sorting and no date/pin/like filters; full profile parity is not claimed.

## `proxyConfiguration` (type: `object`):

Omit for direct requests when country is None. Country alone enables RESIDENTIAL. Advanced users can select authorized residential or ordinary datacenter groups. Conflicting/disabled country settings or custom proxy URLs are rejected. All TikTok source/media requests share one session per run.

## Actor input object example

```json
{
  "postURLs": [
    "https://www.tiktok.com/@apifylife/video/7200360993149553925"
  ],
  "scrapeRelatedVideos": false,
  "resultsPerPage": 1,
  "shouldDownloadVideos": false,
  "shouldDownloadCovers": false,
  "downloadSubtitlesOptions": "NEVER_DOWNLOAD_SUBTITLES",
  "shouldDownloadSlideshowImages": false,
  "allowPartialResults": false,
  "dnsResolver": "system",
  "maxConcurrency": 2,
  "maxRequests": 50,
  "maxRunSeconds": 100,
  "requestTimeoutSeconds": 15,
  "requestIntervalMillis": 500,
  "maxRetries": 1,
  "maxMediaBytes": 10000000,
  "saveSourceEvidence": false,
  "commentsPerPost": 5,
  "maxRepliesPerComment": 0,
  "commentsOnly": false,
  "commentPageSize": 20,
  "maxConsecutiveEmptyCommentPages": 3,
  "hashtags": [],
  "profiles": [],
  "profileScrapeSections": [
    "videos"
  ],
  "profileSorting": "latest",
  "excludePinnedPosts": false,
  "maxFollowersPerProfile": 0,
  "maxFollowingPerProfile": 0,
  "searchQueries": [],
  "searchSection": "",
  "maxProfilesPerQuery": 10,
  "videoSearchSorting": "MOST_RELEVANT",
  "videoSearchDateFilter": "ALL_TIME",
  "scrapeRelatedSearchWords": false,
  "scrapeAdditionalAuthorMeta": false,
  "shouldDownloadAvatars": false,
  "shouldDownloadMusicCovers": false,
  "aiVideoDescription": false,
  "aiVideoSummary": false,
  "proxyCountryCode": "None",
  "emitErrorRows": true,
  "commentsOutputMode": "nested",
  "maxPagesPerDiscovery": 20,
  "maxDiscoveredVideos": 500,
  "asrModel": "tiny",
  "maxTranscriptionSeconds": 60,
  "maxVisualSeconds": 60,
  "visualFrameCount": 0,
  "visualSampleIntervalSeconds": 1,
  "maxVisualFrames": 128,
  "profileDiscoveryMode": "complete"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "postURLs": [
        "https://www.tiktok.com/@apifylife/video/7200360993149553925"
    ],
    "resultsPerPage": 1,
    "commentsPerPost": 5,
    "hashtags": [],
    "maxFollowersPerProfile": 0,
    "maxFollowingPerProfile": 0,
    "proxyCountryCode": "None"
};

// Run the Actor and wait for it to finish
const run = await client.actor("peerless_columbine/tiktok-video-scraper-independent").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "postURLs": ["https://www.tiktok.com/@apifylife/video/7200360993149553925"],
    "resultsPerPage": 1,
    "commentsPerPost": 5,
    "hashtags": [],
    "maxFollowersPerProfile": 0,
    "maxFollowingPerProfile": 0,
    "proxyCountryCode": "None",
}

# Run the Actor and wait for it to finish
run = client.actor("peerless_columbine/tiktok-video-scraper-independent").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "postURLs": [
    "https://www.tiktok.com/@apifylife/video/7200360993149553925"
  ],
  "resultsPerPage": 1,
  "commentsPerPost": 5,
  "hashtags": [],
  "maxFollowersPerProfile": 0,
  "maxFollowingPerProfile": 0,
  "proxyCountryCode": "None"
}' |
apify call peerless_columbine/tiktok-video-scraper-independent --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,peerless_columbine/tiktok-video-scraper-independent"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4r6uFZdGg3D2Xr563/builds/isfYaJ2ZP1e5ajRnB/openapi.json
