Tiktok Keyword Search Scraper avatar

Tiktok Keyword Search Scraper

Pricing

from $1.60 / 1,000 search rresults

Go to Apify Store
Tiktok Keyword Search Scraper

Tiktok Keyword Search Scraper

TikTok Keyword Search Scraper extracts TikTok videos from keyword-based search results, including rank, captions, creators, stats, and URLs. Use it for market research, trend tracking, competitor monitoring, SEO-style analysis, and AI workflows.

Pricing

from $1.60 / 1,000 search rresults

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

2

Bookmarked

51

Total users

10

Monthly active users

2 days ago

Last modified

Share

Search TikTok videos by keyword with ranking context, filters, creator data, and structured export-ready results.

TikTok Keyword Search Scraper

What does this actor do?

TikTok Keyword Search Scraper is an Apify Actor that searches TikTok for videos by keyword and exports structured search results with rich metadata. It is designed for content research, competitor monitoring, trend spotting, influencer discovery, SEO/content ideation, and AI/LLM workflows.

For each keyword, the actor:

  1. Searches TikTok for videos — or creators/accounts with searchType: "user"
  2. Extracts results with pagination (hundreds per keyword, past the old ~150 in-browser cap)
  3. Preserves search rank, page number, and position context
  4. Returns structured records with video, creator, engagement, music, and content data
  5. Supports multi-keyword batch mode with cross-keyword deduplication
  6. Optionally adds a per-keyword insights summary and no-watermark download URLs

Who is this for?

  • Content strategists & social media marketers — see what actually ranks for your keywords
  • SEO / content researchers — analyze TikTok search visibility across queries and regions
  • Brand & competitor monitoring teams — track who and what appears for competitive terms
  • Influencer / creator discovery teams — find creators ranking for a niche
  • Market researchers & analysts — build structured, comparable keyword datasets
  • AI / data teams — generate clean, rank-labeled datasets for LLM and analytics workflows

Why use this actor?

  • Rank-aware output — every result includes search rank, page number, position, and a rank bucket, so you can analyze what surfaces for a query, not just collect videos
  • Clean, flat, spreadsheet-ready — analysis-ready rows for Sheets/Excel/BI/AI, not raw nested TikTok JSON
  • Video or creator search — switch to searchType: "user" to discover accounts, not just videos
  • Browserless & paginated — pulls from a hosted TikTok API for speed and depth (well past ~150/keyword), with an automatic browser fallback
  • Keyword-focused — cleaner and simpler than all-in-one TikTok scrapers
  • Multi-keyword batch mode — search multiple keywords in a single run with per-keyword traceability
  • Rich metadata, always included — video details, creator summary, engagement stats (incl. reposts & engagement rate), music info, and parsed hashtags on every result
  • Optional analytics & downloads — a free per-keyword insights summary, and opt-in no-watermark download URLs
  • Filters that matter — sort (incl. most-viewed), date, and minimum views/likes/comments; plus a run-wide result cap
  • Deduplication — optionally deduplicate when the same video/creator appears across multiple keywords
  • Fair pricing — pay only per result; no run fee, and empty runs cost nothing
  • Export-ready — structured output for CSV, JSON, Excel, API, and AI pipelines
  • Part of a suite — pairs with TikTok Trend & Discovery Scraper, TikTok Profile Scraper, and TikTok Comment Scraper

Input

ParameterTypeDefaultDescription
keywordsstring[]One or more TikTok search keywords (required)
searchTypestring"video"What to search for: video or user (creator/account search)
maxItemsPerKeywordinteger50Maximum results to collect per keyword (1–500)
maxTotalResultsintegerOptional overall cap across all keywords (leave empty for no limit)
sortstring"relevance"Sort order: relevance, latest, mostLiked, mostViewed (video search)
regionstring""Two-letter country code for region targeting (e.g. US, AU, GB)
datePostedstring"any"Date filter: any, last24Hours, last7Days, last30Days, last90Days
deduplicateAcrossKeywordsbooleanfalseRemove duplicate videos/users across keywords
minViewsinteger0Only keep videos with at least this many views (video search; 0 = off)
minLikesinteger0Only keep videos with at least this many likes (video search; 0 = off)
minCommentsinteger0Only keep videos with at least this many comments (video search; 0 = off)
includeKeywordInsightsbooleanfalseEmit a per-keyword summary record (video search; not charged)
includeDownloadUrlbooleanfalseAdd a no-watermark videoDownloadUrl per result (video search; extra charge)
videoDownloadQualitystring"high"Download variant when enabled: high (no-watermark) or low (smallest)

