SFOLN

Catalogue / Social media data

TikTok Engagement Rate & Audit

sfoln/tiktok-account-audit · Social media, Lead generation, Automation On request

Audit any public TikTok account in one row: followers, likes and bio plus average and median views, engagement rate, posting frequency, top videos, hashtags, sounds and best posting hour from its latest videos. $13 per 1,000 accounts; bigger samples $0.007 per extra page.

About

What it does

TikTok Engagement Rate & Audit gives a one-row audit of any public TikTok account: the profile (followers, following, total likes, videos, bio, link, verification, region) plus analytics computed over its latest videos: average and median views, average likes/comments/shares/saves, engagement rate by followers and by views, views per follower, posting frequency, average length, the three most played videos, top hashtags and sounds, paid-partnership share and the best posting hour (UTC). Built for influencer vetting, creator pricing, competitor benchmarking and agency reporting.

Price

Price per delivered record

EventPricePer 1,000Charged for
TikTok account audit
tiktok-account-audit
$0.013$13 / 1,000Charged once per account: profile plus views, engagement rates, posting frequency, top videos, hashtags, sounds and best posting hour over its latest videos (first page of the feed).
Extra videos page
tiktok-audit-extra-page
$0.007$7 / 1,000Charged per additional page of videos read when the first page does not reach sampleSize (page size is set by TikTok).
TikTok profile snapshot
tiktok-account-profile-only
$0.0065$6.5 / 1,000Charged instead of tiktok-account-audit when only the profile could be delivered (private account, no videos, or videos unavailable).

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~tiktok-account-audit/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"handles":["nasa"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/tiktok-account-audit"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~tiktok-account-audit/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Audit the TikTok accounts @nasa and @natgeo: compare their engagement rate, average views, posting frequency and top videos.

Input

Input fields

List TikTok accounts. Each account produces one dataset record with its profile and statistics over its latest videos.

FieldTypeDefaultMeaning
handles *arrayrequiredAccounts
TikTok handles (with or without @) or profile URLs (https://www.tiktok.com/@nasa), one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 accounts per run.
sampleSizeinteger30Videos to analyze
Latest videos sampled per account (5–100). The first page of the feed is included in the audit price; each further page is charged as tiktok-audit-extra-page. Range 5–100.
includeVideosbooleanfalseInclude sampled videos
Add the sampled videos (id, url, description, plays, likes, comments, shares, date, hashtags, sound) to each record.
maxItemsinteger500Max accounts
Safety cap on how many accounts are processed in this run. Range 1–5000.
concurrencyinteger3Concurrency
Accounts processed in parallel (1–5). Range 1–5.
itemTimeoutSecsinteger300Per-account timeout (seconds)
Time limit per account; video paging stops early when it is near. Range 60–1800.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified profile and video payloads under `raw` (larger output).
Example input
{
  "handles": [
    "nasa"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The input item this record corresponds to.
statusstringStatus
ok (auditType full or profile-only, charged) | not_found (unknown account, not charged) | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record.
sourcestringSource
Upstream data source (scrapecreators = ScrapeCreators, public TikTok data).
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
code / message when status is not ok (or a partial failure).
warningsarrayWarnings
Non-fatal notes (partial data, stopped early, free-plan caps).
foundboolean | nullFound
Account exists.
auditTypestring | nullAudit type
full (profile + video stats) or profile-only (private / no videos / videos unavailable).
handlestring | nullHandle
TikTok username.
userIdstring | nullUser id
Numeric TikTok id.
secUidstring | nullsecUid
TikTok secure user id.
profileUrlstring | nullProfile URL
https://www.tiktok.com/@<handle>.
nicknamestring | nullNickname
Display name.
biostring | nullBio
Profile bio.
bioLinkstring | nullBio link
Link in bio.
followersinteger | nullFollowers
Follower count.
followinginteger | nullFollowing
Accounts followed.
likesinteger | nullTotal likes
Lifetime likes received.
videoCountinteger | nullVideos
Total videos.
friendCountinteger | nullFriends
Mutual follows.
isVerifiedboolean | nullVerified
Verified badge.
isPrivateboolean | nullPrivate
Private account.
isOrganizationboolean | nullOrganization
Organization account.
isCommerceUserboolean | nullCommerce
Commerce / seller account.
avatarUrlstring | nullAvatar
Avatar image URL.
regionstring | nullRegion
Account region.
languagestring | nullLanguage
Account language.
createdAtstring | nullCreated
Account creation date (ISO), when reported.
sampleSizeRequestedinteger | nullSample size requested
sampleSize input.
videosAnalyzedinteger | nullVideos analyzed
Latest videos in the sample (pinned excluded).
pinnedExcludedinteger | nullPinned excluded
Pinned videos left out of the stats.
avgViewsinteger | nullAvg views
Mean plays per sampled video.
medianViewsnumber | nullMedian views
Median plays per sampled video.
avgLikesnumber | nullAvg likes
Mean likes per sampled video.
avgCommentsnumber | nullAvg comments
Mean comments per sampled video.
avgSharesnumber | nullAvg shares
Mean shares per sampled video.
avgSavesnumber | nullAvg saves
Mean saves (collects) per sampled video.
engagementRatePctnumber | nullEngagement rate %
(avgLikes + avgComments + avgShares) ÷ followers × 100.
engagementRateByViewsPctnumber | nullEngagement / views %
Σ(likes + comments + shares) ÷ Σ plays × 100.
viewsPerFollowerPctnumber | nullViews / follower %
avgViews ÷ followers × 100.
postingFrequencyPerWeeknumber | nullPosts per week
Sampled videos ÷ weeks from the oldest sampled video to fetch time.
sampleWindowDaysnumber | nullSample window (days)
Days from the oldest sampled video to fetch time.
avgDurationSecsinteger | nullAvg duration (s)
Mean video length.
topVideosarrayTop videos
Up to 3 most played sampled videos { videoId, url, description, views, likes, createdAt }.
topHashtagsarrayTop hashtags
Up to 10 { tag, count }: sampled videos using the hashtag.
topSoundsarrayTop sounds
Up to 5 { sound, count } ('title — author').
paidPartnershipSharePctnumber | nullPaid partnership %
Share of sampled videos flagged as paid partnership (when reported).
postingHoursUtcarrayPosting hours (UTC)
{ hourUtc, posts, avgEngagement } for each hour with posts.
bestPostingHourUtcinteger | nullBest hour (UTC)
Hour with the highest mean likes + comments + shares (hours with ≥ 2 videos preferred).
mostActivePostingHourUtcinteger | nullMost active hour (UTC)
Hour with the most sampled videos.
newestVideoAtstring | nullNewest video
ISO.
oldestVideoAtstring | nullOldest sampled video
ISO.
pagesFetchedinteger | nullPages fetched
Video feed pages fetched.
extraPagesChargedinteger | nullExtra pages charged
Pages charged as tiktok-audit-extra-page.
sampleStopReasonstring | nullSample stop reason
limit | end | budget | deadline | aborted | empty_pages | max_pages | error.
videosarraySampled videos
Only with includeVideos: normalized videos (plays, likes, comments, shares, saves, hashtags, sound…).
Example record
{
  "input": "nasa",
  "found": true,
  "auditType": "full",
  "handle": "nasa",
  "userId": "6750",
  "profileUrl": "https://www.tiktok.com/@nasa",
  "nickname": "NASA",
  "bio": "Exploring the universe",
  "followers": 2300000,
  "following": 5,
  "likes": 41000000,
  "videoCount": 640,
  "isVerified": true,
  "isPrivate": false,
  "region": "US",
  "sampleSizeRequested": 30,
  "videosAnalyzed": 30,
  "pinnedExcluded": 0,
  "avgViews": 182000,
  "medianViews": 96000,
  "avgLikes": 14100.5,
  "avgComments": 210.3,
  "avgShares": 380.1,
  "avgSaves": 920.4,
  "engagementRatePct": 0.639,
  "engagementRateByViewsPct": 7.95,
  "viewsPerFollowerPct": 7.91,
  "postingFrequencyPerWeek": 3.5,
  "sampleWindowDays": 60,
  "avgDurationSecs": 41,
  "topVideos": [
    {
      "videoId": "74…",
      "url": "https://www.tiktok.com/@nasa/video/74…",
      "description": "Artemis II rollout…",
      "views": 1900000,
      "likes": 160000,
      "createdAt": "2026-09-30T16:00:00.000Z"
    }
  ],
  "topHashtags": [
    {
      "tag": "space",
      "count": 18
    },
    {
      "tag": "nasa",
      "count": 15
    }
  ],
  "topSounds": [
    {
      "sound": "original sound — nasa",
      "count": 22
    }
  ],
  "paidPartnershipSharePct": 0,
  "postingHoursUtc": [
    {
      "hourUtc": 16,
      "posts": 9,
      "avgEngagement": 21000
    }
  ],
  "bestPostingHourUtc": 16,
  "mostActivePostingHourUtc": 16,
  "newestVideoAt": "2026-10-13T16:00:00.000Z",
  "oldestVideoAt": "2026-08-15T18:00:00.000Z",
  "pagesFetched": 1,
  "extraPagesCharged": 0,
  "sampleStopReason": "limit",
  "status": "ok",
  "charged": true,
  "chargedEvent": "tiktok-account-audit",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents