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

Tired of copying TikTok stats by hand? Paste any video URL and get captions, hashtags, views, likes, comments, shares, author and music data, plus watermark-free video downloads and transcripts. Export JSON, CSV or Excel. No login or cookies.

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

## Pricing

from $1.75 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

### What is TikTok Video Scraper?

TikTok Video Scraper is an Apify Actor that turns TikTok post URLs into structured data. This TikTok video scraper returns captions, hashtags, views, likes, comments, shares, author and music details, and can also download media and create transcripts. Results export as JSON, CSV or Excel, and you need no login.

- **Bulk input:** paste as many post URLs as you like, or link a `.txt` file with one URL per line.
- **Full media downloads:** save videos, cover images, slideshow images and music to your Apify storage.
- **Transcripts:** use TikTok's own subtitles or speech-to-text.
- **Related videos:** collect what TikTok recommends next to each post.
- **Photo posts too:** you can scrape TikTok photo posts, and their slideshow images can be saved.

Click **Try for free**, paste a post URL and press **Start**. You can use this TikTok scraper online, so there is nothing to install.

### What data can you extract from TikTok?

Wondering how to get TikTok video data without copying it by hand? Each result is one TikTok video metadata record, with the field names below. It holds views, likes, the caption, hashtags and details on the author and the sound. Export the dataset as JSON, CSV or Excel.

| Field | Description | Example |
|---|---|---|
| `id` | TikTok ID of the post | `7200360993149553925` |
| `text` | Caption text of the post, line breaks kept | `opening your inbox has never been this exciting 💕 #prague #startup #valentinesday ` |
| `textLanguage` | Language code TikTok detected for the caption | `en` |
| `createTime` / `createTimeISO` | Upload time as a unix timestamp and in ISO 8601 (UTC) | `1676464688` / `2023-02-15T12:38:08.000Z` |
| `webVideoUrl` | Link to the post on TikTok | `https://www.tiktok.com/@apifylife/video/7200360993149553925` |
| `playCount`, `diggCount`, `commentCount`, `shareCount`, `collectCount`, `repostCount` | Plays, likes, comments, shares, saves and reposts | `1501`, `155`, `1`, `2`, `1`, `0` |
| `likeCount` | Same as `diggCount` | `155` |
| `mentions` / `detailedMentions` | @usernames in the caption, and mentioned accounts with ID, name and profile URL | `["@bdtiktokofficial","@kalesalad"]` |
| `hashtags` | Hashtags in caption order with ID, name, description and cover when TikTok has them | |
| `authorMeta` / `author` | Author profile (name, nickname, avatar, bio, bio link, followers, following, likes, video count, verified, region) and a compact author object | |
| `musicMeta` / `music` | Sound used in the post (name, author, original or not, album, cover, play URL, duration, ID) and a compact music object | |
| `videoMeta` | Video size, duration, cover, quality, format, subtitle links and download links | |
| `videoUrl`, `mediaUrls`, `coverImg`, `slideshowImageLinks`, `images` | Links to the video, cover and slideshow images; stored copies when downloads are on | |
| `locationCreated`, `locationMeta`, `region` | Country code of the post, a tagged place if any, and region | `CZ` |
| `isSlideshow`, `isPinned`, `isSponsored`, `isAd`, `isMuted`, `isStory`, `hasTikTokShopProduct` | Post flags | `false` |
| `stickerTexts`, `diversificationLabels`, `effectStickers`, `anchors`, `suggestedWords` | On-screen sticker text, TikTok categories, effects used, attached links and suggested search words | `["moving week 📦","new office 📍🎊"]` |
| `duetEnabled`, `stitchEnabled`, `shareEnabled`, `canRepost`, `commentsDisabled`, `isPrivate`, `forFriendsOnly` | Permission and visibility flags | `true` / `false` |
| `transcript`, `transcriptText`, `transcriptLanguage`, `transcriptSource`, `transcriptSegments`, `transcriptWordCount`, `subtitles`, `whisper`, `subtitleMode` | Transcript in WebVTT with timestamps, plain text, language, source and subtitle details | `ASR`, `NEVER_DOWNLOAD_SUBTITLES` |
| `isRelatedVideo`, `relatedToVideoId`, `relatedViaVideoId`, `relatedDepth`, `relatedVideosScraped`, `originalVideoDetail` | Links each related video to the post it was found next to | `1` |
| `downloads` | Links to stored files: video, cover, music, slideshow images, subtitles, transcription | |
| `input`, `submittedVideoUrl`, `url`, `scrapedAt` | The input value, the URL you submitted, the post URL and collection time | |

