TikTok Discover Scraper With Search Suggestions avatar

TikTok Discover Scraper With Search Suggestions

Pricing

from $4.99 / 1,000 results

Go to Apify Store
TikTok Discover Scraper With Search Suggestions

TikTok Discover Scraper With Search Suggestions

TikTok Discover Scraper extracts public discovery data, including trending searches, search suggestions, keywords, hashtags, creators, and related content. Analyze emerging topics and search trends to uncover content opportunities, audience interests, and viral trends.

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

Share

TikTok Search Suggestions Scraper — Keywords & Videos as JSON

TikTok Search Suggestions Scraper turns one seed term into the exact phrases TikTok's own search box offers, in rank order and tagged with TikTok's own language code, plus — in the same run — the TikTok videos that seed surfaces in search. Suggestion rows and video rows both come back as one typed, normalized JSON schema: no HTML, no selectors, nothing to parse before an agent, a spreadsheet or a data pipeline can use it. Read on for every input, every output field, and exactly how far past TikTok's 8-phrase cap the alphabet expansion goes.


What is TikTok Search Suggestions Scraper?

TikTok Search Suggestions Scraper is a keyword-research tool for TikTok's own autocomplete box. Give it a seed term and it returns the phrases TikTok's search suggestion surface offers for that term, each carrying a rank position, TikTok's own language tag, the tokenised query and a stable group ID. On the same run it can also pull the companion TikTok videos that same seed surfaces in search. No TikTok account, login or cookie is used anywhere in a run — not on the keyless request path, and not on the Playwright-driven browser transport reserved for the two signature-gated video and account surfaces.

  • 🔤 Turn a seed term into ranked TikTok search suggestions, with language tag, query tokens and a stable groupId
  • 🔠 Push past TikTok's hard 8-phrase cap with optional a–z / 0–9 expansion
  • 🎬 Pull the companion TikTok videos that same seed surfaces in search
  • 📤 Export as JSON, CSV, Excel or XML straight from the Apify dataset
  • 🛡️ No proxy setup required by default — the run starts direct and escalates only if TikTok pushes back

What data does TikTok Search Suggestions Scraper collect?

Every run can return up to three kinds of row: search-suggestion rows, TikTok video rows, and the creator and sound metadata carried inside each video row.

Data TypeKey FieldsJSON Field Names
Search suggestionssuggested phrase, rank in the box, language tag, stable de-dup IDsuggestion.term, suggestion.position, suggestion.language, suggestion.groupId
TikTok videoscaption, creation time, engagement stats, media URLtext, createTimeISO, diggCount, playCount, mediaUrls
Creator & sound metadata (nested in video rows)author handle, follower count, sound title and authorauthorMeta.name, authorMeta.fans, musicMeta.musicName, musicMeta.musicAuthor

Need more TikTok data?

If keyword and video data from search isn't the whole job, API Empire also publishes TikTok Hashtag Scraper With Sticker Text & Language for hashtag-driven video feeds with on-screen text and caption-language fields, and TikTok Profile Videos API Scraper With Playlist Details for pulling a known creator's own video catalogue and playlists. Run this Actor first to find the phrase and the videos ranking for it, then hand the hashtags or handles it surfaces to either of those Actors to go deeper.


Why not build this yourself?

TikTok's suggestion and video-search surfaces are not a stable, documented public API — they are the same internal endpoints the TikTok web app calls, and two of them actively resist a plain HTTP client. /api/search/general/full/ (videos) and /api/search/user/full/ (accounts) answer HTTP 200 with a zero-byte body to any curl-style request, even one carrying valid session cookies — only a signed request produced by a loaded, script-patched browser page returns real data. A WAF challenge page also answers HTTP 200, so a DIY scraper that only checks status codes will run green while silently returning nothing.

Keeping a scraper like this working means maintaining a keyless HTTP client for the suggestion endpoint, a signature-aware headless-browser transport for the video and account endpoints, a proxy-escalation ladder that only steps up when a request is actually blocked (never on status code alone), and retry logic that will not re-scrape and double-charge rows that already pushed successfully. That is a standing engineering commitment, not a one-off script — and it is the maintenance burden this Actor already carries for you.


Why do developers and teams scrape TikTok?

For AI engineers and agent builders

Feed a brand or product seed term into an agent's tool loop and get back TikTok's own autocomplete phrases — suggestion.term, suggestion.language and the stable suggestion.groupId — as typed JSON ready to drop into a vector store or a RAG index, with no HTML to parse first. An agent can chain a suggestion lookup ahead of a content-generation step, using the ranked phrases as the seed list for a keyword-expansion tool, then call this Actor again on each expanded phrase to keep building the graph.