No field toggles to configure. Caption, hashtags/mentions, creator, music, and engagement fields are always included in every result, so you get the full, consistent schema on every run.

mostViewed re-orders the fetched results by view count (a client-side sort over the batch TikTok returns, ~150/keyword). minViews/minLikes/minComments and mostViewed apply to video search; they are ignored for searchType: user.

{
"keywords": ["tesla"],
"maxItemsPerKeyword": 50
}

Example input: Multi-keyword research batch

{
"keywords": ["ai tools", "chatgpt prompts", "automation apps"],
"maxItemsPerKeyword": 100,
"sort": "relevance",
"region": "US",
"datePosted": "last30Days",
"deduplicateAcrossKeywords": true
}
{
"keywords": ["canberra cafe", "sydney brunch"],
"maxItemsPerKeyword": 30,
"region": "AU",
"sort": "latest"
}
{
"keywords": ["ai tools", "faceless creator"],
"searchType": "user",
"maxItemsPerKeyword": 25
}

With searchType: "user", each result is a TikTok creator/account (username, nickname, bio, follower/heart counts, verification) instead of a video. Video-only options (sort, datePosted, and the min-engagement filters) are ignored in this mode. User results appear in the Users dataset view.

Example input: Filtered research with insights + download URLs

{
"keywords": ["home workout"],
"maxItemsPerKeyword": 100,
"sort": "mostViewed",
"minViews": 10000,
"includeKeywordInsights": true,
"includeDownloadUrl": true,
"videoDownloadQuality": "high"
}

Keeps only videos with ≥10,000 views, orders them by view count, adds a videoDownloadUrl per result (charged via video-download-url), and appends one per-keyword insights summary row. Use maxTotalResults to cap total results across many keywords.

Pricing & cost examples

This actor uses pay-per-result pricing: you are charged a fixed price per search result pushed to the dataset. There is no run fee, and empty runs cost nothing — you only pay for results you actually receive. (The per-result rate shown on the actor page is the discounted floor; the effective Free-tier rate is a little higher and drops as your Apify plan tier increases.)

Search setupExpected resultsEstimated cost @ $1.60 / 1,000
1 keyword × 50 results50~$0.08
3 keywords × 100 results300~$0.48
10 keywords × 100 results1,000~$1.60
20 keywords × 250 results5,000~$8.00

You are billed for dataset records returned, not for input keywords — so filters and sort options never add hidden cost. Use maxItemsPerKeyword to keep runs predictable. The only optional extra charge is video-download-url (one per resolved URL), and only if you turn on includeDownloadUrl.

Output

In video search the actor outputs one record per result video; in user search (searchType: "user") it outputs one record per creator/account. Results are available in five dataset views:

  • Search Results — keyword, rank, video URL, caption, engagement, and creator summary
  • Creators — creator-focused view with follower counts and profile links
  • Engagement — engagement metrics focused view (incl. reposts)
  • Full Data — all fields including media, music, system metadata
  • Users — creator/account results from searchType: "user" (username, nickname, bio, follower/heart counts, verification)
  • Insights — one per-keyword summary row (video search): result count, engagement stats, top creators/hashtags, posting-time distribution
  • Download URLs — video URL + no-watermark videoDownloadUrl per result (populated when includeDownloadUrl is on)

TikTok Keyword Search Scraper — Search Results table view

Search Results view

