# TikTok Video Scraper (`piotrv1001/tiktok-video-scraper`) Actor

Scrape TikTok video data from any video URL: views, likes, comments, shares and saves, caption, hashtags, mentions, upload date, duration, music/sound, subtitles, cover and author stats. Bulk URLs and share links, export to JSON, CSV or Excel for TikTok analytics.

- **URL**: https://apify.com/piotrv1001/tiktok-video-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Social media, Videos, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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 Video Scraper

The **TikTok Video Scraper** turns any list of TikTok video links into clean TikTok video data: views, likes, comments, shares and saves, the caption with hashtags and mentions, the exact upload time, duration, the music or sound, subtitle links, cover image and the author's profile stats. Paste full URLs, share links (vm.tiktok.com, vt.tiktok.com) or video IDs and export the results as JSON, CSV or Excel. It works like a TikTok API for video stats without a key or an approval process.

### 🎯 Use Cases

- **TikTok analytics for many videos at once**: pull views, likes, comments, shares and saves for a list of videos into one spreadsheet instead of opening each one.
- **TikTok views counter and stats tracker**: run the same list every day and chart how each video's play count grows.
- **TikTok engagement rate calculator**: every row has plays, likes, comments, shares, saves and the author's follower count, so engagement rate is one formula away.
- **TikTok song finder**: get the sound behind each video (title, artist, original or not, audio link).
- **Influencer and campaign reporting**: collect the stats of sponsored posts from creators you work with, with the exact posting time.
- **TikTok data for research and AI**: captions, hashtags, categories, language and subtitle links for datasets and content analysis.

### ✨ Features

- **Video stats**: plays, likes, comments, shares, saves and reposts for every post.
- **Caption details**: full caption, hashtags, mentions, detected language and TikTok's content categories.
- **Exact upload date**: ISO timestamp and Unix time, down to the second.
- **Music and sound**: sound ID, title, artist, duration, cover and audio link, plus whether it is an original sound.
- **Subtitles**: links to TikTok's caption files (WebVTT) with their language, when the video has them.
- **Author stats**: username, nickname, ID, verified flag, bio, avatar, followers, following, total likes and video count.
- **Photo posts too**: slideshow posts come back with `type: "photo"` and all image links.
- **Any link format**: full URLs, `/photo/` links, mobile links, share links (vm.tiktok.com, vt.tiktok.com, tiktok.com/t/) and bare video IDs.
- **Fair billing**: the same video pasted twice is saved and charged once; removed, private and invalid links are listed in the status message and never charged.

### 🛠️ How It Works

1. **Paste TikTok video links** – one per line, in any of the formats above.
2. **Run the scraper** – each link becomes one row with the video's stats, caption, music and author.
3. **Download or connect** – export JSON, CSV or Excel, or pull the dataset through the Apify API.

### ⚙️ Input

| Field          | What it does                                                                                                   |
| -------------- | -------------------------------------------------------------------------------------------------------------- |
| **Video URLs** | TikTok video or photo post links, share links (vm.tiktok.com, vt.tiktok.com, tiktok.com/t/) or video IDs, one per line. |
| **Max videos** | Stop after this many videos. Default 50, so raise it when you paste more links.                                 |

```json
{
    "videoUrls": [
        "https://www.tiktok.com/@zachking/video/6768504823336815877",
        "https://vm.tiktok.com/ZMexample/",
        "7665075736742530317"
    ],
    "maxItems": 500
}
```

### 💰 Pricing

You pay only for the videos you get. There is no monthly rental.

| Event           | Price                                 | What you get                                                        |
| --------------- | ------------------------------------- | ------------------------------------------------------------------- |
| **Video**       | $0.001 per video ($1 per 1,000)       | One TikTok video or photo post with stats, caption, music and author |
| **Actor start** | $0.00005 per run                      | Charged once when the run starts.                                   |

Examples: 50 videos = $0.05 · 1,000 videos = $1.00 · 10,000 videos = $10.00.

Removed, private and invalid links are not charged.

### 📊 Sample Output Data

```json
{
    "id": "7655004069190192398",
    "url": "https://www.tiktok.com/@zachking/video/7655004069190192398",
    "type": "video",
    "description": "a message to all AI",
    "createdAt": "2026-06-24T16:45:49.000Z",
    "createTimeUnix": 1782319549,
    "playCount": 67800000,
    "likeCount": 14000000,
    "commentCount": 105100,
    "shareCount": 561600,
    "saveCount": 1015338,
    "repostCount": 0,
    "durationSeconds": 27,
    "width": 720,
    "height": 1280,
    "definition": "720p",
    "coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/o8mI3f…",
    "dynamicCoverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/o8mI3f…",
    "images": [],
    "photoTitle": null,
    "hashtags": [],
    "mentions": [],
    "music": {
        "id": "7655004159753718541",
        "title": "original sound",
        "author": "Zach King",
        "original": true,
        "durationSeconds": 28,
        "coverUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/smgf5f…",
        "playUrl": "https://v16m.tiktokcdn-us.com/2bb17bda4d0a3a23e0ee8eaa73b53504/…"
    },
    "subtitles": [
        { "language": "eng-US", "source": "ASR", "format": "webvtt", "url": "https://v16m-webapp.tiktokcdn-us.com/eb0174…" }
    ],
    "location": null,
    "country": "US",
    "language": "en",
    "categories": ["Professional Special Effects", "Talents"],
    "isAd": false,
    "isAiGenerated": false,
    "authorUsername": "zachking",
    "authorNickname": "Zach King",
    "authorId": "68616495085350913",
    "authorSecUid": "MS4wLjABAAAANnzJ9pdfxtlf3m5Ku_M-rCXVitJC13w4GavqyUD3RE8h1cZ-7O9FT-uQ9rCJjU_E",
    "authorVerified": true,
    "authorBio": "Bringing a little more wonder into the world, 15 seconds at a time",
    "authorAvatar": "https://p19-common-sign.tiktokcdn-us.com/tos-alisg-avt-0068/smgf5f…",
    "authorFollowers": 86800000,
    "authorFollowing": 183,
    "authorLikes": 1300000000,
    "authorVideoCount": 619,
    "inputUrl": "https://www.tiktok.com/@zachking/video/7655004069190192398",
    "scrapedAt": "2026-10-21T17:16:35.128Z"
}
```

