TikTok Profile Scraper — Engagement Rate & Post Timing avatar

TikTok Profile Scraper — Engagement Rate & Post Timing

Pricing

$19.99/month + usage

Go to Apify Store
TikTok Profile Scraper — Engagement Rate & Post Timing

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

SimpleAPI

Maintained by Community

Actor stats

1

Bookmarked

13

Total users

0

Monthly active users

3 days ago

Last modified

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 postsAnalyzed states exactly how many posts each ratio is computed from, and any rate computed over fewer than 2 posts is returned as null rather than a misleadingly precise number from too little data.
  • Honest window scoping. windowScope/coversFullHistory explicitly 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, and engagementConsistency (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, and peakHourUtc are 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 aiohttp transport gets a WAF challenge disguised as HTTP 200 — this Actor uses curl_cffi with 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_report row is pushed via a plain Actor.push_data() call with no charged_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")

FieldExample ValueNotes
text / createTimeISO / webVideoUrlcaption / posted date / link
diggCount / shareCount / playCount / commentCount / collectCount / repostCountreal per-video statsPreferred from statsV2's exact counters when present, falling back to stats
engagementCount / engagementRate / engagementRatePctderived per-video engagement
isTopPost / topPostRank / rankedBywhether this video made the shortlist, and by what metric
authorMetanested creator identity objectfollowers, following, verified status, etc.
musicMeta / hashtags / mentions / locationMetaattached metadata

Creator report rows (type: "creator_report")

FieldExample ValueNotes
postsAnalyzed20Real sample size
engagementRatePct / engagementRateMedian / engagementConsistency3.2 / 2.8 / 0.45Mean, median, and coefficient-of-variation
postsPerWeek / medianGapDays / longestSilenceDays4.1 / 1.5 / 12Real cadence statistics
peakWeekday / peakHourUtc"Tuesday" / 14Most common posting day/hour in the sample
windowScope / coversFullHistoryscope object / falseDiscloses exactly what the numbers describe
topPostsranked arrayTop topPostsLimit posts by rankBy
profileStatsfollowers, hearts, video countReal 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

ParameterRequiredTypeDescriptionExample Value
creatorHandlesNoarrayTikTok usernames or profile URLs, one per line.["khaby.lame"]
postsPerCreatorNointeger (1–500)Analysis window size per creator. Default 20.50
includeCreatorReportNobooleanEmit the creator_report row (uncharged). Default true.true
rankByNostring enumengagementRate, plays, diggs, or shares. Default "engagementRate"."engagementRate"
topPostsLimitNointeger (0–50)Shortlist length. 0 skips it. Default 5.10
postOrderingNostring enumlatest, popular, oldest — client-side ordering within the fetched window. Default "latest"."popular"
windowStartDate / windowEndDateNostring (date)Restrict the analysis window by date."30" (last 30 days)
minHearts / maxHeartsNointegerKeep only posts with likes at/above minHearts or below maxHearts.10000
maxFollowersPerProfile / maxFollowingPerProfileNointegerSkip posts whose author has this many followers/following or more.
profiles, resultsPerPage, profileSorting, oldestPostDateUnified, newestPostDate, leastDiggs, mostDiggs, profileScrapeSectionsNovariousBase-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.
proxyConfigurationNoobjectOptional; 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?

ScraperWhat it extracts
TikTok Comments Scraper — Full Reply ThreadsNested comment threads with creator-answer detection
TikTok Video Scraper — Hashtag, Sound & ReachVideo-level reach and sound data
Instagram Engagement EstimatorProfile-level engagement rate and posting cadence
Threads User Posts Scraper — Engagement Cadence ReportPost-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 ApifyClient
client = 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.

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.