{
"keyword": "tesla",
"searchRank": 1,
"keywordRankBucket": "top10",
"pageNumber": 1,
"videoId": "7615705845640318221",
"videoUrl": "https://www.tiktok.com/@tesla.flex/video/7615705845640318221",
"caption": "The base Tesla Model 3 is actually good?! #tesla #model3 #teslatok #evsoftiktok #teslamodel3 ",
"createTimeISO": "2026-03-10T19:09:00.000Z",
"duration": 60,
"views": 14800,
"likes": 520,
"comments": 20,
"shares": 26,
"authorUniqueId": "tesla.flex",
"authorVerified": false,
"sort": "relevance",
"region": "",
"scrapedAt": "2026-03-16T07:47:49.912Z"
}

Creators view

{
"keyword": "tesla",
"searchRank": 1,
"videoId": "7615705845640318221",
"authorId": "6614876484773969926",
"authorUniqueId": "tesla.flex",
"authorNickname": "Brandon | Tesla Flex",
"authorUrl": "https://www.tiktok.com/@tesla.flex",
"authorVerified": false,
"authorFollowerCount": 3000000,
"authorFollowingCount": 593,
"authorHeartCount": 159700000,
"views": 14800,
"likes": 520,
"caption": "The base Tesla Model 3 is actually good?! #tesla #model3 #teslatok #evsoftiktok #teslamodel3 "
}

Engagement view

{
"keyword": "tesla",
"searchRank": 1,
"videoId": "7615705845640318221",
"caption": "The base Tesla Model 3 is actually good?! #tesla #model3 #teslatok #evsoftiktok #teslamodel3 ",
"authorUniqueId": "tesla.flex",
"views": 14800,
"likes": 520,
"comments": 20,
"shares": 26,
"saves": 33,
"reposts": 4,
"engagementTotal": 599,
"engagementRateByViews": 0.0405,
"videoFormat": "video",
"isAd": false,
"isSponsored": false,
"isSlideshow": false
}

Full Data view

{
"keyword": "tesla",
"normalizedKeyword": "tesla",
"searchType": "keyword_video_search",
"searchRank": 1,
"keywordRankBucket": "top10",
"pageNumber": 1,
"resultIndexOnPage": 1,
"sort": "relevance",
"region": "",
"dateFilter": "any",
"scrapedAt": "2026-03-16T07:47:49.912Z",
"runId": "bKcA8m72H7Iwwx9YD",
"videoId": "7615705845640318221",
"videoUrl": "https://www.tiktok.com/@tesla.flex/video/7615705845640318221",
"shareUrl": "https://www.tiktok.com/@tesla.flex/video/7615705845640318221",
"videoDownloadUrl": "https://api16-normal-useast5.tiktokv.us/aweme/v1/play/?video_id=... (only when includeDownloadUrl is on)",
"caption": "The base Tesla Model 3 is actually good?! #tesla #model3 #teslatok #evsoftiktok #teslamodel3 ",
"createTime": 1773169740,
"createTimeISO": "2026-03-10T19:09:00.000Z",
"duration": 60,
"views": 14800,
"likes": 520,
"comments": 20,
"shares": 26,
"saves": 33,
"reposts": 4,
"engagementTotal": 599,
"engagementRateByViews": 0.0405,
"authorId": "6614876484773969926",
"authorUniqueId": "tesla.flex",
"authorNickname": "Brandon | Tesla Flex",
"authorUrl": "https://www.tiktok.com/@tesla.flex",
"authorVerified": false,
"authorAvatarUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ff1930f2d25bb38d219aa67e7d04d59b~tplv-tiktokx-cropcenter:1080:1080.jpeg?...",
"authorFollowerCount": 3000000,
"authorFollowingCount": 593,
"authorHeartCount": 159700000,
"musicId": "7411930613424883713",
"musicTitle": "Like This (Lofi)",
"musicAuthorName": "ProdByDave",
"musicOriginal": false,
"musicDuration": 240,
"hashtags": ["tesla", "model3", "teslatok", "evsoftiktok", "teslamodel3"],
"mentions": [],
"isAd": false,
"isSponsored": false,
"isSlideshow": false,
"videoFormat": "video",
"coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/oUAjAfo3BBC0iA0ClwibDHEE2BJIFwUw5tIQYA~tplv-tiktokx-dmt-logom.image?...",
"dynamicCoverUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/oUAjAfo3BBC0iA0ClwibDHEE2BJIFwUw5tIQYA~tplv-tiktokx-origin.image?...",
"originCoverUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/oY46bG7WDIiEgw2uAfFESJRoFBf5pZDIEAgGEs~tplv-tiktokx-origin.image?...",
"videoWidth": 720,
"videoHeight": 1280,
"ratio": "720p",
"inputKeywordIndex": 0,
"isDuplicateAcrossKeywords": false,
"source": "tiktok_search",
"scrapeStatus": "ok"
}

