# TikTok Data Extractor (`data_wiki/tiktok-data-extractor`) Actor

Collect TikTok videos from links, profiles, hashtags or keywords: views, likes, shares, music, comments and transcripts. No login needed. Great for trend research, influencer vetting and competitor tracking. Export to Excel or CSV.

- **URL**: https://apify.com/data_wiki/tiktok-data-extractor.md
- **Developed by:** [Data WiKi](https://apify.com/data_wiki) (community)
- **Stats:** 2 total users, 1 monthly users, 69.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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 Data Extractor?

TikTok Data Extractor is an Apify Actor that collects public TikTok videos from video links, profiles, hashtags and keyword searches in one run, with no login and no cookies. Each video comes back as one row with caption, plays, likes, shares, saves, author stats, music and cover links, plus optional top comments and transcripts, ready for JSON, CSV or Excel.

- **One list for everything:** mix a video link, `@mrbeast`, `#funny` and `funny cats` in the same run, like a TikTok scraper that takes many kinds of input at once.
- **Rows appear while the run is going:** each video is saved as soon as it is ready, so a stopped run keeps everything collected so far.
- **Output in tabs:** overview, engagement, authors, music, media, content, transcripts and source tabs, plus comments, profiles, hashtags and sources tables that are not billed.
- **Failures stay visible:** an input that cannot be collected gets its own row with an error code, and the other inputs carry on.
- **Connection changes on its own:** the run starts without a proxy and moves to another connection when TikTok stops answering.

The Actor runs in the cloud, so nothing is installed on your computer, and it reads only what a visitor without an account can see. Click **Try for free**, add an input and press **Start**.

### 📊 What data can you extract from TikTok?

You get one dataset row per video, and you can export the rows as JSON, CSV, Excel, XML or HTML. Read this way, the Actor works as a TikTok video data extractor for spreadsheets and databases. Field names below are the exact names in the dataset. TikTok leaves some values empty, so a field can be `null`.

| Field | Description | Example |
|---|---|---|
| `id`, `webVideoUrl` | Video id and link to the video | `7000000000000000001` |
| `text`, `textLanguage` | Caption and its language code | `"Penalty practice"`, `en` |
| `createTime`, `createTimeISO`, `scrapedAt` | Posting time (Unix and ISO) and collection time | `2026-01-01T12:00:00.000Z` |
| `isAd`, `isPinned`, `isPrivate` | Ad flag, pinned flag, private flag | `false` |
| `authorMeta` | Creator id, name, nickname, verified flag, bio (`signature`), `bioLink`, avatar, `fans`, `following`, `heart`, `video`, `digg`, `friends`, `region`, `accountCreatedISO` and more | `example_creator` |
| `musicMeta` | Sound name, author, original flag, album, duration, copyright and commerce flags, cover and play link | `Original sound` |
| `playCount`, `diggCount`, `commentCount`, `shareCount`, `collectCount`, `repostCount` | Plays, likes, comments, shares, saves and reposts | `50000`, `3000` |
| `engagement` | `totalInteractions`, `engagementRatePct`, `likeRatePct`, `commentRatePct`, `shareRatePct`, `saveRatePct`, `playsPerFollower` | `7.44` |
| `videoMeta` | Size, length, resolution, format, codec, bitrate, quality score, cover links, play and download links, caption languages | `720 x 1280` |
| `hashtags`, `mentions`, `detailedMentions` | Hashtags and mentions found in the caption | `["football"]` |
| `contentCategories`, `isAiGenerated`, `aiDescription` | Content categories and AI label | `[]`, `false` |
| `location`, `permissions` | Country code and place tag; duet, stitch, share, repost and comment settings | `"countryCode": "US"` |
| `isSlideshow`, `slideshowTitle`, `mediaUrls` | Slideshow flag, its title and image links | `false`, `[]` |
| `effectStickers`, `stickerTexts`, `anchors`, `playlistId` | Effects, sticker texts, anchors and playlist | `[]` |
| `transcript`, `comments`, `commentsError` | Transcript text and language, top-level comments, and the reason comments are missing | `null` |
| `hashtagMeta`, `searchQuery`, `sourceType`, `sourceInput`, `collectedVia` | Which input produced the row and how it was collected | `hashtag`, `#football` |
| `input`, `url`, `error`, `errorCode` | Only on failed inputs: the input, its link, a message and a code | `PROFILE_PRIVATE` |

The `authorMeta` object holds the creator's followers, following, total likes and video count, plus `bioLink` when the creator lists one. Together they give you the TikTok creator stats of each video's author. The `videoMeta` fields hold the TikTok video metadata of the clip: size, length and quality. Caption language, categories, AI label, place and permissions have their own fields.

Four extra tables sit next to the videos in the Output tab and are not billed:

- **Comments:** one row per comment with text, likes, `replyCount`, creator flags and the comment author, like the output of a TikTok comments scraper.
- **Profiles:** one row per profile you enter, with followers, following, total likes, videos, region and bio link, as a TikTok user data extractor table.
- **Hashtags:** one row per hashtag you enter with TikTok's video and view totals.
- **Sources:** one row per input with `status`, `videosSaved`, `error` and `errorCode`.

> ⚠️ The `comments` field and the comments table are filled only when **Comments per video** is above 0, and `transcript` only when transcripts are switched on.

### 💡 Use cases for TikTok data

- **Influencer shortlists:** sort the `authorMeta` followers, total likes and `engagementRatePct` of creators under a niche hashtag for TikTok influencer research.
- **Creator checks before outreach:** compare followers, plays and engagement rates of recent videos for TikTok influencer vetting, and read `authorMeta.bioLink` for contact links.
- **Hashtag discovery:** collect the videos under a few hashtags and read their `hashtags`, plays and music for TikTok hashtag research. The hashtags table adds TikTok's total views per hashtag.
- **Trend watching:** set **Posted after** to a few days and sort by `playCount` for TikTok trend research on the videos TikTok shows for a keyword.
- **Competitor profiles:** follow a brand's profile and its newest videos for TikTok competitor analysis, with plays, shares and saves side by side.
- **Content planning:** captions, `contentCategories`, music and `videoMeta.duration` of well-played videos feed TikTok content research for your next posts.
- **Performance reporting:** the `engagement` object gives the TikTok engagement rate of every video. Load the rows into a sheet for TikTok video analytics and compare `playsPerFollower` across creators.
- **Audience reactions:** collect top comments per video and score them for TikTok comment sentiment analysis, using the `likes` and `language` fields of the comments table.
- **Training data:** structured rows with captions, transcripts and comments make a TikTok dataset for classification, summaries or search.

### 🛠️ How to scrape TikTok videos

The Actor is a TikTok data scraper you run from the Apify Console in a few clicks.

1. Create a free Apify account and open TikTok Data Extractor in the Apify Store.
2. Add video links, profiles, hashtags, search links or keywords to **Links, profiles, hashtags or keywords**, one per line, to scrape TikTok videos from all of them at once.
3. Set **Max videos per profile, hashtag or search** (default 10) and, if you want, **Posted after** such as `7d`.
4. Set **Comments per video** (default 2) to scrape TikTok comments, and choose **Add transcripts** if you need the spoken words.
5. Click **Start** and follow the live log and the status message.
6. Open the **Output** tab, switch between the tabs and download the data as JSON, CSV or Excel.

> 💡 Start with one hashtag and the default of 10 videos to see the data, then raise the limits.
> 💡 To scrape TikTok profile videos, enter `@name` or the profile link.

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

TikTok Data Extractor uses pay per event pricing: you pay for each video saved to the dataset, plus a small start event per run. The price per video depends on your Apify plan tier, from $2.00 per 1,000 videos on the Free tier to $1.50 on Gold and above.

| Event | Name in the Pricing tab | Price |
|---|---|---|
| Video saved | `main_result` (result, primary event) | Free $0.002, Bronze $0.0018, Silver $0.0016, Gold, Platinum and Diamond $0.0015 per video |
| Run start | `apify-actor-start` (Actor Start) | $0.00005 per GB of memory; the Actor is set to 4,096 MB (4 GB), so 4 x $0.00005 = $0.0002 per run |

Apify platform usage (compute) is billed on top of the events above. Failed inputs and the comments, profiles, hashtags and sources tables are not billed.

| Plan tier | Price per video | Calculation | Per 1,000 videos |
|---|---|---|---|
| Free | $0.002 | 1,000 x $0.002 | $2.00 |
| Bronze | $0.0018 | 1,000 x $0.0018 | $1.80 |
| Silver | $0.0016 | 1,000 x $0.0016 | $1.60 |
| Gold, Platinum, Diamond | $0.0015 | 1,000 x $0.0015 | $1.50 |

Worked examples, event costs only:

- 100 videos on the Free tier: 100 x $0.002 = $0.20, plus $0.0002 start = $0.2002.
- 1,000 videos on the Bronze tier: 1,000 x $0.0018 = $1.80, plus $0.0002 start = $1.8002.
- 10,000 videos on the Gold tier: 10,000 x $0.0015 = $15.00, plus $0.0002 start = $15.0002.

If you set a maximum cost for a run, the Actor stops cleanly when the limit is reached and keeps the videos saved so far. See the Pricing tab for the current rates of your plan.

### ⬇️ Input

Only **Links, profiles, hashtags or keywords** (`urls`) is required, and the Input tab explains every field. An entry can be a TikTok video link, a profile (`@mrbeast` or a profile link), a hashtag (`#funny` or a tiktok.com/tag link), a TikTok search link or any plain keyword. Hashtag entries work like a TikTok hashtag scraper.

This example reads a hashtag and a keyword, keeps videos from the last 7 days, saves up to 5 per input, collects 2 comments per video and adds transcripts:

```json
{
  "urls": ["#football", "funny cats"],
  "resultsPerPage": 5,
  "oldestPostDateUnified": "7d",
  "commentsPerPost": 2,
  "downloadSubtitlesOptions": "DOWNLOAD_SUBTITLES",
  "proxyConfiguration": { "useApifyProxy": false }
}
```

- **Videos per input:** `resultsPerPage` (default 10, minimum 0) is the number of videos saved for every profile, hashtag and keyword. A video link always gives exactly that one video, which makes the Actor a TikTok video scraper for single clips. `0` means as many as TikTok shows without a login, which varies.
- **Comments:** `commentsPerPost` (default 2, minimum 0) is how many top-level comments to collect per video. `0` switches comments off, and TikTok may return fewer for videos with few comments.
- **Date filter:** `oldestPostDateUnified` keeps videos posted after a point. Use a number with `h`, `d`, `w`, `m` or `y` such as `24h`, `7d`, `2w`, `3m` or `1y`, or a date like `2026-01-31`. Leave it empty for no date filter.
- **Transcripts:** `downloadSubtitlesOptions` is `NEVER_DOWNLOAD_SUBTITLES` (default) or `DOWNLOAD_SUBTITLES`. Videos without TikTok captions keep an empty transcript. With the option on, the Actor acts as a TikTok transcript scraper for every video that has captions.
- **Proxy:** `proxyConfiguration` is optional. With no proxy selected, the Actor starts without one and switches to a proxy on its own if TikTok blocks the run. Pick a proxy there to start with it instead.

### ⬆️ Output

The scraped results are shown as a dataset in the **Storage** tab. The table view is for convenience and does not show **all the fields**. The Output tab offers the same rows as eight tabs (overview, engagement, authors, music, media, content, transcripts and source), next to the comments, profiles, hashtags and sources tables. The music tab shows the TikTok music data of each video: sound name, author and original flag.

You can download the data as JSON, CSV, Excel, XML or HTML and pick the fields before exporting. To export TikTok comments to Excel, open the comments table and choose Excel. The `transcripts` tab downloads the same way for a TikTok transcript download.

The example below is illustrative: the values are made up to show the structure and are not from a real run. It continues the input above.

```json
{
  "id": "7000000000000000001",
  "text": "Penalty practice #football #training",
  "textLanguage": "en",
  "createTime": 1767268800,
  "createTimeISO": "2026-01-01T12:00:00.000Z",
  "isAd": false,
  "authorMeta": {
    "id": "6000000000000000001",
    "name": "example_creator",
    "profileUrl": "https://www.tiktok.com/@example_creator",
    "nickName": "Example Creator",
    "verified": false,
    "fans": 20000,
    "following": 150,
    "heart": 900000,
    "video": 320
  },
  "musicMeta": { "musicName": "Original sound", "musicAuthor": "example_creator", "musicOriginal": true },
  "webVideoUrl": "https://www.tiktok.com/@example_creator/video/7000000000000000001",
  "diggCount": 3000,
  "shareCount": 200,
  "playCount": 50000,
  "collectCount": 400,
  "commentCount": 120,
  "hashtags": [{ "id": "1", "name": "football" }, { "id": "2", "name": "training" }],
  "isSlideshow": false,
  "engagement": {
    "totalInteractions": 3720,
    "engagementRatePct": 7.44,
    "likeRatePct": 6,
    "commentRatePct": 0.24,
    "shareRatePct": 0.4,
    "saveRatePct": 0.8,
    "playsPerFollower": 2.5
  },
  "transcript": { "language": "eng-US", "source": "auto-captions (original speech)", "text": "Here is how to take a penalty." },
  "comments": [
    { "id": "8000000000000000001", "text": "Great tips", "likes": 12, "replyCount": 0, "author": { "name": "example_fan" } }
  ],
  "sourceType": "hashtag",
  "sourceInput": "#football",
  "collectedVia": "hashtag feed",
  "scrapedAt": "2026-01-02T08:00:00.000Z"
}
```

A failed input gets a row like this one, and `Sources` records the same message:

```json
{
  "input": "@example_private",
  "url": "https://www.tiktok.com/@example_private",
  "sourceType": "profile",
  "error": "@example_private is a private account - videos are not visible logged-out",
  "errorCode": "PROFILE_PRIVATE"
}
```

### ⚠️ Limitations and error handling

- **Public data only:** private accounts and private videos are not available, and the Actor reads nothing behind a login.
- **Partial feeds:** TikTok shows people without an account only part of a hashtag, search or profile, so some inputs return fewer videos than **Max videos per profile, hashtag or search**. Run a small test to see how many you get.
- **Comments:** only top-level comments are collected, and the number of replies is in `replyCount`. TikTok may return fewer comments than you asked for.
- **Transcripts:** a transcript exists only for videos that have TikTok captions. Other videos keep an empty transcript, and the caption languages are always listed in `videoMeta.subtitleLanguages`.
- **Expiring links:** play and download links in `videoMeta` and `musicMeta` can expire after a while, so download files soon after the run.
- **Slideshows:** a slideshow post returns its images as TikTok slideshow data in `mediaUrls` and `slideshowTitle`.
- **Empty values:** TikTok does not provide every field for every video, so some fields stay `null`.
- **Stops:** a run ends cleanly when your spending limit is reached and keeps the videos saved so far; the log and status message say so.

A failed input is saved as a row with `error` and `errorCode`, and the other inputs carry on:

| `errorCode` | Meaning | What to do |
|---|---|---|
| `POST_NOT_FOUND`, `POST_NOT_FOUND_OR_PRIVATE` | The video was removed, is private or cannot be shown | Check the link in a browser |
| `POST_PRIVATE` | The video is private | Nothing, private videos are not available |
| `POST_REGION_BLOCKED` | TikTok does not show the video in the region of the connection | Choose a proxy in another country |
| `FETCH_FAILED` | The page could not be read | Run again later or choose a proxy |
| `NOT_FOUND` | The profile or hashtag does not exist | Check the spelling |
| `PROFILE_PRIVATE` | The account is private | Nothing, its videos are not visible |
| `PROFILE_EMPTY` | The profile has no public videos | Nothing |
| `PROFILE_UNAVAILABLE`, `PROFILE_FEED_UNAVAILABLE` | The profile or its video list could not be read | Run again later or choose a proxy |
| `HASHTAG_FEED_UNAVAILABLE`, `NO_TRENDING_FOR_HASHTAG` | TikTok returned no videos for the hashtag | Try another hashtag or run again later |
| `SEARCH_UNAVAILABLE`, `SEARCH_QUERY_NOT_FOUND` | TikTok returned no videos for the keyword | Try another keyword or run again later |
| `FILTER_NO_PASS` | Videos were found but none passed **Posted after** | Use a longer period |
| `INVALID_INPUT` | The entry is not a video link, profile, hashtag, search link or keyword | Correct the entry |
| `INVALID_URLS` | A short link could not be resolved or does not lead to a video or profile | Use the full TikTok link |
| `MUSIC_NOT_FOUND` | A TikTok sound link returned no videos | Check the link or run again later |
| `BLOCKED` | TikTok kept refusing the connection | Choose a proxy and run again |
| `PARSE_ERROR`, `UNEXPECTED_ERROR` | A video or input could not be processed | Run again; open an issue if it repeats |

The **Sources** table shows one `status` per input: `done`, `failed`, `stopped` or `skipped`. The run itself fails with a clear status message when **Posted after** or another number is not valid, when no input is given, or when no video could be collected from any input.

### 🔌 Integrating TikTok Data Extractor with other apps

You can start the Actor from the Apify API, run it on a schedule and connect it to other tools through webhooks and integrations. The API tab of the Actor shows ready-made JavaScript, Python and CLI calls, and the [Apify API reference](https://docs.apify.com/api/v2) describes how to start runs and read datasets. Called this way, it is a TikTok scraper API that takes the input as JSON and returns the dataset. It is not an official TikTok API.

- Send results to Google Sheets, Slack, Make, Zapier, Airbyte and more through the [Apify integrations](https://docs.apify.com/integrations).
- Use [Apify schedules](https://docs.apify.com/actors/running/schedules) to run the same inputs daily or weekly.
- Add a [webhook](https://docs.apify.com/integrations/webhooks) to react when a run finishes.
- Let AI agents run the Actor through the [Apify MCP server](https://docs.apify.com/mcp).

#### Run it again and again

Schedule the Actor with the same profiles or hashtags and set **Posted after** to match the interval, for example `7d` for a weekly run. Each run is a separate dataset, so you can compare plays and followers from one run to the next to track competitors yourself in a TikTok competitor tracker sheet. Pass the rows on to a sheet or dashboard for your own reports.

### 🔗 Other social media scrapers by data_wiki

| Actor | What it extracts | When to use it |
|---|---|---|
| [TikTok Shop product search scraper](https://apify.com/data_wiki/tiktok-shop-search-scraper) | TikTok Shop products by keyword with units sold, prices, reviews and sellers | When you need shop products, not videos |
| [Instagram reels by hashtag scraper](https://apify.com/data_wiki/instagram-hashtag-scraper) | Public Instagram reels by hashtag or keyword | When your hashtag research also covers Instagram |
| [Douyin keyword and hashtag search scraper](https://apify.com/data_wiki/douyin-search-scraper) | Douyin videos by keyword, hashtag or link | When you follow short videos on Douyin, the Chinese app |
| [Douyin creator profile scraper](https://apify.com/data_wiki/douyin-profile-scraper-followers-posts-hashtags) | Public Douyin creator profiles with followers and posts | When you compare creators on Douyin |
| [Pinterest keyword search](https://apify.com/data_wiki/pinterest-search-scraper) | Pins, boards, creators and related searches for any keyword | Your keyword research also covers Pinterest, not only TikTok videos |
| [Tripadvisor reviews dataset](https://apify.com/data_wiki/tripadvisor-review-scraper) | Review rows with stars, text, trip type and place details | After spotting a destination trend, to read what visitors say about places there |

The data in this Actor comes from public pages of [TikTok](https://www.tiktok.com). New to Apify? The [Apify documentation](https://docs.apify.com/platform) explains runs, datasets and schedules.

### ⚖️ Is it legal to scrape TikTok?

TikTok Data Extractor only extracts data that users have made publicly available on TikTok and does not extract private data. Results can still contain personal data, such as usernames, captions and comments, so collect it only for a legitimate reason. Whether your use is allowed depends on TikTok's terms and on privacy laws such as GDPR and CCPA, and you are responsible for following them and for keeping request volumes reasonable. Consult a lawyer if you are unsure. Apify explains the topic in [is web scraping 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 does TikTok Data Extractor work?

You give it video links, profiles, hashtags, search links or keywords. The Actor recognises each entry, reads the public videos, adds the comments and transcripts you switch on, and saves each video to the dataset as soon as it is ready. Entries that fail get an error row.

#### Do I need a TikTok account or API key?

No. You need no TikTok account, no cookies and no TikTok API key. It works as a TikTok scraper no login required, because only what a visitor without an account can see is returned.

#### How much does it cost?

You pay per video saved, at the price of your Apify plan tier, plus the start event of $0.0002 per run at 4,096 MB. 1,000 videos cost $2.00 on the Free tier and $1.50 on Gold, before Apify platform usage. See the pricing section for the full table.

#### How many videos can I get from one hashtag or search?

Up to the number you set in **Max videos per profile, hashtag or search**. TikTok shows people without an account only part of a hashtag or search, so some inputs return fewer. Add more hashtags or keywords to collect more.

#### Can I scrape private accounts or videos?

No. A private profile returns a row with the code `PROFILE_PRIVATE`, and a private video returns `POST_PRIVATE`.

#### Can I get comments and replies?

You get top-level comments up to **Comments per video**. Replies are not collected, but each comment has a `replyCount`. Add one video link per entry for a run that is only about comments. The comments table then works as a TikTok comment exporter for a sheet. You can download TikTok comments from it as JSON, CSV or Excel.

#### Why is a transcript empty?

Transcripts exist only for videos that have TikTok captions. The Actor adds the text and its language when captions exist. Switch on **Add transcripts** and the Actor works as a TikTok transcript extractor for the videos you list.

#### Do I need a proxy?

No. Proxy settings are optional, and the Actor switches to a proxy on its own when TikTok stops answering. You can pick a proxy in the input to start with it.

#### Can I look up a profile or hashtag on its own?

Yes. Enter `@name` for a TikTok profile scraper run that saves the creator's latest videos and a profile row. The profile row holds the public TikTok profile stats. Enter `#tag` to save the hashtag's videos and a hashtag row with TikTok's totals. With several tags you get a TikTok hashtag video list for each of them.

#### Can I search TikTok by keyword?

Yes. Any plain entry such as `funny cats` is searched like a TikTok search scraper would, and each video row records the phrase in `searchQuery`.

#### Can I use TikTok Data Extractor through MCP?

Yes. The Apify MCP server at `https://mcp.apify.com` lets AI agents find Actors, read their details and run them, so an agent can start TikTok Data Extractor like any other Actor.

#### Is it legal to scrape TikTok data?

The Actor reads only public data, but you stay responsible for how you use it. See the legality section above for GDPR, terms of use and when to ask a lawyer.

### 💬 Your feedback

Found a bug or need another field? Open an issue on the Actor's Issues tab. Need a custom solution? Contact hello.datawiki@gmail.com.

# Changelog

This Actor's version history is a separate document: https://apify.com/data_wiki/tiktok-data-extractor/changelog.md

# Actor input Schema

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

One entry per line. Paste a TikTok video link, a profile (@mrbeast or a profile link), a hashtag (#funny or a tiktok.com/tag link), a TikTok search link, or any plain keyword such as funny cats to search videos. Mix them freely and add as many as you like – each one is collected in turn.

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

Maximum number of videos saved for every profile, hashtag and keyword. Video links always give exactly that one video. 0 = as many as TikTok shows without a login (it varies).

## `commentsPerPost` (type: `integer`):

How many top-level comments to collect for every video. 0 = no comments. TikTok may return fewer for videos with few comments.

## `oldestPostDateUnified` (type: `string`):

Only keep videos posted after this point. Use a period: a number with h (hours), d (days), w (weeks), m (months) or y (years), e.g. 7d, or a date like 2026-01-31. Leave empty for no date filter.

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

Choose whether to add the transcript text (and its language) to every video that has TikTok captions. Videos without captions keep an empty transcript. Caption languages are always listed in the video details, whatever you pick here.

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

Leave on no proxy for the automatic mode: if TikTok blocks the run it moves to a datacenter proxy, then to a residential proxy, and keeps that for the rest of the run. Pick a proxy here to start with it instead.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@chunniuc/video/7553309587378539831",
    "@mrbeast",
    "#funny",
    "funny cats"
  ],
  "resultsPerPage": 10,
  "commentsPerPost": 10,
  "oldestPostDateUnified": "7d",
  "downloadSubtitlesOptions": "NEVER_DOWNLOAD_SUBTITLES",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

The main facts of every video, plus failed inputs.

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

Plays, likes, comments, shares, saves and engagement rates.

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

Who posted each video, with profile stats.

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

The sound used in each video.

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

Video size, length, quality, cover images and media links.

## `content` (type: `string`):

Caption, hashtags, mentions, categories, AI label, location and permissions.

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

Spoken words of each video (when transcripts are on and TikTok has captions).

## `source` (type: `string`):

Which input produced each video and how it was collected.

## `comments` (type: `string`):

One row per collected comment.

## `profiles` (type: `string`):

One row per profile input with public stats.

## `hashtags` (type: `string`):

One row per hashtag input with TikTok totals.

## `sources` (type: `string`):

One row per input with the run result.

# 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": [
        "#football",
        "funny cats"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_wiki/tiktok-data-extractor").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": [
        "#football",
        "funny cats",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("data_wiki/tiktok-data-extractor").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": [
    "#football",
    "funny cats"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call data_wiki/tiktok-data-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_wiki/tiktok-data-extractor"
        }
    }
}
```

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/T6SAbEdYMPxDaruC0/builds/ubPdVDbsxMRYMVXel/openapi.json
