# TikTok Video Scraper – Captions, Stats & Music (`scrapingmonkey/tiktok-video-details-scraper`) Actor

Extract public TikTok video details from URLs. Get captions, engagement counts, creator information, music, media links, hashtags, and mentions in one row per video.

- **URL**: https://apify.com/scrapingmonkey/tiktok-video-details-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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/actors/running/actors-in-store.md#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

Turn a public TikTok video URL into its caption, engagement figures, creator details, music metadata, and media references. **TikTok Video Scraper** brings these fields together in one row, so a list of campaign links becomes a dataset you can compare or export.

No TikTok login or cookies are required. Each result retains the submitted link and a `success` or `failed` status.

| At a glance | Details |
| --- | --- |
| 📥 Input | Full TikTok /@username/video/ID URLs |
| 📤 Output | Caption, views and engagement, creator, music, video URL, hashtags, and mentions |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 videos concurrently with automatic retries |
| 💾 Delivery | One dataset row per unique valid video ID; invalid links receive failed rows |

### What the TikTok video scraper extracts 🔎

The Actor checks that the requested post is a video and returns the details exposed with it. Use it when you already have video links and need their content and metrics together.

- Post ID, canonical URL, caption, creation time, and reported creation region
- Views, likes, comments, shares, and saves
- Creator identity, bio, avatar URLs, verification, and available audience counts
- Video playback URL, covers, dimensions, duration, and available volume measurements
- Music title, artist, cover images, playback URL, and original-sound flags
- Hashtags, mentions, and source-provided advertising, AI-content, and interaction flags

Media fields are URL references. The Actor does not save video files or generate transcripts.

### How to scrape TikTok video details 🚀

1. Copy a full public TikTok video link.
2. Add it to `inputList`, with one URL per item.
3. Start the Actor and open the resulting dataset.
4. Filter by `status` and export the fields needed for your report.

```json
{
  "inputList": [
    "https://www.tiktok.com/@scout2015/video/6718335390845095173"
  ]
}
```

Use the full /video/ URL. Short share links, bare IDs, profile links, and /photo/ links are not accepted.

### TikTok video data fields and output 📦

| Field group | Included data |
| --- | --- |
| Post | ID, canonical URL, type, description, creation date, and region |
| Performance | Views, likes, comments, shares, and saves |
| Creator | Identity, profile link, avatars, bio, account flags, and available counts |
| Video and music | Playback and cover URLs, dimensions, duration, volume data, and sound metadata |
| Text and flags | Hashtags, mentions, labels, and interaction or disclosure flags |

Complete illustrative success item; these fictional values show the output structure and are not a live result:

```json
{
  "input": "https://www.tiktok.com/@trailjournal/video/7523456789012345678",
  "status": "success",
  "video.cover": "https://example.com/trail-video-cover.jpg",
  "url": "https://www.tiktok.com/@trailjournal/video/7523456789012345678",
  "id": "7523456789012345678",
  "type": "video",
  "description": "Morning trail with @trailguide #hiking",
  "created_at": "2023-11-14T22:13:20Z",
  "create_time": 1700000000,
  "location_created": "US",
  "statistics.views": 42700,
  "statistics.likes": 2860,
  "statistics.comments": 64,
  "statistics.shares": 118,
  "statistics.saves": 390,
  "author.avatar_large": "https://example.com/trail-journal-large.jpg",
  "author.avatar_medium": "https://example.com/trail-journal-medium.jpg",
  "author.avatar_thumb": "https://example.com/trail-journal-thumb.jpg",
  "author.username": "trailjournal",
  "author.name": "Trail Journal",
  "author.profile_url": "https://www.tiktok.com/@trailjournal",
  "author.id": "7123456789012345678",
  "author.sec_uid": "",
  "author.bio": "Weekend walks and practical trail notes.",
  "author.region": "US",
  "author.is_verified": false,
  "author.is_private": false,
  "author.followers": 18400,
  "author.following": 126,
  "author.likes": 286000,
  "author.videos_count": 94,
  "author.friends_count": 28,
  "music.id": "7423456789012345678",
  "music.title": "Morning Walk",
  "music.author_name": "Trail Journal",
  "music.author_username": "trailjournal",
  "music.album": "",
  "music.duration": 24,
  "music.is_original": true,
  "music.is_commerce": false,
  "music.is_author_artist": false,
  "music.cover_large": "https://example.com/morning-walk-large.jpg",
  "music.cover_medium": "https://example.com/morning-walk-medium.jpg",
  "music.cover_thumb": "https://example.com/morning-walk-thumb.jpg",
  "music.play_url": "https://example.com/morning-walk.mp3",
  "video.id": "7523456789012345678",
  "video.play_url": "https://example.com/trail-video.mp4",
  "video.download_url": "",
  "video.width": 1080,
  "video.height": 1920,
  "video.duration": 24,
  "video.ratio": "1080p",
  "video.format": "mp4",
  "video.origin_cover": "https://example.com/trail-video-cover.jpg",
  "video.dynamic_cover": "https://example.com/trail-video-preview.webp",
  "video.bitrate": 0,
  "video.encoded_type": "",
  "video.video_quality": "",
  "video.volume_info.loudness": -15.5,
  "video.volume_info.peak": 0.5,
  "video.volume_info.loudness_range": 0.0,
  "video.bitrates": [],
  "images": [],
  "image_cover.url": "",
  "image_cover.urls": [],
  "image_cover.width": 0,
  "image_cover.height": 0,
  "subtitles": [],
  "hashtags.id": [
    "54321"
  ],
  "hashtags.name": [
    "hiking"
  ],
  "hashtags.description": [
    ""
  ],
  "hashtags.profile_url": [
    "https://www.tiktok.com/tag/hiking"
  ],
  "hashtags.cover_large": [
    ""
  ],
  "hashtags.cover_medium": [
    ""
  ],
  "hashtags.cover_thumb": [
    ""
  ],
  "mentions.user_id": [
    "7223456789012345678"
  ],
  "mentions.sec_uid": [
    ""
  ],
  "mentions.username": [
    "trailguide"
  ],
  "mentions.profile_url": [
    "https://www.tiktok.com/@trailguide"
  ],
  "mentions.start": [
    19
  ],
  "mentions.end": [
    30
  ],
  "is_photo": false,
  "is_ad": false,
  "is_aigc": false,
  "aigc_label_type": 0,
  "is_original_item": true,
  "is_official_item": false,
  "is_secret": false,
  "for_friends": false,
  "duet_enabled": false,
  "stitch_enabled": false,
  "share_enabled": true,
  "comments_enabled": true,
  "comment_status": 0,
  "collected": false,
  "diversification_labels": [
    "Travel",
    "Outdoors"
  ],
  "suggested_words": [
    "Hiking"
  ]
}
```