For marketers and brand teams

Turn a single product or brand seed into the long-tail phrases TikTok's search box is already suggesting to users, complete with TikTok's own language tag so a global team can see which markets are asking about a topic. Turning on alphabet expansion surfaces phrases behind the platform's 8-result cap, giving a content calendar more raw material than a single manual search ever would, while the companion video rows show which existing videos already rank for that seed.

For researchers and analysts

Every suggestion and video row here comes from TikTok's own public, logged-out search surfaces, so a researcher can track how the autocomplete box for a topic shifts over time by re-running the same seed and diffing on suggestion.groupId, TikTok's own stable identifier for a phrase. No account, consent flow, or private data is touched — the scope is limited to what a visitor typing the same term into the search bar would see.

For developers building data products

A keyword-research product built on this Actor can call it through the Apify API on a schedule, storing suggestion.term, suggestion.position and suggestion.language per seed over time to build a TikTok search-trend feature without operating a browser fleet, a proxy pool or a block-detection layer directly. maxSuggestionsPerSeed puts a hard, predictable ceiling on how many charged rows a single scheduled seed can emit, which matters when a schedule runs unattended.


How to scrape TikTok (step by step)

  1. Open TikTok Search Suggestions Scraper on its Apify Store listing and click Try for free.
  2. Add one or more terms to 🌱 Seed terms to research (startUrls) — the only required input.
  3. Decide what comes back: leave 🔤 Suggestion rows only off for suggestions plus videos, or turn it on for a keyword-only run, and set a language filter or a per-seed cap if you want a bounded, predictable row count.
  4. Click Save & Start and let the run finish.
  5. Open Storage → Dataset and export the results as JSON, CSV, Excel or XML, or read them straight from the Apify API.

What to do when TikTok changes its structure

TikTok's search and suggestion endpoints are actively maintained targets, and this Actor is maintained against them. When TikTok changes a payload shape, the fix lands here and the dataset's field names and types stay the same on your end — no pipeline rewrite required on your side. No specific turnaround time is promised.


⬇️ Input

TikTok Search Suggestions Scraper takes 8 parameters, defined in the Actor's published input schema. Only startUrls is required.

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarray of stringsPlain search terms work best — protein powder, skincare, phonk. Also accepted: a hashtag with or without #, and a TikTok URL (a search?q= link, a /tag/<name> link or an @handle link) — the term or handle is extracted from it.["protein powder", "skincare"]
suggestionsOnlyNoboolean, default falseON → keyword-research mode: suggestion rows only, no browser at all. Fastest and cheapest run. OFF → you also get video rows for each seed, capped by maxItems.true
expandWithAlphabetNoboolean, default falseFires up to 37 lookups per seed instead of 1, and a single seed can emit a few hundred charged rows. Leave off for a quick look; turn on for a long-tail keyword list.false
expansionCharsetNostring, enum, default "az09"Only used when expandWithAlphabet is on. az09 (a–z and 0–9 — 36 extra lookups, widest), az (a–z only — 26 extra lookups), 09 (0–9 only — 10 extra lookups, fastest)."az09"
maxSuggestionsPerSeedNointeger, 0–2000, default 0Hard stop on how many suggestion rows one seed may emit, applied after de-duplication and after the language filter. 0 means no cap.100
suggestionLanguagesNoarray of stringsTikTok's own two-letter language tag on each phrase, e.g. en, my, it, ms. Leave empty to keep every language.["en"]
maxItemsNointeger, 0–500, default 10How many TikTok videos to pull for each seed from the keyword search feed. 0 means no cap from you — the run still stops at the platform's own limit.10
proxyConfigurationNoobject, proxy editorTurn on Apify Proxy here if you already know you need a specific proxy group up front.{ "useApifyProxy": false }

Example input, every parameter shown:

{
"startUrls": ["protein powder", "skincare", "https://www.tiktok.com/search?q=phonk"],
"suggestionsOnly": false,
"expandWithAlphabet": true,
"expansionCharset": "az",
"maxSuggestionsPerSeed": 200,
"suggestionLanguages": ["en"],
"maxItems": 25,
"proxyConfiguration": { "useApifyProxy": false }
}

The most common input mistake is turning on expandWithAlphabet for a long startUrls list without also setting maxSuggestionsPerSeed — every phrase and every video row is charged at the same rate, so an uncapped expansion across many seeds is the fastest way to run up an unexpectedly large bill.


⬆️ Output

