# TikTok Trending Videos Scraper (`maximedupre/tiktok-trending-scraper`) Actor

Collect TikTok videos trending in the US, Japan, Vietnam, Thailand, or Indonesia. Rank the trending list by views, engagement rate, or six-second view rate for the last 7 or 30 days. Each video includes its creator, sound, and link, and no TikTok login is needed.

- **URL**: https://apify.com/maximedupre/tiktok-trending-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Videos, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.65 / 1,000 trending videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### 📈 Find the TikTok videos trending in five countries

This TikTok trending scraper helps marketers, content creators, and social media researchers see which videos are trending on TikTok. Pick one or more markets. Each run saves the videos to an Apify dataset with their views, creators, sounds, and links, so you can compare what is popular across markets.

Use it to:

- Check the videos trending in a market you choose with **[TikTok trending videos by country](https://apify.com/maximedupre/tiktok-trending-scraper/examples/tiktok-trending-videos-by-country)**.
- Rank trending videos by engagement rate with **[TikTok engagement rate scraper](https://apify.com/maximedupre/tiktok-trending-scraper/examples/tiktok-engagement-rate-scraper)**.
- Collect videos from TikTok's For You feed in a market you choose with **[TikTok For You page scraper](https://apify.com/maximedupre/tiktok-trending-scraper/examples/tiktok-for-you-page-scraper)**.
- Narrow a trending list to one category, such as Beauty & Care, with **[TikTok trending beauty videos scraper](https://apify.com/maximedupre/tiktok-trending-scraper/examples/tiktok-trending-beauty-videos-scraper)**.
- Find the creators behind trending videos, with their handles and display names, using **[TikTok trending creators scraper](https://apify.com/maximedupre/tiktok-trending-scraper/examples/tiktok-trending-creators-scraper)**.
- Check the sound each trending video uses, including whether it is original audio, with **[TikTok trending sounds scraper](https://apify.com/maximedupre/tiktok-trending-scraper/examples/tiktok-trending-sounds-scraper)**.

#### 📊 What each video row includes

Each row is one TikTok video. Rows can include:

- The rank, market, video link, caption, cover image link, and post date.
- Views, likes, comments, shares, and saves.
- The creator's handle, display name, follower count, and verified status.
- The sound the video uses, and its hashtags.
- On trending lists: lifetime views (since the video was posted), plus organic views, engagement rate, and six-second view rate for the time window you chose. The most-liked viewer comments also appear when TikTok provides them.

TikTok does not show every detail for every video, so some fields are left out of a row.

#### ▶️ Run a trending video collection

1. Pick the markets you want: `US`, `JP`, `VN`, `TH`, or `ID`.
2. Pick **Find videos by** to choose a trending list or one of TikTok's feeds.
3. For a trending list, pick **Rank videos by**, **Time window**, and an optional **Category**.
4. Set **Maximum results** to stop early. The form starts at 20. Leave it empty to return all available results until the source is exhausted.
5. Start the run, then open the results from the run's Output tab.

#### ⚙️ Input

The form has seven fields. Only **Result type** is required, and it is set to `videos`. The other fields have defaults or are optional.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` (Result type) | string | The kind of data to collect. `videos` is the only option. |
| `markets` (Markets) | array of strings | Country codes to collect from: `US`, `JP`, `VN`, `TH`, or `ID`. Add more codes to collect from several markets in one run. A code outside this list stops the run from starting. Defaults to `US`. |
| `discoveryMethod` (Find videos by) | string | Where the videos come from. `trending-list` uses the videos TikTok ranks in each market. `for-you-feed` uses TikTok's For You feed. `explore-feed` uses TikTok's Explore trending feed. Defaults to `trending-list`. |
| `rankBy` (Rank videos by) | string | Trending lists only. Sets the order: `views`, `engagement-rate`, or `six-second-view-rate`. Defaults to `views`. Feed runs ignore it. |
| `timeWindow` (Time window) | string | Trending lists only. Sets the period the trends cover: `7-days` or `30-days`. Defaults to `7-days`. |
| `category` (Category) | string | Trending lists only. Optional. Keeps only videos in one category, such as `Beauty & Care`. Leave it empty to include every category. |
| `maxItems` (Maximum results) | integer | Optional. Stops the run after this many results. With several markets, the limit counts results from all of them together. The form starts at 20. Leave it empty to return all available results until the source is exhausted. On a trending list, TikTok shows only a few top videos for each market, sort order, and time window, so a higher limit may return fewer videos than you ask for. |

**Example input**

This is the default form input, with a limit of 20 results.

```json
{
  "resultType": "videos",
  "markets": [
    "US"
  ],
  "discoveryMethod": "trending-list",
  "rankBy": "views",
  "timeWindow": "7-days",
  "maxItems": 20
}
```

#### 🧾 Output

Each run saves one row for each video in a dataset. A video appears once per run, in the first market where the run found it. Later markets do not add another row.

The rows come in two shapes, depending on **Find videos by**. Trending list rows include the trend numbers, and top comments when TikTok provides them. Feed rows, from TikTok's feeds, leave the trend numbers and top comments out.

The Output tab shows an overview table with the rank, market, caption, views, and video link.

**Trending list rows**

| Field | Type | What it does |
| --- | --- | --- |
| `rank` | integer | Position of the video in its market's trending list, using the Rank videos by setting. |
| `market` | string | The country code where the run first found the video: `US`, `JP`, `VN`, `TH`, or `ID`. |
| `videoId` | string | TikTok's ID for the video. Use it to match this row with other data about the same video. |
| `videoUrl` | string | Link that opens the video on TikTok. |
| `caption` | string | The caption the creator wrote for the video. |
| `publishedAt` | string | When the video was posted on TikTok, as a date and time. |
| `coverImageUrl` | string | Link to the video's cover image. |
| `creator.handle` | string | The creator's TikTok username, without the @ sign. |
| `creator.displayName` | string | The name the creator shows on their profile. |
| `creator.followerCount` | integer | Number of followers the creator has. Left out when TikTok does not provide it. |
| `creator.isVerified` | boolean | `true` when TikTok shows the creator as verified. |
| `views` | integer | Views in the time window you chose, 7 or 30 days. |
| `lifetimeViews` | integer | Total views since the video was posted, as TikTok reports them. |
| `organicViews` | integer | Organic views in the time window you chose, as TikTok reports them. |
| `engagementRate` | number | Engagement rate TikTok reports for the time window, as a percentage. For example, `5.2` means 5.2%. |
| `sixSecondViewRate` | number | Six-second view rate TikTok reports for the time window, as a percentage. For example, `40` means 40%. |
| `durationSeconds` | integer | Length of the video in seconds. |
| `likes` | integer | Total likes TikTok reports on the video's page. |
| `comments` | integer | Total comments TikTok reports on the video's page. |
| `shares` | integer | Total shares TikTok reports on the video's page. |
| `saves` | integer | Total saves (bookmarks) TikTok reports on the video's page. |
| `hashtags` | array of strings | Hashtag names the video uses, without the # sign. Left out when TikTok does not provide them. |
| `sound.title` | string | Name of the sound or song the video uses. |
| `sound.artistName` | string | Artist or creator behind the sound, as TikTok shows it. |
| `sound.isOriginalAudio` | boolean | `true` when TikTok marks the sound as original audio. |
| `isAd` | boolean | `true` when TikTok labels the video as an ad. |
| `topComments` | array of objects | The most-liked viewer comments on the video, where TikTok provides them. Only top comments are included, not full comment threads. |
| `topComments.text` | string | Text of the comment. |
| `topComments.likes` | integer | Number of likes on the comment. |

**Example trending list row**

This is a real row from a US trending list run.

```json
{
  "rank": 1,
  "market": "US",
  "videoId": "7678774988710661407",
  "videoUrl": "https://www.tiktok.com/@guacamolly.com/video/7678774988710661407",
  "caption": "#mioPartner raise ur hand if ur bad at drinking water 🙋‍♀️🌟 I would be lost without my @mio to help me stay hydrated! lmk ya fav flavaaaaa",
  "publishedAt": "2026-08-27T18:09:03.000Z",
  "coverImageUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/owEOAfzINLEAfIPAIVIG1TeEQA7NApkSIqg9dj~tplv-tiktokx-origin.image?dr=9643&nonce=85488&refresh_token=da22ec2529cd0df0a5be9176a3fe1359&x-expires=1792760400&x-signature=hssoqSaBlwf9sDgZtpEh0kNtjuI%3D&idc=useast5&ps=13740610&shcp=89439a58&shp=c6b69ba0&t=4d5b0474",
  "creator": {
    "handle": "guacamolly.com",
    "displayName": "MOLLY FAYE",
    "followerCount": 1333125,
    "isVerified": false
  },
  "views": 14440580,
  "lifetimeViews": 84915901,
  "organicViews": 997560,
  "engagementRate": 0.037,
  "sixSecondViewRate": 0.977,
  "durationSeconds": 28,
  "likes": 37900,
  "comments": 117,
  "shares": 1003,
  "saves": 2360,
  "hashtags": [
    "miopartner"
  ],
  "sound": {
    "title": "original sound",
    "artistName": "MOLLY FAYE",
    "isOriginalAudio": true
  },
  "isAd": true,
  "topComments": [
    {
      "text": "girl i thought it was a vape💀",
      "likes": 790
    },
    {
      "text": "drink WATER, that is all",
      "likes": 93
    },
    {
      "text": "I ain’t ever seen that flavor mio before",
      "likes": 39
    },
    {
      "text": "Yesss !!!!!! I love mio ✨✨",
      "likes": 20
    },
    {
      "text": "My dumb ass thought you were shaking a vape 😭",
      "likes": 15
    },
    {
      "text": "mio!!! omg yes my roots fr",
      "likes": 13
    },
    {
      "text": "muscle memory",
      "likes": 11
    },
    {
      "text": "BIRTHDAY CAKE WATER",
      "likes": 7
    },
    {
      "text": "Northeastern omg",
      "likes": 6
    },
    {
      "text": "Mio is treated like a biohazard when getting thrown out byw",
      "likes": 6
    }
  ]
}
```

**Feed rows (TikTok feeds)**

| Field | Type | What it does |
| --- | --- | --- |
| `rank` | integer | Position of the video in the results for its market. When Maximum results is set, feed videos are ordered by view count. |
| `market` | string | The country code where the run first found the video: `US`, `JP`, `VN`, `TH`, or `ID`. |
| `videoId` | string | TikTok's ID for the video. Use it to match this row with other data about the same video. |
| `videoUrl` | string | Link that opens the video on TikTok. |
| `caption` | string | The caption the creator wrote for the video. |
| `publishedAt` | string | When the video was posted on TikTok, as a date and time. |
| `coverImageUrl` | string | Link to the video's cover image. |
| `creator.handle` | string | The creator's TikTok username, without the @ sign. |
| `creator.displayName` | string | The name the creator shows on their profile. |
| `creator.followerCount` | integer | Number of followers the creator has. Left out when TikTok does not provide it. |
| `creator.isVerified` | boolean | `true` when TikTok shows the creator as verified. |
| `views` | integer | The public view count TikTok shows on the video. |
| `durationSeconds` | integer | Length of the video in seconds. |
| `likes` | integer | Total likes TikTok reports on the video's page. |
| `comments` | integer | Total comments TikTok reports on the video's page. |
| `shares` | integer | Total shares TikTok reports on the video's page. |
| `saves` | integer | Total saves (bookmarks) TikTok reports on the video's page. |
| `hashtags` | array of strings | Hashtag names the video uses, without the # sign. Left out when TikTok does not provide them. |
| `sound.title` | string | Name of the sound or song the video uses. |
| `sound.artistName` | string | Artist or creator behind the sound, as TikTok shows it. |
| `sound.isOriginalAudio` | boolean | `true` when TikTok marks the sound as original audio. |
| `isAd` | boolean | `true` when TikTok labels the video as an ad. We have not yet verified this label for feed rows. |

Feed rows do not include the trend numbers or top comments.

**Example feed row**

This is a real row from a US For You feed run.

```json
{
  "rank": 3,
  "market": "US",
  "videoId": "7680966021896768799",
  "videoUrl": "https://www.tiktok.com/@xincam8/video/7680966021896768799",
  "caption": "#Cops #Police #Bodycam #Copsoftiktok #Viral",
  "publishedAt": "2026-09-02T15:51:35.000Z",
  "coverImageUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/o4YCvEfEvAmgqlWVQQBVRIAlaaIZFZEeD3aERY~tplv-tiktokx-origin.image?dr=9636&x-expires=1792328400&x-signature=VPQAM%2FdBGDPEAFCeq6uec2uYTbM%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
  "creator": {
    "handle": "xincam8",
    "displayName": "Anime Queen 🫅",
    "followerCount": 58900,
    "isVerified": false
  },
  "views": 43000000,
  "durationSeconds": 79,
  "likes": 1900000,
  "comments": 60300,
  "shares": 1200000,
  "saves": 286300,
  "hashtags": [
    "cops",
    "police",
    "bodycam",
    "copsoftiktok",
    "viral"
  ],
  "sound": {
    "title": "âm thanh gốc",
    "artistName": "Anime Queen 🫅",
    "isOriginalAudio": true
  },
  "isAd": false
}
```

#### 💳 Pricing

This Actor uses pay per event pricing. You pay $0.00065 for each TikTok video saved to the dataset. Set **Maximum results** to limit how many videos a run saves, and so how many charges it makes.

#### 🔌 Integrations

Results are saved to an Apify dataset. You can view them in Apify Console, download them as JSON, CSV, or Excel, or read them through the Apify API.

Watch this video on YouTube:

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Which countries can I collect videos from?

The Actor covers five markets: the US, Japan, Vietnam, Thailand, and Indonesia. Use the codes `US`, `JP`, `VN`, `TH`, or `ID`. Any other code stops the run from starting.

##### Why did my trending list run return fewer videos than my limit?

On a trending list, TikTok shows only a few top videos for each market, sort order, and time window. The run stops at what TikTok shows, so it can return fewer videos than your limit.

##### Why do feed rows have fewer fields than trending list rows?

The trend numbers (lifetime views, organic views, engagement rate, and six-second view rate) and the top comments come only from trending lists. Feed rows do not include them.

##### Why are some fields missing from my rows?

TikTok does not show every detail for every video. A field is left out of a row when TikTok does not provide it. Examples are follower count, hashtags, and top comments.

##### Does the Actor rank hashtags, sounds, or creators?

No. Each row shows the sound for that video and its hashtags when it has them. The Actor does not make separate rankings of hashtags, sounds, or creators.

##### Can it search TikTok by keyword or collect one creator's videos?

No. It collects trending lists and feeds by market. The Related Actors section lists Actors for keyword search and creator video collection.

##### Does it download the videos?

No. It gives you a link to each video's page on TikTok and a link to its cover image. It does not store video files.

##### Does it keep history or compare runs?

No. Each run is a snapshot of what the Actor found in that run.

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

No. The Actor runs without any TikTok login.

##### Can I use the Actor through an API?

Yes. You can start runs and read results through the Apify API, as you can with other Apify Actors.

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

The Actor collects public data without logging in. Before you use the data, check TikTok's terms of service and the laws that apply to you.

### 📝 Changelog

**v0.0** (16-10-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~tiktok-trending-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [TikTok Creative Center Scraper for Top Ads](https://apify.com/maximedupre/tiktok-creative-center-scraper): Compare ranked trending hashtags by market before you plan a post.
- [TikTok Hashtag Search Scraper](https://apify.com/maximedupre/tiktok-hashtag-search-scraper): Look up view and user counts for hashtags that match a keyword.
- [TikTok Search Scraper](https://apify.com/maximedupre/tiktok-search-results-scraper): Search public TikTok videos or creator profiles by keyword, which this Actor does not do.
- [TikTok Profile Videos API Scraper](https://apify.com/maximedupre/tiktok-profile-videos-api): Collect the public uploads from a creator you already know, which this Actor does not do.
- [TikTok Music Posts Scraper](https://apify.com/maximedupre/tiktok-music-posts-scraper): Find the posts that use a sound, to see how that sound is used across videos.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `resultType` (type: `string`):

Videos collects TikTok videos from the markets you pick, using the source you choose under Find videos by. Videos is the only option.

## `markets` (type: `array`):

Type a two-letter country code and press Enter. Add more codes to collect videos from several markets in one run. Valid codes: US (United States), JP (Japan), VN (Vietnam), TH (Thailand), and ID (Indonesia). A code outside this list stops the run from starting. If you leave this field out of an API run, the run uses the United States.

## `discoveryMethod` (type: `string`):

Trending list collects the videos TikTok ranks in each market. For You feed collects videos from TikTok's For You feed in each market. Explore feed collects videos from TikTok's Explore trending feed in each market.

## `rankBy` (type: `string`):

Trending list only. Sets the order of the trending video list. For You feed and Explore feed videos ignore it.

## `timeWindow` (type: `string`):

Trending list only. Sets the period the trends cover: the last 7 days or the last 30 days.

## `category` (type: `string`):

Optional. Choose one category to keep only results in that category. Trending list only. Leave empty to include every category.

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

Optional. Stops the run after this many results. With several markets, the limit counts results from all of them together. Leave empty to return all available results until the source is exhausted. With Find videos by set to Trending list, TikTok shows only a few top videos for each market, sort order, and time window. A higher limit may return fewer videos than you ask for.

## Actor input object example

```json
{
  "resultType": "videos",
  "markets": [
    "US"
  ],
  "discoveryMethod": "trending-list",
  "rankBy": "views",
  "timeWindow": "7-days",
  "maxItems": 20
}
```

# Actor output Schema

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

Open the videos as a table.

# 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 = {
    "resultType": "videos",
    "markets": [
        "US"
    ],
    "discoveryMethod": "trending-list",
    "rankBy": "views",
    "timeWindow": "7-days",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/tiktok-trending-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 = {
    "resultType": "videos",
    "markets": ["US"],
    "discoveryMethod": "trending-list",
    "rankBy": "views",
    "timeWindow": "7-days",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/tiktok-trending-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 '{
  "resultType": "videos",
  "markets": [
    "US"
  ],
  "discoveryMethod": "trending-list",
  "rankBy": "views",
  "timeWindow": "7-days",
  "maxItems": 20
}' |
apify call maximedupre/tiktok-trending-scraper --silent --output-dataset

```

## MCP server setup

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