The table and JSON use the same flat keys, such as `statistics.views` and `author.username`. Hashtag and mention columns contain ordered lists: values at the same position within each group belong together.

A success row can contain empty strings, `0`, `false`, or empty lists where TikTok provides no value. These defaults do not prove that an omitted count or setting is zero or disabled. The current output keeps `subtitles` and `video.bitrates` empty, and `video.download_url` is an empty string. Failed rows retain `input` and `status` while the video-data fields are `null`.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Rules |
|---|---|---|---|
| `inputList` | array of strings | Yes | At least one full TikTok /@username/video/numeric-ID URL; no fixed batch-size maximum |

URLs must use HTTP or HTTPS on tiktok.com or one of its subdomains. A trailing slash and query parameters are allowed; the output URL is canonicalized. The username part must contain 1–24 letters, digits, periods, or underscores.

Valid URLs are deduplicated by video ID, including different links to the same video. Invalid entries are saved individually as failed rows. There is no search, profile-feed collection, or pagination setting.

### TikTok video use cases 🎯

#### Campaign performance

Join submitted campaign links with views, likes, shares, and saves to prepare a consistent performance report.

#### Creative review

Compare captions, clip duration, cover images, and music across selected videos before organizing them into a content library.

#### Creator context

Keep the creator's public identity and available audience figures beside each video, then enrich selected accounts with the profile Actor.

#### Repeatable reporting

Schedule the same link list and compare successive exports to follow changes in the metrics TikTok exposes.

### Pricing and billable video rows 💰

Check the Actor's **Pricing** tab for the current pricing model and rate.

Under dataset-item pricing, each saved success or failed row can be billable. Valid duplicate requests are processed once; invalid entries can each save a failed row. Automatic retries do not independently create extra dataset rows.

Hashtags, mentions, and music fields stay in the video row and do not create additional result rows.

### TikTok Video Details Scraper API and integrations 🔌

Use the Actor ID from the **API** tab as `$ACTOR_ID` and your Apify token as `$APIFY_TOKEN`.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.tiktok.com/@scout2015/video/6718335390845095173"]}'
```

The request starts a run. Retrieve its dataset after completion, or connect an Apify schedule and webhook to repeat collection and trigger downstream work. Export to JSON, CSV, or Excel, or send selected fields to Google Sheets, Make, Zapier, or your own application.

### Reliability and limits ⚠️

The Actor processes up to five video requests concurrently and retries temporary request failures. A wrong post type, unavailable post, or request that cannot be completed produces a failed result while other valid items can continue.

Private, removed, region-restricted, or embed-disabled videos may be inaccessible even when a link opens in a logged-in browser. TikTok may omit creator counts or post flags. Playback and cover URLs can expire, so do not treat them as permanent asset storage.

### Frequently asked questions ❓

#### Can I submit a TikTok short link?

No. Open the share link and copy the full /@username/video/ID address before submitting it.

#### Does this scrape every video from a profile?

No. It retrieves the specific video URLs in `inputList` and does not crawl a profile feed.

#### Will I get a transcript or subtitles?

No transcript is generated, and the current `subtitles` field is an empty list.

#### Is this a video downloader?

It returns a playback URL when available. It does not download files or provide a separate download URL.

#### Why do some counts show zero?

TikTok may omit a metric from the accessible response. The output uses zero for missing numeric values, so a zero is not always a confirmed measured count.

### Support, responsible use, and related actors 🛟

For help with a result, share the run ID and a safe public example input through the Actor's support channel. Keep tokens and other credentials out of support messages.

Use public data and media within the permissions and obligations that apply to your project, including privacy and copyright requirements.

# Actor input Schema

## `inputList` (type: `array`):

Add one full TikTok /video/ link per item. Numeric post IDs, short links and photo-post links are not accepted.

## Actor input object example

```json
{
  "inputList": [
    "https://www.tiktok.com/@scout2015/video/6718335390845095173"
  ]
}
```

# Actor output Schema

## `posts` (type: `string`):

One dataset row for every submitted TikTok video link.

# 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 = {
    "inputList": [
        "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/tiktok-video-details-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 = { "inputList": ["https://www.tiktok.com/@scout2015/video/6718335390845095173"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/tiktok-video-details-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 '{
  "inputList": [
    "https://www.tiktok.com/@scout2015/video/6718335390845095173"
  ]
}' |
apify call scrapingmonkey/tiktok-video-details-scraper --silent --output-dataset

```

## MCP server setup

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