Every run writes typed, normalized rows to one Apify dataset with a single, stable shape shared by suggestion rows and video rows — fields that don't apply to a given row type are null or [], never a fabricated value. Export as JSON, CSV, Excel or XML, or read the dataset over the Apify API. The default dataset view surfaces 14 columns for the suggestion fields; the full row carries considerably more, all documented below.

Scraped search suggestion

{
"hashtag": "protein powder",
"count": 1,
"rowType": "suggestion",
"suggestion": {
"term": "protein powder for women",
"normalizedTerm": "protein powder for women",
"position": 2,
"groupId": "7229384712983746561",
"source": "sug",
"language": "en",
"tokens": ["protein", "powder", "for", "women"],
"isPersonalized": false,
"recallReason": "sug",
"searchUrl": "https://www.tiktok.com/search?q=protein+powder+for+women",
"seed": "protein powder",
"seedSuffix": null,
"matchedQuery": "protein powder"
},
"scrapedAt": "2026-07-29T12:00:00Z",
"runId": "a1B2c3D4e5F6g7H8",
"statsExact": null,
"id": null,
"text": null,
"createTime": null,
"createTimeISO": null,
"isAd": null,
"isMuted": null,
"authorMeta": { "id": null, "name": null, "nickName": null, "verified": null, "signature": null, "bioLink": null, "avatar": null, "privateAccount": null, "following": null, "fans": null, "heart": null, "video": null, "digg": null },
"musicMeta": { "musicName": null, "musicAuthor": null, "musicOriginal": null, "musicAlbum": null, "playUrl": null, "coverMediumUrl": null, "musicId": null },
"webVideoUrl": null,
"mediaUrls": [],
"videoMeta": { "height": null, "width": null, "duration": null, "coverUrl": null, "originalCoverUrl": null, "definition": null, "format": null, "originalDownloadAddr": null, "downloadAddr": null, "subtitleUrls": [], "slideshowImages": [] },
"diggCount": null,
"shareCount": null,
"playCount": null,
"collectCount": null,
"commentCount": null,
"mentions": [],
"hashtags": [],
"effectStickers": [],
"isSlideshow": null,
"isPinned": null,
"input": "protein powder",
"discoveryInfo": { "breadcrumbs": [], "relatedTags": [], "url": "https://www.tiktok.com/search?q=protein+powder+for+women", "tag": "protein powder", "type": "suggestion" }
}

suggestion.term, suggestion.position, suggestion.language, suggestion.groupId, suggestion.normalizedTerm, suggestion.source, suggestion.tokens, suggestion.isPersonalized, suggestion.recallReason, suggestion.searchUrl, suggestion.seed, suggestion.seedSuffix and suggestion.matchedQuery are the fields that actually vary on a suggestion row. Every other key above is the same video-row field kept present and null so the dataset stays one shape.

Scraped video

{
"hashtag": "protein powder",
"count": 2,
"id": "7614464525332516118",
"text": "High protein pizza bowl meal prep, ready in 20 minutes #mealprep #highproteinmeals",
"createTime": 1772880681,
"createTimeISO": "2026-03-05T09:44:41Z",
"isAd": false,
"isMuted": false,
"authorMeta": {
"id": "6873734221858341889",
"name": "balancewithnu",
"nickName": "Nu | Meal Prep + Cooking",
"verified": false,
"signature": "high protein, low effort meals",
"bioLink": null,
"avatar": "https://p16-sign.tiktokcdn-us.com/....jpeg",
"privateAccount": false,
"following": 202,
"fans": 49642,
"heart": 812000,
"video": 317,
"digg": 1204
},
"musicMeta": {
"musicName": "original sound",
"musicAuthor": "balancewithnu",
"musicOriginal": true,
"musicAlbum": "",
"playUrl": "https://sf16-....mp3",
"coverMediumUrl": "https://p16-....jpeg",
"musicId": "7210909845497580000"
},
"webVideoUrl": "https://www.tiktok.com/@balancewithnu/video/7614464525332516118",
"mediaUrls": ["https://v16m-....mp4"],
"videoMeta": {
"height": 1024,
"width": 576,
"duration": 18,
"coverUrl": "https://p16-....jpeg",
"originalCoverUrl": "https://p16-....jpeg",
"definition": "540p",
"format": "mp4",
"originalDownloadAddr": "https://v16m-....mp4",
"downloadAddr": "https://v16m-....mp4",
"subtitleUrls": [],
"slideshowImages": [],
"playAddr": "https://v16m-....mp4"
},
"diggCount": 784,
"shareCount": 124,
"playCount": 21634,
"collectCount": 340,
"commentCount": 9,
"mentions": [],
"hashtags": [{ "id": "228", "name": "mealprep", "title": "", "cover": "" }],
"effectStickers": [],
"isSlideshow": false,
"isPinned": false,
"input": "protein powder",
"discoveryInfo": { "breadcrumbs": [], "relatedTags": ["protein powder for women", "protein powder recipes"], "url": "https://www.tiktok.com/search?q=protein+powder", "tag": "protein powder", "type": "search" },
"statsExact": { "playCount": 21634, "diggCount": 784, "shareCount": 124, "commentCount": 9, "collectCount": 340 },
"rowType": "video",
"suggestion": null,
"scrapedAt": "2026-07-29T12:00:03Z",
"runId": "a1B2c3D4e5F6g7H8"
}

