# TikTok Search Insights Scraper: Topics, Content Gaps, Audience (`memo23/tiktok-search-insights-scraper`) Actor

Find what people search for on TikTok: search topics from Creator Search Insights with a popularity score, a 7-point trend, video count and a content-gap flag. Filter by category and language, add who searches (age, gender, country) and the top videos per topic. No login.

- **URL**: https://apify.com/memo23/tiktok-search-insights-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, SEO tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 search topics

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

## TikTok Search Insights Scraper: Topics, Content Gaps, Audience

See **what people search for on TikTok**. This Actor reads TikTok's Creator Search Insights and returns search topics with a popularity score, a 7-point trend, the number of videos that answer the search, and TikTok's own content-gap flag. On request it adds who is searching (age, gender, country) and the videos TikTok ranks for each topic.

### What it does

| Input | You get | Row type |
|-------|---------|----------|
| Nothing, or categories and languages | Search topics with popularity, trend, video count and content-gap flag | `topic` |
| `contentGapOnly` | Only topics many people search for and few videos answer | `topic` |
| `includeAudience` | The audience of each topic: shares by age group, gender and country | on the `topic` row |
| `includeVideos` | The videos TikTok ranks for each topic, with plays, likes, comments, shares, saves | `video` |

The dataset has **Topics** and **Videos** views.

### How It Works

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/4gwreSZReBjpBnPAV/records/how-it-works-tiktok-search-insights.png" alt="How the TikTok search insights scraper works" width="900" />
</p>

### Why this one

- **No login, no cookies, no proxy.** Creator Search Insights normally sits inside the TikTok app, behind an account.
- **Content gaps as data.** TikTok's own flag for searches with too few good answers, which is where a new video has room.
- **A trend on every topic.** Seven points of search popularity and a plain `rising`, `falling` or `flat`.
- **Who is searching.** Age, gender and country shares for each topic, over 7 days to 6 months.
- **Proof of what works.** The videos already ranking for a topic, with their numbers.
- **Six categories, twelve languages.** Combine them freely; a topic found under several filters is returned once.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `categories` | `string[]` | `Gaming`, `Fashion`, `Tourism`, `Science`, `Food`, `Sports`. Empty means all of TikTok. |
| `languages` | `string[]` | `en` (default), `es`, `pt`, `de`, `fr`, `id`, `vi`, `tr`, `ar`, `th`, `ja`, `ko`. |
| `contentGapOnly` | boolean | Only content-gap topics. |
| `maxTopicsPerFilter` | integer | Topics per category and language pair. Default 100, minimum 5. |
| `minPopularityScore` | integer | Keep topics at or above this score (0 to 100). |
| `includeAudience` / `audienceTimeRange` | boolean / string | Audience split for every topic. Range: `past_7_days`, `past_30_days` (default), `past_60_days`, `past_6_months`. |
| `includeVideos` / `maxVideosPerTopic` | boolean / integer | Top videos per topic. Default 20. |
| `maxItems` | integer | Cap on topic rows per run. Default 2,000. |

#### Example: content gaps in two niches

```json
{
  "categories": ["Food", "Tourism"],
  "languages": ["en"],
  "contentGapOnly": true,
  "maxTopicsPerFilter": 200
}
```

#### Example: strong topics with their audience

```json
{
  "categories": ["Fashion"],
  "languages": ["en", "es"],
  "minPopularityScore": 70,
  "includeAudience": true,
  "audienceTimeRange": "past_30_days"
}
```

#### Example: topics and the videos that rank for them

```json
{
  "categories": ["Gaming"],
  "maxTopicsPerFilter": 25,
  "includeVideos": true,
  "maxVideosPerTopic": 20
}
```

### Output

Topic:

```json
{
  "type": "topic",
  "topicId": "77053398",
  "topic": "Vatican city",
  "popularityScore": 81,
  "searchPopularity": 654865,
  "trendDirection": "rising",
  "trendScores": [80, 77, 82, 80, 79, 75, 81],
  "trendSearchPopularity": [542654, 383638, 732973, 591759, 472747, 309930, 654865],
  "videoCount": 1071,
  "isContentGap": true,
  "category": "Tourism",
  "subcategory": "Tourism Sites",
  "niche": "Historical & Cultural Tourism Sites",
  "language": "en",
  "categoryFilter": "Tourism",
  "searchUrl": "https://www.tiktok.com/search?q=Vatican%20city"
}
```

With `includeAudience` the row also carries:

```json
{
  "audience": {
    "timeRange": "past_30_days",
    "totalSearchPopularity": 426626,
    "topAgeGroup": "25-34",
    "topGender": "unknown",
    "topCountry": "United Kingdom",
    "age": [{ "group": "25-34", "searchPopularity": 51115, "share": 0.12 }],
    "gender": [{ "group": "male", "searchPopularity": 30409, "share": 0.062 }],
    "countries": [{ "group": "United Kingdom", "searchPopularity": 154346, "share": 0.393 }]
  }
}
```

Video:

