Tiktok Profile Scraper
Pricing
from $3.00 / 1,000 results
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
35
Total users
12
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape TikTok profiles and their video or repost history. The actor emits a profile row (rowType=profile) with full account metadata and then individual post rows (rowType=video or rowType=repost) for each piece of content. Without a session cookie the actor returns profile info plus approximately 14 recent videos from search; with a sessionCookie it can retrieve the full video history up to 500 posts. Reposts are available without a cookie.
What this actor does
- Accepts TikTok usernames (with or without @) and/or full profile URLs
- Emits a dedicated profile row per account with follower/following/like/video counts and account settings
- Emits separate post rows for each video or repost, selectable via
contentTypes - Retrieves up to ~14 recent videos without authentication via search fallback
- With a
sessionCookieor fullcookiesexport, retrieves the complete video history (up to 500 posts) - Reposts (videos the user has shared from other creators) are extracted without a cookie
- Empty fields are omitted
Output per profile row
The bullets below highlight the most commonly used fields. The full, authoritative field reference (every field the actor can emit, with descriptions) is the Output tab / .actor/dataset_schema.json in the source — every field listed there is populated with real data when TikTok provides it and omitted otherwise (no nulls or empty placeholders).
rowType— always"profile"for profile rowsuserId— TikTok user IDsecUid— TikTok secUidusername— @handledisplayName— display name / nicknameverified— verification badge statusprivateAccount— whether the account is privatebio— profile bio textbioLink— clickable link in bio (if set)language— account's primary language settingisOrganization— whether the account is registered as an organizationttSeller— whether the account is a TikTok Shop sellerroomId— live room ID (non-empty when currently streaming)followerCount— total followersfollowingCount— total accounts followedheartCount— total likes received across all videosvideoCount— number of public videosdiggCount— number of posts liked by this useravatarLarger/avatarMedium/avatarThumb— avatar image URLs at different resolutionscreateTime/createdAt— account creation timestamp (Unix / ISO 8601)commentSetting/duetSetting/stitchSetting/downloadSetting— who can comment/duet/stitch/download the user's postsfollowingVisibility— who can see the user's following listopenFavorite— whether the user's liked videos are publicly visibleprofileEmbedPermission— whether the user allows profile embeddingprofileTab— visibility of profile tabs (music, questions, playlists)UserStoryStatus— TikTok Stories status flagprofileUrl— canonical TikTok profile URLscrapedAt— ISO 8601 scrape timestamp
Output per video/repost row
The bullets below highlight the most commonly used fields. The full, authoritative field reference (every field the actor can emit, with descriptions) is the Output tab / .actor/dataset_schema.json in the source — every field listed there is populated with real data when TikTok provides it and omitted otherwise (no nulls or empty placeholders).
rowType—"video"or"repost"contentKind— same as rowType for filtering convenienceprofileUsername— the queried username that produced this rowpostId— unique post IDpostUrl— canonical post URLpostType—"video"or"slideshow"caption— post caption texttextLanguage— detected language code of the captionlocationCreated— ISO country code where the post was createdcreateTime/createdAt— publication timestamp (Unix / ISO 8601)likeCount/commentCount/shareCount/playCount/collectCount/repostCount— engagement countersstitchEnabled/shareEnabled/duetEnabled— post-level permission flagsisAd/isAigc/isECVideo/privateItem— content-type/visibility flagsauthor.*— author snapshot at scrape time:id,secUid,username,displayName,bio,verified,privateAccount,roomId,avatarUrl,followerCount,followingCount,heartCount,videoCountmusic.*— sound used:id,title,authorName,original,duration,isCopyrighted,isCommerceMusic,isUnlimitedMusic,isPrivate,shootDuration,album,playUrl,coverUrl,musicUrl,dspLinksvideo.*— technical metadata and signed URLs:width,height,duration,ratio,definition,bitrate,codecType,format,size,playUrl,downloadAddr,cover,originCover,dynamicCover,videoQuality,hasSubtitles,subtitleInfos,bitrateInfo,volumeInfoimages— image list for slideshow posts (postType="slideshow")hashtags— array of{id, name, isCommerce}hashtag objectsmentions— array of{username, start, end, awemeId}@mention objectsmediaUrlExpiresAt— when signed media URLs (video/cover) expirecommentStatus/adLabelVersion/forFriend/originalItem/viewerRegion/AIGCDescription— additional TikTok-provided post metadatastickersOnItem/effectStickers/diversificationLabels/channelTags/item_control/contents/poi/warnInfo— richer post metadata (interactive stickers, effects, category labels, structured caption segments, tagged location, content warnings) present when TikTok supplies them
Input
| Field | Type | Default | Description |
|---|---|---|---|
usernames | array | — | TikTok usernames to scrape (with or without @) |
profileUrls | array | — | Full TikTok profile URLs as alternative or additional input |
contentTypes | array | ["profile","videos"] | Which rows to emit: any combination of "profile", "videos", "reposts" |
maxPostsPerProfile | integer | 30 | Maximum combined post rows per profile, across videos and reposts together (0 = skip posts) |
includeProfileInfo | boolean | true | Include profile metadata in the profile row |
sessionCookie | string | — | TikTok sessionid cookie value — required for full video history |
cookies | array | — | Full browser cookie export as JSON array (Cookie-Editor format) |
ttwid | string | — | TikTok ttwid device cookie — enables immediate video listing |
Example: Profile info and recent videos (no cookie)
{"usernames": ["natgeo"],"contentTypes": ["profile", "videos"],"maxPostsPerProfile": 10}
Example: Reposts only
{"usernames": ["khaby.lame", "charlidamelio"],"contentTypes": ["reposts"],"maxPostsPerProfile": 50}
Example: Full video history with session cookie
{"usernames": ["natgeo"],"contentTypes": ["profile", "videos"],"maxPostsPerProfile": 200,"sessionCookie": "your_sessionid_value_here"}
Example: Multiple profiles — profile metadata only
{"usernames": ["natgeo", "bbcnews", "cnn"],"contentTypes": ["profile"],"maxPostsPerProfile": 0}
Use cases
- Influencer research — pull profile stats and recent video performance for creator discovery and vetting
- Competitive benchmarking — track a competitor brand account's posting frequency and engagement trends over time
- Audience and content auditing — export a creator's complete video history for content strategy or brand safety review
- Repost tracking — identify what external content a creator is amplifying through reposts
- Social media archival — build structured archives of public TikTok accounts for research or compliance purposes
- Agency reporting — collect cross-account profile snapshots for client portfolio dashboards
FAQ
Do I need a TikTok account or cookies?
Not for profile metadata or reposts. For the complete video list you need a sessionCookie or full cookies export, because TikTok's video listing API blocks unauthenticated datacenter requests.
How many videos can I get without a cookie?
Roughly 10-40 recent videos per profile, even when maxPostsPerProfile is set much higher. The actor runs a multi-strategy fallback cascade (search API, in-page fetch, mobile API, scroll, related-item expansion) that paginates as far as TikTok allows, but on large/high-follower accounts TikTok's anti-bot defenses eventually block pagination continuation for anonymous/residential-proxy sessions, capping the anonymous yield at that range. Reposts are not subject to this ceiling and paginate fully up to maxPostsPerProfile. For a profile's complete video history, provide a sessionCookie or full cookies browser export.
How do I get my sessionCookie?
Install the Cookie-Editor browser extension, log into TikTok, click the icon, find the cookie named sessionid, and copy its value. Paste that value into the sessionCookie field.
What is the difference between sessionCookie and cookies?
sessionCookie accepts only the sessionid value and is enough on its own to enable the video-list API and full video history retrieval. cookies accepts the full browser cookie export (Cookie-Editor JSON format) and provides the complete session context including msToken and ttwid — this gives the most reliable video list retrieval.
What is ttwid?
A non-personal device tracking cookie from TikTok. Providing your browser's ttwid value lets the actor bypass the typical 7-day device-aging period that TikTok applies to new (unknown) devices. Find it in browser DevTools under Application → Cookies → tiktok.com.
What is a repost? A video from another creator that the profile owner has re-shared to their own followers using TikTok's repost feature. The original author and post ID are preserved in the output.
What does includeProfileInfo: false do?
The profile row is still emitted but without the detailed metadata fields (follower counts, bio, settings). Useful when you only want the post rows.
Can I scrape private accounts? Profile metadata for private accounts is visible, but their video grid is not accessible without being an approved follower.
Why did I get 0 videos for some profiles even without any errors?
Without a sessionCookie/cookies/ttwid, video listing relies on TikTok's public search-fallback endpoint, which requires TikTok's anti-bot signature (X-Bogus/X-Gnarly/msToken) to be freshly and validly generated for that specific request. This succeeds most of the time on a RESIDENTIAL proxy, but TikTok can still reject the request for some accounts/sessions with an empty response, independent of proxy quality. The profile row and reposts are unaffected by this — only the videos content type can occasionally under-deliver. Providing a sessionCookie makes video retrieval far more reliable.
Why does video.playUrl / video.downloadAddr / music.playUrl give me a 403 error when I open it in my browser?
These are signed CDN URLs that TikTok's Akamai infrastructure ties to the IP/session that originally requested them during scraping. Opening the same URL later from a different network (e.g. your own computer) commonly returns a 403 Access Denied error even though the URL itself is valid and unmodified. This applies to video.playUrl, video.downloadAddr, and music.playUrl alike. This is expected TikTok CDN behavior, not a data quality issue — the URL still reflects the real signed address returned by TikTok at scrape time.
Why does music.coverUrl occasionally 404?
This field is passed through verbatim from TikTok's own API response (music.cover_large_url/cover_medium_url). For a small fraction of tracks (well under 10%) TikTok's own metadata points to a stale/moved unsigned CDN asset that no longer resolves — this reflects upstream data quality, not a scraping defect. All other media URLs (video.cover/originCover/dynamicCover, author.avatarUrl, music.musicUrl, postUrl) are unaffected.
Related TikTok Scrapers
Build a complete TikTok data pipeline with our full suite: