TikTok Scraper With Advanced Filters
Pricing
from $5.99 / 1,000 results
TikTok Scraper With Advanced Filters
TikTok Scraper With Advanced Filters extracts TikTok videos and profiles using filters like keywords, hashtags, language, region, engagement, date, and more. Get captions, views, likes, comments, shares, creator data, and timestamps for research and analysis.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
TikTok Scraper — Videos, Reposts & Search With Advanced Filters
TikTok Scraper With Advanced Filters pulls videos from public TikTok profiles, hashtag search, and keyword search, then narrows every result down with a minimum-likes threshold, an exclude-keywords list, and an oldest-date cutoff before a row is ever pushed. Each run returns typed JSON — profile videos, profile reposts, hashtag search results, or keyword search results — carrying captions, engagement counts, author details, and direct video URLs, ready to hand to an LLM, load into a spreadsheet, or feed a monitoring pipeline. No TikTok login is required. As TikTok's markup keeps shifting, the same four scrape modes and the same three filters keep returning results in one stable schema.
What is TikTok Scraper With Advanced Filters?
TikTok Scraper With Advanced Filters is an Apify Actor that queries TikTok four ways in a single run: it scrapes a profile's videos and/or its reposts, and it runs a keyword or hashtag search — then applies the same set of post-fetch filters to whichever modes you use. That filter layer is the thing other TikTok scrapers leave to you after export: minEngagement, excludeKeywords, and oldestDate all run before a row is pushed, so a row that doesn't pass never lands in your dataset and never costs you anything. No TikTok account, login, or cookie is needed — every mode reads pages and endpoints that are already public.
- 📹 Profile videos — every video on a public profile, paginated automatically until TikTok stops returning new ones
- 🔄 Profile reposts — the videos a profile has reposted, captured from its Reposts tab
- #️⃣ Hashtag search — videos returned for a given
#hashtag - 🔑 Keyword search — videos returned for a general TikTok keyword search
- 🎚️ Query controls —
profileScrapeSections(videos and/or repost),searchType(keyword or hashtag),maxResultsper target, plus the three filters below
What data can you get with TikTok Scraper With Advanced Filters?
TikTok Scraper With Advanced Filters returns four result types, each carrying captions, engagement counts, timestamps, and direct video URLs, and each subject to the same filter set.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Profile video | id, description, createTimeISO, likeCount, viewCount, commentCount, shareCount, itemUrl, plus a nested video object (author, stats, music, cover/download URLs) | Track a creator's full upload history and engagement |
| Profile repost | Same core fields, plus a repost object with flat authorMeta.* / videoMeta.* / musicMeta.* keys | See what a profile amplifies without posting original content |
| Hashtag search result | Same core fields, plus an item object with authorMeta, musicMeta, hashtags, mentions, videoMeta | Track everything posted under a hashtag or trend |
| Keyword search result | Same core fields, plus a large item object mirroring TikTok's own search response (video, author, music, stats, textExtra) | General topic or brand-mention monitoring |
🎚️ Filtering that runs before you're charged
minEngagement, excludeKeywords, and oldestDate apply to all four scrape modes identically, after the raw fetch and before the push. A row that fails any active filter is simply never pushed — it isn't pushed-then-discarded, it's never created, so it never triggers a row_result billing event. minEngagement compares against likeCount; excludeKeywords does a case-insensitive substring check against the caption/description text; oldestDate compares against createTimeISO. All three are optional and combine with AND logic:
{"minEngagement": 5000,"excludeKeywords": ["giveaway", "ad"],"oldestDate": "30 days"}
A video with 4,999 likes, or one whose caption contains "ad", or one posted more than 30 days ago, is dropped by this configuration regardless of which of the four modes produced it.
🔄 Profile reposts
Reposts are captured separately from a profile's own uploads, from the same profile page's Reposts tab. The row carries the same core engagement fields as any other mode, plus a repost object — useful for competitive or brand-safety work where what an account chooses to amplify matters as much as what it creates, without mixing the two into one undifferentiated video list.
Why not build this yourself?
TikTok's profile pages and internal API responses change their markup and payload shape without notice, and a plain HTTP client can't always tell a real page from a challenge page — this Actor checks for TikTok's own embedded JSON markers (__UNIVERSAL_DATA_FOR_REHYDRATION__, SIGI_STATE, sigi-persisted-data) and a minimum response size before trusting a profile fetch, and treats anything smaller with no marker as a block. Getting blocked also isn't a single failure mode to handle once: this Actor escalates the outbound connection in tiers — starting on a direct connection, then an Apify Proxy datacenter group, then a residential group, retrying on residential up to 3 times before giving up on that target — and two of the four scrape modes drive a real headless browser (Playwright) with scroll-based pagination rather than a simple paginated API call. Reproducing four separate scraping engines, the block-detection logic, and the connection-escalation ladder is a meaningfully different project than calling an endpoint.
What's the difference between TikTok keyword search and hashtag search?
searchType: "keyword" runs a general TikTok search for whatever text you put in searchQuery — the same search box TikTok's own UI exposes, matching captions, sounds, and other on-platform signals. searchType: "hashtag" searches specifically for videos tagged with that word as a hashtag, and the Actor strips a leading # automatically if you include one. The two use separate code paths internally (a Playwright-driven general-search flow versus a Playwright-driven hashtag-search flow) because TikTok serves them from different endpoints, but both return the same output schema, so you can filter and process the results identically regardless of which mode produced them. Use keyword when you want topic or brand-mention coverage; use hashtag when you specifically want everything tagged under a trend or campaign hashtag.
How to scrape TikTok with TikTok Scraper With Advanced Filters?
- Open TikTok Scraper With Advanced Filters on the Apify Store and start it in Apify Console.
- Enter the query — add one or more TikTok profile URLs or usernames to
startUrls, and/or type a term intosearchQuerywithsearchTypeset tokeywordorhashtag. - Set the real query controls —
profileScrapeSections(videos,repost, or both),maxResultsper target, and any of the three filters (minEngagement,excludeKeywords,oldestDate). - Click Start to launch the run.
- Once the run finishes, open the Dataset tab and export the results as JSON, CSV, Excel, or another supported format, or pull them programmatically with the Apify API or
apify-client.
How to run multiple queries in one job
startUrls is a bulk stringList field — add as many profile URLs or bare usernames as you want and the Actor works through them one after another in the same run, applying the same profileScrapeSections and filters to each. searchQuery runs a single search per run, so covering several keywords or hashtags means either separate runs or scheduling repeated runs with different input.
⬇️ Input
TikTok Scraper With Advanced Filters has no required fields — provide startUrls, searchQuery, or both. Every parameter below comes straight from the input schema.
| Parameter | Required | Type | Constraints | Description |
|---|---|---|---|---|
startUrls | No | array | editor: stringList | TikTok profile URLs (e.g. https://www.tiktok.com/@username) or bare usernames. Bulk input supported. Leave empty to search-only. |
profileScrapeSections | No | array | default: ["videos"]; items enum: videos, repost; editor: select | Which profile sections to scrape: videos (all profile videos) and/or repost (reposted content). |
searchQuery | No | string | default: ""; editor: textfield | Search query for hashtag or keyword search. Leave empty to profile-scrape only. Examples: Ronaldo, #travel, cooking tips. |
searchType | No | string | default: "keyword"; enum: keyword, hashtag; editor: select | keyword for general TikTok search, hashtag for hashtag-specific search. |
maxResults | No | integer | default: 100; minimum: 1; maximum: 1000 | Maximum results to collect per profile/search query, before filters are applied. |
minEngagement | No | integer | default: 0; minimum: 0 | Drop any row whose like count is below this number. 0 = no filtering. |
excludeKeywords | No | array | default: []; editor: stringList | Drop any row whose caption/description contains any of these words or phrases (case-insensitive). |
oldestDate | No | string | default: ""; editor: datepicker (absolute or relative) | Drop any row posted before this date. Accepts an absolute date (e.g. 2025-01-01) or a relative value (e.g. 30 days). Empty = no date filtering. |
proxyConfiguration | No | object | editor: proxy | Proxy settings. By default, no proxy is used (direct connection). |
Example input:
{"startUrls": ["https://www.tiktok.com/@mrbeast", "charlidamelio"],"profileScrapeSections": ["videos", "repost"],"searchQuery": "#travel","searchType": "hashtag","maxResults": 200,"minEngagement": 5000,"excludeKeywords": ["giveaway", "ad"],"oldestDate": "30 days","proxyConfiguration": { "useApifyProxy": true }}
Common pitfalls:
maxResultscaps the raw fetch per profile/search query, before the three filters run — a lowmaxResultscombined with a highminEngagementcan legitimately return zero rows for a low-engagement target, since there's nothing left to filter down from.- An
oldestDatevalue that isn't a valid ISO date and isn't resolved to one by the datepicker's relative-date parsing is silently ignored — the date filter is skipped rather than the run failing, so a malformed value can look like "no results are being filtered" when in fact none are. profileScrapeSectionsneeds at least one value for profile scraping to run at all; ifstartUrlsis filled but this array is emptied out, no profile-phase rows are produced.
⬆️ Output
Every result is a typed JSON row pushed to the Actor's dataset as it passes the filters, exportable as JSON, CSV, Excel, HTML table, XML, or RSS from the Dataset tab or via the Apify API. Each row's type field marks which of the five shapes it is: profile_video, profile_repost, hashtag_search, keyword_search, or error.
Core fields present on every row:
| Field | Type | Present when | Description |
|---|---|---|---|
type | string | always | profile_video, profile_repost, hashtag_search, keyword_search, or error |
username | string | profile_video, profile_repost | TikTok username the row came from |
query | string | hashtag_search, keyword_search | The hashtag or keyword text searched |
success | boolean | always | true for a scraped row, false for a failure/error row |
id | string | success rows | TikTok's video ID |
description | string | success rows | Video caption/description text |
createTimeISO | string | null | success rows | Original post time, UTC ISO-8601 |
likeCount | integer | success rows | Like count at scrape time |
viewCount | integer | success rows | View/play count at scrape time |
commentCount | integer | success rows | Comment count at scrape time |
shareCount | integer | success rows | Share count at scrape time |
itemUrl | string | success rows | Direct URL to the video on TikTok |
scrapedAt | string | always | UTC ISO-8601 timestamp of when the row was written |
error | string | failure rows only | Human-readable failure reason |
Additional fields by row type (each row carries its mode's raw nested payload alongside the core fields above, so nothing from the underlying fetch is dropped):
profile_videorows add avideoobject (id,url,title,description,create_time,duration,width,height,cover_url,dynamic_cover_url,play_url,download_url,author.username,author.nickname,author.avatar,author.verified,stats.views,stats.likes,stats.comments,stats.shares,music.title,music.author,music.duration) plus flat mirror keysvideoId,videoTitle,videoUrl,videoCreatedAt,videoAuthor,videoViews,videoLikes,videoComments,videoShares.hashtag_searchrows add anitemobject (id,text,createTime,createTimeISO,isAd,isMuted,authorMeta[id,name,nickName,verified,signature,bioLink,avatar,privateAccount,ttSeller,following,fans,heart,video,digg],musicMeta[musicName,musicAuthor,musicOriginal,musicAlbum,playUrl,coverMediumUrl,musicId],webVideoUrl,mediaUrls,videoMeta[height,width,duration,coverUrl,originalCoverUrl,definition,format,originalDownloadAddr,downloadAddr],diggCount,shareCount,playCount,collectCount,commentCount,mentions,hashtags) plus flat mirror keysitemId,itemText,itemCreatedAt,itemViews,itemLikes,itemComments.keyword_searchrows add anitemobject mirroring TikTok's own search response (url,id,desc,createTime,createTimeISO,scheduleTime,video[~20 sub-fields includingbitrateInfo],author,music,challenges,stats,isActivityItem,duetInfo.duetFromId,warnInfo,originalItem,officalItem,textExtra,secret,forFriend,digged,itemCommentStatus,showNotPass,vl1,takeDown,itemMute,effectStickers,authorStats,privateItem,duetEnabled,stitchEnabled,stickersOnItem,isAd,shareEnabled,comments,duetDisplay,stitchDisplay,indexEnabled,diversificationLabels,adAuthorization,adLabelVersion,locationCreated,nickname,authorId,authorSecId,avatarThumb,downloadSetting,authorPrivate) plus flat mirror keysitemId,itemText,itemCreatedAt,itemViews,itemLikes,itemComments.profile_repostrows add arepostobject — note this one uses flat dotted key names instead of nested objects (authorMeta.avatar,authorMeta.name,text,diggCount,shareCount,playCount,commentCount,videoMeta.duration,musicMeta.musicName,musicMeta.musicAuthor,musicMeta.musicOriginal,createTime,createTimeISO,webVideoUrl,authorMeta.nickname,authorMeta.verified,authorMeta.signature,authorMeta.following,authorMeta.fans,authorMeta.heart,authorMeta.video,authorMeta.digg,stats.collectCount,videoMeta.width,videoMeta.height,videoMeta.ratio,videoMeta.cover,videoMeta.originCover,videoMeta.dynamicCover,videoMeta.playAddr,videoMeta.downloadAddr,videoMeta.shareCover,musicMeta.musicId,musicMeta.musicAlbum,musicMeta.musicCover,musicMeta.musicPlayUrl,musicMeta.musicDuration,id,secretID,isAd,itemCommentStatus,privateItem,duetEnabled,stitchEnabled,shareEnabled,locationCreated,forFriend,officalItem,originalItem,duetDisplay,stitchDisplay,stickersOnItem,effectStickers) plus flat mirror keysrepostId,repostText,repostUrl,repostCreatedAt,repostAuthor,repostViews,repostLikes.
Billing: only rows with success: true are billed under the row_result event. The no-input error row and the four per-mode failure rows are pushed for visibility but never charged — filter them out of downstream processing with success === true (or error not present).
Scraped results
[{"type": "profile_video","username": "mrbeast","success": true,"video": {"id": "7321456789012345678","url": "https://www.tiktok.com/@mrbeast/video/7321456789012345678","title": "I Gave $100,000 To Random People","description": "I Gave $100,000 To Random People","create_time": 1717000000,"duration": 45,"width": 1080,"height": 1920,"cover_url": "https://p16-sign.tiktokcdn.com/example/cover.jpeg","dynamic_cover_url": "https://p16-sign.tiktokcdn.com/example/dyncover.jpeg","play_url": "https://v16.tiktokcdn.com/example/play.mp4","download_url": "https://v16.tiktokcdn.com/example/download.mp4","author": { "username": "mrbeast", "nickname": "MrBeast", "avatar": "https://p16-sign.tiktokcdn.com/example/avatar.jpeg", "verified": true },"stats": { "views": 15230000, "likes": 980000, "comments": 4500, "shares": 21000 },"music": { "title": "original sound", "author": "MrBeast", "duration": 45 }},"id": "7321456789012345678","description": "I Gave $100,000 To Random People","createTimeISO": "2024-05-29T14:26:40Z","likeCount": 980000,"viewCount": 15230000,"commentCount": 4500,"shareCount": 21000,"itemUrl": "https://www.tiktok.com/@mrbeast/video/7321456789012345678","videoId": "7321456789012345678","videoTitle": "I Gave $100,000 To Random People","videoUrl": "https://www.tiktok.com/@mrbeast/video/7321456789012345678","videoCreatedAt": "2024-05-29T14:26:40Z","videoAuthor": "mrbeast","videoViews": 15230000,"videoLikes": 980000,"videoComments": 4500,"videoShares": 21000,"scrapedAt": "2026-08-15T09:12:03Z"},{"type": "hashtag_search","query": "travel","success": true,"item": {"id": "7301122334455667788","text": "solo backpacking through the alps #travel","createTime": 1715000000,"createTimeISO": "2024-05-06T13:33:20Z","isAd": false,"isMuted": false,"authorMeta": { "id": "6812345", "name": "wanderjules", "nickName": "Jules Wanders", "verified": false, "signature": "travel + coffee", "bioLink": null, "avatar": "https://p16-sign.tiktokcdn.com/example/jules.jpeg", "privateAccount": false, "ttSeller": false, "following": 210, "fans": 84200, "heart": 1200000, "video": 340, "digg": 15000 },"musicMeta": { "musicName": "original sound", "musicAuthor": "wanderjules", "musicOriginal": true, "musicAlbum": "", "playUrl": "https://sf16.tiktokcdn.com/example/music.mp3", "coverMediumUrl": "https://p16-sign.tiktokcdn.com/example/musiccover.jpeg", "musicId": "700123456" },"webVideoUrl": "https://www.tiktok.com/@wanderjules/video/7301122334455667788","mediaUrls": ["https://v16.tiktokcdn.com/example/play.mp4"],"videoMeta": { "height": 1920, "width": 1080, "duration": 32, "coverUrl": "https://p16-sign.tiktokcdn.com/example/cover2.jpeg", "originalCoverUrl": "https://p16-sign.tiktokcdn.com/example/origcover2.jpeg", "definition": "720p", "format": "mp4", "originalDownloadAddr": "https://v16.tiktokcdn.com/example/download2.mp4", "downloadAddr": "https://v16.tiktokcdn.com/example/download2.mp4" },"diggCount": 62000,"shareCount": 1900,"playCount": 940000,"collectCount": 3300,"commentCount": 810,"mentions": [],"hashtags": [{ "name": "travel" }, { "name": "alps" }]},"id": "7301122334455667788","description": "solo backpacking through the alps #travel","createTimeISO": "2024-05-06T13:33:20Z","likeCount": 62000,"viewCount": 940000,"commentCount": 810,"shareCount": 1900,"itemUrl": "https://www.tiktok.com/@wanderjules/video/7301122334455667788","itemId": "7301122334455667788","itemText": "solo backpacking through the alps #travel","itemCreatedAt": "2024-05-06T13:33:20Z","itemViews": 940000,"itemLikes": 62000,"itemComments": 810,"scrapedAt": "2026-08-15T09:14:41Z"},{"type": "profile_repost","username": "mrbeast","success": true,"repost": {"authorMeta.avatar": "https://p16-sign.tiktokcdn.com/example/other.jpeg","authorMeta.name": "otheruser","text": "this is wild","diggCount": 320000,"shareCount": 8900,"playCount": 5100000,"commentCount": 4100,"videoMeta.duration": 18,"musicMeta.musicName": "trending sound","musicMeta.musicAuthor": "otheruser","musicMeta.musicOriginal": false,"createTime": 1716000000,"createTimeISO": "2024-05-18T05:20:00Z","webVideoUrl": "https://www.tiktok.com/@otheruser/video/7311998877665544332","id": "7311998877665544332","repostId": "7311998877665544332","repostText": "this is wild","repostUrl": "https://www.tiktok.com/@otheruser/video/7311998877665544332","repostCreatedAt": "2024-05-18T05:20:00Z","repostAuthor": "otheruser","repostViews": 5100000,"repostLikes": 320000},"id": "7311998877665544332","description": "this is wild","createTimeISO": "2024-05-18T05:20:00Z","likeCount": 320000,"viewCount": 5100000,"commentCount": 4100,"shareCount": 8900,"itemUrl": "https://www.tiktok.com/@otheruser/video/7311998877665544332","scrapedAt": "2026-08-15T09:16:02Z"},{"type": "profile_video","username": "some_private_or_dead_handle","success": false,"error": "This profile could not be scraped after multiple attempts.","scrapedAt": "2026-08-15T09:17:55Z"}]
How can I use the data extracted with TikTok Scraper With Advanced Filters?
- 📊 Social & influencer marketers: filter by
minEngagementto shortlist high-performing videos in a niche, then readlikeCount/viewCount/shareCountto rank creators or campaign hashtags for outreach. - 🤖 AI engineers and LLM developers: run a query, get back structured JSON with
description,createTimeISO, and engagement fields, and pass it directly to an LLM as grounded context for summarization or trend-explanation tasks. - 🔬 Market and trend researchers: run the same
searchQuery/searchTypeon a schedule and comparelikeCount/viewCountacross runs to track how coverage of a topic or hashtag shifts over time. - 🛡️ Brand safety / content moderation teams: use
excludeKeywordsto strip promotional or policy-relevant terms out of a monitoring feed before it reaches a human reviewer or a downstream classifier.
How do you monitor TikTok engagement over time?
Monitoring here means running the same profile, hashtag, or keyword query repeatedly and comparing each run's numbers to the last one, rather than treating a single run as a snapshot. Because every row carries id, createTimeISO, and the four engagement counts (likeCount, viewCount, commentCount, shareCount), you can key two runs' datasets by id and diff those four fields to see which videos gained the most traction, and use createTimeISO to separate genuinely new uploads from re-scraped older ones.
A practical loop: schedule a run across a fixed set of usernames and/or hashtags, set oldestDate to roughly your run interval so each run only pulls what's new since the last one, and keep minEngagement at whatever floor matters for your use case so noise never enters the dataset in the first place. Compare the new run's dataset against the previous run's export (by id) and alert on whichever delta matters — a video crossing an engagement threshold, a new upload from a tracked profile, or a spike in hashtag volume.
The Actor itself has no built-in scheduler; the real delivery mechanism is Apify's own platform tooling — set up an Apify Schedule in the Console to trigger runs on a cron cadence, and attach an Apify webhook on the run-succeeded event to push each run's dataset to your own pipeline.
Integrate TikTok Scraper With Advanced Filters and automate your workflow
TikTok Scraper With Advanced Filters works with any language or tool that can send an HTTP request or call the Apify SDK.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run_input = {"startUrls": ["https://www.tiktok.com/@mrbeast"],"searchQuery": "#travel","searchType": "hashtag","maxResults": 200,"minEngagement": 1000,}run = client.actor("YOUR_USERNAME/tiktok-scraper-with-advanced-filters").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("success"):print(item["description"], item["likeCount"])
Scheduled monitoring and delivery
The Actor has no delivery feature of its own; use Apify's platform tooling instead — an Apify Schedule to trigger runs on a cron cadence, and an Apify webhook (e.g. on ACTOR.RUN.SUCCEEDED) to push each finished run's dataset to Slack, email, or your own HTTP endpoint.
Is it legal to scrape TikTok video data?
Yes — scraping publicly visible TikTok content is legal in most jurisdictions when done responsibly. TikTok Scraper With Advanced Filters retrieves only what any visitor's browser already receives from a public profile page, hashtag page, or search page; it does not bypass a login wall or paywall. Because TikTok's public pages carry creator identifiers (usernames, nicknames, avatars, follower counts) tied to real individuals, GDPR (EU) and CCPA (California) can apply once you store or process that data at scale, particularly if you profile or contact identifiable people from it. TikTok's own Terms of Service separately restrict automated access, so review them before large-scale or commercial use. Scraping for AI-training purposes and scraping for short-term operational monitoring carry different risk profiles. Consult your legal team for commercial use cases involving bulk data storage.
Frequently asked questions
Can I scrape both TikTok profiles and search results in the same run?
Yes. If startUrls and searchQuery are both filled, the Actor runs profile scraping first (videos and/or reposts, per profileScrapeSections), then search scraping second (keyword or hashtag, per searchType), and writes both to the same dataset.
What's the difference between searchType: "keyword" and searchType: "hashtag"?
keyword runs a general TikTok search for whatever text is in searchQuery. hashtag searches specifically for videos tagged with that word as a hashtag (a leading # is stripped automatically). Both return the same output schema.
How does TikTok Scraper With Advanced Filters handle TikTok's anti-bot measures?
It starts every run on a direct connection and escalates automatically on a blocked or challenge response: first to an Apify Proxy datacenter group, then to a residential group, retrying up to 3 times on residential before giving up on that target. It also detects silent blocks — a page returned with a normal status but under 5,000 bytes and no TikTok content marker is treated as a block rather than real content.
Does TikTok Scraper With Advanced Filters filter results by engagement, keywords, and date?
Yes — minEngagement, excludeKeywords, and oldestDate apply identically to all four scrape modes. A row that fails any active filter is dropped before it's pushed, so it's never billed under the row_result event.
How many results does TikTok Scraper With Advanced Filters return per query?
maxResults (default 100, range 1–1000) caps the raw fetch for each profile and for the search query, before filters run. The number of rows actually saved can be lower once minEngagement, excludeKeywords, or oldestDate remove some of them. There's no separate cap beyond that per-target ceiling.
How do I use TikTok Scraper With Advanced Filters to monitor TikTok engagement over time?
Schedule repeated runs of the same profiles/queries, key the results by id, and diff likeCount/viewCount/commentCount/shareCount between runs. Use Apify Schedules to trigger the runs and an Apify webhook to deliver each run's results.
Does TikTok Scraper With Advanced Filters work with Claude, ChatGPT, and AI agent frameworks?
It has no MCP server, but it's callable as a standard Apify Actor run through the Apify API or the apify-client SDK, so any agent framework that can issue an HTTP request can trigger a run and read the JSON dataset back as grounded context.
Can I use TikTok Scraper With Advanced Filters without managing proxies or a TikTok account?
Yes. No TikTok login is required since every mode reads public pages, and by default the Actor runs on a direct connection with no proxy setup needed. proxyConfiguration is only there if you want to force a specific Apify Proxy configuration from the start.
What happens if a profile or search can't be scraped?
The Actor retries automatically with connection escalation between attempts — 4 attempts for profile videos, 3 for profile reposts, hashtag search, and keyword search. If every attempt fails, it pushes one row with success: false and a plain-language error field instead of stopping the run, and that row is never charged.
💬 Your feedback
Found a bug, or a field missing from the output? Let Scrapier know through the Actor's Issues tab on the Apify Store, or via the Apify Console's built-in support/contact options on the Actor's page. Bug reports and feature requests are what keep this scraper's four scrape modes matching what TikTok actually serves.