TikTok Profile Scraper: Account Stats and Every Post avatar

TikTok Profile Scraper: Account Stats and Every Post

Pricing

from $1.99 / 1,000 results

Go to Apify Store
TikTok Profile Scraper: Account Stats and Every Post

TikTok Profile Scraper: Account Stats and Every Post

Scrape any public TikTok profile: followers, likes, video count, bio, verified and private flags. Switch on post collection to also pull each account's videos with plays, likes, comments, shares and a correct pinned flag. Exact result limits, no rounding up. No login, no cookies.

Pricing

from $1.99 / 1,000 results

Rating

5.0

(1)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

19

Monthly active users

10 days ago

Last modified

Share

TikTok Profile Scraper

Scrape any public TikTok profile by username or URL, with no login, no cookies and zero risk to your own account. Paste one or many usernames and get one clean row per profile: follower, following, like and video counts, bio and bio link, verified, private, seller and organization flags, interface language, and account creation date.

Switch on post collection and each profile is followed by its videos, with plays, likes, comments, shares, saves and a correct pinned flag. From $1.99 per 1,000 rows. Export as JSON, CSV or Excel.

Why Use This Scraper?

  • Zero account risk — you never hand over TikTok cookies or log in, so your account can't be flagged, throttled, or banned. Cookie-based scrapers make you supply a session and take that risk; this one never does.
  • No TikTok account needed — nothing to configure, no 2FA, no checkpoints.
  • Deepest profile row on the Store — beyond the usual counters you get the bio link URL, seller / commerce flags with category, organization flag, language, and the account's creation date.
  • Account age includedaccountCreatedAt exposes when the account was registered, a key bot/credibility signal most profile scrapers don't return.
  • Bulk in one run — pass hundreds of usernames at once; every row is tagged with its sourceUsername.
  • Graceful edge cases — deleted/banned accounts yield a user_not_found error item, never a failed run. Private accounts still return their full public profile card with isPrivate: true.
  • Posts on the same run — turn on includeVideos and you get the account's videos alongside the profile card, linked by sourceUsername, so audience size and content performance land in one dataset.
  • Exact result limits — ask for 37 posts and you get 37, not a page-boundary 40. Limits that quietly round up are a common complaint about other profile scrapers.
  • Pinned posts flagged correctly — TikTok marks pinned videos with is_top, not is_pinned, which is a frequent source of wrong data elsewhere. This Actor reads the right field.
  • Follower count on every post row — no joining back to the profile row to find out how big the account was.
  • Clean, flat output — one row per profile, ready for CRM import, influencer vetting, or lead scoring.

Overview

This Actor returns one dataset row per input username with the complete public profile card and all engagement counters. Data is retrieved through a third-party TikTok data provider, so no TikTok credentials are ever required.

Supported Inputs

InputWhat you get
A single username (e.g. tiktok)That profile's full public card + stats
Multiple usernames / URLsOne row each, in one run
  • Handles are accepted with or without the leading @, and full profile URLs work too — https://www.tiktok.com/@tiktok, tiktok.com/@tiktok/, or the mobile m.tiktok.com variant, with or without query parameters.
  • Private accounts are supported — their profile card (stats, bio, flags) is public; only their content is hidden. The row carries isPrivate: true.
  • Not supported: video URLs, tag URLs (use the dedicated Hashtag / Search scrapers for those).

Pure HTTP. No browser, no CAPTCHA solver, no cookies.

Use Cases

AudienceHow they use it
Influencer marketersVet creators at scale — follower counts, engagement totals, verification, and account age in one pass
Sales / lead genQualify seller and commerce accounts (isSeller, isCommerceUser, commerceCategory) and harvest bio links
Growth / social teamsTrack competitor accounts' follower and like counters over time with scheduled runs
Researchers / OSINTResolve handles to stable IDs (userId, secUid), account age, and language at scale

How It Works

  1. Normalize — every input is reduced to a canonical username (handles, @handles, and profile URLs all work).
  2. Resolve — each username is looked up live; one request per profile, resolved in parallel.
  3. Emit — every profile is pushed to the dataset as its own flat row, tagged with sourceUsername.
  4. Collect posts (optional) — the account's videos follow its profile row, newest first, deduplicated by post ID.

About post depth

Up to 33 posts per profile is served in a single fast request. Asking for more switches to a deeper source that pages 10 at a time, which is slower and costs more per post but has no practical ceiling.

Pick the shallow path when you are screening many accounts, and the deep path when you need a full content history for a few.

Private accounts return their profile card but no posts, since their content is not public.

Input Configuration

FieldTypeRequiredNotes
usernamesarray of stringsYesPublic usernames to scrape, with or without @, or profile URLs.
includeVideosbooleanNoDefault false. On, each profile is followed by rows for its posts.
maxVideosPerProfileintegerNoDefault 100. Applies only when collecting posts. Up to 33 uses the fast path.

Profiles only

