# TikTok Explore/Trending Scraper (`crawlerbros/tiktok-explore-scraper`) Actor

Scrape TikTok's Explore/Trending feed across categories. Get the latest trending posts with full video metadata, engagement stats, and author info. Supports auto-discovery of all available categories.

- **URL**: https://apify.com/crawlerbros/tiktok-explore-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Social media, Videos, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

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

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

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

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

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## TikTok Explore Scraper

Scrape TikTok's Explore and trending feed to collect the most popular videos across one or more content categories. Category 123 ("All") is always available and works without login. An auto-discovery mode navigates the live Explore page to detect all available category IDs automatically.

### What this actor does

- Accepts a list of category objects (id + name) and paginates TikTok's Explore item list API for each one
- Returns full post rows enriched with `feedType`, `categoryId`, and `categoryName` so results from multiple categories can be distinguished
- Deduplicates posts that appear in more than one category so each video is emitted only once
- Supports an auto-discovery mode that navigates TikTok's Explore page and detects all available category IDs from the live UI
- Category 123 ("All") is the default and is always available without additional configuration
- Empty fields are omitted

### Output per post

- `feedType` — always `"explore"`
- `categoryId` — numeric TikTok category type ID
- `categoryName` — human-readable category label (e.g. "All", "Entertainment", "Sports")
- `postId` — unique TikTok video ID
- `postUrl` — direct URL to the video
- `caption` — full caption text
- `likeCount` — total likes
- `commentCount` — total comments
- `shareCount` — total shares
- `playCount` — total plays/views
- `author.id` — author's TikTok user ID
- `author.secUid` — author's secondary unique ID
- `author.username` — author handle
- `author.displayName` — author display name
- `author.verified` — verification status
- `author.avatarUrl` — author profile image URL
- `music.id` — sound ID
- `music.title` — sound title
- `music.authorName` — sound creator name
- `video.width` — video width in pixels
- `video.height` — video height in pixels
- `video.duration` — video duration in seconds
- `video.playUrl` — streamable video URL (expires)
- `video.cover` — cover/thumbnail image URL
- `hashtags` — array of hashtag names parsed from caption
- `scrapedAt` — ISO 8601 timestamp of when the record was collected

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `categories` | object[] | `[{"id": 123, "name": "All"}]` | Category objects with numeric `id` and human-readable `name`. |
| `maxItemsPerCategory` | integer | 50 | Maximum trending posts to collect per category (1–500). |
| `autoDiscoverCategories` | boolean | `false` | Navigate TikTok's Explore page to discover all available category IDs from the live UI. |

#### Example: default All-category feed

