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

Extract public TikTok video metadata, author details, engagement statistics, hashtags, and music from video URLs.

- **URL**: https://apify.com/fetch\_cat/tiktok-video-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Social media, Videos, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.05 / 1,000 item extracteds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TikTok Video Scraper

Export public TikTok video metadata, captions, author details, engagement statistics, hashtags, music fields, covers, and canonical video URLs.

Use this Actor to turn TikTok video URLs into a clean dataset for campaign reporting, creator monitoring, competitor research, content analysis, and API workflows. Results can be downloaded as CSV, JSON, Excel, XML, RSS, or used through the Apify Dataset API.

### At a glance

- **Video URL input**: Paste one or many public TikTok video URLs and save one result row per submitted video.
- **Metadata export**: Collect video IDs, captions, authors, publish times, durations, hashtags, music, covers, and canonical URLs.
- **Engagement metrics**: Export public like, comment, share, play, and collect counts when available.
- **Unavailable status rows**: Handle deleted, private, blocked, or unavailable videos with clear availability fields.
- **API export**: Send video metadata to spreadsheets, reports, dashboards, monitoring jobs, or AI agents.

### Ready-to-run examples

Use these saved Store examples as starting points. Open any example to prefill the Actor input, then adjust URLs, keywords, limits, or filters for your own run.

