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

Extract TikTok video metadata, exact engagement stats, download URLs (with and without watermark), author info, music metadata, and hashtags. 40 fields per video. All numbers exact, all timestamps ISO 8601. Download URLs included at no extra cost.

- **URL**: https://apify.com/happy\_b/tiktok-video-scraper.md
- **Developed by:** [Happy B](https://apify.com/happy_b) (community)
- **Categories:** Social media, Videos
- **Stats:** 13 total users, 7 monthly users, 78.7% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

### What is TikTok Video Scraper?

TikTok Video Scraper extracts **complete video metadata** from TikTok posts — exact engagement counts, download URLs (with and without watermark), author info, music metadata, and quality streams — all in one request per video.

Every number is an exact integer. Every date is ISO 8601. Download URLs included at no extra cost.

#### Data points extracted per video

| Field | Description | Example |
|-------|-------------|---------|
| `videoId` | Video ID | `7617913537561693470` |
| `description` | Caption text | `Let's just use regular belt...` |
| `descriptionLanguage` | Detected language | `en` |
| `createTime` | Unix timestamp | `1773683723` |
| `createTimeIso` | ISO 8601 timestamp | `2026-03-16T17:55:23.000Z` |
| `videoUrl` | Full video URL | `https://www.tiktok.com/@user/video/...` |
| `region` | Creator region | `US` |
| `playCount` | Exact view count | `54589869` |
| `likeCount` | Exact like count | `2306071` |
| `commentCount` | Comment count | `19349` |
| `shareCount` | Share count | `493979` |
| `collectCount` | Bookmark/save count | `114238` |
| `downloadCount` | Download count | `31858` |
| `repostCount` | Repost count | `0` |
| `isAd` | Paid promotion | `false` |
| `isPinned` | Pinned to profile | `false` |
| `isSlideshow` | Photo slideshow | `false` |
| `authorUid` | Author numeric ID | `127905465618821121` |
| `authorUniqueId` | TikTok handle | `khaby.lame` |
| `authorNickname` | Display name | `Khabane lame` |
| `authorAvatarUrl` | Profile picture URL | `https://p16-common-sign...` |
| `authorSecUid` | Secure user ID | `MS4wLjABAAAA...` |
| `authorSignature` | Bio text | `If u wanna laugh...` |
| `authorVerified` | Verified creator | `true` |
| `videoHeight` | Video height (px) | `1280` |
| `videoWidth` | Video width (px) | `720` |
| `videoDurationMs` | Duration (ms) | `17460` |
| `videoDefinition` | Quality label | `720p` |
| `videoCoverUrl` | Thumbnail URL | `https://p16-common-sign...` |
| `videoDownloadUrl` | Download URL | `https://v16m.tiktokcdn...` |
| `videoDownloadNoWatermarkUrl` | No-watermark download | `https://v16m.tiktokcdn...` |
| `videoPlayUrl` | Streaming URL | `https://v16m.tiktokcdn...` |
| `musicId` | Sound ID | `7617913388278106910` |
| `musicTitle` | Sound name | `original sound - khaby.lame` |
| `musicAuthor` | Sound creator | `Khabane lame` |
| `musicIsOriginal` | Original sound | `true` |
| `musicPlayUrl` | Sound audio URL | `https://v16m.tiktokcdn...` |
| `musicCoverUrl` | Sound cover image | `https://p16-common-sign...` |
| `hashtags` | Hashtags with IDs | `[{"id":"...","name":"comedy"}]` |
| `scrapeTimestamp` | When scraped | `2026-04-03T09:58:00.000Z` |

**40 fields per video. Every number exact. Download URLs included.**

### Why use this scraper?

#### Download URLs included — no add-ons

Other scrapers charge extra for video download URLs. We include both watermarked and no-watermark download URLs at no additional cost — both at the highest quality available.

#### Exact data, not approximations

Every count is an exact integer (`2306071`, not `2.3M`). Every timestamp is ISO 8601 (`2026-03-16T17:55:23.000Z`, not `2 weeks ago`). Your data is analysis-ready out of the box.

#### Fields you won't find elsewhere

- **`collectCount`** — bookmark/save count (not available in most scrapers)
- **`downloadCount`** — how many times the video was downloaded
- **`authorVerified`** — verified creator badge status
- **`videoDownloadNoWatermarkUrl`** — clean HD download, no TikTok logo overlay

### Use cases

- **Video analytics** — track views, likes, shares, and saves with exact numbers for accurate reporting
- **Content research** — analyze video metadata, hashtags, music usage, and engagement patterns
- **Influencer vetting** — verify creator profiles, engagement rates, and content themes
- **Competitive analysis** — compare video performance across creators or campaigns
- **Media archival** — download videos with no-watermark URLs for research and compliance
- **Trend detection** — monitor hashtag usage and music trends across videos

### How much does it cost?

Each video counts as one item.

| Plan | Price per video |
|------|----------------|
| Free | $0.0065 |
| Starter | $0.0045 |
| Scale | $0.0040 |
| Business | $0.0030 |

| Scenario | Videos | Cost (Free plan) |
|----------|--------|------|
| 1 video | 1 | $0.007 |
| 100 videos | 100 | $0.65 |
| 1,000 videos | 1,000 | $6.50 |

Apify also charges a small compute cost (CU) for the actor's runtime — typically under $0.01 for most runs.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `videoUrls` | string[] | *required* | TikTok video URLs or video IDs to scrape. |

### Output example

Each item in the dataset is a single video:

```json
{
  "videoId": "7617913537561693470",
  "description": "Let's just use regular belt from now on",
  "descriptionLanguage": "en",
  "createTime": 1773683723,
  "createTimeIso": "2026-03-16T17:55:23.000Z",
  "videoUrl": "https://www.tiktok.com/@khaby.lame/video/7617913537561693470",
  "region": "US",
  "playCount": 54589869,
  "likeCount": 2306071,
  "commentCount": 19349,
  "shareCount": 493979,
  "collectCount": 114238,
  "downloadCount": 31858,
  "repostCount": 0,
  "isAd": false,
  "isPinned": false,
  "isSlideshow": false,
  "authorUniqueId": "khaby.lame",
  "authorNickname": "Khabane lame",
  "authorVerified": true,
  "videoHeight": 1280,
  "videoWidth": 720,
  "videoDurationMs": 17460,
  "videoDefinition": "720p",
  "videoDownloadNoWatermarkUrl": "https://v16m.tiktokcdn-us.com/...",
  "hashtags": [
    {"id": "1697657584273413", "name": "learnfromkhaby"},
    {"id": "1606334392378370", "name": "comedy"}
  ],
  "scrapeTimestamp": "2026-04-03T09:58:00.000Z"
}
````

Download your results as **JSON**, **CSV**, **Excel**, **XML**, or **HTML** from the dataset tab, or access them via the [Apify API](https://docs.apify.com/api/v2#/reference/datasets).

### Good to know

**One request per video.** Each video URL is fetched independently. A run with 100 videos makes 100 requests.

**Video IDs accepted.** You can pass full TikTok URLs (`https://www.tiktok.com/@user/video/123...`) or just the numeric video ID (`7617913537561693470`). Photo URLs (`/photo/`) are also supported.

**Download URLs expire.** The `videoDownloadUrl` and `videoDownloadNoWatermarkUrl` are temporary CDN links. Download promptly after scraping.

### Integrations

Connect this actor to your workflow with [Apify integrations](https://docs.apify.com/platform/integrations):

- **Make (Integromat)** — trigger workflows when new data is available
- **Zapier** — push video data to Google Sheets, Slack, or databases
- **Google Drive** — export directly to spreadsheets
- **Webhooks** — notify your API when the run completes
- **Apify API** — programmatic access for custom pipelines

### Legal and personal data

This actor extracts publicly available data from TikTok. You should ensure your use of the extracted data complies with TikTok's [Terms of Service](https://www.tiktok.com/legal/terms-of-service), applicable data protection laws (GDPR, CCPA), and your jurisdiction's regulations regarding web scraping and data processing.

Video metadata and engagement statistics are public content visible to anyone on TikTok.

### Support

Found a bug or have a feature request? [Open an issue](https://apify.com/happy_b/tiktok-video-scraper/issues/open) or contact us through Apify messaging.

# Actor input Schema

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

TikTok video URLs or video IDs to scrape

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@khaby.lame/video/7617913537561693470"
  ]
}
```

# Actor output Schema

## `videos` (type: `string`):

Scraped video data with engagement stats, download URLs, author info, and music metadata

## `metadata` (type: `string`):

Scrape status, video counts, and any errors

# 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/@khaby.lame/video/7617913537561693470"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("happy_b/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/@khaby.lame/video/7617913537561693470"
  ]
}' |
apify call happy_b/tiktok-video-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Video Scraper",
        "description": "Extract TikTok video metadata, exact engagement stats, download URLs (with and without watermark), author info, music metadata, and hashtags. 40 fields per video. All numbers exact, all timestamps ISO 8601. Download URLs included at no extra cost.",
        "version": "0.1",
        "x-build-id": "tlESPRgIDIbvKwImy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/happy_b~tiktok-video-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-happy_b-tiktok-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/happy_b~tiktok-video-scraper/runs": {
            "post": {
                "operationId": "runs-sync-happy_b-tiktok-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/happy_b~tiktok-video-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-happy_b-tiktok-video-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "videoUrls"
                ],
                "properties": {
                    "videoUrls": {
                        "title": "Video URLs",
                        "type": "array",
                        "description": "TikTok video URLs or video IDs to scrape",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