Notes on fields worth reading before you build a pipeline on them:

  • authorMeta.bioLink is always null. TikTok's search payload does not ship a bio link on any author record it returns, so this key stays in the schema for stability but never populates.
  • videoMeta.originalDownloadAddr mirrors downloadAddr. TikTok's search response ships exactly one download address; the distinct playable stream is exposed separately as videoMeta.playAddr.
  • hashtags[].title and hashtags[].cover are empty stubs on this surface — TikTok's search payload carries the hashtag id and name but not those two.
  • statsExact is null unless TikTok's statsV2 block is present on that item; when present it carries the exact, unrounded counter values instead of the rounded ones in diggCount/playCount/etc.
  • discoveryInfo.relatedTags on a video row is the list of suggestion phrases collected for that same seed earlier in the run — [] when no suggestions were collected for it.
  • mentions is parsed from the caption's own @handle markup; it is [], not a placeholder, when the caption names no one.

How does TikTok Search Suggestions Scraper compare to other TikTok scrapers?

FeatureTikTok Search Suggestions ScraperGeneric alternative
Suggestions past the 8-phrase capa–z / 0–9 expansion, up to 37 lookups per seed, de-duplicated on TikTok's own groupIdNot documented on TikTok Search Suggestions Scraper (vistics), whose README shows one query per seed, as observed on its Apify Store listing on 2026-07-30
Companion video dataOptional video rows from the same seed, in the same datasetTikTok Search Suggestions Scraper (vistics) returns suggestion rows only, as observed on its Apify Store listing on 2026-07-30
Query tokens exposedsuggestion.tokens, parsed from TikTok's own cut_queryNot documented on TikTok Search Suggestions Scraper (vistics)'s listing, as observed on 2026-07-30
Stable de-duplication keyTikTok's own groupIdTikTok Search Suggestions Scraper (vistics) documents a relevance score field with no id-based de-dup, as observed on 2026-07-30
Signature-gated video/account endpointsHandled with a dedicated signed-browser transport, kept separate from the keyless suggestion pathTikTok User Search Scraper (clockworks) and Tiktok Search Scraper (epctex) return video/user data without documenting this distinction, as observed on their listings on 2026-07-30

If you're building an AI agent or a RAG pipeline, the output-format row is the decision-maker: parsing HTML inside an agent loop is a reliability failure mode, not a feature. A stable, typed JSON schema is what lets an agent or an ETL job trust the same field names run after run.


How many results can you scrape with TikTok Search Suggestions Scraper?

TikTok's suggestion box itself returns a hard cap of 8 phrases per lookup — asking for more (count=20 or count=50 in the query string) still returns 8. The only way past that cap is expandWithAlphabet, which re-queries the seed with each character in expansionCharset appended: up to 37 total lookups per seed with az09, 27 with az, or 11 with 09, each producing at most 8 phrases before de-duplication on TikTok's own groupId. maxSuggestionsPerSeed (0–2000, default 0 = no cap) then trims the deduplicated set down further if you set it.