- **[Export TikTok captions and hashtags](https://apify.com/fetch_cat/tiktok-video-scraper/examples/tiktok-caption-hashtag-export)**
- **[Export TikTok video engagement stats](https://apify.com/fetch_cat/tiktok-video-scraper/examples/tiktok-video-engagement-stats)**
- **[Extract TikTok video metadata](https://apify.com/fetch_cat/tiktok-video-scraper/examples/extract-tiktok-video-metadata)**

### What can it do?

TikTok Video Scraper extracts public metadata from TikTok video pages and saves one dataset row per video URL.

- **Normalize video links**: Process full public TikTok video URLs and return canonical video URLs.
- **Collect public metadata**: Save captions, author fields, music, hashtags, covers, publish time, and duration.
- **Track engagement**: Capture public play, like, comment, share, collect, and related counts when TikTok exposes them.
- **Flag unavailable videos**: Return status fields for videos that cannot be fetched.
- **Export repeatable datasets**: Use Apify downloads, API calls, schedules, webhooks, and integrations.

### Common workflows

- **Campaign reporting**: Export public engagement metrics for sponsored or branded TikTok videos.
- **Creator monitoring**: Track selected creator posts and compare captions, music, hashtags, and metrics.
- **Competitor research**: Save competitor video metadata for recurring content analysis.
- **Content analysis**: Study captions, hashtag choices, music usage, duration, and public performance signals.
- **Data enrichment**: Add TikTok video context to an existing list of URLs.
- **API workflows**: Use the Actor as a TikTok video metadata API alternative for public video URLs.

### What data can you extract?

The Actor returns one dataset row per public TikTok video URL.

| Field | Description |
| --- | --- |
| `videoUrl` | Submitted or normalized TikTok video URL |
| `videoId` | TikTok video ID |
| `authorUsername` | Creator handle |
| `authorDisplayName` | Creator display name |
| `description` | Video caption |
| `createTime` | Publish time in ISO format |
| `durationSeconds` | Video duration |
| `musicTitle` | Music or sound title |
| `musicAuthor` | Music or sound author |
| `hashtags` | Hashtags used in the caption |
| `diggCount` | Like count |
| `commentCount` | Comment count |
| `shareCount` | Share count |
| `playCount` | View or play count |
| `collectCount` | Save or favorite count |
| `coverUrl` | Cover image URL |
| `canonicalUrl` | Normalized TikTok video URL |
| `isAvailable` | Whether public metadata was available |
| `fetchedAt` | Timestamp when the video was fetched |

### Pricing

The Actor uses pay-per-event pricing, so cost is tied to the run and the number of saved video rows.

| Event | Price | Charged when |
| --- | --- | --- |
| Run start | `$0.005` per run | Once when the Actor starts. |
| Video result | BRONZE `$0.000085261` per saved video row | Each TikTok video result saved to the dataset. This is about `$0.085261` per 1,000 saved videos on BRONZE, with lower per-result prices on higher Apify plans. |

Use a low `maxItems` value for the first run, review the dataset, and then scale up. Exact live pricing is shown on the Apify Actor page before you start a run.

### Input configuration

| Setting | JSON key | Use it for | Example |
| --- | --- | --- | --- |
| Video URLs | `videoUrls` | Required list of full public TikTok video URLs. | `["https://www.tiktok.com/@scout2015/video/6718335390845095173"]` |
| Maximum videos | `maxItems` | Cap processed URLs and spend. | `10` |
| Proxy configuration | `proxyConfiguration` | Optional Apify Proxy settings if TikTok blocks requests from your region. | `{"useApifyProxy":false}` |

### Example input

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

### Example output

```json
{
  "videoUrl": "https://www.tiktok.com/@scout2015/video/6718335390845095173",
  "videoId": "7623088450576633119",
  "authorUsername": "khaby.lame",
  "authorDisplayName": "Khabane lame",
  "description": "Not a good morning #learnfromkhaby #comedy",
  "createTime": "2026-04-30T12:37:04.000Z",
  "durationSeconds": 16,
  "musicTitle": "original sound",
  "musicAuthor": "Khabane lame",
  "hashtags": ["learnfromkhaby", "comedy"],
  "diggCount": 12345,
  "commentCount": 123,
  "shareCount": 45,
  "playCount": 67890,
  "collectCount": 100,
  "coverUrl": "https://...",
  "canonicalUrl": "https://www.tiktok.com/@scout2015/video/6718335390845095173",
  "isAvailable": true,
  "fetchedAt": "2026-06-27T00:00:00.000Z"
}
```

### How to run it

1. Open the Actor on Apify.
2. Paste one or more public TikTok video URLs.
3. Set `maxItems` if you want to process only part of the list.
4. Choose proxy settings if needed.
5. Start the run and export the dataset.

### Search tips

- **Use full video URLs**: Prefer `https://www.tiktok.com/@username/video/VIDEO_ID` links.
- **Test a few links first**: Confirm output quality before running a large campaign list.
- **Remove duplicates**: Deduplicate URLs before starting if you do not need repeated rows.
- **Expect availability gaps**: Private, deleted, blocked, or restricted videos may return unavailable status rows.
- **Use proxy only when needed**: Start simple; enable Apify Proxy if TikTok blocks public access.

### Limits and caveats

- The Actor extracts publicly visible TikTok video metadata only.
- It does not download video files, scrape full comments, access private videos, or log in.
- Public counts may differ from the TikTok app due to caching, localization, or delayed updates.
- Short links and redirected links may not always expose the same public metadata as canonical video URLs.

### Integrations

You can connect TikTok video metadata to downstream tools:

- Export CSV or Excel to spreadsheets for campaign reports.
- Send engagement rows to dashboards and BI tools.
- Enrich creator or campaign databases with video metadata.
- Trigger webhooks after scheduled monitoring runs.
- Combine video outputs with TikTok profile, hashtag, trends, and ads data.

### API usage

#### Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/tiktok-video-scraper').call({
  videoUrls: ['https://www.tiktok.com/@scout2015/video/6718335390845095173'],
  maxItems: 1
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/tiktok-video-scraper').call(run_input={
    'videoUrls': ['https://www.tiktok.com/@scout2015/video/6718335390845095173'],
    'maxItems': 1,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~tiktok-video-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"videoUrls":["https://www.tiktok.com/@scout2015/video/6718335390845095173"],"maxItems":1}'
```

### MCP and AI agents

This Actor can be used through the official Apify MCP server at `https://mcp.apify.com`.

For a focused single-Actor tool setup, use:

```text
https://mcp.apify.com?tools=fetch_cat/tiktok-video-scraper
```

Use the same JSON keys shown in the input configuration table, such as `videoUrls`, `maxItems`, and `proxyConfiguration`.

### FAQ

#### Can I scrape multiple TikTok videos at once?

Yes. Add multiple URLs to `videoUrls` and set `maxItems` to the number you want to process.

#### Does it download video files?

No. It exports public metadata, URLs, covers, and metrics. It does not download video files.

#### Does it scrape comments?

No. It exports public video metadata and count fields, not full comment text.

#### Can I schedule it?

Yes. Use Apify schedules for recurring checks of the same video URL list.

### Related scrapers

- [TikTok Profile Scraper](https://apify.com/fetch_cat/tiktok-profile-scraper)
- [TikTok Hashtag Scraper](https://apify.com/fetch_cat/tiktok-hashtag-scraper)
- [TikTok Trends Scraper](https://apify.com/fetch_cat/tiktok-trends-scraper)
- [TikTok Ads Library Scraper](https://apify.com/fetch_cat/tiktok-ads-library-scraper)
- [YouTube Video Details Scraper](https://apify.com/fetch_cat/youtube-video-details-scraper)

#### 0.1

- Initial public release with TikTok video URL input, metadata extraction, engagement metrics, availability rows, and API-ready output.

### Support

If a run fails, returns no data, or a field looks wrong, open an issue from the Actor page.

Please include the Apify run ID or run URL, input JSON, one example public URL, query, or input item, what you expected, and what the dataset returned. Small reproducible inputs make parsing or site-layout issues much faster to fix.

# Actor input Schema

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

Full public TikTok video URLs to scrape, for example https://www.tiktok.com/@khaby.lame/video/7623088450576633119.

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

Maximum number of video URLs to process in this run.

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

Optional proxy settings. Leave disabled unless TikTok blocks requests from your region.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@scout2015/video/6718335390845095173"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Saved public TikTok video metadata rows.

## `runSummary` (type: `string`):

Requested, saved, failed, and deadline counters for the run.

## `pendingUrls` (type: `string`):

Unstarted valid URLs when a run reaches its shutdown reserve.

# 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/@scout2015/video/6718335390845095173"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/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/@scout2015/video/6718335390845095173"] }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/@scout2015/video/6718335390845095173"
  ]
}' |
apify call fetch_cat/tiktok-video-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fetch_cat/tiktok-video-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/njzn6GtGvxIYRp782/builds/u1pKp4IAKtrWcSaQf/openapi.json
