# TikTok Keyword Suggestions Scraper — Autocomplete + Volume (`memo23/tiktok-suggestions-scraper`) Actor

Scrape TikTok autocomplete search suggestions for any seed keyword. A–Z & 0–9 expansion, recursive keyword trees, and true per-country results via proxy — every phrase scored by a volume proxy so in-demand terms rise to the top. Metadata: rank, hot-level, intent. JSON or CSV

- **URL**: https://apify.com/memo23/tiktok-suggestions-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, AI, Agents
- **Stats:** 31 total users, 7 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 tiktok suggestions

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

<h1 align="center">TikTok Keyword Suggestions Scraper 🔎</h1>

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/tiktok-suggestions-logo.png" alt="TikTok Keyword Suggestions Scraper" width="160"/>
</p>

Turn any seed keyword into hundreds of **ranked TikTok autocomplete suggestions** — the exact phrases real users see when they start typing in TikTok search. Built for TikTok SEO, content planning, trend discovery, and ad/keyword research.

Most "autocomplete dumps" hand you an unsorted list. This actor adds the three things that make it a real keyword tool:

- 📊 **Volume proxy** — a relative popularity score for every phrase (how many query variants surfaced it).
- 🌳 **Recursive keyword trees** — feed suggestions back in as seeds to mine the long tail several levels deep.
- 🌍 **Truly localized regions** — country-pinned residential exits, because TikTok localizes by IP, not by a query param (most tools get this wrong).

> Pure HTTP. No login, no token, no browser, no CAPTCHA solver.

***

### Why use this scraper?

- **Find what people actually search on TikTok** — autocomplete is TikTok telling you, in its own words, what its users type.
- **Rank by popularity, not just A–Z** — the volume proxy floats in-demand phrases to the top instead of dumping an unsorted list.
- **Scale one seed into hundreds** — A–Z / 0–9 expansion and recursive depth multiply each seed into a deep long-tail set.
- **Real per-country data** — pin an exit to each region and a US sweep and a DE sweep genuinely differ.
- **Cheap and fast** — a light public endpoint, fetched in parallel. Billed per suggestion.

***

### Overview

The actor outputs **one row per suggestion** (not one row per seed). Each row carries the phrase plus its ranking signals — volume proxy, TikTok's own rank, hot-level, e-commerce-intent, region, language, and the recursion depth it was found at. Run it with a single seed for a quick autocomplete pull, or with A–Z expansion + recursion across multiple regions for an exhaustive keyword map.

***

### Supported inputs

| You provide | The actor does |
|---|---|
| One or more **seed keywords** | Fetches TikTok autocomplete suggestions for each |
| **A–Z / 0–9 expansion** toggles | Appends each letter/digit → long-tail completions (~26× / 10× more ideas) |
| **Recursive depth** (0–3) | Feeds discovered suggestions back as new seeds → keyword tree |
| **Regions + languages** | Sweeps each locale; with Apify Proxy, each region is a real country-pinned exit |

***

### Use cases

| Audience | What they get |
|---|---|
| TikTok creators & SEO | The exact phrases to put in captions, hashtags, and on-screen text |
| Social & content marketers | Trend and niche discovery before a topic saturates |
| E-commerce / TikTok Shop | The `ecomIntent` flag highlights buying-intent suggestions |
| Performance / ads teams | Demand language for TikTok Ads targeting |
| Tool & dashboard builders | A cheap, fast suggestion feed to power your own product |

***

### How it works

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-tiktok-suggestions.png" alt="How it works" width="900"/>
</p>