The dataset also defines further fields, such as `isAiGenerated`, `textTranslatable`, `categoryType`, `takeDown` and `warnInfo`. Open the Output tab for the complete TikTok video information.

### Use cases for TikTok data

Teams use this TikTok data scraper for jobs like these:

- **Content analysis:** compare TikTok engagement metrics such as `playCount`, `diggCount`, `shareCount` and `collectCount` across posts. Run a list of posts through this TikTok analytics scraper and export the counts.
- **Reporting:** feed the counts into your own dashboards for TikTok video analytics.
- **Benchmarking:** line up TikTok video statistics from different accounts side by side.
- **Influencer research:** use author fields such as followers, likes and verified status for TikTok influencer research.
- **Hashtag and trend tracking:** collect TikTok hashtag data from `hashtags`, `mentions` and `diversificationLabels` to see how creators tag their posts.
- **Sound research:** use `musicMeta` for TikTok music data, such as which sounds are used in the posts you track.
- **Content archiving:** download videos, covers and slideshow images to your own storage, where the links do not expire like TikTok's own.
- **Transcript and caption research:** feed `transcriptText` into your own analysis tools.
- **Ad and sponsorship checks:** filter on flags such as `isAd` and `isSponsored`.

### How to scrape TikTok videos

The steps are short. You can run the TikTok video scraper online from the Apify Console, with no setup.

1. Create a free Apify account.
2. Open TikTok Video Scraper.
3. Add one or more post URLs to **TikTok video URLs** (`urls`). You can scrape TikTok videos by URL, and you can also paste short links or post IDs.
4. Switch on the options you need, such as related videos, downloads or subtitles.
5. Click **Start** and wait for the run to finish.
6. Download the dataset as JSON, CSV or Excel. To export TikTok video data to CSV, pick CSV in the Storage tab.

#### How to download TikTok video without watermark

Switch on **Download videos** (`shouldDownloadVideos`) and keep **Video download quality** (`videoDownloadQuality`) on `best`, which gives the highest quality without the TikTok watermark. `lowest` saves the smallest file and `original` saves TikTok's own watermarked file when TikTok offers it. Leave related videos and subtitles off if you only need a TikTok video downloader.

#### How to save covers, slideshow images and music

Switch on `shouldDownloadCovers` to download TikTok cover image files and `shouldDownloadMusic` to save the sound. For photo posts, switch on `shouldDownloadSlideshowImages` to download TikTok slideshow images. Files go to the key-value store you name in `videoKvStoreIdOrName`, or to the run's default storage. Downloads increase run time and storage use.

#### How to get a TikTok transcript

Set **Subtitles & transcription mode** (`downloadSubtitlesOptions`) to choose between four modes: `NEVER_DOWNLOAD_SUBTITLES`, `DOWNLOAD_SUBTITLES`, `DOWNLOAD_AND_TRANSCRIBE_VIDEOS_WITHOUT_SUBTITLES` and `TRANSCRIBE_ALL_VIDEOS`. TikTok subtitles are used when a video has them. For a quick TikTok transcript download, pick `DOWNLOAD_SUBTITLES` and optionally list languages in `subtitleLanguages`. Transcripts are saved as plain text (`transcriptText`) and as WebVTT (`transcript`). To transcribe the spoken audio instead, choose a mode that transcribes and set the model in `transcriptionModel` (`tiny`, `base`, `small`, `medium`, `large-v3` or `distil-large-v3`); it takes extra time per video. The `medium` and `distil-large-v3` models need 4 GB or more of run memory, and `large-v3` needs 8 GB or more, so raise the run memory before using them.

