# TikTok Search Scraper (`calm_builder/tiktok-search-scraper`) Actor

Search TikTok by keyword: videos, photo posts or creators with views, likes, shares, captions, hashtags, sound and full creator profiles. Far deeper than TikTok search, with related keywords, language, filters, sorting and transcripts. No login.

- **URL**: https://apify.com/calm_builder/tiktok-search-scraper.md
- **Developed by:** [Coder](https://apify.com/calm_builder) (community)
- **Stats:** 10 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 video scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## TikTok Search Scraper

Search TikTok by keyword and get videos, photo posts or creators as clean, structured data, fast.

Add keywords, choose what to search for, and export the results as JSON, CSV or Excel, or pull them through the Apify API. Results appear in your dataset while the run is still going.

### What This Actor Does

- Searches TikTok for **videos**, **photo posts** or **creators** by keyword
- Goes **far deeper than a normal TikTok search**, which stops after a few hundred results
- **Related keywords** (optional): also searches TikTok's own related searches, such as `pizza recipe dough` for `pizza recipe`
- **Language**: keep results from people searching in one language
- **Filters and sorting**: posted after a date, minimum likes or views, one post per creator, most liked, most viewed, newest
- Every video has **views, likes, comments, shares, saves**, caption, hashtags, sound, files and the **creator's profile**
- Creators come with their **full profile**: bio, bio link, follower and like counts, verified badge, category
- **Transcript** (optional): what is said in each video, from TikTok's captions or AI speech-to-text
- The related searches of every keyword are saved for **keyword research**, free of charge

### Best For

- Finding trending content and creators for a topic
- Influencer discovery and outreach lists
- Content research, competitor and campaign monitoring
- Keyword and trend research with TikTok's own related searches
- Building datasets for dashboards, CRM, BI or AI workflows

### Input

| Field                  | What it does                                                                          |
| ---------------------- | ------------------------------------------------------------------------------------- |
| `keywords`             | What to search for, one per row, e.g. `pizza recipe`. TikTok search links work too    |
| `searchType`           | `videos` (default), `photos` or `creators`                                            |
| `maxResultsPerKeyword` | How many results per keyword (default 100)                                            |
| `relatedKeywords`      | Also search TikTok's related searches to reach your maximum (default off)             |
| `language`             | `any` (default, most results) or a language such as `en`, `es`, `de`                  |
| `newerThan`            | Only posts after this date, e.g. `2026-09-01` or `30 days`                            |
| `minLikes`, `minViews` | Only posts with at least this many likes or views                                     |
| `oneVideoPerCreator`   | Keep only the first post of each creator                                              |
| `sortBy`               | `default` (TikTok's order), `mostLiked`, `mostViewed`, `mostShared`, `newest`, `oldest` |
| `includeTranscript`    | Add a `transcript` object to each video (default off, add-on price)                   |
| `aiTranscription`      | Use AI speech-to-text for videos without TikTok captions (default on, per audio minute) |
| `transcriptLanguage`   | Preferred caption / spoken language, or `auto` (default)                              |
| `includeSrt`           | Also add the transcript as SRT subtitles (default off)                                |

Filters, sorting and transcripts apply to videos and photo posts.

#### Example input

```json
{
  "keywords": ["pizza recipe", "skincare routine"],
  "searchType": "videos",
  "maxResultsPerKeyword": 500,
  "relatedKeywords": true,
  "language": "en",
  "minLikes": 1000,
  "sortBy": "mostLiked"
}
```

### Output

One table. For videos and photo posts there is one row per post; for creators, one row per account. `source.value` is your keyword, and `source.relatedKeyword` is filled when a row came from a related search. The table shows the most useful columns; every field is included when you export or use the API.

#### Video and photo post fields

| Field                                                   | Description                                               |
| ------------------------------------------------------- | --------------------------------------------------------- |
| `id`, `url`, `text`, `createdAt`                        | Post ID, link, caption and post date                      |
| `viewCount`, `likeCount`, `commentCount`, `shareCount`, `saveCount`, `repostCount` | Engagement counts            |
| `isPhotoPost`, `images`                                 | Photo posts and their images                              |
| `durationSeconds`, `width`, `height`, `definition`      | Video details                                             |
| `coverUrl`, `videoUrl`, `downloadUrl`                   | Cover image and video file links                          |
| `hashtags`, `mentions`                                  | Hashtags and mentioned accounts                           |
| `music`                                                 | Sound: title, author, original or not, links              |
| `author`                                                | The creator's profile and counts                          |
| `language`, `isAd`, `isSponsored`, `isAiGenerated`, `hasShopProduct` | Caption language and flags                   |
| `transcript`                                            | Only with **Include transcript**: `transcript` text, `hasSpeech`, `transcriptSource` (`tiktok_captions` or `ai`), `transcriptLanguage`, `wordCount`, timed `segments`, `audioMinutes` (AI only), optional `srt` |
| `source`                                                | Your keyword (`value`) and the related keyword (`relatedKeyword`) |
| `scrapedAt`                                             | When the row was collected                                |

#### Creator fields

| Field                                                   | Description                                   |
| ------------------------------------------------------- | --------------------------------------------- |
| `username`, `name`, `url`, `avatarUrl`                  | Account identity                              |
| `bio`, `bioLink`, `businessCategory`                    | Profile text, link in bio and category        |
| `followerCount`, `followingCount`, `likeCount`, `videoCount` | Counts                                   |
| `verified`, `isPrivate`, `createdAt`                    | Flags and account creation date               |
| `source`                                                | The keyword the creator was found by          |

#### Related keywords

The run's key-value store has a `RELATED_KEYWORDS` record with TikTok's related searches for every keyword, whether or not **Also search related keywords** is on:

```json
[{"keyword": "pizza recipe", "relatedKeywords": ["Easy pizza recipe with store-bought dough", "pizza recipe dough", "pizza oven"]}]
```

### How To Use

1. Add one or more keywords.
2. Choose **Videos**, **Photo posts** or **Creators**, and how many results per keyword.
3. Optionally turn on related keywords, pick a language, add filters or a sort order, or turn on transcripts.
4. Run the Actor and open the **Output** tab, export the results, or read them through the Apify API.

### Pricing

This Actor uses pay-per-event pricing, so you only pay for results you receive:

- **Video**: each video or photo post saved to your dataset
- **Profile**: each creator saved to your dataset
- **Transcript** (optional add-on): each video that gets a transcript
- **AI transcript minute** (optional add-on): each started minute of audio transcribed by AI, only for videos without TikTok captions
- **Actor start**: a small fee each time a run starts

Filters, sorting, language and related keywords are included at no extra cost. Videos with no speech are not charged for a transcript. Current prices for each Apify plan are shown on the Actor's Pricing tab.

If a run reaches the maximum cost you set for it, it stops cleanly and keeps everything collected so far.

#### Free plan

On the Apify free plan every feature is available to try, with smaller amounts per run: up to **3** keywords, **20** results per keyword and **10** minutes of AI transcription. Upgrade to a paid Apify plan to remove these limits.

### Best Practices

- For the most results, keep **Language** on **Any language** and turn on **Also search related keywords**.
- Filters apply to everything found for a keyword, so a strict filter (for example a high minimum of likes) can return fewer results than your maximum.
- With a sort order, results are collected first and the best ones returned, so the run takes a little longer than TikTok's order.
- Video file links expire after a while, so download files soon after the run if you need them.

### FAQ

#### How many results can I get per keyword?

Usually several hundred to a few thousand videos for popular keywords, far more than a normal TikTok search shows. With related keywords on, you can get more. Niche keywords have fewer results.

#### Why are some videos in other languages?

TikTok search returns videos from around the world. Pick a **Language** to keep results from people searching in it.

#### Can I search hashtags or profiles?

Use the TikTok Hashtag Scraper or TikTok Profile Scraper for those. This Actor searches keywords.

#### Do I get the country a video was posted from?

No. TikTok's public web data does not include it.

### Responsible Use

Only collect public data, and use it in line with TikTok's terms, data protection laws such as GDPR, and the rights of the people in the data.

### Troubleshooting

- **Fewer results than requested**: the keyword may be niche, or your filters strict. Turn on related keywords or loosen the filters.
- **No results**: check the spelling of the keyword, or try it in the TikTok app.
- **Something else**: open an issue on the Actor's Issues tab with your run link.

# Actor input Schema

## `keywords` (type: `array`):

What to search TikTok for, one per row, exactly as you would type it into the TikTok search bar. TikTok search page links work too.

Examples: `pizza recipe`, `skincare routine`, `marvel`

## `searchType` (type: `string`):

- **Videos**: matching videos (photo posts are left out)
- **Photo posts**: matching photo carousels
- **Creators**: matching accounts, each with its full profile

## `maxResultsPerKeyword` (type: `integer`):

How many videos, photo posts or creators to collect for each keyword. This Actor goes well past the few hundred results a normal TikTok search shows; turn on **related keywords** below for even more.

## `relatedKeywords` (type: `boolean`):

Also search TikTok's own related searches for each keyword (for example `pizza recipe dough` for `pizza recipe`) to reach your maximum. Their results count toward the keyword's maximum, and each row shows the related keyword it came from in `source.relatedKeyword`.

The related searches of every keyword are always saved in the run's key-value store as `RELATED_KEYWORDS`, free of charge.

## `language` (type: `string`):

**Any language** gives the most results. Pick a language to get results from people searching in it; videos whose caption is in another language are left out (videos without a detectable caption language are kept).

## `newerThan` (type: `string`):

Skip posts older than this date. Pick a date, or enter a relative period such as `7 days` or `3 months`.

## `minLikes` (type: `integer`):

Only keep posts with at least this many likes.

## `minViews` (type: `integer`):

Only keep posts with at least this many views.

## `oneVideoPerCreator` (type: `boolean`):

Keep only the first post of each creator, so one account cannot fill your results.

## `sortBy` (type: `string`):

With a sort order, everything found for a keyword is collected first, and the top results up to your maximum are returned. This takes longer than **TikTok's order**.

## `includeTranscript` (type: `boolean`):

Videos only. Add what is said in each video as a `transcript` object on its row: TikTok's captions when the video has them, else AI speech-to-text. A transcript is an add-on with its own price; AI transcripts are also charged per minute of audio. Videos without speech are not charged for it.

## `aiTranscription` (type: `boolean`):

Needs **Include transcript**. About half of TikTok videos have no captions. With this on, their speech is transcribed by AI, charged per minute of audio. With it off, only TikTok's captions are used.

## `transcriptLanguage` (type: `string`):

Needs **Include transcript**. **Detect automatically** works for most videos. Pick a language to get TikTok's captions in that language when the video has them (including TikTok's own translations), and to tell the AI which language is spoken, which helps with accents and videos that mix languages. Included at no extra cost.

## `includeSrt` (type: `boolean`):

Needs **Include transcript**. Also add the transcript as an SRT subtitle file (text field `srt`), ready for video editors and players. Included at no extra cost.

## Actor input object example

```json
{
  "keywords": [
    "pizza recipe"
  ],
  "searchType": "videos",
  "maxResultsPerKeyword": 100,
  "relatedKeywords": false,
  "language": "any",
  "oneVideoPerCreator": false,
  "sortBy": "default",
  "includeTranscript": false,
  "aiTranscription": true,
  "transcriptLanguage": "auto",
  "includeSrt": false
}
```

# Actor output Schema

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

No description

## `relatedKeywords` (type: `string`):

No description

# 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 = {
    "keywords": [
        "pizza recipe"
    ]
};

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

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

```

## MCP server setup

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