1. Each seed is expanded into a set of query variants (the seed itself, plus optional A–Z / 0–9 suffixes), multiplied across the regions and languages you ask for.
2. All variants are fetched **in parallel** against TikTok's public autocomplete endpoint (`/api/search/general/sug/`).
3. Every returned phrase is aggregated: identical suggestions are merged, and a **volume proxy** counts how many distinct variants surfaced each — a relative popularity signal.
4. If recursive depth > 0, the discovered suggestions become the next round of seeds (bounded by a request budget).
5. Results are ranked per seed (volume proxy, then TikTok's own rank) and written one row per suggestion.

> **Note on regions:** TikTok localizes suggestions by **exit IP**, not by the `region` parameter. For genuinely different per-country results, enable **Apify Proxy (Residential)** — the actor then pins an exit to each region's country. Without a proxy, all regions reflect the run's own IP (still fine for a single locale).

***

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | string\[] | — (required) | Seed terms to get suggestions for |
| `expandAlphabet` | boolean | `false` | Append a–z to each seed for long-tail expansion |
| `expandNumbers` | boolean | `false` | Append 0–9 to each seed |
| `expansionDepth` | integer | `0` | Recursively re-seed from discovered suggestions (0–3) |
| `regions` | string\[] | `["US"]` | ISO country codes; real localization needs proxy (see above) |
| `languages` | string\[] | `["en"]` | Language codes for `app_language` |
| `maxSuggestionsPerKeyword` | integer | `0` | Cap per seed after ranking (0 = no cap) |
| `maxItems` | integer | `1000` | Hard cap on total rows (charging-aware) |
| `deduplicateSuggestions` | boolean | `false` | Collapse the same phrase across seeds into one row |
| `includeMetadata` | boolean | `true` | Include TikTok's rank / hot-level / e-comm-intent signals |
| `maxConcurrency` | integer | `10` | Simultaneous requests |
| `proxy` | object | off | Optional; enable for true multi-region |

#### Example input

```json
{
  "keywords": ["coffee", "matcha"],
  "expandAlphabet": true,
  "expansionDepth": 0,
  "regions": ["US"],
  "languages": ["en"],
  "maxItems": 1000
}
```

***

### Output overview

Every row is a single suggestion with its ranking signals. Rows are ordered by `rank` within each `seedKeyword` (1 = most popular by volume proxy). Export as JSON, CSV, Excel, or pull via the Apify API.

#### Output sample

```json
{
  "suggestion": "berlin nights cafe",
  "seedKeyword": "berlin cafe",
  "query": "berlin cafe",
  "region": "US",
  "language": "en",
  "rank": 1,
  "volumeProxy": 6,
  "tiktokRank": 0,
  "depth": 1,
  "surfacedByQueries": ["berlin cafe", "berlin cafe n", "berlin cafe s"],
  "source": "sug",
  "hotLevel": "0",
  "ecomIntent": "1",
  "groupId": "6943606858285580941",
  "scrapedAt": "2026-06-24T10:23:00.000Z"
}
```

#### Key output fields

| Field | Meaning |
|---|---|
| `suggestion` | The autocomplete phrase TikTok serves |
| `seedKeyword` | The seed it derives from |
| `query` | The exact query variant that surfaced it |
| `rank` | Rank within its seed (1 = top), by volume proxy |
| `volumeProxy` | How many query variants surfaced this phrase — relative popularity |
| `tiktokRank` | The position TikTok itself ranked it at (lower = higher) |
| `depth` | Recursion depth it was found at (0 = direct seed) |
| `hotLevel` / `ecomIntent` | TikTok's trending / buying-intent flags |
| `region` / `language` | Locale it was found in |
| `scrapedAt` | ISO timestamp |

***

### FAQ

**Does this need a TikTok login, API key, or token?**
No. It uses TikTok's public web autocomplete endpoint over plain HTTP.

**Is `volumeProxy` an exact search volume?**
No — it's a *relative* popularity signal (how many query variants surfaced the phrase). It's excellent for ranking ideas against each other, not a substitute for paid search-volume data.

**Why do all my regions return the same results?**
TikTok localizes by exit IP. Enable Apify Proxy (Residential) to pin each region to its country; otherwise all regions reflect the run's IP. See the note under *How it works*.

**How many suggestions per seed?**
TikTok returns up to ~10 per query. With A–Z expansion that becomes hundreds of long-tail ideas per seed; recursion deepens it further.

**Can I get suggestions in other languages?**
Yes — set `languages` (e.g. `["es","ar"]`). For the strongest localization, combine with a matching-country proxy.

**Will huge expansions run forever?**
No. A built-in request budget caps total fetches and logs when it truncates, so an A–Z + deep-recursion run stays bounded.

***

### Support

Questions, custom fields, or a tailored scraper? Email **muhamed.didovic@gmail.com** or open an issue on the actor's Issues tab. Issues are monitored and usually answered within a day.

***

### Additional services

Need this wired into a pipeline — scheduled runs, a webhook into your CRM/warehouse, a custom-shaped dataset, or a different platform's autocomplete? I build and maintain bespoke scrapers. Reach out at **muhamed.didovic@gmail.com**.

***

### Explore more scrapers

Browse the rest of the portfolio (Yelp, Airbnb, Expedia, Tours & Activities, and more) on the author's Apify page: **https://apify.com/memo23**

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/tiktok-suggestions-scraper`).

**Purpose:** Expand seed keywords into ranked TikTok autocomplete suggestions, each scored by a volume proxy (how many query variants surfaced it), with optional A–Z/recursive expansion and per-country sweeps.

**Minimal input:**

```json
{ "keywords": ["coffee"], "maxItems": 50 }
```

**Output:** one row per suggestion — suggestion, seedKeyword, query, region, language, rank, volumeProxy, tiktokRank, depth, surfacedByQueries, source, hotLevel, ecomIntent, groupId, scrapedAt.

**Behaviors an agent should know:**

- Always set `maxItems` (default 1000, charging-aware); `expandAlphabet`/`expandNumbers` multiply requests ~26× / 10× and `expansionDepth` (0–3) grows them exponentially.
- `regions` localizes by exit IP, not the parameter — paying runs are auto-routed through built-in country-pinned residential proxies; without a proxy all regions reflect the run's own IP.
- `deduplicateSuggestions` collapses a phrase surfaced by multiple seeds into one row (volume proxy summed); default keeps one row per (seed, suggestion).
- `includeMetadata` toggles the rank / hotLevel / ecomIntent / groupId fields.
- Billed per suggestion row emitted.

***

### ⚠️ Disclaimer

This Actor collects **publicly available** TikTok search-autocomplete data for legitimate research, SEO, and market-analysis purposes. It does not log in, bypass authentication, or access private or personal data. Use of this Actor must comply with TikTok's Terms of Service and all applicable laws including data-protection regulations (GDPR, CCPA, etc.). The Actor's authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading TikTok's infrastructure
- Not use scraped data to violate user privacy or terms
- Use the data in compliance with applicable jurisdictions
- Not republish scraped content in violation of copyright

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use. TikTok is a trademark of its respective owner; this Actor is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance Ltd.

***

### SEO Keywords

tiktok keyword tool, tiktok search suggestions, tiktok autocomplete scraper, tiktok seo keywords, tiktok keyword research, tiktok trending searches, tiktok content ideas, tiktok hashtag research, tiktok long-tail keywords, tiktok search api, tiktok keyword discovery, tiktok marketing tool, social media keyword research, tiktok shop keywords, tiktok ads keyword research, tiktok autocomplete api, keyword suggestions scraper, tiktok trends, apify tiktok scraper, tiktok json csv export

# Actor input Schema

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

One or more seed terms to fetch TikTok autocomplete suggestions for. Each seed is expanded into long-tail suggestions ranked by a relative volume proxy.

## `expandAlphabet` (type: `boolean`):

Append every letter a–z to each seed ("coffee a", "coffee b", …) to surface hundreds of long-tail completions per seed. Multiplies the request count ~26× — keep concurrency reasonable.

## `expandNumbers` (type: `boolean`):

Append every digit 0–9 to each seed. Useful for versioned or listicle terms ("top 5", "iphone 15").

## `expansionDepth` (type: `integer`):

Feed returned suggestions back in as new seeds, building a keyword tree. 0 = seeds only (default). 1–2 recommended; higher values grow the request count exponentially.

## `regions` (type: `array`):

ISO 2-letter country codes, e.g. US, GB, DE. TikTok localises suggestions by <b>exit IP</b>, not by this value — so the actor pins the proxy exit to each region's country for genuinely different per-country results (verified: a US sweep returns English, a JP sweep returns Japanese). <b>Paying users are auto-routed through premium country-pinned residential proxies</b> (no setup needed); free users can enable Apify Proxy below for the same. Without any proxy, regions are best-effort (reflect the run's IP). A suggestion appearing across many regions earns a higher volume proxy. Defaults to \["US"].

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

Language codes to query, e.g. en, es, ar. Defaults to \["en"].

## `maxSuggestionsPerKeyword` (type: `integer`):

Cap on suggestions returned per seed keyword, applied after ranking by volume proxy. 0 = no per-seed cap.

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

Hard cap on the total number of suggestion rows pushed to the dataset (charging-aware). Default 1000.

## `deduplicateSuggestions` (type: `boolean`):

When enabled, a suggestion surfaced by multiple seeds collapses into one row (volume proxy summed). When disabled (default), one row per (seed, suggestion) keeps full seed attribution.

## `includeMetadata` (type: `boolean`):

Include TikTok's raw per-suggestion signals: rank, hot level, e-commerce intent, source, group ID and language.

## `maxConcurrency` (type: `integer`):

Maximum simultaneous requests to TikTok. The endpoint is light, so 10–20 is safe.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "keywords": [
    "coffee",
    "vegan recipe"
  ],
  "expandAlphabet": false,
  "expandNumbers": false,
  "expansionDepth": 0,
  "regions": [
    "US"
  ],
  "languages": [
    "en"
  ],
  "maxSuggestionsPerKeyword": 0,
  "maxItems": 1000,
  "deduplicateSuggestions": false,
  "includeMetadata": true,
  "maxConcurrency": 10
}
```

# 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": [
        "coffee",
        "vegan recipe"
    ],
    "regions": [
        "US"
    ],
    "languages": [
        "en"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/tiktok-suggestions-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": [
        "coffee",
        "vegan recipe",
    ],
    "regions": ["US"],
    "languages": ["en"],
}

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Mluvd8FAKPdTNgnRB/builds/AT24Ga7fk0oNp2nOO/openapi.json