If transcripts are your main goal, [TikTok Transcript Scraper](https://apify.com/crawl_craft/tiktok-transcript-scraper) is built for them: it offers timestamped text, every subtitle language, AI speech-to-text and translation into 133 languages.

#### How to collect related videos

Turn on **Scrape related videos** (`scrapeRelatedVideos`) and set `resultsPerPage` to choose how many related videos to collect per post. Each related video is a separate result. Fields such as `relatedToVideoId` show which post it belongs to.

### How much does it cost to scrape TikTok?

TikTok Video Scraper uses tiered pay-per-event pricing: **$2.5 per 1,000 results on the Free plan, and less on paid plans**. The event is `main_result`, charged once per saved video result. Error rows for inputs that could not be scraped are not charged.

| Apify plan | Price per 1,000 results |
|---|---|
| Free | $2.5 |
| Bronze | $2.25 |
| Silver | $2 |
| Gold / Platinum / Diamond | $1.75 |

For example, 1,000 results cost $2.5 on the Free plan. Each run also has a small start charge of $0.00005 (the Actor Start event). The free plan lets you try the TikTok scraper free of charge: you get up to 10 results per run, and there is no monthly limit. Paid Apify plans have no per-run limit. See the Pricing tab for current rates, which always take priority over this page.

### Input

Only `urls` is required. It accepts full video or photo URLs, embed URLs, `vm.tiktok.com` and `vt.tiktok.com` short links, bare post IDs, or a link to a `.txt` file with one URL per line. That makes it a simple fit for anyone who needs a TikTok video link scraper: one link or a long list works.

![TikTok video scraper input form with TikTok video URLs](IMAGE_URL_PLACEHOLDER "tiktok-video-scraper-input-form.png")

See the Input tab for every option. Below is an example input:

```json
{
  "urls": [
    "https://www.tiktok.com/@apifylife/video/7200360993149553925"
  ],
  "scrapeRelatedVideos": false,
  "resultsPerPage": 10,
  "shouldDownloadVideos": false,
  "downloadSubtitlesOptions": "NEVER_DOWNLOAD_SUBTITLES",
  "videoKvStoreIdOrName": "tiktok-videos"
}
```

💡 Start with one or two URLs to test your settings. Free plan users get up to 10 results per run in total, including related videos.

Other options include `scrapeAuthorProfile` (full author profile details), `resolvePinnedStatus` (fills `isPinned`), `customMapFunction` (a Python function that reshapes each result), `maxConcurrency`, `maxRetries`, `requestDelaySecs`, `requestTimeoutSecs` and `proxyConfiguration`.

### Output

The scraped results are shown as a dataset in the **Storage** tab. The table view is for convenience and doesn't show **all the fields**. Each record holds the full TikTok video details for one post. The field `transcriptText` carries the TikTok transcript text without timestamps. The Output tab has views for overview, captions and hashtags, engagement, authors, music, video, subtitles and transcripts, related videos, downloads and errors.

![TikTok video data extractor output table with views, likes and hashtags](IMAGE_URL_PLACEHOLDER "tiktok-video-scraper-output-table.png")

Export formats: JSON, CSV and Excel.

Example output (values taken from the Actor's dataset schema, using the example input above; fields without a schema example are left out here):

```json
{
  "id": "7200360993149553925",
  "text": "opening your inbox has never been this exciting 💕 #prague #startup #valentinesday ",
  "textLanguage": "en",
  "createTime": 1676464688,
  "createTimeISO": "2023-02-15T12:38:08.000Z",
  "isMuted": false,
  "locationCreated": "CZ",
  "isAd": false,
  "hasTikTokShopProduct": false,
  "webVideoUrl": "https://www.tiktok.com/@apifylife/video/7200360993149553925",
  "diggCount": 155,
  "shareCount": 2,
  "playCount": 1501,
  "collectCount": 1,
  "commentCount": 1,
  "repostCount": 0,
  "mentions": ["@bdtiktokofficial", "@kalesalad"],
  "isSlideshow": false,
  "isPinned": false,
  "isSponsored": false,
  "input": "https://www.tiktok.com/@apifylife/video/7200360993149553925",
  "submittedVideoUrl": "https://www.tiktok.com/@apifylife/video/7200360993149553925",
  "stickerTexts": ["moving week 📦", "new office 📍🎊"],
  "diversificationLabels": ["Diary & VLOG", "Daily Life", "Lifestyle"]
}
```

#### Error row output

Inputs that cannot be scraped appear as error rows. Besides `id`, `url`, `input`, `submittedVideoUrl` and `scrapedAt`, they carry the fields below. This example shows an invalid input and only the fields that have a schema example:

```json
{
  "inputKind": "invalid",
  "error": "not a TikTok video/photo URL, short link or post id",
  "errorCode": "INVALID_URL",
  "invalidUrls": ["not-a-tiktok-url"]
}
```

### Limitations and error handling

- **Free plan cap:** free plan users get up to 10 results per run. Paid plans have no limit.
- **Public posts only:** private posts and private data cannot be scraped. Posts that are private, deleted or blocked in a region come back as error rows.
- **Error codes:** the `errorCode` field can be `NOT_FOUND`, `PRIVATE`, `REGION_BLOCKED`, `INVALID_URL`, `SHORT_URL_UNRESOLVED`, `URL_LIST_UNREADABLE` (a `.txt` URL list could not be read), `TIKTOK_ERROR` (TikTok returned another error status) or `FETCH_FAILED`. Error rows are not charged.
- **Comments are not collected:** `commentsDatasetUrl` is always `null`. You still get `commentCount`.
- **Always-empty fields:** `fromProfileSection`, `searchQuery`, `searchHashtag` and `searchMusic` are not used and are always `null`.
- **Downloads and transcription:** these add run time and storage use, and larger speech-to-text models need more memory.
- **Spend limit:** if you set a spend limit on the run, the Actor stops cleanly and keeps what it saved.

### Integrating TikTok Video Scraper with other apps

TikTok Video Scraper runs on Apify, so you can start it from the Apify API, schedule it, or trigger webhooks when a run finishes. The API tab has ready-made JavaScript, Python and CLI snippets, so you can call it as a TikTok scraper API from your own code. See [Apify integrations](https://docs.apify.com/platform/integrations) for apps you can connect. The output is structured, so other tools can read it directly.

### Other TikTok scrapers by crawl_craft

| Actor | What it extracts | When to use it |
|---|---|---|
| [TikTok User Search Scraper](https://apify.com/crawl_craft/tiktok-user-search-scraper) | Full creator profiles from a keyword search: username, bio, bio link, followers, likes, videos, verified, TikTok Shop and live status | Use it when you need to find creators by keyword, before you scrape their individual videos with TikTok Video Scraper. |
| [TikTok Transcript Scraper](https://apify.com/crawl_craft/tiktok-transcript-scraper) | Timestamped transcripts, every subtitle language, AI speech-to-text and translation into 133 languages | Use it when transcripts are the main goal rather than video statistics. |

### Is it legal to scrape TikTok?

TikTok Video Scraper only extracts data that users have made publicly available on TikTok and does not extract private data such as email addresses or location. Results may still contain personal data, so only collect it with a legitimate reason. Consider GDPR (Regulation (EU) 2016/679) and TikTok's terms, and consult a lawyer if you are unsure. Read Apify's posts on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/).

### ❓ FAQ

#### How much does it cost to use TikTok Video Scraper?

It costs $2.5 per 1,000 results on the Free plan and less on paid plans, on a pay-per-event basis. Free plan users get up to 10 results per run. See the Pricing tab for current rates.

#### Do I need a TikTok account or login?

No. You do not need to log in to TikTok, so this is a TikTok video scraper with no login. You only need an Apify account to run it.

#### How many TikTok videos can I scrape?

Free plan users get up to 10 results per run, counting related videos. Paid plans have no per-run limit. Run a small test first to confirm the output fits your needs.

#### Can I scrape private TikTok data?

No. Only public posts can be scraped, and private posts return an error row with the code `PRIVATE`.

#### How to scrape TikTok with Python?

Start a run through the Apify API from your own Python code and read the dataset afterwards. The API tab shows ready-made snippets, so you do not need a separate TikTok scraper Python package.

#### Can I get the video without the watermark?

Yes. Switch on **Download videos** and keep the quality on `best`. See the download section above.

#### Does it scrape TikTok comments?

No. It returns `commentCount`, but comments themselves are not collected.

#### Do I need proxies?

Proxy settings are optional. Leave the default if you are unsure.

#### Is there a TikTok scraper tool for people who do not code?

Yes. The Apify Console form is a TikTok video scraper tool that needs no code: paste your URLs, choose options and press **Start**.

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

Yes. A bulk TikTok video scraper run only needs a longer list: paste many URLs, or link a `.txt` file with one URL per line. Use `maxConcurrency` to set how many are processed in parallel.

### Your feedback

Found a bug or want a feature? Open a ticket in the Issues tab of this Actor. For a custom solution, email hello.crawlcraft@gmail.com.

# Actor input Schema

## `urls` (type: `array`):

One or more TikTok posts to scrape, one per line. Accepted: full video or photo URLs (https://www.tiktok.com/@user/video/123...), embed URLs, vm.tiktok.com / vt.tiktok.com short links, bare post IDs, or a link to a .txt file with one URL per line. Bulk input is supported: paste as many as you like. Free plan users get up to 10 results per run; paid plans have no limit.

## `scrapeRelatedVideos` (type: `boolean`):

Also collect the videos TikTok recommends next to each post. How many is set by the number of related videos per post below. Each related video is a separate result.

## `resultsPerPage` (type: `integer`):

How many related videos to collect for each post URL. Used only when Scrape related videos is on. Free plan users get up to 10 results per run in total (your posts plus their related videos); paid plans have no limit.

## `enrichRelatedVideos` (type: `boolean`):

On: every related video gets the same full details as your own posts (location, subtitles, complete stats). Off: related videos are saved faster with shorter details (full details are always loaded when downloads or subtitles are switched on).

## `shouldDownloadVideos` (type: `boolean`):

Save each video file to your Apify storage. The dataset field mediaUrls (and videoMeta.downloadAddr) then links to the stored copy, which does not expire like TikTok's own links. Increases run time and storage use.

## `videoDownloadQuality` (type: `string`):

Which version of the video to download. Best: highest quality without the TikTok watermark. Lowest: the smallest file (fastest). Original: TikTok's own Save video file with watermark when TikTok offers it; for videos where TikTok does not (or the creator turned downloads off), the Best quality file is saved instead.

## `shouldDownloadCovers` (type: `boolean`):

Save each post's cover image (thumbnail) to your Apify storage. Increases run time and storage use.

## `shouldDownloadSlideshowImages` (type: `boolean`):

Save every image of photo slideshow posts to your Apify storage. Increases run time and storage use.

## `shouldDownloadMusic` (type: `boolean`):

Save the sound used in each post (audio file) to your Apify storage.

## `videoKvStoreIdOrName` (type: `string`):

Name (or ID) of the key-value store where downloaded files go. Leave empty to use the run's default storage. A named store keeps your files until you delete it, so they are not removed by data retention. Letters, digits and hyphens only, no spaces.

## `downloadSubtitlesOptions` (type: `string`):

Choose how to handle subtitles. TikTok provides subtitles for some videos. Transcription turns the spoken audio of a video into text with a speech-to-text model; it takes extra time per video.

## `subtitleLanguages` (type: `array`):

Only keep subtitles in these languages, for example en or es (one per line). Leave empty to keep every language TikTok offers.

## `transcriptionModel` (type: `string`):

Model used when a video is transcribed. Bigger models are more accurate but slower. Medium and larger models need more memory: raise the run memory to 4 GB or more before using them.

## `transcriptionLanguage` (type: `string`):

Language spoken in the videos. Auto-detect works for most videos; pick a language when detection gets it wrong (for example very short or noisy clips).

## `shouldGetTranscript` (type: `boolean`):

Shortcut kept for compatibility: when on and the subtitles mode is 'Don't download subtitles', TikTok's subtitles are downloaded.

## `scrapeAuthorProfile` (type: `boolean`):

Add the author's profile details to every result: bio link, shop status, region, language and exact follower and like counts.

## `resolvePinnedStatus` (type: `boolean`):

Find out whether each video is pinned on its author's profile (field isPinned). When off, isPinned stays empty.

## `customMapFunction` (type: `string`):

Optional Python lambda or function that reshapes each result before it is saved, for example: lambda r: {'id': r\['id'], 'plays': r\['playCount']}. Return None to drop a result. Keys that also exist in the standard output must keep their type (for example author stays an object, playCount stays a number); use new key names for anything else. Leave empty to save results unchanged.

## `maxConcurrency` (type: `integer`):

How many post URLs (and related videos) are processed at the same time. Higher is faster.

## `maxRetries` (type: `integer`):

How many times a failed request is tried again before the video is reported as failed.

## `requestDelaySecs` (type: `number`):

Pause in seconds before each video lookup. Raise it for a slower, gentler pace.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for TikTok to answer one request.

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

Optional. Choose the proxy settings for your run. Leave the default if you are unsure.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@apifylife/video/7200360993149553925"
  ],
  "scrapeRelatedVideos": false,
  "resultsPerPage": 10,
  "enrichRelatedVideos": true,
  "shouldDownloadVideos": false,
  "videoDownloadQuality": "best",
  "shouldDownloadCovers": false,
  "shouldDownloadSlideshowImages": false,
  "shouldDownloadMusic": false,
  "videoKvStoreIdOrName": "tiktok-videos",
  "downloadSubtitlesOptions": "NEVER_DOWNLOAD_SUBTITLES",
  "subtitleLanguages": [
    "en",
    "es"
  ],
  "transcriptionModel": "base",
  "transcriptionLanguage": "auto",
  "shouldGetTranscript": false,
  "scrapeAuthorProfile": true,
  "resolvePinnedStatus": true,
  "maxConcurrency": 4,
  "maxRetries": 3,
  "requestDelaySecs": 0,
  "requestTimeoutSecs": 40,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per video with the key numbers.

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

Caption, language, hashtags, mentions and post flags.

## `engagement` (type: `string`):

Views, likes, comments, shares, saves and reposts.

## `authors` (type: `string`):

Who posted each video.

## `music` (type: `string`):

The sound used in each video.

## `video` (type: `string`):

Video size, length, quality and links.

## `transcripts` (type: `string`):

Transcript text and subtitle details per video.

## `related` (type: `string`):

Which input post each related video belongs to.

## `downloads` (type: `string`):

Links to the files stored in your Apify storage.

## `errors` (type: `string`):

Inputs that could not be scraped and why.

## `media` (type: `string`):

Downloaded videos, covers, slideshow images, music, subtitles and transcripts in the run's default key-value store (only when downloads or subtitles are switched on and no storage name is given).

## `videoFiles` (type: `string`):

Downloaded video files in the run's default storage (only when video downloads are on and no storage name is given).

## `coverFiles` (type: `string`):

Downloaded cover images in the run's default storage (only when cover downloads are on and no storage name is given).

## `musicFiles` (type: `string`):

Downloaded sound files in the run's default storage (only when music downloads are on and no storage name is given).

## `slideFiles` (type: `string`):

Downloaded photo-post images in the run's default storage (only when slideshow image downloads are on and no storage name is given).

## `subtitleFiles` (type: `string`):

Saved subtitle files in the run's default storage (only when subtitle downloads are on and no storage name is given).

## `transcriptionFiles` (type: `string`):

Saved speech-to-text transcripts in the run's default storage (only when transcription is on and no storage name is given).

# 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 = {
    "urls": [
        "https://www.tiktok.com/@apifylife/video/7200360993149553925"
    ],
    "resultsPerPage": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawl_craft/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 = {
    "urls": ["https://www.tiktok.com/@apifylife/video/7200360993149553925"],
    "resultsPerPage": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawl_craft/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 '{
  "urls": [
    "https://www.tiktok.com/@apifylife/video/7200360993149553925"
  ],
  "resultsPerPage": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawl_craft/tiktok-video-scraper --silent --output-dataset

```

## MCP server setup

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