# TikTok Scraper - Videos, Profiles & Comments (`vulnv/tiktok-video-scraper`) Actor

Scrape TikTok: keyword video search, user search, full video details, user profiles, a user's posted videos, and video comments. Export views, likes, shares, saves, comments, hashtags, sounds and creator data to JSON/CSV/Excel. No login, cookies or proxy needed.

- **URL**: https://apify.com/vulnv/tiktok-video-scraper.md
- **Developed by:** [VulnV](https://apify.com/vulnv) (community)
- **Categories:** Social media, Videos
- **Stats:** 4 total users, 3 monthly users, 94.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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.

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 Scraper - Videos, Profiles & Comments

**Scrape TikTok and export videos, user profiles and comments to JSON, CSV or Excel.** Search videos or users by keyword, pull a single video's full details, collect a video's comments, get a user's profile, or list everything a user has posted - all from one Actor. Each result is one clean, flat row with views, likes, comments, shares, saves, hashtags, sound, media links and creator data.

No login, no cookies and no proxies to configure - data is fetched through a fast, managed pipeline. Just pick an operation, add your input and press **Start**.

> **Unofficial notice:** This is an independent tool and is **not** affiliated with, endorsed by, or connected to TikTok or ByteDance. "TikTok" is a trademark of its respective owner, used here only to describe what the Actor scrapes.

### What is TikTok?

TikTok is the world's leading short-video platform, with over a billion monthly users. Trends, songs and products break there first, and creators of every size reach audiences far beyond their followers through the For You feed. This scraper gives you programmatic access to TikTok search, videos, comments and creator profiles so you can track trends, find creators and analyze engagement at scale without a TikTok account.

### Operations

Pick one **Operation** and fill in the matching field:

| Operation | Input field | What you get |
|-----------|-------------|--------------|
| **Search videos by keyword** | `keywords` | Videos matching each keyword, with engagement, hashtags, sound, media and creator data. |
| **Search users by keyword** | `keywords` | Accounts matching each keyword, with followers, likes, video count and verification. |
| **Video details** | `videoUrls` | The full record for each video or photo post. |
| **Video comments** | `videoUrls` | Top-level comments for each video, with likes, reply counts, language and commenter data. |
| **User profile** | `userUrls` | A user's profile: followers, following, total likes, video count, bio, bio link, verification. |
| **User's posted videos** | `userUrls` | The videos a user has posted, newest first or most popular first, paginated. |

`videoUrls` accept `tiktok.com/@user/video/<id>` and `/photo/<id>` URLs, short share links (`vm.tiktok.com/...`, `vt.tiktok.com/...`, `tiktok.com/t/...`) or numeric video IDs. `userUrls` accept `tiktok.com/@username` URLs, usernames with or without `@` (e.g. `khaby.lame`) or `secUid` values (`MS4wLjABAAAA...`) - one per line.

### How to use it (step by step)

1. Choose an **Operation**.
2. Fill in the matching input:
   - Search videos / Search users -> add one or more **Search keywords** (any language, brands, #hashtags and emoji all work).
   - Video details / Video comments -> paste **Video URLs / IDs**.
   - User profile / User's videos -> paste **Usernames / profile URLs**.
3. Set **Maximum results per input** (default 100, or 0 for all available) for the paginated operations.
4. For video search, optionally set **Video search sort order** (relevance or most liked), **Published within** (last 24 hours up to last 6 months) and **Search region**. For a user's videos, optionally choose **Latest** or **Popular**.
5. Press **Start**. Export the dataset as JSON, CSV, Excel, XML or via the API.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `operation` | string | **Required.** `search_videos`, `search_users`, `video_detail`, `video_comments`, `user_profile`, or `user_videos`. |
| `keywords` | array | Search keywords (for `search_videos`, `search_users`). |
| `videoUrls` | array | Video URLs, short share links or numeric IDs (for `video_detail`, `video_comments`). |
| `userUrls` | array | Profile URLs, usernames or secUid values (for `user_profile`, `user_videos`). |
| `maxItems` | integer | Max results per keyword / user / video. `0` = all available. Default `100`. |
| `searchSort` | string | `relevance` or `most_liked` (video search only). |
| `publishTime` | string | `all`, `day`, `week`, `month`, `three_months` or `six_months` (video search only). |
| `region` | string | Two-letter country code, default `US` (video search only). |
| `userVideoSort` | string | `latest` or `popular` (user's videos only). |

### Output

Every row carries a `record_type` of `video`, `user` or `comment`. Common video fields:

| Field | Description |
|-------|-------------|
| `video_id`, `video_url`, `content_type` | Video identity, canonical URL, and `video` or `photo` (slideshow). |
| `description`, `hashtags`, `language`, `region` | Caption, hashtags, caption language and the video's country code. |
| `play_count`, `like_count`, `comment_count`, `share_count`, `collect_count`, `download_count` | Engagement metrics. |
| `create_time`, `duration_seconds`, `is_pinned`, `is_ad` | Publish time (ISO-8601 UTC), length and flags. |
| `cover_url`, `play_url`, `image_urls`, `image_count`, `width`, `height` | Cover image, video file, photo-post images and dimensions. |
| `music_id`, `music_title`, `music_author`, `music_is_original` | The sound used in the video. |
| `author_id`, `author_unique_id`, `author_name`, `author_sec_uid`, `author_followers_count`, `author_verified`, `author_avatar_url`, `author_profile_url` | Creator data. |

User (`user`) rows add `user_id`, `unique_id`, `sec_uid`, `nickname`, `signature`, `avatar_url`, `profile_url`, `followers_count`, `following_count`, `video_count`, `likes_total`, `verified`, `verify_reason`, `is_private`, `account_labels`, `bio_url` and `instagram_id`. Comment (`comment`) rows add `comment_id`, `video_id`, `content`, `like_count`, `reply_count`, `language`, `is_pinned`, `liked_by_author` and the commenter's `author_*` fields including `author_region`.

Example video row:

```json
{
  "record_type": "video",
  "operation": "user_videos",
  "input": "https://www.tiktok.com/@khaby.lame",
  "video_id": "7689510970292489502",
  "video_url": "https://www.tiktok.com/@khaby.lame/video/7689510970292489502",
  "description": "Ye… I’m gonna mind my business #learnfromkhaby #comedy ",
  "content_type": "video",
  "hashtags": ["learnfromkhaby", "comedy"],
  "create_time": "2026-09-25T16:30:18+00:00",
  "duration_seconds": 26,
  "region": "US",
  "play_count": 5966309,
  "like_count": 718463,
  "comment_count": 16126,
  "share_count": 40994,
  "collect_count": 35160,
  "author_unique_id": "khaby.lame",
  "author_name": "Khabane lame"
}
```

### Common use cases

- **Trend and hashtag research** - search a topic, sort by most liked or limit to the last week, and see what is taking off.
- **Influencer discovery** - search users in a niche, then pull their profiles and recent videos to compare reach and engagement.
- **Brand and competitor monitoring** - track a brand's own posts and the comments people leave on them.
- **Content and sentiment analysis** - collect captions and comments for NLP, sentiment or AI training datasets.

### Notes on reliability

- TikTok's search pages overlap; duplicates are removed automatically, so a keyword may return slightly fewer results than the page count suggests.
- **Search region** shifts the ranking toward that market but is not a strict country filter; results from other countries still appear.
- On **Video details** rows `author_followers_count` is `0` because TikTok does not include it there; use **User profile** for the creator's follower count.
- The bio (`signature`), bio link and account labels are only present on **User profile** rows; **Search users** rows carry the linked Instagram handle instead.
- Video, image and avatar URLs are served by TikTok's CDN and expire after a few hours; fetch them promptly.
- Counts reflect what TikTok returns at scrape time. If a video or user is private, deleted or restricted, that input is skipped and the run continues.

### FAQ

**Do I need a TikTok account, cookies or a proxy?** No. Just add your input and press Start.

**Which video links work?** Full `tiktok.com/@user/video/...` and `/photo/...` links, short share links from the app (`vm.tiktok.com`, `vt.tiktok.com`, `tiktok.com/t/`) and numeric video IDs all work.

**Does it handle photo (slideshow) posts?** Yes. They come back with `content_type` set to `photo` and every image URL in `image_urls`.

**Can I run several keywords or URLs at once?** Yes - add multiple lines. Cross-input duplicates are removed automatically.

**Can I try it for free?** Yes. Users on the free Apify plan can fetch up to 10 results in total to try the Actor. Upgrade to a paid Apify plan to run it without that limit.

**What export formats are supported?** JSON, CSV, Excel, XML and HTML, plus the Apify API and integrations such as Google Sheets, Zapier, Make and webhooks.

### Pricing

This Actor is **pay per result**: you are charged for each record it returns (videos, video details, comments, user profiles and user search results), plus standard Apify platform usage. Different record types have different prices; see the **Pricing** tab for current rates. You are never charged for inputs that return nothing.

### Related scrapers

- **[Douyin Scraper](https://apify.com/vulnv/douyin-search-scraper)** - 抖音 videos by keyword, with creators and downloads.
- **[Instagram Posts Scraper](https://apify.com/vulnv/instagram-posts-scraper)** - Instagram posts and engagement data.
- **[Threads Scraper](https://apify.com/vulnv/threads-scraper)** - Threads creators, posts and replies.

# Actor input Schema

## `operation` (type: `string`):

What to scrape. Each operation uses a different input field below:

• Search videos → Keywords
• Search users → Keywords
• Video details → Video URLs / IDs
• Video comments → Video URLs / IDs
• User profile → Usernames / profile URLs
• User's videos → Usernames / profile URLs

## `keywords` (type: `array`):

For the "Search videos" and "Search users" operations. Add one or more keywords - any language, brand names, #hashtags and emoji all work. Each keyword is searched independently and cross-keyword duplicates are removed.

## `videoUrls` (type: `array`):

For the "Video details" and "Video comments" operations. Paste full tiktok.com/@user/video/... or /photo/... URLs, short share links (vm.tiktok.com/..., tiktok.com/t/...) or numeric video IDs - one per line.

## `userUrls` (type: `array`):

For the "User profile" and "User's videos" operations. Paste tiktok.com/@username URLs, usernames (with or without @, e.g. khaby.lame) or secUid values (MS4wLjABAAAA...) - one per line.

## `maxItems` (type: `integer`):

Upper bound on results per keyword / user / video (for the paginated operations: both searches, user's videos, comments). Cost scales linearly. Set 0 to fetch all available.

## `searchSort` (type: `string`):

For "Search videos" only. Order results by relevance or by most likes.

## `publishTime` (type: `string`):

For "Search videos" only. Only return videos posted within this period.

## `region` (type: `string`):

For "Search videos" only. Two-letter country code (e.g. US, GB, DE, JP) that TikTok uses to rank results. It biases the mix of videos toward that market; it is not a strict country filter.

## `userVideoSort` (type: `string`):

For "User's videos" only. Newest first, or the user's most popular videos first.

## Actor input object example

```json
{
  "operation": "search_videos",
  "keywords": [
    "cooking"
  ],
  "maxItems": 100,
  "searchSort": "relevance",
  "publishTime": "all",
  "region": "US",
  "userVideoSort": "latest"
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped TikTok results in the default dataset.

## `overview` (type: `string`):

Overview table of the scraped results.

# 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 = {
    "keywords": [
        "cooking"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vulnv/tiktok-video-scraper").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 = { "keywords": ["cooking"] }

# Run the Actor and wait for it to finish
run = client.actor("vulnv/tiktok-video-scraper").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 '{
  "keywords": [
    "cooking"
  ]
}' |
apify call vulnv/tiktok-video-scraper --silent --output-dataset

```

## MCP server setup

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

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/dDsxeUheXCFJ6issq/builds/X5dyP9LPnu1KBzGcl/openapi.json