For video rows, maxItems accepts 0–500 (default 10; 0 is treated internally as the schema's own ceiling of 500, not as literally unlimited). Regardless of the maxItems value you set, the video transport pages a maximum of 8 times per seed at up to 20 raw rows per page, so no single seed can return more than roughly 160 raw search-result rows in one run — and after TikTok's own account-card rows and duplicate video ids are filtered out, the number of video rows actually written is normally lower than that ceiling.


Integrate TikTok Search Suggestions Scraper and automate your workflow

TikTok Search Suggestions Scraper works with any language or tool that can send an HTTP request.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("tiktok-discover-scraper-with-search-suggestions").call(run_input={
"startUrls": ["protein powder"],
"suggestionsOnly": True,
"expandWithAlphabet": True,
"expansionCharset": "az",
"suggestionLanguages": ["en"],
"maxSuggestionsPerSeed": 100,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["rowType"] == "suggestion":
print(row["suggestion"]["position"], row["suggestion"]["term"])

Works in Python, Node.js, Go, Ruby, cURL.

Automation platforms (n8n, Make, LangChain)

The Apify platform ships an official n8n community node and a Make app that can start any Actor by its ID and read back its dataset — point either one at tiktok-discover-scraper-with-search-suggestions to drop this Actor's suggestion and video rows straight into a workflow without writing an HTTP call by hand. On the LangChain side, Apify's own ApifyDatasetLoader reads a finished run's dataset directly into LangChain documents, which is a natural fit for feeding suggestion phrases into a downstream retrieval or generation step.


Yes — TikTok Search Suggestions Scraper reads only publicly visible TikTok surfaces: the same suggestion box and search results any logged-out visitor sees, with no login, cookie or session token involved. Suggestion rows carry no personal data at all — they are TikTok's own phrase, rank and language metadata. Video rows do carry public creator information (handle, display name, follower count), which counts as personal data in most jurisdictions: store and use it under a lawful basis, in line with GDPR, CCPA and equivalent laws where they apply. Consult legal counsel for commercial use cases involving bulk personal data.


❓ Frequently asked questions

Does TikTok Search Suggestions Scraper work without a TikTok account?

Yes. No TikTok login, cookie or session token is used on either transport this Actor runs — the keyless suggestion client and the signed-browser video client are both logged-out.

How often is the scraped data updated?

Every run fetches live from TikTok at the moment it executes — nothing is cached or served from a prior run. Re-run the Actor whenever you need a fresh read.

What happens when a seed term returns no suggestions?

A zero-suggestion result is reported as zero rows, not retried into a fabricated row. It is a genuine, valid outcome for a very rare or nonsense seed, and the same run continues to any remaining seeds and to the video step if suggestionsOnly is off.

Can I scrape private or login-gated TikTok content?

No. Only TikTok's public, logged-out suggestion and search surfaces are queried. Content behind a private account or a login wall is not accessible through this Actor.

How much does a run cost?

$0.005 per row pushed to the dataset (row_result), and a suggestion row costs exactly the same as a video row — there is no separate per-search or per-lookup charge. If suggestion fetching fails for a seed after every retry, no row is pushed for that seed, so a failed lookup is never charged.

Does TikTok Search Suggestions Scraper work for AI agent workflows and LLM pipelines?

Yes. It is callable as an HTTP endpoint from any agent framework through the Apify API, and every response is typed JSON — no parsing step before passing a row to an LLM.

How does TikTok Search Suggestions Scraper handle TikTok's anti-bot system?

Every request is judged on body shape, not HTTP status, because TikTok's blocked and challenged surfaces still answer 200. Requests start with no proxy and escalate through Apify Datacenter and then Apify Residential proxy tiers only when TikTok's response looks like a WAF challenge or a soft block — never on status code alone. Once any row has been pushed for a seed, that seed's retry logic stops re-trying on a fresh IP, so a mid-run failure can never duplicate (and double-charge) rows already written.

How does TikTok Search Suggestions Scraper compare to other TikTok scrapers?

As observed on their Apify Store listings on 2026-07-30, TikTok Search Suggestions Scraper (vistics) returns one suggestion query per seed with no documented expansion or video companion data; TikTok User Search Scraper (clockworks) and Tiktok Search Scraper (epctex) focus on user and video search respectively, without a keyword-suggestion feature. This Actor combines ranked search suggestions, an expansion path past TikTok's 8-phrase cap, and the companion video rows in one dataset.

Does TikTok Search Suggestions Scraper return data in a format LLMs can use directly?

Yes. Every row is typed, normalized JSON with stable field names — no HTML, no selectors. Pass it directly into an LLM's context window, index it into a vector store, or route it through an agent tool.

Can I use TikTok Search Suggestions Scraper without managing proxies?

Yes. Runs start with no proxy at all, and only escalate to Apify's own Datacenter and Residential proxy tiers automatically if TikTok pushes back. Setting proxyConfiguration is optional, for when you already know you need a specific proxy group up front.

What happens when TikTok changes its structure or blocks the scraper?

This Actor is actively maintained against TikTok's suggestion and search surfaces. Field names and types on your end stay stable across a fix — no numeric turnaround time is promised.


💬 Your feedback

Found a bug, or a field that doesn't match what TikTok actually sent you? Open an issue on this Actor's Issues tab in Apify Console, or reach out through the contact link on its Apify Store listing. Reports like these are how the Actor stays accurate as TikTok's own surfaces change.