TikTok Search Scraper: Keywords, Hashtags, Creators avatar

TikTok Search Scraper: Keywords, Hashtags, Creators

Pricing

from $0.20 / 1,000 tiktok posts

Go to Apify Store
TikTok Search Scraper: Keywords, Hashtags, Creators

TikTok Search Scraper: Keywords, Hashtags, Creators

Scrape TikTok search results by keyword or hashtag and discover creators. Pay only per result. Views, likes, comments, shares, bookmarks, channel stats, music, subtitles and direct video URLs as JSON. Output compatible with popular TikTok scrapers. No proxies or login needed. Works via API and MCP.

Pricing

from $0.20 / 1,000 tiktok posts

Rating

5.0

(1)

Developer

GoFetch

GoFetch

Maintained by Community

Actor stats

4

Bookmarked

41K

Total users

625

Monthly active users

2 days ago

Last modified

Share

TikTok Search Scraper: Keywords, Hashtags, Creators logo

TikTok Search Scraper is a TikTok search API alternative for marketers, social listening teams, researchers and developers who need TikTok keyword search and hashtag data. Give it a list of search keywords and get the matching TikTok videos (about 200–420 per keyword, see the FAQ) as structured data — views, likes, comments, shares and bookmarks, creator/channel stats, music, subtitles and direct video URLs — as JSON, CSV or Excel. An optional expansion mode harvests TikTok's search suggestions, hashtag feeds and sound feeds to discover roughly 10x more creators per keyword. No login, no cookies, no TikTok account and no proxy setup: you enter keywords, you pay per result.

Who uses TikTok Search Scraper?

  • Influencer marketing teams build creator shortlists: a list of niche keywords with expansion (paid plans) and uniqueAuthors on returns one video per creator, ready to sort by channel.followers and channel.verified. Then TikTok Profile Scraper adds bios and recent posts.
  • Brand and social listening teams schedule a daily run on brand and product keywords with sortType: "DATE_POSTED", keep only videos newer than the previous run (uploadedAtFormatted), and send them to Slack or Google Sheets with Apify integrations.
  • Researchers and data teams compare views, likes and hashtags across topics over time, and use the subtitle tracks for content analysis.
  • AI agents call it over MCP for questions like "what are the most-liked TikTok videos about AI tools right now?"

What data does TikTok Search Scraper extract?

One dataset item per video, including:

  • Engagement — views, likes, comments, shares, bookmarks
  • Post — title/caption, hashtags, upload timestamp (raw + ISO), permanent post URL
  • Channel — id, name, username, avatar, verified flag, follower/following counts, total videos and likes
  • Video — width, height, ratio, duration, direct video URL, cover and thumbnail images
  • Music — song id, title, artist, album, duration, cover art
  • Extras — subtitle/caption tracks with URLs, POI (location) data, collab info, the keyword that found the video, and (in expansion mode) which pool surfaced it

A run typically finishes in seconds; every field is shown in the output example below.

How to scrape TikTok search results

In the Apify Console

  1. Open TikTok Search Scraper in Apify Store and click Try for free.
  2. Enter one or more Search Keywords — a topic, a brand, a hashtag term, a creator niche. Each keyword is searched independently and the results are combined into one dataset.
  3. Optionally set Maximum number of items (the form prefills 100), a Sort Type, or turn on Expansion Pools for creator discovery. Leave the proxy field empty — proxies are built in.
  4. Click Start. The run ends when every keyword is exhausted or maxItems is reached.
  5. Open the Dataset tab and download the results as JSON, CSV, Excel, XML or RSS, or read them through the API.

TikTok Search Scraper input form

The minimal input is a single keyword:

{ "keywords": ["ai tools"] }

From the API, CLI or an AI agent

Use it as a TikTok scraper API. A synchronous run returns the items directly:

curl -X POST "https://api.apify.com/v2/acts/xmolodtsov~tiktok-search-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": ["ai tools"], "maxItems": 200}'

With the Apify CLI:

$apify call xmolodtsov/tiktok-search-scraper --input '{"keywords": ["ai tools"], "maxItems": 200}'

AI agents call it by name, xmolodtsov/tiktok-search-scraper, through Apify's MCP server — see Integrations.

How much does it cost to scrape TikTok?