Output fields

Search context fields

FieldDescription
keywordThe search keyword that produced this result
normalizedKeywordLowercase, whitespace-normalized version of the keyword
searchTypekeyword_video_search (video), keyword_user_search (user), or keyword_insights (summary)
searchRankOverall position in search results for this keyword
pageNumberWhich page this result came from
resultIndexOnPagePosition within the page
keywordRankBucketRank band: top10, 11-50, or 51+
sortSort mode used (relevance/latest/mostLiked/mostViewed)
regionRegion code used for search
dateFilterDate filter applied
scrapedAtISO 8601 timestamp of extraction
runIdActor run ID for batch traceability

Video fields

FieldDescription
videoIdTikTok video ID
videoUrlFull video URL
shareUrlShareable video URL
videoDownloadUrlNo-watermark downloadable video URL (only when includeDownloadUrl is on; else absent)
captionVideo caption/description
createTimeUnix timestamp of video creation
createTimeISOISO 8601 creation time
durationDuration in seconds

Engagement fields (always included)

FieldDescription
viewsPlay/view count
likesLike count
commentsComment count
sharesShare count
savesSave/collect count
repostsRepost count (best-effort; may be null)
engagementTotalSum of likes + comments + shares + saves
engagementRateByViewsengagementTotal / views (0–1; null when views unknown)

Creator fields (always included)

FieldDescription
authorIdAuthor user ID
authorUniqueIdAuthor username
authorNicknameDisplay name
authorUrlProfile URL
authorVerifiedVerified badge status
authorAvatarUrlAvatar image URL
authorFollowerCountFollower count (if available)
authorFollowingCountFollowing count (if available)
authorHeartCountTotal hearts (if available)

Music fields (always included)

FieldDescription
musicIdMusic/sound ID
musicTitleMusic title
musicAuthorNameMusic author
musicOriginalWhether the sound is original
musicDurationMusic duration in seconds

Content fields

FieldDescription
hashtagsParsed hashtags from caption
mentionsParsed @mentions from caption
isAdWhether the video is an ad
isSponsoredWhether the video is sponsored
isSlideshowWhether the post is an image slideshow/carousel (best-effort)
videoFormatFormat class: video, slideshow, or ad

Media fields

FieldDescription
coverUrlVideo cover image URL
dynamicCoverUrlAnimated cover URL
originCoverUrlOriginal cover URL
videoWidthVideo width in pixels
videoHeightVideo height in pixels
ratioVideo aspect ratio

System fields

FieldDescription
inputKeywordIndexIndex of the keyword in the input array
isDuplicateAcrossKeywordsWhether this video appeared under a previous keyword
sourceAlways tiktok_search
scrapeStatusok or error status

User record fields (searchType: "user")

When searchType is user, each record describes a creator/account instead of a video (see the Users dataset view):

