TikTok Posts Search Scraper
Pricing
from $5.00 / 1,000 results
TikTok Posts Search Scraper
Search TikTok posts by keyword/hashtag. Multiple keywords, date-range filter, auto-pagination. Returns caption, author, likes, comments, shares, views and video URLs. No login needed — uses a real browser so TikTok signs its own API requests.
Pricing
from $5.00 / 1,000 results
Rating
0.0
(0)
Developer
code craker
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
6
Monthly active users
12 days ago
Last modified
Categories
Share
Apify actor that searches TikTok posts by keyword/hashtag and exports them as structured data — no login, no cookies, no session to maintain.
TikTok content is viewable logged-out; the only barrier is its anti-bot request
signing. This actor drives a real Chrome (Playwright) so TikTok's own JavaScript
signs its API requests, then intercepts the /api/challenge/item_list/ (and
/api/search/) responses — the same browser-interception pattern as the Reddit and
YouTube actors. There is nothing to reverse-engineer and no cookie that expires.
Features
- One keyword (
query) or many (queries) — each searched separately, combined and de-duplicated by video. - Hashtag feed (
/tag/<keyword>, default, open to logged-out visitors) or full-textsearchmode. Whitespace collapses into a single hashtag (artificial intelligence→ the#artificialintelligencefeed). - Auto-pagination by scrolling until
numberOfPostsper keyword is reached. - Actor-side
timeSince/timeUntildate filtering (TikTok has no date operators). - Anti-detection built in: stealth browser fingerprint, residential-proxy preflight, and automatic relaunch on a fresh IP when TikTok serves a captcha / empty responses.
- Results pushed per keyword, so an abort keeps everything collected so far.
Input
{"queries": ["econet", "#zimbabwe"],"numberOfPosts": 100,"searchMode": "hashtag","region": "US","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
numberOfPosts applies per keyword. Keep the RESIDENTIAL proxy — TikTok blocks
datacenter IPs and serves empty/captcha responses to flagged exits.
Output
One dataset item per video. Fields are emitted in both clean and snake_case/camelCase
forms so the item is a drop-in for the powerai/tiktok-hashtag-posts-scraper output
that scraping-tool's normalizeSocialPost already understands.
{"id": "7401234567890123456","url": "https://www.tiktok.com/@zimtech/video/7401234567890123456","webVideoUrl": "https://www.tiktok.com/@zimtech/video/7401234567890123456","text": "AI is changing Zim business #econet","author": {"uniqueId": "zimtech", "unique_id": "zimtech","nickname": "Zim Tech", "id": "99","profileUrl": "https://www.tiktok.com/@zimtech", "verified": true},"create_time": 1782898212,"created_at": "2026-07-01T09:30:12.000Z","likesCount": 4200, "diggCount": 4200, "digg_count": 4200,"commentsCount": 88, "commentCount": 88, "comment_count": 88,"sharesCount": 12, "shareCount": 12, "share_count": 12,"viewsCount": 150000,"playCount": 150000, "play_count": 150000,"duration": 42,"hashtags": ["econet", "ai"],"searchQuery": "econet","hashtag": "econet"}
created_at is exact (TikTok exposes real upload timestamps, unlike YouTube search).
Integration (scraping-tool)
Drop-in for the existing TikTok keyword path — this is our own actor with the same
output shape as powerai/tiktok-hashtag-posts-scraper, so set it as primary with the
vendor as fallback (mirroring Facebook), and normalizeSocialPost needs no change:
// ACTOR_FALLBACKS in scrapingService.js'outspoken_strategy/tiktok-post-search-scraper': 'powerai/tiktok-hashtag-posts-scraper',
// socialProjectMonitoringService.scrapeSocialPostsByKeyword (tiktok branch)const res = await this.scrapingService.scrape({url: `https://www.tiktok.com/tag/${encodeURIComponent(keyword)}`,resultsLimit: requestCount,actor: 'outspoken_strategy/tiktok-post-search-scraper',timeout,additionalInput: {query: keyword, numberOfPosts: requestCount, region: 'ZW',proxyConfiguration: { useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'], apifyProxyCountry: 'ZW' }},scrapeType: 'tiktok-keyword-search'});
The existing normalizeSocialPost already reads author.unique_id, video_id/id,
create_time, digg_count, comment_count, share_count, play_count — all present.
Local development
npm installecho '{ "query": "artificial intelligence", "numberOfPosts": 30, "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" } }' > storage/key_value_stores/default/INPUT.jsonnpm start
Note: TikTok flags IPs that make many requests, so local runs from a home IP may be
served empty responses — the actor is designed to run on Apify residential proxies.
Deploy with apify push.