This Actor is priced pay per result: you are charged only for items actually written to the dataset — not for compute time, not for retries, not for setup, and proxies are included. The price per result depends on your Apify plan:

Apify plan (discount tier)Price per 1,000 results
Free$0.30
Starter (Bronze)$0.25
Scale (Silver)$0.22
Business (Gold)$0.20
Platinum (enterprise)$0.18
Diamond (enterprise)$0.15

Worked example: 5 keywords × ~200 videos each ≈ 1,000 results — $0.25 on Starter, $0.20 on Business. Runs that return zero results, or fail, produce zero billable items and cost you nothing. Batching many keywords into one run is the most cost-efficient way to use the Actor.

Is scraping TikTok free?

You can try it for free: Apify's free plan includes a monthly usage credit, no payment method required. On the free plan this Actor applies the limits below; any paid Apify plan removes them and lowers the price per result.

Free plan limits

On the Apify Free plan, this Actor is limited to:

  • 10 results per run (maxItems is clamped to 10),
  • 5 runs per calendar month (the counter resets on the 1st),
  • classic keyword search only — expansion pools are disabled,
  • Apify Proxy (residential) instead of the Actor's built-in proxy.

These limits are set by the developer, not by Apify — pay-per-result revenue only counts for paid plans. Every free-plan run says so in its log and status message, for example: "Free plan: run 1/5 this month, capped at 10 results (a limit set by the developer, not by Apify)." When the monthly quota is used up, the run ends successfully with an explanatory status message and no results — it does not fail and nothing is charged. Paid users are never limited, on any tier.

Input

FieldTypeDefaultDescription
keywordsarray— (required)Search terms, each searched independently; results are combined into one dataset
maxItemsinteger1000 via API; the Console form prefills 100Global cap on output items across all keywords and expansion pools (10 on the free plan)
maxItemsPerKeywordinteger—Optional cap per single keyword; keywords are processed sequentially against the global maxItems budget
sortTypeenumRELEVANCERELEVANCE, MOST_LIKED, DATE_POSTED. Sorting is applied after fetching, per keyword — TikTok ignores server-side sort parameters
locationstringUSISO 3166-1 alpha-2 country code, passed to TikTok as the region parameter. Cosmetic — TikTok keys results off the request's IP address, not off this parameter, so it does not produce a per-country result set
includeSearchKeywordsbooleantrueAdds keyword + inputSource to each item
expansionarray[] (off)Opt-in harvest pools: suggest, hashtag, music — see Expansion mode. Paid plans only
relevanceThresholdnumber0.3Music pool only: fraction (0–1) of a sound's first-page captions that must match the keyword or its hashtags before that sound is crawled. Higher = stricter
uniqueAuthorsbooleanfalseEmit at most one item per creator (channel.id)
maxPostsPerAuthorinteger—Cap on items per creator in the classic search results; the expansion pools always emit at most one item per creator regardless of this value (empty = no cap)
proxyConfigurationobject— (leave empty)Not needed — proxies are built in and included in the price. To route through your own proxies, enter their URLs here; the Apify Proxy option is not used on paid plans

Out-of-range values are clamped (item caps to 1–100,000, relevanceThreshold to 0–1); an unknown sortType fails the run with a clear message.

Expansion mode and creator discovery

By default the Actor runs the classic keyword search. Set expansion to opt into extra harvest pools, all seeded from the keyword's own search hits and run after the classic search for that keyword:

  • suggest — TikTok's own search suggestions for your keyword; each suggestion is then run through the normal search (up to ~200 items per suggestion).
  • hashtag — the feed of the keyword's own hashtag plus up to five of the tags that appear most on the keyword's search results.
  • music — the feeds of up to five of the sounds those same results use most. Each sound is probed first: if fewer than relevanceThreshold of its first-page captions match the keyword or its hashtags, the sound is skipped as off-topic (trending sounds carry every niche).

The pools widen creator coverage: each emits only creators the run has not seen yet, one item per creator, deduplicated across every pool (measured 85–95% disjoint). With all three on, a keyword surfaces roughly 10x more unique creators than plain search.

Each item gains an expansion_source field — relevance (classic search), suggest, hashtag or music — naming the pool that first surfaced that creator, while keyword and inputSource keep the original input keyword.

maxItems bounds the total across all pools, and a pool stops for a keyword once two consecutive suggestions, tags or sounds yield fewer than five new creators. A pool hiccup never costs the classic-search items already collected. For creator discovery, add uniqueAuthors:

{
"keywords": ["recipe"],
"expansion": ["suggest", "hashtag", "music"],
"uniqueAuthors": true,
"maxItems": 2000
}

Output

Output example

{
"inputSource": "artificial intelligence",
"id": "7400028062320020768",
"title": "Humanity's smartest invention might also be its last. Superintelligent AI could be our dream come true – or our worst nightmare. … #kurzgesagt #sciencetok #ai #artificialintelligence #superintelligence #agi",
"views": 122500,
"likes": 10000,
"comments": 134,
"shares": 219,
"bookmarks": 772,
"hashtags": ["kurzgesagt", "inanutshell", "kurzgesagt_inanutshell", "sciencetok", "ai", "artificialintelligence", "superintelligence", "superintelligentai", "agi", "artificialgeneralintelligence"],
"channel": { "id": "6807723105163871238", "name": "Kurzgesagt - In A Nutshell", "username": "kurz_gesagt", "avatar": "https://p16-common-sign.tiktokcdn-eu.com/…", "verified": true, "url": "https://www.tiktok.com/@kurz_gesagt", "followers": 2000000, "following": 42, "videos": 506, "likes": 30000000 },
"collabInfo": null,
"uploadedAt": 1722953306,
"uploadedAtFormatted": "2024-08-06T14:08:26.000Z",
"video": { "width": 576, "height": 1024, "ratio": "540p", "duration": 56, "url": "https://v16-webapp-prime.tiktok.com/…", "cover": "https://p16-common-sign.tiktokcdn-eu.com/…", "thumbnail": "https://p16-common-sign.tiktokcdn-eu.com/…" },
"song": { "id": 7400028146168319000, "title": "original sound", "artist": "Kurzgesagt - In A Nutshell", "album": null, "duration": 56, "cover": "https://p16-common-sign.tiktokcdn-eu.com/…" },
"subtitleInformation": [{ "caption_format": "webvtt", "caption_length": 1802, "lang": "eng-US", "language_code": "eng", "is_auto_generated": true, "url": "https://v16-webapp.tiktokcdn-eu.com/…", "url_list": ["https://v16-webapp.tiktokcdn-eu.com/…"], "version": "1:big_caption" }],
"postPage": "https://www.tiktok.com/@kurz_gesagt/video/7400028062320020768",
"poi": null,
"keyword": "artificial intelligence"
}

Example output table

Field notes:

  • subtitleInformation is null or an array of caption tracks, each with caption_format, caption_length, lang, language_code, is_auto_generated, url, url_list and version.
  • poi is null or an object with poiName, address, cityCode, cityName, latitude, longitude and regionCode.
  • Channel stats TikTok omits for a card are null (e.g. channel.videos); engagement counters default to 0.
  • expansion_source appears only when expansion is set — see Expansion mode.
  • keyword and inputSource intentionally carry the same value, for compatibility with pipelines built around the common TikTok scraper output format.

CDN links expire: video.url, video.cover and video.thumbnail are signed, short-lived TikTok CDN links — download or process them promptly after the run. postPage is the permanent link to the video.

Compatible with the common TikTok scraper output format

The output uses the field names, nesting and types popular TikTok search scrapers on Apify Store already use (views, likes, channel.*, video.*, song.*, …), so existing pipelines and spreadsheets work unchanged.

Next steps: comments, creators and hashtags

Every item carries the values the other TikTok scrapers from this developer take as input:

Guarantees and failure semantics

  • No duplicates: run-global deduplication writes the same video at most once per run, even when it matches several keywords, query passes or expansion pools.
  • You pay only for delivered results: empty and failed runs produce zero billable items.
  • The run SUCCEEDS when it returns at least one item (a keyword that returns nothing logs a warning), when TikTok answered but genuinely had no results (empty dataset, status message empty — search returned no posts), and when a free-plan monthly quota is used up.
  • The run FAILS on invalid input (no keywords, unknown sortType), or when it returned zero items and at least one keyword never got a single valid response from TikTok (blocked or network failure). The status message then starts with a machine-readable token — blocked, quota, server, timeout or network — so automation can key retries off it.
  • Run statistics: every run writes a STATISTICS record to its key-value store — item, request and failed-request counts, duration, a per-keyword (and per-pool) breakdown and the same failureReason token (ok when items shipped) — for dashboards and alerting.