FieldDescription
searchTypeAlways keyword_user_search
searchRank / pageNumber / resultIndexOnPageRanking context
userId / secUidTikTok user IDs
uniqueIdUsername (@handle)
nicknameDisplay name
profileUrlProfile URL
avatarUrlAvatar image URL
verifiedVerified badge status
privateAccountWhether the account is private
regionCreator region (best-effort)
followerCountFollowers (best-effort)
followingCountFollowing (best-effort)
heartCountTotal hearts received (best-effort)
videoCountNumber of videos (best-effort)
diggCountLikes given (best-effort)
signatureProfile bio
sourceAlways tiktok_user_search
{
"keyword": "ai tools",
"searchType": "keyword_user_search",
"searchRank": 1,
"uniqueId": "hustle.faceless",
"nickname": "Sam | AI Tools & Tech",
"profileUrl": "https://www.tiktok.com/@hustle.faceless",
"verified": false,
"followerCount": 358000,
"heartCount": 4030336,
"signature": "Daily AI tools & creator tech",
"source": "tiktok_user_search"
}

Some deep profile stats (followingCount, videoCount, region) are populated on a best-effort basis — TikTok's user search returns a subset per result.

Keyword insights (searchType: "video")

Set includeKeywordInsights: true (off by default) and the actor also emits one summary record per keyword — a quick, analysis-ready snapshot of everything that ranked for that query. It appears in the Insights dataset view and is marked searchType: "keyword_insights" (filter on that to separate it from the per-video rows). It is video search only and not charged.

FieldDescription
keyword / normalizedKeywordThe keyword this summary covers
searchTypeAlways keyword_insights
resultCountNumber of video results analyzed
avgViews / medianViews / maxViewsView aggregates
avgLikes / avgComments / avgShares / avgEngagementTotalEngagement aggregates
totalViews / totalLikesSum across results
topHashtagsTop 10 { tag, count } by frequency
topCreatorsTop 10 { uniqueId, nickname, appearances, followerCount, maxViews }
verifiedRatio / adRatio / slideshowRatioShare of results that are verified / ads / slideshows
postingByHourUTC{ "0".."23": count } posting-time distribution
oldestCreateTimeISO / newestCreateTimeISODate range of the results
{
"keyword": "home workout",
"searchType": "keyword_insights",
"resultCount": 60,
"avgViews": 1839349,
"medianViews": 412087,
"maxViews": 20663531,
"avgEngagementTotal": 177420,
"verifiedRatio": 0.033,
"adRatio": 0,
"slideshowRatio": 0,
"topHashtags": [{ "tag": "homeworkout", "count": 25 }, { "tag": "workout", "count": 11 }],
"topCreators": [{ "uniqueId": "justtcocoo", "nickname": "Courteney Fisher", "appearances": 3, "followerCount": 2370611, "maxViews": 1755506 }],
"postingByHourUTC": { "17": 6, "10": 5 },
"oldestCreateTimeISO": "2026-01-19T17:17:34.000Z",
"newestCreateTimeISO": "2026-07-08T10:10:16.000Z"
}

Leave includeKeywordInsights off (default) to return only the raw video rows.

Video download URLs (searchType: "video")

Set includeDownloadUrl: true (off by default) to add a no-watermark videoDownloadUrl to each result. TikTok search results don't carry this, so it's resolved per video from TikTok's app API — a real per-video operation, billed via the separate video-download-url pay-per-event (only for results where a URL is resolved). Choose the variant with videoDownloadQuality (high = no-watermark, default; low = smallest file).

  • Available on the hosted-API path only (a browser-fallback run leaves it null).
  • URLs expire after a few days (TikTok CDN signing) — download promptly; the actor does not re-host files.
  • To download, issue a GET with an app-like User-Agent (the URL 302-redirects to the CDN .mp4).
{
"keyword": "home workout",
"videoId": "7658...",
"videoDownloadUrl": "https://api16-normal-useast5.tiktokv.us/aweme/v1/play/?video_id=..."
}

Use cases

  • Topic research — find top TikTok videos for any topic or keyword
  • Trend monitoring — track keyword-based content trends over time with scheduled runs
  • Creator discovery — identify creators ranking for target queries
  • Competitor tracking — monitor what content appears for competitive keywords
  • Keyword landscape analysis — compare search results across regions and sort modes
  • AI dataset generation — build structured datasets for clustering, summarization, and analysis
  • Content ideation — discover what types of content perform for a topic before creating