```json
{
  "categories": [{"id": 123, "name": "All"}],
  "maxItemsPerCategory": 10
}
````

#### Example: multiple specific categories

```json
{
  "categories": [
    {"id": 123, "name": "All"},
    {"id": 4, "name": "Entertainment"},
    {"id": 9, "name": "Sports"}
  ],
  "maxItemsPerCategory": 50
}
```

#### Example: auto-discover all categories

```json
{
  "categories": [],
  "autoDiscoverCategories": true,
  "maxItemsPerCategory": 30
}
```

#### Example: daily trend snapshot

```json
{
  "categories": [{"id": 123, "name": "All"}],
  "maxItemsPerCategory": 100
}
```

### Use cases

- **Trend analysts** monitoring which video formats and topics are surfacing on TikTok's Explore feed each day
- **Content strategists** identifying high-performing content styles across specific categories like Sports or Entertainment
- **Brand safety teams** reviewing what trending content is appearing alongside ad placements on Explore
- **Academic researchers** building time-series datasets of trending TikTok content for algorithmic studies
- **Media companies** benchmarking which creators and formats are being amplified by TikTok's discovery system
- **Developers** building trend dashboards or notification systems that surface breakout content early

### FAQ

**Q: What is category 123?**\
A: Category 123 is TikTok's "All" Explore feed — the default tab showing trending posts across all content types. It is always available and is the recommended starting point.

**Q: How do I find other category IDs?**\
A: Enable `autoDiscoverCategories: true`. The actor navigates TikTok's Explore page and records each tab's category ID. You can then hardcode those IDs for future runs without re-discovery.

**Q: Do posts get deduplicated across categories?**\
A: Yes. If the same video appears in multiple categories, it is only emitted once in the dataset.

**Q: How many posts can I get per category?**\
A: Up to 500 per category. TikTok's Explore API returns approximately 8 posts per page and the actor paginates automatically.

**Q: Do I need login or cookies?**\
A: No. TikTok's Explore feed is publicly accessible. The actor uses a stealth browser without any credentials.

**Q: Do video URLs expire?**\
A: Yes. TikTok signs all CDN URLs with short-lived tokens. Download or cache media promptly. The `mediaUrlExpiresAt` field indicates the expiry time.

**Q: Can I use this to monitor trending content over time?**\
A: Yes. Schedule this actor to run daily or hourly and use the `categoryId` and `scrapedAt` fields to track how trending content changes across sessions.

### Related TikTok Scrapers

Build a complete TikTok data pipeline with our full suite:

| Scraper | URL |
|---|---|
| TikTok Post Scraper | https://apify.com/crawlerbros/tiktok-post-scraper |
| TikTok Profile Scraper | https://apify.com/crawlerbros/tiktok-profile-scraper |
| TikTok Comments Scraper | https://apify.com/crawlerbros/tiktok-comments-scraper |
| TikTok Search Scraper | https://apify.com/crawlerbros/tiktok-search-scraper |
| TikTok Hashtag Scraper | https://apify.com/crawlerbros/tiktok-hashtag-scraper |
| TikTok Music Scraper | https://apify.com/crawlerbros/tiktok-music-scraper |
| TikTok Transcript Scraper | https://apify.com/crawlerbros/tiktok-transcript-scraper |
| TikTok Followers Scraper | https://apify.com/crawlerbros/tiktok-followers-scraper |
| TikTok Mention Scraper | https://apify.com/crawlerbros/tiktok-mention-scraper |
| TikTok Profile Mention Scraper | https://apify.com/crawlerbros/tiktok-profile-mention-scraper |
| TikTok Playlist Scraper | https://apify.com/crawlerbros/tiktok-playlist-scraper |
| TikTok For You Scraper | https://apify.com/crawlerbros/tiktok-for-you-scraper |
| TikTok Downloader | https://apify.com/crawlerbros/tiktok-downloader-api |
| TikTok Ads Library Scraper | https://apify.com/crawlerbros/tiktok-ads-library-scraper-pro |
| TikTok Top Ads Scraper | https://apify.com/crawlerbros/tiktok-top-ads-scraper |
| TikTok Hashtag Trends Scraper | https://apify.com/crawlerbros/tiktok-hashtag-trends-scraper |
| TikTok LIVE Scraper | https://apify.com/crawlerbros/tiktok-live-scraper |

# Actor input Schema

## `categories` (type: `array`):

Category IDs to explore. The 'All' category (id=123) is always available. Use autoDiscoverCategories=true to find additional category IDs from the live TikTok UI.

## `maxItemsPerCategory` (type: `integer`):

Maximum number of trending posts to collect per category.

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

Alias for maxItemsPerCategory. If both are set, maxItemsPerCategory takes precedence.

## `categoryId` (type: `integer`):

Shorthand: a single integer category ID. Maps to categories=\[{id: N}]. Use 123 for All.

## `autoDiscoverCategories` (type: `boolean`):

When enabled, navigates to TikTok's Explore page and clicks each category tab to discover all available category IDs from the live UI. Discovered categories are added to the categories list.

## Actor input object example

```json
{
  "categories": [
    {
      "id": 123,
      "name": "All"
    }
  ],
  "maxItemsPerCategory": 10,
  "autoDiscoverCategories": false
}
```

# Actor output Schema

## `data` (type: `string`):

Dataset of trending TikTok posts from the Explore feed. Each row is one post with full video metadata, author info, engagement stats, and explore context (feedType, categoryId, categoryName).

# 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 = {
    "categories": [
        {
            "id": 123,
            "name": "All"
        }
    ],
    "maxItemsPerCategory": 10,
    "autoDiscoverCategories": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/tiktok-explore-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 = {
    "categories": [{
            "id": 123,
            "name": "All",
        }],
    "maxItemsPerCategory": 10,
    "autoDiscoverCategories": False,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/tiktok-explore-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "categories": [
    {
      "id": 123,
      "name": "All"
    }
  ],
  "maxItemsPerCategory": 10,
  "autoDiscoverCategories": false
}' |
apify call crawlerbros/tiktok-explore-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Explore/Trending Scraper",
        "description": "Scrape TikTok's Explore/Trending feed across categories. Get the latest trending posts with full video metadata, engagement stats, and author info. Supports auto-discovery of all available categories.",
        "version": "1.0",
        "x-build-id": "m8XTbZeDWcHiNFM1N"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~tiktok-explore-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-tiktok-explore-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~tiktok-explore-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-tiktok-explore-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~tiktok-explore-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-tiktok-explore-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "Category IDs to explore. The 'All' category (id=123) is always available. Use autoDiscoverCategories=true to find additional category IDs from the live TikTok UI.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer",
                                    "title": "Category ID",
                                    "description": "Numeric TikTok category type ID (e.g. 123 for All)"
                                },
                                "name": {
                                    "type": "string",
                                    "title": "Category Name",
                                    "description": "Human-readable category label (e.g. All, Entertainment, Sports)"
                                }
                            }
                        },
                        "default": [
                            {
                                "id": 123,
                                "name": "All"
                            }
                        ]
                    },
                    "maxItemsPerCategory": {
                        "title": "Max Items Per Category",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of trending posts to collect per category.",
                        "default": 50
                    },
                    "maxItems": {
                        "title": "Max Items (alias)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Alias for maxItemsPerCategory. If both are set, maxItemsPerCategory takes precedence."
                    },
                    "categoryId": {
                        "title": "Category ID (shorthand)",
                        "type": "integer",
                        "description": "Shorthand: a single integer category ID. Maps to categories=[{id: N}]. Use 123 for All."
                    },
                    "autoDiscoverCategories": {
                        "title": "Auto-Discover Categories",
                        "type": "boolean",
                        "description": "When enabled, navigates to TikTok's Explore page and clicks each category tab to discover all available category IDs from the live UI. Discovered categories are added to the categories list.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