`playCount`, `likeCount` and the author counts are the numbers TikTok shows, which it rounds to three digits for big videos (67.8M). `saveCount` is exact. `subtitles` is empty when TikTok has no captions for the video, and `location` is filled only when the creator tagged a place. `country` is the region the video was posted from. Cover, music and subtitle links are signed by TikTok and expire after some time, so download them soon after the run.

### 📅 Schedule and Integrate

To track a TikTok views counter or a campaign, save your list of links as a Task and run it daily (or hourly for fresh launches) with Apify **Schedules**. Every run adds a new snapshot with `scrapedAt`, so you can chart growth over time. Send the results to Google Sheets, Zapier, Make, n8n or your own system through webhooks and the Apify API.

### 🤖 Use with AI Agents (MCP)

The TikTok Video Scraper works as a tool in Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server (`https://mcp.apify.com`). An agent can call it with:

```json
{ "videoUrls": ["https://www.tiktok.com/@zachking/video/6768504823336815877"], "maxItems": 10 }
```

### ❓ FAQ

**Does TikTok have an official API for video data?** TikTok offers a Display API for creators' own accounts and a Research API that requires an application and approval for academic use. Neither gives you quick stats for any public video. This actor takes public video links and returns the same numbers you see on the video page, with no key, no approval and no rate-limit handling on your side.

**Do I need a TikTok account?** No. Paste public video links and run.

**Can I check TikTok views and engagement for many videos?** Yes. Paste hundreds or thousands of links in one run and set **Max videos** at least as high as the number of links. Engagement rate = (likes + comments + shares) ÷ plays, or ÷ `authorFollowers` for follower-based rates.

**What happens with removed, private or invalid links?** They are skipped, named in the run's status message and not charged. A run where none of the links works ends as failed, so you notice.

**How do I find the upload date of a TikTok video?** Every row has `createdAt` (ISO, UTC) and `createTimeUnix`, to the second.

**Is the video file included?** No. TikTok's video file links only work inside the browser session that opened the page, so they are left out. Cover images, the sound file and subtitles are included.

**How do I get all videos of a profile?** Use the [TikTok Profile Videos Scraper](https://apify.com/piotrv1001/tiktok-profile-videos-scraper) to list a creator's videos, or paste their video links here.

### 🔗 Related Scrapers

- [TikTok Profile Videos Scraper](https://apify.com/piotrv1001/tiktok-profile-videos-scraper): every public video of a profile, newest first, with a date cutoff.
- [TikTok Video Transcript Scraper](https://apify.com/piotrv1001/tiktok-video-transcript-scraper): the spoken text of TikTok videos for content research and AI.
- [YouTube Transcript Scraper](https://apify.com/piotrv1001/youtube-transcript-scraper): full transcripts of YouTube videos with timestamps.
- [YouTube Channel Videos Scraper](https://apify.com/piotrv1001/youtube-channel-videos-scraper): every video of a YouTube channel with views and duration.

# Actor input Schema

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

TikTok video or photo post links, one per line: https://www.tiktok.com/@user/video/…, share links (vm.tiktok.com/…, vt.tiktok.com/…, tiktok.com/t/…) or bare video IDs. Each link gives one row.

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

Stop after this many videos. Raise it when you paste more links.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@zachking/video/6768504823336815877",
    "https://www.tiktok.com/@zachking/video/7655004069190192398",
    "https://www.tiktok.com/@nasa/video/7665075736742530317"
  ],
  "maxItems": 50
}
```

# Actor output Schema

## `results` (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 = {
    "videoUrls": [
        "https://www.tiktok.com/@zachking/video/6768504823336815877",
        "https://www.tiktok.com/@zachking/video/7655004069190192398",
        "https://www.tiktok.com/@nasa/video/7665075736742530317"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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 = {
    "videoUrls": [
        "https://www.tiktok.com/@zachking/video/6768504823336815877",
        "https://www.tiktok.com/@zachking/video/7655004069190192398",
        "https://www.tiktok.com/@nasa/video/7665075736742530317",
    ],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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 '{
  "videoUrls": [
    "https://www.tiktok.com/@zachking/video/6768504823336815877",
    "https://www.tiktok.com/@zachking/video/7655004069190192398",
    "https://www.tiktok.com/@nasa/video/7665075736742530317"
  ],
  "maxItems": 50
}' |
apify call piotrv1001/tiktok-video-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/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/FbsyBVR5MnlG1QcCv/builds/Sg2Psx3qJcjIHCp8G/openapi.json