Integrations, API and MCP

JavaScript and Python clients

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('xmolodtsov/tiktok-search-scraper').call({
keywords: ['ai tools', 'fitness'],
maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient(token="YOUR_APIFY_TOKEN")
run = client.actor("xmolodtsov/tiktok-search-scraper").call(
run_input={"keywords": ["ai tools", "fitness"], "maxItems": 500},
)
items = client.dataset(run["defaultDatasetId"]).list_items().items

Schedules, webhooks and exports

Use schedules for daily keyword monitoring, webhooks to get notified when a run finishes, dataset export to JSON, CSV, Excel, XML or RSS, and integrations like Zapier, Make and Google Sheets.

Use with AI agents (MCP)

Through Apify's MCP server at mcp.apify.com, AI agents that speak the Model Context Protocol (Claude, ChatGPT and others) can call xmolodtsov/tiktok-search-scraper with the same input and read the dataset back. To load just this Actor as a tool, connect your MCP client to https://mcp.apify.com?tools=xmolodtsov/tiktok-search-scraper. The usual pricing and free-plan limits apply.

More scrapers from this developer

TikTok: TikTok Profile Scraper (Pay Per Result): profiles, followers and latest posts by username · TikTok Comments Scraper: comments and full reply threads from any video · TikTok Hashtag Scraper: videos for any hashtag, with views, likes and music · TikTok Sound & Music Scraper: videos that use a sound or song

Social & news: Reddit Search Scraper: posts by keyword, subreddit or author · Google News Scraper: Google News results as clean full-text articles

E-commerce: Prom.ua Product Search Scraper: Prom.ua product search results, no browser needed · Amazon Product Search & Bestsellers Scraper: search results, Best Sellers and product details from Amazon

Maps & leads: Google Maps Scraper: places, leads and emails from Google Maps

Ads: Facebook Ad Library Scraper (Meta Ads Library): ads from the Meta Ad Library, with EU reach and payers

Video: YouTube Transcript Scraper: transcripts, subtitles and captions from YouTube videos

FAQ

The Actor collects only publicly available data — the same information any logged-out visitor sees on TikTok search. It never logs in, never accesses private accounts, and collects no data behind authentication. You are responsible for how you use the data: respect TikTok's terms of service and comply with personal-data laws such as the GDPR and the CCPA.

Creator names, usernames and avatars are personal data under the GDPR, the CCPA and similar laws: collect only what you need and make sure you have a lawful basis for processing it. This is general guidance, not legal advice.

How many results do I get per keyword?

TikTok caps a single query string at ~200 unique results. The Actor adds automatic query passes — accent, casing and spacing variants of your keyword, so results stay on-topic — and stops once they stop returning enough new items. Expect ~200–420 items per keyword in classic mode. To scale, add keywords or turn on expansion.

Why did I get zero results?

Usually an overly narrow keyword or a transient TikTok block — the status message tells them apart (see Guarantees). Zero items cost nothing.

Is search exact-match? Can I filter by date or country?

No. Search is fuzzy, not exact-match — TikTok's search behaves like TikTok's search, and a nonsense keyword still returns ~30 loosely related videos rather than nothing. There is no server-side date filter; use sortType: "DATE_POSTED" and filter on uploadedAtFormatted downstream. location is passed to TikTok but does not partition results by country (see the input table).

Does it download the videos?

No — it returns direct video URLs and metadata, not video files, which is why runs finish in seconds. Download the files yourself from video.url if you need them (see the CDN-expiry note above).

Will I hit rate limits?

Not on your side: the Actor paces its requests and retries transient failures automatically. If TikTok still blocks a keyword, the status message says so (see Guarantees). For very large keyword lists, one batched run beats many small runs.

How do I get full profiles for the creators I find?

Discover creators here (uniqueAuthors plus expansion), then feed channel.username into TikTok Profile Scraper for full profile stats and each creator's recent videos.

Support

Open the Issues tab on the Actor's page in Apify Console to report a problem or ask for a field or feature. Include the run ID — every run logs its context (plan, origin) so support cases can be diagnosed from the log.