TikTok Profile Scraper — Engagement Rate & Post Timing
Pricing
$19.99/month + usage
TikTok Profile Scraper — Engagement Rate & Post Timing
TikTok Profile Scraper extracts data from any public TikTok profile, including username, bio, followers, following, likes, profile picture, and recent video metadata. Ideal for influencer research, competitor analysis, trend tracking, and automating structured TikTok profile insights at scale.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
1
Bookmarked
13
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
TikTok Profile Scraper — Engagement Rate and Cadence
TikTok Profile Scraper — Engagement Rate & Posting Cadence turns a creator's TikTok videos into a per-creator analytics report — real engagement rate, posting cadence (posts per week, median gap, longest silence, peak posting day and hour), and a ranked top-posts shortlist — computed entirely from stats already fetched, with zero extra network requests. It's built for creators and social media managers who want their real posting rhythm and engagement rate rather than a single vanity metric, agencies benchmarking a client's or competitor's cadence, and researchers who need engagement statistics with an honest sample-size disclosure. No login is required. Every section below documents an input, an output field, or exactly how each analytics number is computed.
What is TikTok Profile Scraper — Engagement Rate & Posting Cadence?
This Actor fetches a TikTok creator's videos via TikTok's own internal API, then computes a full analytics report locally from the fetched posts — engagement rate, cadence statistics, and a ranked shortlist — all pure arithmetic on data already in hand, never a separate analytics call.
Key capabilities, read from the source:
- Every report number carries its own sample size. The report's
postsAnalyzedstates exactly how many posts each ratio is computed from, and any rate computed over fewer than 2 posts is returned asnullrather than a misleadingly precise number from too little data. - Honest window scoping.
windowScope/coversFullHistoryexplicitly discloses whether the analyzed posts represent a creator's full history or just the fetched window — since TikTok's endpoint always returns newest-first,postOrdering: "oldest"means oldest within the fetched window, not the account's true oldest post, and the report says so. - Both mean and median engagement, plus a consistency score. The report includes
engagementRate,engagementRateMedian, andengagementConsistency(coefficient of variation) — median exposes skew from a single viral post, and consistency tells you how stable a creator's performance is post-to-post. - Real cadence statistics, not an estimate.
postsPerWeek,medianGapDays,longestSilenceDays,peakWeekday, andpeakHourUtcare all computed from the fetched posts' actual timestamps. - A mobile-fingerprint transport built specifically because the plain approach fails. The module docstring notes a plain
aiohttptransport gets a WAF challenge disguised as HTTP 200 — this Actor usescurl_cffiwith a mobile browser impersonation ladder and detects blocks by body-content markers and length, never by trusting the status code alone. - Report rows are never charged. The per-creator
creator_reportrow is pushed via a plainActor.push_data()call with nocharged_event_name— only real video rows are billed.
What data can I extract with TikTok Profile Scraper — Engagement Rate & Posting Cadence?
Every field below is read directly from transform_post() and build_creator_report() in src/main.py — the dataset's default view surfaces 24 of these as table columns.
Video rows (type: "video")
| Field | Example Value | Notes |
|---|---|---|
text / createTimeISO / webVideoUrl | caption / posted date / link | |
diggCount / shareCount / playCount / commentCount / collectCount / repostCount | real per-video stats | Preferred from statsV2's exact counters when present, falling back to stats |
engagementCount / engagementRate / engagementRatePct | derived per-video engagement | |
isTopPost / topPostRank / rankedBy | whether this video made the shortlist, and by what metric | |
authorMeta | nested creator identity object | followers, following, verified status, etc. |
musicMeta / hashtags / mentions / locationMeta | attached metadata |
Creator report rows (type: "creator_report")
| Field | Example Value | Notes |
|---|---|---|
postsAnalyzed | 20 | Real sample size |
engagementRatePct / engagementRateMedian / engagementConsistency | 3.2 / 2.8 / 0.45 | Mean, median, and coefficient-of-variation |
postsPerWeek / medianGapDays / longestSilenceDays | 4.1 / 1.5 / 12 | Real cadence statistics |
peakWeekday / peakHourUtc | "Tuesday" / 14 | Most common posting day/hour in the sample |
windowScope / coversFullHistory | scope object / false | Discloses exactly what the numbers describe |
topPosts | ranked array | Top topPostsLimit posts by rankBy |
profileStats | followers, hearts, video count | Real profile-level stats |
Why not build this yourself?
TikTok's WAF answers a plain HTTP client's TLS fingerprint with an HTTP 200 response carrying a ~1.4KB challenge page — not a clear block status — so a scraper that only checks the status code will parse a fake "success" and either crash on malformed data or silently report zero results as if the profile were empty. This Actor's own source documents building a mobile-browser impersonation ladder specifically to get past this, and detecting the challenge by its actual _wafchallengeid/SlardarWAF body markers and response length rather than trusting the HTTP status. Getting cadence and engagement statistics right additionally means being disciplined about sample size — a rate computed from one or two posts is nearly meaningless, which is why this Actor returns null rather than a falsely precise number when the sample is too thin.
How to use data extracted from TikTok Profile Scraper — Engagement Rate & Posting Cadence?
Creator self-analysis and content strategy
Run your own profile to see your real postsPerWeek, peakWeekday/peakHourUtc, and the gap between engagementRatePct and engagementRateMedian — a large gap tells you your average is being propped up by a small number of standout posts.
Agency benchmarking
Compare engagementRatePct and postsPerWeek across a client and named competitors for a side-by-side cadence-and-performance report, using windowScope to confirm you're comparing equivalent sample windows.
Content research and timing optimization
Use topPosts (ranked by rankBy) alongside peakWeekday/peakHourUtc to see whether a creator's best-performing content actually aligns with their typical posting schedule.
AI agents and reporting pipelines
Because the report row is one self-contained object with postsAnalyzed attached to every ratio, an agent can generate an accurate summary directly from the report without re-deriving statistical validity itself.
🔼 Input sample
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
creatorHandles | No | array | TikTok usernames or profile URLs, one per line. | ["khaby.lame"] |
postsPerCreator | No | integer (1–500) | Analysis window size per creator. Default 20. | 50 |
includeCreatorReport | No | boolean | Emit the creator_report row (uncharged). Default true. | true |
rankBy | No | string enum | engagementRate, plays, diggs, or shares. Default "engagementRate". | "engagementRate" |
topPostsLimit | No | integer (0–50) | Shortlist length. 0 skips it. Default 5. | 10 |
postOrdering | No | string enum | latest, popular, oldest — client-side ordering within the fetched window. Default "latest". | "popular" |
windowStartDate / windowEndDate | No | string (date) | Restrict the analysis window by date. | "30" (last 30 days) |
minHearts / maxHearts | No | integer | Keep only posts with likes at/above minHearts or below maxHearts. | 10000 |
maxFollowersPerProfile / maxFollowingPerProfile | No | integer | Skip posts whose author has this many followers/following or more. | — |
profiles, resultsPerPage, profileSorting, oldestPostDateUnified, newestPostDate, leastDiggs, mostDiggs, profileScrapeSections | No | various | Base-scraper-compatible aliases for the fields above — present so existing base input JSON runs unchanged; an explicit base key takes precedence over its analytics-named counterpart. | — |
proxyConfiguration | No | object | Optional; escalates to datacenter then residential only while a creator has produced no rows yet. | {"useApifyProxy": false} |
{"creatorHandles": ["khaby.lame"],"postsPerCreator": 50,"rankBy": "engagementRate","topPostsLimit": 10}
Common pitfall: postOrdering: "oldest" does not mean the creator's oldest-ever post — TikTok's endpoint always returns a newest-first window, so "oldest" only reorders within whatever window postsPerCreator fetched. Check coversFullHistory on the report row before treating cadence numbers as representative of a creator's entire posting history.
🔽 Output sample
Output is one JSON row per video (charged), plus one uncharged report row per creator, pushed to the run's default dataset.
{"type": "video","creatorUsername": "khaby.lame","text": "When it's actually that simple...","diggCount": 850000,"shareCount": 42000,"playCount": 12000000,"commentCount": 8500,"engagementRatePct": 7.6,"isTopPost": true,"topPostRank": 1,"rankedBy": "engagementRate","createTimeISO": "2026-07-20T14:30:00Z","webVideoUrl": "https://www.tiktok.com/@khaby.lame/video/1234567890"}
A creator report row:
{"type": "creator_report","creatorUsername": "khaby.lame","postsAnalyzed": 50,"engagementRatePct": 4.2,"engagementRateMedian": 3.8,"engagementConsistency": 0.35,"postsPerWeek": 3.5,"medianGapDays": 2.0,"longestSilenceDays": 8,"peakWeekday": "Friday","peakHourUtc": 18,"coversFullHistory": false,"topPostUrl": "https://www.tiktok.com/@khaby.lame/video/1234567890"}
How do you filter and target specific videos?
Window size drives report reliability. postsPerCreator is the primary lever — a larger window gives a more statistically representative cadence and engagement report, at the cost of a longer run; postsAnalyzed on the report row always states the real sample size used.
Hearts filters profile a creator's tiers of content. minHearts/maxHearts let you isolate a creator's viral hits versus their typical output — useful for understanding the spread between their best and average performance rather than one blended number.
Date window scopes the analysis to a specific period. windowStartDate/windowEndDate restrict which posts feed the report, useful for a "last quarter" or "since this campaign launched" style analysis rather than an all-time snapshot.
Three real examples:
{ "creatorHandles": ["khaby.lame"], "postsPerCreator": 100, "rankBy": "plays", "topPostsLimit": 10 }
Deep view-focused analysis with a large top-posts shortlist.
{ "creatorHandles": ["creator1", "creator2", "creator3"], "postsPerCreator": 30 }
Multi-creator cadence and engagement-rate comparison.
{ "creatorHandles": ["mybrandaccount"], "windowStartDate": "30", "includeCreatorReport": true }
Last-30-days performance snapshot for a single account.
▶️ Want to try other scrapers?
| Scraper | What it extracts |
|---|---|
| TikTok Comments Scraper — Full Reply Threads | Nested comment threads with creator-answer detection |
| TikTok Video Scraper — Hashtag, Sound & Reach | Video-level reach and sound data |
| Instagram Engagement Estimator | Profile-level engagement rate and posting cadence |
| Threads User Posts Scraper — Engagement Cadence Report | Post-level engagement and posting cadence |
How to extract TikTok engagement and cadence data programmatically
This Actor runs as a standard Apify Actor call — one API call in, structured JSON dataset out, using your Apify API token.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("<YOUR_USERNAME>/tiktok-profile-scraper-engagement-rate-posting-cadence").call(run_input={"creatorHandles": ["khaby.lame"],"postsPerCreator": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("type") == "creator_report":print(item["creatorUsername"], item["engagementRatePct"], item["postsPerWeek"])
Export to spreadsheets or CRM
Every dataset supports one-click CSV/Excel export from the Apify Console. Filter on type to separate video rows from creator report rows before exporting.
Is it legal to scrape TikTok profiles?
Scraping publicly visible TikTok videos and profile data is generally lawful, since this data is published for anyone to view without logging in — the underlying legal question was tested directly in hiQ Labs v. LinkedIn (9th Cir.), which held that scraping public, non-password-protected data does not violate the U.S. Computer Fraud and Abuse Act. Creator identity and follower counts are business-relevant public data, but consult legal counsel for commercial applications, particularly around large-scale storage of any personal information in captions or comments.
❓ FAQ
Why is a rate returned as null instead of a number sometimes?
The report never computes a rate from fewer than 2 posts, since a ratio from that thin a sample would be statistically meaningless despite looking precise. null in that case is more honest than a misleading number.
Does "oldest" ordering give me a creator's true oldest post?
No — TikTok's endpoint always returns newest-first, so this Actor's postOrdering: "oldest" only reorders posts within the fetched window, not across the creator's full history. Check coversFullHistory on the report row to see whether the window actually reached the account's full post history.
Are report rows charged the same as video rows?
No — the creator_report row is pushed uncharged; only real video rows are billed as row_result events.
What happens if a profile is private or not found?
The Actor pushes an uncharged error row with errorReason set to a specific status (e.g. profile_private, profile_not_found) rather than crashing the whole run — other creators in your batch continue processing.
How does the Actor tell a real block from a genuinely empty result?
It checks the response body for TikTok's own WAF markers and a minimum expected byte length — an HTTP 200 with a suspiciously short body or a WAF marker is treated as a block requiring fingerprint/proxy escalation, never as "this creator has no videos."
How does this compare to other TikTok profile scrapers?
As observed on the Apify Store on 2026-07-26, khadinakbar/tiktok-profile-scraper and easyapi/tiktok-profile-posts-scraper both extract profile videos, but neither documents a built-in engagement-and-cadence analytics report with sample-size honesty — that analytics layer is unique to this Actor.
Does this work with AI agent frameworks?
Yes — call it as a standard HTTP endpoint via the Apify API from any agent framework capable of making an API call; there's no MCP-specific integration for this Actor.
Conclusion
TikTok Profile Scraper — Engagement Rate & Posting Cadence turns a creator's videos into both raw data and a statistically honest analytics report — real engagement rate, cadence, and a ranked shortlist, every number carrying its own sample size. It fits creator self-analysis, agency benchmarking, and content-timing research. Start a run from the Apify Console or the Apify API with your target creators to get your first cadence report.