TikTok Scraper With Advanced Filters avatar

TikTok Scraper With Advanced Filters

Pricing

from $5.99 / 1,000 results

Go to Apify Store
TikTok Scraper With Advanced Filters

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

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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 controlsprofileScrapeSections (videos and/or repost), searchType (keyword or hashtag), maxResults per 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 TypeExtracted FieldsPrimary Use Case
Profile videoid, 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 repostSame core fields, plus a repost object with flat authorMeta.* / videoMeta.* / musicMeta.* keysSee what a profile amplifies without posting original content
Hashtag search resultSame core fields, plus an item object with authorMeta, musicMeta, hashtags, mentions, videoMetaTrack everything posted under a hashtag or trend
Keyword search resultSame 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.

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?

  1. Open TikTok Scraper With Advanced Filters on the Apify Store and start it in Apify Console.
  2. Enter the query — add one or more TikTok profile URLs or usernames to startUrls, and/or type a term into searchQuery with searchType set to keyword or hashtag.
  3. Set the real query controls — profileScrapeSections (videos, repost, or both), maxResults per target, and any of the three filters (minEngagement, excludeKeywords, oldestDate).
  4. Click Start to launch the run.
  5. 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.

ParameterRequiredTypeConstraintsDescription
startUrlsNoarrayeditor: stringListTikTok profile URLs (e.g. https://www.tiktok.com/@username) or bare usernames. Bulk input supported. Leave empty to search-only.
profileScrapeSectionsNoarraydefault: ["videos"]; items enum: videos, repost; editor: selectWhich profile sections to scrape: videos (all profile videos) and/or repost (reposted content).
searchQueryNostringdefault: ""; editor: textfieldSearch query for hashtag or keyword search. Leave empty to profile-scrape only. Examples: Ronaldo, #travel, cooking tips.
searchTypeNostringdefault: "keyword"; enum: keyword, hashtag; editor: selectkeyword for general TikTok search, hashtag for hashtag-specific search.
maxResultsNointegerdefault: 100; minimum: 1; maximum: 1000Maximum results to collect per profile/search query, before filters are applied.
minEngagementNointegerdefault: 0; minimum: 0Drop any row whose like count is below this number. 0 = no filtering.
excludeKeywordsNoarraydefault: []; editor: stringListDrop any row whose caption/description contains any of these words or phrases (case-insensitive).
oldestDateNostringdefault: ""; 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.
proxyConfigurationNoobjecteditor: proxyProxy 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:

  • maxResults caps the raw fetch per profile/search query, before the three filters run — a low maxResults combined with a high minEngagement can legitimately return zero rows for a low-engagement target, since there's nothing left to filter down from.
  • An oldestDate value 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.
  • profileScrapeSections needs at least one value for profile scraping to run at all; if startUrls is 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:

FieldTypePresent whenDescription
typestringalwaysprofile_video, profile_repost, hashtag_search, keyword_search, or error
usernamestringprofile_video, profile_repostTikTok username the row came from
querystringhashtag_search, keyword_searchThe hashtag or keyword text searched
successbooleanalwaystrue for a scraped row, false for a failure/error row
idstringsuccess rowsTikTok's video ID
descriptionstringsuccess rowsVideo caption/description text
createTimeISOstring | nullsuccess rowsOriginal post time, UTC ISO-8601
likeCountintegersuccess rowsLike count at scrape time
viewCountintegersuccess rowsView/play count at scrape time
commentCountintegersuccess rowsComment count at scrape time
shareCountintegersuccess rowsShare count at scrape time
itemUrlstringsuccess rowsDirect URL to the video on TikTok
scrapedAtstringalwaysUTC ISO-8601 timestamp of when the row was written
errorstringfailure rows onlyHuman-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_video rows add a video object (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 keys videoId, videoTitle, videoUrl, videoCreatedAt, videoAuthor, videoViews, videoLikes, videoComments, videoShares.
  • hashtag_search rows add an item object (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 keys itemId, itemText, itemCreatedAt, itemViews, itemLikes, itemComments.
  • keyword_search rows add an item object mirroring TikTok's own search response (url, id, desc, createTime, createTimeISO, scheduleTime, video [~20 sub-fields including bitrateInfo], 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 keys itemId, itemText, itemCreatedAt, itemViews, itemLikes, itemComments.
  • profile_repost rows add a repost object — 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 keys repostId, 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 minEngagement to shortlist high-performing videos in a niche, then read likeCount/viewCount/shareCount to 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/searchType on a schedule and compare likeCount/viewCount across runs to track how coverage of a topic or hashtag shifts over time.
  • 🛡️ Brand safety / content moderation teams: use excludeKeywords to 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 ApifyClient
client = 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.

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.