TikTok Profile Scraper (Engagement Rate & Brand Deals)
Pricing
from $16.50 / 1,000 creator reports
TikTok Profile Scraper (Engagement Rate & Brand Deals)
Scrape TikTok creator profiles plus their recent public videos into one row each: followers, likes, engagement rate, median views, posting cadence, top hashtags and brand-deal share. Same formula for every creator. Not-found accounts are free. No login. $30 per 1,000 creator reports.
Pricing
from $16.50 / 1,000 creator reports
Rating
0.0
(0)
Developer
locaihost data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Features
Share
Check TikTok creators before you book them. Give it handles or profile URLs and get one row per creator: the public profile, plus engagement rate, median views, posting cadence, top hashtags and brand-deal share worked out from their recent public videos. Export as JSON, CSV or Excel. No login, no cookies.
What people use it for:
- Checking a creator before a campaign: engagement per view, days since the last post, and the share of recent posts that are sponsored.
- Comparing a shortlist. Every creator is measured with the same formulas, so the numbers line up.
- Re-checking a roster each month: followers, cadence and paid-deal share for the creators you already work with.
- Feeding an influencer platform or an AI agent: a list of handles in, the same columns out for every creator.
Quick start
Paste this into the JSON tab of the input and click Start:
{"handles": ["khaby.lame", "@duolingo", "https://www.tiktok.com/@nba"]}
You get 3 creator reports in about a minute (creators are checked in parallel, so 6 creators take about as long as 3). Handles, @handles, profile URLs and video URLs all work; the same creator listed twice is fetched and charged once.
Output
| Group | Fields |
|---|---|
| Status | status, statusMessage, reportType, videosStatus, input |
| Profile | handle, nickname, bio, bioLink, bioLinkUrl, verified, profileUrl, userId, secUid, language, createdAt, avatarUrl + avatarUrlExpiresAt |
| Account type | isBusinessAccount, businessCategory, isTikTokShopSeller, isOrganization |
| Counts | followerCount, followingCount, heartCount (total likes), videoCount, countsExact |
| Analytics | analytics.engagementRate, engagementRatePerFollower, medianViews, avgViews, viewsPerFollower, postingCadencePerWeek, daysSinceLastPost, brandDealRate, brandDealVideoIds, topHashtags, lifetimeLikesPerVideo, lifetimeLikesPerFollower, videosAnalyzed, windowStart, windowEnd |
| Recent videos | recentVideos[]: url, createdAt, description (caption), views, likes, comments, shares, saves, durationSec, hashtags, paidPartnership, isAd, musicTitle, musicAuthor, musicOriginal, isSlideshow, slideshowImageCount |
How the analytics are worked out:
| Field | What it means |
|---|---|
engagementRate | (likes + comments + shares) ÷ views over the analysed videos, weighted by views. Saves are not counted |
engagementRatePerFollower | Average interactions per video ÷ followers |
medianViews, avgViews | Typical views per video. The median isn't skewed by one viral post |
viewsPerFollower | Median views ÷ followers: the share of followers a typical post reaches |
postingCadencePerWeek | Videos per week from the oldest analysed video to now, never over less than one week |
brandDealRate | Share of posts with TikTok's "Paid partnership" label, TikTok's ad flag, or a disclosure hashtag such as #ad, #sponsored or #brandpartner |
topHashtags | The hashtags used most, with how many videos use each |
Pinned videos are left out of every number: they are a showcase and can be years old.
One real row (run on 2026-10-18, shortened; recentVideos holds the 30 videos behind the numbers):
{"handle": "duolingo","status": "ok","reportType": "creator-report","profileUrl": "https://www.tiktok.com/@duolingo","nickname": "Duolingo","bioLinkUrl": "https://duolingo.com/","verified": true,"isOrganization": true,"isBusinessAccount": true,"businessCategory": "Shopping & Retail","followerCount": 18266486,"heartCount": 505437895,"videoCount": 1203,"countsExact": true,"videosStatus": "included","analytics": {"videosAnalyzed": 30,"engagementRate": 0.170582,"medianViews": 618950,"viewsPerFollower": 0.033884,"postingCadencePerWeek": 5.62,"daysSinceLastPost": 4.5,"brandDealRate": 0,"topHashtags": [{"tag": "le_sserafim", "videos": 4}, {"tag": "duolingo", "videos": 1}]},"recentVideos": [{"url": "https://www.tiktok.com/@duolingo/video/7696211706317409550", "createdAt": "2026-10-13T17:52:19.000Z", "views": 2200000, "likes": 444600, "comments": 7012, "shares": 81000, "saves": 49960, "durationSec": 12, "paidPartnership": false}]}
Every creator you list gets a row, and status says what happened:
status | Meaning | Charged |
|---|---|---|
ok | Profile read (reportType says whether as a creator report or a profile) | Yes |
not-found | No account uses this handle (or it was renamed) | No |
private | Private account. The row carries nothing else about it | No |
unavailable | Banned, restricted or deactivated | No |
blocked | TikTok blocked the request, even after switching proxy. Try again later | No |
error | The page couldn't be read | No |
Per video, musicTitle and musicAuthor name the sound, musicOriginal is true for a sound a TikTok user uploaded ("original sound") and false for (mostly) a track from TikTok's licensed music library, and isSlideshow marks a photo post, with slideshowImageCount images. Whether a video tags a TikTok Shop product isn't returned: the public video list we read didn't show it.
The dataset has three views (Creators, Recent videos, and One row per video for outputShape: "videos") and exports to JSON, CSV, Excel or HTML. The run's SUMMARY record counts creators by status.
One row per video, date window and order
Three optional settings. Leave them out and every row is exactly as described above.
outputShape: "videos"gives one row per analysed video instead of one per creator, with the creator'shandle,nickname,followerCount,heartCount,videoCount,verified,isOrganization,isBusinessAccount,businessCategory,isTikTokShopSellerandbioLinkUrlcopied into each row, so it loads straight into a spreadsheet. Video fields:position(1 = first in the list),videoId,videoUrl,postedAt,description,views,likes,comments,shares,saves,durationSec,hashtags,paidPartnership,isAd,isBrandDeal(counted in the creator's brand-deal share), and the music and slideshow fields. A creator without public videos still gets one profile row (charged as a profile), and a not-found or private creator one free row. The creator-level analytics stay in the default shape.videosNewerThananalyses and lists only videos posted after a date ("2026-10-01", midnight UTC) or within a period ("30 days","2 weeks","3 months"). The analytics then cover that window, andpostingCadencePerWeekis videos per week over it. It filters the newest videos read (up tomaxVideosPerCreator), so set that high enough for the window. A creator with no video in the window comes back as a profile, and the row says why. A value that isn't a date or a period stops the run before anything is read or charged.videosSort: "popular"lists the most viewed of the videos read, most viewed first, instead of the newest. "Videos read" means the newest pages of the profile (inside any date window), not the creator's all-time top videos. The analytics always use the newest videos, so two creators stay comparable whatever the order.
{ "handles": ["khaby.lame", "@duolingo"], "outputShape": "videos", "videosNewerThan": "30 days", "videosSort": "popular" }
Pricing
You pay per creator returned. There is no charge for Apify platform usage on top, and the residential proxy TikTok's video list needs is included.
| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Creator report (profile + analytics + recent videos) | $30 per 1,000 | $22.50 per 1,000 | $16.50 per 1,000 |
| Creator profile (profile only) | $3 per 1,000 | $2.25 per 1,000 | $1.65 per 1,000 |
Plus $0.00005 per run start. Apify's free $5 monthly credit covers about 160 creator reports (or about 1,600 profile-only rows). Free-plan runs return up to 25 creators per run (only charged creators count); any paid Apify plan removes the cap.
With outputShape: "videos", each video row is charged as a video event at the price on the Pricing tab, instead of one creator report; creators without videos are charged as profiles as above.
A row is charged as a profile, not a report, when you turn includeVideos off or when TikTok doesn't show that creator's videos (videosStatus says why). Example: 200 creators, of which 185 come back as reports, 10 as profiles and 5 not found, cost 185 × $0.03 + 10 × $0.003 = $5.58 at the Starter price.
What's free: not-found, private, unavailable, blocked and unreadable creators, repeats of a creator already in the list, entries that aren't a TikTok handle, creators skipped by onlyNew, videos left out by videosNewerThan, and creators not started before the run's time limit or your spending limit. To cap a run's spend, set Maximum cost per run in the run options: the run stops cleanly and says how many creators were left.
Limits
- Logged-out view only. The Actor sees what any visitor without an account sees. TikTok hides some posts from logged-out visitors, so a creator's video list can be incomplete and the analytics cover the public posts only.
- Counts are what TikTok shows publicly. Profile counts are exact when TikTok sends exact numbers (
countsExact: true). Per-video views, likes, comments and shares come rounded by TikTok above 10,000 (for example 2,200,000); saves are exact. Videos posted in the last few hours are still collecting views. - Up to 60 videos per creator (
maxVideosPerCreator, 30 by default). 30 covers about a month for a creator who posts daily. - No audience demographics, follower lists, comments or contact details. Those need a login or belong to other people.
- The paid-deal share only counts disclosed deals. Undisclosed ones can't be detected. On brand accounts TikTok's ad flag marks the brand's own promoted posts, so it isn't counted there.
- Short links (vm.tiktok.com/…) aren't supported. Open them and paste the profile URL.
- Speed: creators run up to 6 at a time at the default 4 GB memory (fewer at lower memory). A creator report usually takes 20 to 60 seconds, depending on how quickly TikTok hands over the video list. Near the run's time limit the Actor stops starting new creators and ends cleanly with what it has.
- TikTok can change its site at any time. When it does, rows say so and nothing is charged for them.
Privacy. Public creator data only. The Actor never logs in, never uses cookies or accounts, and never asks you for one. Email addresses and phone numbers are removed from bios, names and captions before anything is stored, and a bio link that is a phone or email (WhatsApp, mailto:) is dropped. Private accounts get no data at all.
Only new since last run, and schedules
Turn on onlyNew in a saved task and the Actor skips creators that task has already returned and charged, so a growing list only vets (and charges for) the new names. Skipped creators cost nothing. It's off by default, so a normal run always returns everyone. To re-check a roster on a timetable, set up a schedule under Schedules in Apify Console.
Integrations: API, n8n, Make and AI agents
API. Run it and get the rows back in one call:
curl -X POST "https://api.apify.com/v2/acts/locaihost~tiktok-creators/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"handles": ["khaby.lame", "@duolingo"]}'
Apify's API clients for Python and JavaScript work the same way.
n8n, Make, Zapier, Google Sheets, Slack, webhooks. Apify's built-in integrations send each run's dataset wherever you need it.
AI agents (MCP). Add this Actor to Claude, Cursor or any MCP client with https://mcp.apify.com/?tools=locaihost/tiktok-creators, then ask something like "Which of these 10 creators has the highest engagement rate and the fewest sponsored posts?"
FAQ
How much does it cost to scrape TikTok creator profiles?
On the Free and Starter plans, $30 per 1,000 creator reports ($22.50 on Scale, $16.50 on Business) and $3 per 1,000 profiles ($2.25 on Scale, $1.65 on Business). Not-found and private accounts are free. Apify's free $5 monthly credit covers about 160 creator reports.
Can I use it through the API or from Python?
Yes. Use the run-sync-get-dataset-items call above, or Apify's Python and JavaScript clients. Every run's data is also available as JSON, CSV or Excel from its dataset.
Can I use it from an AI agent?
Yes. Through the Apify MCP server (https://mcp.apify.com/?tools=locaihost/tiktok-creators) any MCP client can call it with a list of handles and read the rows back.
Is it legal to scrape TikTok profiles?
The Actor reads only what TikTok shows to anyone who is not logged in: public profiles and public videos. It never logs in, skips private accounts and never collects follower lists, commenters, email addresses or phone numbers. TikTok's own terms restrict automated access, so check that your use fits them and the data-protection rules that apply to you. You are responsible for how you use the results.
Why are some fields empty?
private, not-found and other non-ok rows carry only the status and the reason. When TikTok doesn't show a creator's videos, the row has the profile but no analytics or recentVideos, and videosStatus says why. bioLink and businessCategory are empty when the creator hasn't set them.
How is the engagement rate calculated?
Likes, comments and shares summed over the analysed videos, divided by their total views. A video with ten times the views carries ten times the weight, and pinned videos are left out.
More from locaihost data
- TikTok Trends Scraper: trending hashtags, videos and top ads by country, to find creators worth vetting.
- TikTok Shop Product Scraper: products, prices and sales from TikTok Shop searches and categories.
- Google Trends Scraper: check whether a creator's topic is growing before you commit a budget.
Did it help?
If this saved you time, a quick rating on the Store helps other people find it.
Support
Something not working, or a field you need? Open an issue on the Issues tab: we answer issues within 24 hours.