{
"usernames": ["tiktok", "@khaby.lame", "https://www.tiktok.com/@charlidamelio"]
}

Profiles plus their recent posts

{
"usernames": ["@gymshark"],
"includeVideos": true,
"maxVideosPerProfile": 30
}

Output Overview

Each item is a flat object describing one profile. Runs stream to the default dataset, exportable as JSON, CSV, Excel, or via the API.

Output Samples

Profile row

{
"sourceUsername": "tiktok",
"username": "tiktok",
"userId": "107955",
"secUid": "MS4wLjABAAAAv7iSuuXDJGDvJkmH_vz1qkDZYo1apxgzaxdBSeIuPiM",
"nickname": "TikTok",
"bio": "One TikTok can make a big impact",
"bioLinkUrl": "linktr.ee/tiktok",
"profileUrl": "https://www.tiktok.com/@tiktok",
"avatarUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/...",
"language": "en",
"isVerified": true,
"isPrivate": false,
"isOrganization": true,
"isSeller": false,
"isCommerceUser": true,
"commerceCategory": "Media & Entertainment",
"accountCreatedAt": "2015-02-28T17:22:29.000Z",
"followerCount": 95100000,
"followingCount": 0,
"likeCount": 462300000,
"videoCount": 1487,
"friendCount": 1
}

Post row (includeVideos: true)

{
"rowType": "video",
"sourceUsername": "gymshark",
"postId": "7661334167342320918",
"postUrl": "https://www.tiktok.com/@gymshark/video/7661334167342320918",
"caption": "Onyx V1 Returns. July 16th. 7pm BST #onyxv1 #Gymshark",
"createdAt": "2026-07-11T09:29:30.000Z",
"durationSeconds": 41,
"isPinned": true,
"playCount": 1300861,
"likeCount": 200045,
"commentCount": 873,
"shareCount": 7771,
"saveCount": 14239,
"authorId": "6536068161471517696",
"authorUsername": "gymshark",
"authorNickname": "Gymshark",
"authorFollowerCount": 6613011,
"musicId": "7132920769062897666",
"musicTitle": "original sound",
"coverUrl": "https://p16-common-sign.tiktokcdn.com/...",
"scrapedAt": "2026-08-19T07:34:12.402Z"
}

Key Output Fields

FieldDescription
sourceUsernameThe input value this row came from
username / nicknameCanonical handle and display name
userId / secUidTikTok's numeric and secure IDs — stable even if the handle changes
bio / bioLinkUrlProfile signature text and the clickable bio link, if set
isVerified / isPrivateVerification badge and privacy flag
isOrganization / isSeller / isCommerceUser / commerceCategoryBusiness-account signals: org account, TikTok Shop seller, commerce user, and declared category
languageThe profile's interface language code
accountCreatedAtISO timestamp of account registration — instant account-age / bot signal
followerCount / followingCountAudience counters
likeCount / videoCount / friendCountTotal likes received, videos posted, and mutual-follow count

Post rows (rowType: "video")

Present only when includeVideos is on. Filter on rowType to separate them from profile rows.

FieldDescription
rowTypeAlways video on these rows. Profile rows have no rowType.
sourceUsernameLinks the post back to the profile it came from
postId / postUrlThe video's ID and canonical link
caption / createdAtDescription text and ISO posting time
durationSecondsVideo length
isPinnedWhether the creator pinned it to the top of their profile
playCount / likeCount / commentCount / shareCount / saveCountEngagement on the post
authorUsername / authorNickname / authorIdWho posted it
authorFollowerCountThe account's follower count, carried on every row
musicId / musicTitleThe sound used
coverUrlThumbnail image

Coming from another TikTok profile scraper?

These are the complaints that show up most often on other TikTok profile scrapers' issue boards. Each line below is something we measured on this Actor rather than asserted.

What people report elsewhereWhat this Actor does
"Actor returns fewer posts than requested"Limits are honoured exactly. Tested at 25, 37 and 60 posts, all deliberately off a page boundary, all returned exactly.
"Returns profile metadata but zero videos for public profiles"Tested against the specific accounts named in those reports, @tangoxofc and @ruthsingh34. Both resolve, and both return posts.
"verified property always returns true for all users"Reads TikTok's real flag. Across a mixed run it returned true for @tiktok, @gymshark, @duolingo and false for two small accounts.
"is_pinned is not correct for most cases"TikTok marks pinned posts is_top, not is_pinned. This Actor reads the right field, so pinned posts are flagged correctly.
Repeated timeouts, "request failed and reached maximum retries"Direct API calls rather than a browser crawler over tiktok.com, so there is no page render to time out.
"Author data does not show the followers"authorFollowerCount is on every post row, no joining back to the profile row.

FAQ

Do I need to provide my TikTok cookies or log in? No. This Actor never asks for cookies, passwords, or a session — that's the point. Cookie-based scrapers advertise a lower headline price but require you to paste your own TikTok session, which puts your account at risk. Here your account stays completely out of it.

Does it work on private accounts? Yes — a private account's profile card (stats, bio, flags) is public even though its content is hidden. You get the full row with isPrivate: true.

What happens with deleted or banned accounts? They yield a user_not_found error item and the run continues with your other usernames — the run never fails because of a missing account.

How many usernames can I pass at once? Hundreds per run is fine — profiles are resolved in parallel, roughly one second per profile at steady state.

How fresh is the data? Fetched live at run time — the counters are what TikTok reports at that moment.

How do I get an account's videos too? Set includeVideos to true. Each profile row is then followed by rows for its posts, newest first, each carrying rowType: "video" and the sourceUsername it belongs to.

How many posts can I get per profile? Up to 33 comes back in one fast request. Beyond that the Actor switches to a deeper source that pages 10 at a time, which is slower and costs more per post but has no practical ceiling.

Do I get exactly the number of posts I ask for? Yes. Asking for 37 returns 37, not 40. Limits are honoured exactly rather than rounded up to a page boundary.

Why do some posts show isPinned: true out of date order? Pinned videos are served at the head of a profile's feed regardless of when they were posted. Sort by createdAt if you want strict chronology.

Can I get posts from a private account? No. The profile card is public but the content is not, so those profiles return their row with isPrivate: true and no posts.

What does it cost? Pay per result: $1.99 per 1,000 rows, plus a small per-run start fee. Profile rows and post rows are billed the same. No subscription.

Support

Found a bug or need a field added? Open an issue on the Actor's Issues tab in Apify Console, or email muhamed.didovic@gmail.com.

Additional Services

Need a custom TikTok or social-media scraper, enrichment pipeline, or a private version of this Actor? Custom builds available — reach out at muhamed.didovic@gmail.com.

Explore More Scrapers

Browse the full portfolio: muhamed-didovic.github.io

🤖 For AI Agents & LLM Apps

Purpose: Resolve TikTok usernames or profile URLs to complete public profile records with engagement stats, and optionally each account's posts.

Minimal tested input:

{ "usernames": ["tiktok"] }

With posts:

{ "usernames": ["@gymshark"], "includeVideos": true, "maxVideosPerProfile": 30 }

Output: array of flat objects, one per profile. Fields: sourceUsername, username, userId, secUid, nickname, bio, bioLinkUrl, profileUrl, avatarUrl, language, isVerified, isPrivate, isOrganization, isSeller, isCommerceUser, commerceCategory, accountCreatedAt, followerCount, followingCount, likeCount, videoCount, friendCount.

Post rows (only when includeVideos is true) carry rowType: "video" plus: sourceUsername, postId, postUrl, caption, createdAt, durationSeconds, isPinned, playCount, likeCount, commentCount, shareCount, saveCount, authorId, authorUsername, authorNickname, authorFollowerCount, musicId, musicTitle, coverUrl, scrapedAt.

Critical for agents: branch on rowType before reading fields, since profile rows and post rows have different shapes and profile rows carry no rowType at all. Join posts to their profile with sourceUsername. Requesting more than 33 posts per profile switches to a slower, costlier source, so keep the limit low when screening many accounts.

Behavior & billing: Pay-per-event — one charge per row, profile or post alike. Unknown accounts yield one user_not_found error item instead of a row; private accounts return full rows with isPrivate: true and no posts. Bulk usernames allowed per call; each row carries its sourceUsername. No login/cookies required.

⚠️ Disclaimer

This Actor accesses publicly available data on TikTok for legitimate research, market-intelligence, and business-analysis purposes. It does not log in, bypass authentication, or access private content. Use of this Actor must comply with TikTok's Terms of Service and all applicable laws, including data-protection regulations (GDPR, CCPA, etc.). The authors are not responsible for any misuse. Users must:

  • Respect rate limits and avoid overloading TikTok's infrastructure
  • Not use scraped data to violate user privacy or platform terms
  • Process any personal data only with a lawful basis and in compliance with their jurisdiction
  • Not republish scraped content in violation of copyright

We do not store scraped data; the Actor returns it directly to your Apify dataset for your authorized use. TikTok is a trademark of ByteDance Ltd.; this Actor is not affiliated with or endorsed by TikTok or ByteDance.

SEO Keywords

tiktok profile scraper, tiktok user posts scraper, tiktok profile videos, scrape tiktok user videos, tiktok account posts export, scrape tiktok profile, tiktok profile data export, tiktok follower count api, tiktok account info scraper, bulk tiktok profile lookup, tiktok bio link scraper, tiktok account age checker, tiktok profile to csv, tiktok user info api, tiktok profile stats, tiktok verified account checker, tiktok seller account finder, tiktok commerce accounts, influencer vetting tool, tiktok influencer analytics, tiktok osint tool, no login tiktok scraper, no cookies tiktok scraper, tiktok data extraction, tiktok public data, competitive intelligence tiktok, apify tiktok scraper