TikTok Posts Search Scraper avatar

TikTok Posts Search Scraper

Pricing

from $5.00 / 1,000 results

Go to Apify Store
TikTok Posts Search Scraper

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

code craker

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

6

Monthly active users

12 days ago

Last modified

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-text search mode. Whitespace collapses into a single hashtag (artificial intelligence → the #artificialintelligence feed).
  • Auto-pagination by scrolling until numberOfPosts per keyword is reached.
  • Actor-side timeSince/timeUntil date 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 install
echo '{ "query": "artificial intelligence", "numberOfPosts": 30, "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" } }' > storage/key_value_stores/default/INPUT.json
npm 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.