Tips and best practices

  • Start small — use maxItemsPerKeyword: 10–20 for initial exploration
  • Use searchRank for analysis — compare how videos rank across keywords and regions
  • Enable deduplication — set deduplicateAcrossKeywords: true when searching related keywords
  • Schedule for monitoring — run on a schedule to track keyword trends over time
  • Use normalizedKeyword — consistent lowercase version for grouping across runs

Reliability & anti-blocking

The actor is built to run reliably without any configuration:

  • Browserless hosted-API extraction — when configured, results are pulled from a hosted TikTok API (no in-browser scraping), which is faster, more reliable, and paginates past the in-browser result cap. If the hosted API is unavailable, the actor automatically falls back to a real-browser scrape, so runs still complete.
  • Automatic retries with exponential backoff on failed requests
  • Session pooling (Crawlee) to spread requests and rotate browser sessions
  • Anti-detection — masks automation signals (e.g. navigator.webdriver) and uses a realistic browser fingerprint
  • Multi-strategy extraction — reads embedded page data first, then falls back to TikTok's in-page search API, so results survive layout changes
  • Best-effort region targeting via localized cookies
  • Per-keyword error isolation — a failure on one keyword does not stop the rest of the run

Reported success rate on the Apify marketplace: 100%.

Limitations

  • Per-keyword result depth — with the hosted API the actor paginates and can return several hundred results per keyword (up to maxItemsPerKeyword, max 500). On the browser fallback, TikTok returns roughly 150 per keyword in a single call, so depth is capped there.
  • Best-effort region — region is applied as a localized cookie hint. For strictly region-specific results, run from infrastructure in that region.
  • Best-effort optional values — fields such as saves, reposts, authorFollowerCount, musicDuration, and user-search stats (followingCount, videoCount, region) depend on what TikTok includes in its search response and may be null.
  • mostViewed is a batch re-sort — it orders the ~150 results TikTok returns for a keyword, not all of TikTok, and applies to video search only.
  • Search results vary — TikTok ranking changes over time and by personalization, so results can differ between runs.

Proxy & connectivity

No proxy configuration is required. The actor manages connectivity internally, and — consistent with its pay-per-result pricing — you are charged only per result returned, never for platform, compute, or proxy usage. There is no proxy input field to set.

Integrations

  • Google Sheets — export search results to spreadsheets for team dashboards
  • Slack/email — set up notifications when new results are found
  • Webhooks — trigger downstream workflows when a run completes
  • API — access results programmatically via the Apify API
  • Other actors — feed discovered creators into TikTok Profile Scraper, or video URLs into TikTok Comment Scraper

FAQ

Can I search for creators/users instead of videos? Yes. Set searchType: "user" to return TikTok creators/accounts (username, nickname, bio, follower/heart counts, verification) for each keyword. Results appear in the Users dataset view. Video-only options (sort, date filter, min-engagement filters) are ignored in user mode.

How do I keep costs predictable across many keywords? Use maxTotalResults to set an overall cap across all keywords, and/or maxItemsPerKeyword per keyword. You are billed only per result returned — no run fee, and empty runs are free.

How many results can I get per keyword? Up to maxItemsPerKeyword (max 500). With the hosted API the actor paginates to reach that depth; on the browser fallback TikTok returns roughly ~150 per keyword. The actual number depends on how many results TikTok has for that query.

Why are some fields null? Fields like saves, authorFollowerCount, and musicDuration depend on what TikTok includes in its search data. They are extracted on a best-effort basis.

What does isDuplicateAcrossKeywords mean? When the same video appears in results for multiple keywords, this field is set to true for subsequent appearances. With deduplicateAcrossKeywords: true, duplicates are removed entirely.

How does region targeting work? Region is set via cookies as a best-effort hint. For true region-specific results, use a proxy from that region.

Can I scrape hashtag pages or specific videos? This actor is focused on keyword search. For hashtag/trend discovery, use TikTok Trend & Discovery Scraper. For specific videos, use TikTok Video Scraper.