TikTok Video Search Scraper - Metrics & Filters
Pricing
from $4.00 / 1,000 tiktok video founds
TikTok Video Search Scraper - Metrics & Filters
Search TikTok videos by keyword or hashtag and get views, likes, comments, shares, engagement rate, duration, hashtags and creator data. Filter by minimum views, likes, or duration. Cookieless, provider-backed, MCP-ready.
Pricing
from $4.00 / 1,000 tiktok video founds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
30
Total users
11
Monthly active users
a day ago
Last modified
Categories
Share
TikTok Video Search Scraper - Metrics & Filters is an Apify Actor for researchers, marketers, and AI agents that want to search TikTok videos by keyword or hashtag and receive one normalized record per video. It accepts plain-text keywords in searchQueries or hashtags in hashtags, then returns fields such as videoUrl, caption, playCount, likeCount, commentCount, shareCount, collectCount, engagementRate, durationSeconds, creator identifiers, and timestamps. Each dataset row represents one TikTok video result, making the output useful for filtering, ranking, enrichment, and downstream analysis.
Best fit and connected workflows
This Actor fits workflows that start with discovery and continue into deeper review:
- Topic research from a keyword list, such as product terms, niche phrases, or campaign themes.
- Hashtag exploration when you want the feed tied to a specific tag.
- Performance screening with thresholds for views, likes, comments, shares, and duration.
- Creator review based on the returned creator fields and video metrics.
- AI agent workflows through Apify MCP, where a tool call returns structured TikTok video rows.
For downstream enrichment after discovery, use the returned TikTok records with:
- TikTok Profile Posts Scraper - Creator Feed Data for creator feed enrichment when you have a public profile URL or ID.
- TikTok Profile Videos Scraper for creator video enrichment when you want to continue from selected records.
Practical scenario
Maya, a social media manager, starts with the keyword nike running and the hashtag running. She sets minPlays to surface higher-traffic videos, keeps includePhotoPosts enabled, and uses sortBy: most-liked for the keyword search. The Actor returns rows with authorUsername, caption, playCount, likeCount, shareCount, engagementRate, durationSeconds, and videoUrl. Maya reviews the creators and captions, then opens the most relevant video URLs to shortlist formats for a new campaign brief.
Input
Use plain text keywords in searchQueries, hashtags in hashtags, or both. At least one of those fields should contain values.
| Field | Type | Description |
|---|---|---|
searchQueries | array of strings | Keyword searches. Each keyword runs its own paginated search. |
hashtags | array of strings | TikTok hashtags to search, with or without #. |
maxResultsPerQuery | integer | Maximum videos to return and charge for per query, from 1 to 10000. Default: 50. |
sortBy | string | Keyword search ordering: relevance, most-liked, or date-posted. Default: relevance. |
datePosted | string | Keyword recency window: yesterday, this-week, this-month, last-3-months, last-6-months, or all-time. Default: all-time. |
region | string | Two-letter region code such as US, GB, or DE. Default: US. |
minPlays | integer | Keep videos with at least this many plays. Default: 0. |
minLikes | integer | Keep videos with at least this many likes. Default: 0. |
minComments | integer | Keep videos with at least this many comments. Default: 0. |
minShares | integer | Keep videos with at least this many shares. Default: 0. |
minDurationSeconds | integer | Keep videos at least this long, in seconds. Default: 0. |
maxDurationSeconds | integer | Keep videos no longer than this many seconds. Default: 0. |
includePhotoPosts | boolean | Includes TikTok image carousel posts when enabled. Default: true. |
maxPagesPerQuery | integer | Safety cap on provider pages per query. Default: 20. |
providerOrder | string | Provider routing: scrapecreators-first, sociavault-first, scrapecreators-only, or sociavault-only. |
includeRawData | boolean | Adds the raw provider payload to each row as rawResult. Default: false. |
Focused input example
{"searchQueries": ["nike running"],"hashtags": ["running"],"maxResultsPerQuery": 25,"sortBy": "most-liked","datePosted": "all-time","region": "US","minPlays": 10000,"includePhotoPosts": true,"providerOrder": "scrapecreators-first","includeRawData": false}
Output
The Actor stores normalized video rows in the default dataset. A run summary is stored in the key-value store under RUN_SUMMARY.
| Field | Type | Description |
|---|---|---|
searchType | string | Whether the row came from a keyword or hashtag search. |
query | string | The keyword or hashtag that returned the row. |
hashtag | string | The hashtag searched, when applicable. |
provider | string | Backend provider that served the row. |
resultPosition | integer | 1-based rank within the query. |
page | integer | Provider page where the row was found. |
isPhotoPost | boolean | True for TikTok image carousel posts. |
videoId | string | TikTok aweme/video ID. |
videoUrl | string | Canonical TikTok URL. |
caption | string | Video caption text. |
createdAt | string | ISO 8601 post timestamp. |
durationSeconds | integer | Video length in seconds. |
region | string | TikTok region code. |
authorId | string | Creator numeric user ID. |
authorSecUid | string | Creator stable secUid. |
authorUsername | string | Creator handle. |
authorNickname | string | Creator display name. |
authorVerified | boolean | Creator verification flag. |
authorAvatarUrl | string | Creator avatar URL. |
playCount | integer | View count. |
likeCount | integer | Like count. |
commentCount | integer | Comment count. |
shareCount | integer | Share count. |
collectCount | integer | Save count. |
engagementRate | number | (likes + comments + shares) / plays, rounded to 4 decimals. |
coverUrl | string | Thumbnail URL. |
imageUrls | array | Image URLs for photo posts. |
hashtags | array | Hashtags found in the caption. |
musicId | string | Music track ID. |
musicTitle | string | Music track title. |
musicAuthor | string | Music track author. |
scrapedAt | string | ISO 8601 scrape timestamp. |
Illustrative output record
{"searchType": "keyword","query": "nike running","provider": "scrapecreators","resultPosition": 1,"page": 1,"isPhotoPost": false,"videoId": "7412345678901234567","videoUrl": "https://www.tiktok.com/@runner/video/7412345678901234567","caption": "suitable nike running shoes #running #nike","createdAt": "2024-06-01T00:00:00.000Z","durationSeconds": 32,"region": "US","authorUsername": "runner","authorNickname": "Runner","authorVerified": true,"playCount": 250000,"likeCount": 12000,"commentCount": 340,"shareCount": 210,"collectCount": 90,"engagementRate": 0.0502,"coverUrl": "https://p16-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/cover.jpg","hashtags": ["running", "nike"],"musicTitle": "Original sound","scrapedAt": "2026-07-01T12:00:00.000Z"}
How it works
This Actor uses public TikTok video data through provider-backed routing. The live contract shows two backend providers: ScrapeCreators and SociaVault. The default order is scrapecreators-first, with alternate routing available through providerOrder. The input schema also shows pagination controls, regional localization, and client-side quality filters that are applied after fetching. The dataset schema defines the normalized row shape, and the output schema points to the default dataset plus the RUN_SUMMARY record for execution diagnostics and provider telemetry.
Pricing
This Actor uses Pay per event pricing plus Apify platform usage.
apify-actor-startis charged once when the Actor starts after input validation.TikTok Video Foundis charged once per video saved to the dataset after quality filters.- Filtered-out videos are not charged.
The video event uses tiered pricing, and the exact current rates are shown in the live Pricing tab on Apify. As an example, if a run saves fifty videos, the event total is based on fifty TikTok Video Found events plus one Actor start event, with any platform usage billed separately according to your Apify plan and the live Pricing tab.
Use with AI agents (MCP)
This Actor is available as an Apify Actor usable through Apify MCP. It is a structured tool for asking for TikTok video search results by keyword or hashtag and receiving normalized rows with engagement metrics, creator data, and URLs.
Exact Actor identity: khadinakbar/tiktok-video-search-scraper
Find TikTok videos for the keyword "protein recipe" and the hashtag "mealprep". Return rows with creator username, caption, plays, likes, comments, shares, engagement rate, duration, and video URL. Use a minimum plays filter of 10000 and keep photo posts if they match.
How to interpret the output:
- Each dataset row represents one saved TikTok video record.
provideridentifies which backend served the row.searchType,query, andhashtagshow how the record was found.engagementRateis calculated from likes, comments, and shares divided by plays.scrapedAtandcreatedAthelp separate post time from collection time.
Scope and pagination guidance:
maxResultsPerQuerysets the saved-video cap per keyword or hashtag.maxPagesPerQuerysets a safety ceiling on provider pages per query.providerOrdercontrols provider routing when you want a specific backend sequence.- The default dataset is the primary machine-readable result set, and
RUN_SUMMARYadds run-level telemetry.
Use via Apify API
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("khadinakbar/tiktok-video-search-scraper").call(run_input={"searchQueries": ["nike running"],"maxResultsPerQuery": 25,"sortBy": "most-liked","minPlays": 10000,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["videoUrl"], item["playCount"], item["engagementRate"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/tiktok-video-search-scraper').call({searchQueries: ['nike running'],maxResultsPerQuery: 25,sortBy: 'most-liked',minPlays: 10000,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {console.log(item.videoUrl, item.playCount, item.engagementRate);}
Best results and outcome guidance
A useful setup is to keep the query focused, then add filters that match the signal you want to study. Keyword searches work well for topic discovery, while hashtags help when you already know the conversation tag. sortBy: most-liked is a practical choice for review queues, and datePosted narrows keyword searches to a recent window. When you want shorter clips, set maxDurationSeconds; when you want higher-engagement rows, use minPlays, minLikes, minComments, or minShares. If you are building an agent workflow, keep includeRawData off by default and turn it on only when you need provider payload inspection.
Continue the workflow
- Then use TikTok Ads Library Scraper for Ad Research to continue from TikTok Video Search Scraper - Metrics & Filters discovery into content data for the selected records.
- Then use Truth Social Scraper to extend TikTok Video Search Scraper - Metrics & Filters with a neighboring social-media research source when the brief calls for Truth data.
Design note
I found that the dataset contract includes collectCount and engagementRate, while the overview view highlights the more review-friendly fields authorUsername, caption, playCount, likeCount, commentCount, shareCount, engagementRate, durationSeconds, createdAt, and videoUrl. That shape makes the default dataset easy to scan while still preserving the fuller record for downstream use.
FAQ
When should I use keywords vs hashtags?
Use searchQueries for topic phrases such as product names, recipes, or campaign themes. Use hashtags when you want the TikTok hashtag feed for a tag such as fitness or running. You can also combine both in the same run.
How does provider routing work?
providerOrder lets you choose the backend sequence. The default is scrapecreators-first, and the live contract also exposes sociavault-first, scrapecreators-only, and sociavault-only.
What is the difference between the dataset and RUN_SUMMARY?
The default dataset holds one row per saved TikTok video. RUN_SUMMARY stores execution diagnostics, provider telemetry, filter stats, cost estimates, and stop reason information.
Can I use this Actor in an MCP workflow?
Yes. It is an Apify Actor usable through Apify MCP, which makes it a good fit for structured search-and-return workflows in agents.
How are video positions and pages represented?
resultPosition is the 1-based rank within a query, and page shows the provider page where the row was found.
Responsible use
Use the output in ways that respect TikTok's Terms of Service, applicable privacy and data-protection laws, and the rights of the creators whose public content appears in search results. Review your own obligations before storing, sharing, or automating decisions from the returned data.