```json
{
  "type": "video",
  "topicId": "77053398",
  "topic": "Vatican city",
  "videoId": "7685186001182002463",
  "url": "https://www.tiktok.com/@creator/video/7685186001182002463",
  "description": "What nobody tells you before visiting",
  "createdAt": "2026-09-14T00:46:58.000Z",
  "plays": 60088,
  "likes": 4837,
  "comments": 140,
  "shares": 195,
  "saves": 2845,
  "authorUsername": "creator",
  "authorFollowers": 12800
}
```

### Pricing

Pay per event. You pay for the rows you receive.

| Event | When | Price |
|-------|------|-------|
| Actor start | Once per run | $0.005 |
| Topic | Each search topic | $0.004 |
| Topic audience | Each topic delivered with an audience split | $0.004 |
| Video | Each video row | $0.002 |

1,000 topics cost $4, or $8 with their audience. Set a maximum cost per run in the run options and the Actor stops there with what it has.

### FAQ

**Do I need a TikTok account, cookies or a proxy?**
No.

**What do the two popularity numbers mean?**
`popularityScore` is TikTok's 0 to 100 score for the topic. `searchPopularity` is the larger figure TikTok shows behind it. Both are TikTok's own numbers; TikTok does not publish them as exact search counts, so use them to compare topics with each other.

**Can I look up a keyword of my own?**
No. TikTok exposes topics by category and language, not by keyword. Filter the result by `topic`, `category` or `niche` to find yours.

**How many topics can I get?**
One request brings up to 200 topics for a category and language, and repeated requests bring partly new ones. A category usually yields a few hundred before it stops returning new topics.

**Why are many audience groups "others" or "unknown"?**
That is how TikTok reports searchers whose age or gender it does not show. The shares are computed over everything TikTok returns, those groups included.

**Why does an English run contain topics in other languages?**
The language filter is TikTok's, and it sorts by the searcher's app language, not by the words of the search.

**Are the topics the same on every run?**
No. Scores are updated through the day and the set rotates. Schedule the run to track a niche over time.

### 🤖 For AI Agents & LLM Apps

**Purpose:** TikTok search topics with popularity, trend, content-gap flag, audience split and top videos, as structured JSON, with no login.

**Minimal input:** `{"categories": ["Food"], "maxTopicsPerFilter": 50}`

**Output:** rows with `type` = `topic` | `video`. Topics: topicId, topic, popularityScore, searchPopularity, trendDirection, trendScores, videoCount, isContentGap, category, subcategory, niche, language, searchUrl, and `audience` when requested. Videos: topicId, topic, videoId, url, description, plays, likes, comments, shares, saves, authorUsername.

**Behaviors to know:** topics cannot be requested by keyword. `maxItems` caps topic rows only. Per-source minimums are 5. Free-plan runs return up to 50 topics.

### ⚠️ Disclaimer

This Actor collects publicly available data only. It is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance. You are responsible for using the data in line with applicable laws and TikTok's terms.

### SEO Keywords

tiktok search insights scraper, tiktok creator search insights, tiktok keyword research, tiktok content gap finder, tiktok search topics, tiktok search volume, tiktok trending searches, tiktok seo tool, tiktok content ideas, tiktok niche research, tiktok search trends, tiktok audience demographics, tiktok keyword tool, what people search on tiktok

# Actor input Schema

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

Limit the topics to these categories. Leave empty for topics across all of TikTok.

## `languages` (type: `array`):

Languages of the searches. Default is English.

## `contentGapOnly` (type: `boolean`):

Return only topics TikTok marks as a content gap: many people search for them and few videos answer.

## `maxTopicsPerFilter` (type: `integer`):

Upper limit of topics for each category and language pair. One request brings up to 200; more are collected with further requests while they keep returning new topics.

## `minPopularityScore` (type: `integer`):

Keep only topics with at least this popularity score (0 to 100). 0 keeps all.

## `includeAudience` (type: `boolean`):

Adds who searches for each topic: the split by age group, gender and country with shares. One extra lookup per topic, billed as its own event when TikTok has the data.

## `audienceTimeRange` (type: `string`):

Period the audience split covers.

## `includeVideos` (type: `boolean`):

Also return the videos TikTok ranks for each topic, one row per video with plays, likes, comments, shares and saves.

## `maxVideosPerTopic` (type: `integer`):

Upper limit of videos for one topic. A page holds 20.

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

The run stops collecting topics when it reaches this number, across all filters. Video rows do not count toward it.

## Actor input object example

```json
{
  "languages": [
    "en"
  ],
  "contentGapOnly": false,
  "maxTopicsPerFilter": 100,
  "minPopularityScore": 0,
  "includeAudience": false,
  "audienceTimeRange": "past_30_days",
  "includeVideos": false,
  "maxVideosPerTopic": 20,
  "maxItems": 2000
}
```

# Actor output Schema

## `results` (type: `string`):

Rows told apart by `type`: `topic` and `video`.

# 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 = {
    "languages": [
        "en"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/tiktok-search-insights-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 = { "languages": ["en"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/tiktok-search-insights-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 '{
  "languages": [
    "en"
  ]
}' |
apify call memo23/tiktok-search-insights-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/tiktok-search-insights-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/UTnVn8BVLoEw2LKyq/builds/ftBK3F7BJjbhOKotO/openapi.json
