TikTok Profile Scraper (Pay Per Result) avatar

TikTok Profile Scraper (Pay Per Result)

Pricing

from $0.60 / 1,000 tiktok profile results

Go to Apify Store
TikTok Profile Scraper (Pay Per Result)

TikTok Profile Scraper (Pay Per Result)

Rising star

Scrape TikTok profiles by username: followers, likes, bio and link, verified badge, TikTok Shop seller data and latest posts. One row per handle, even for missing accounts; up to 1,000 per run. Input and output compatible with popular TikTok profile scrapers. No login or proxies. Pay per result.

Pricing

from $0.60 / 1,000 tiktok profile results

Rating

5.0

(1)

Developer

Yevhenii Molodtsov

Yevhenii Molodtsov

Maintained by Community

Actor stats

2

Bookmarked

171

Total users

70

Monthly active users

18 hours ago

Last modified

Share

TikTok Profile Scraper (Pay Per Result) logo

TikTok Profile Scraper (Pay Per Result) is a TikTok user info scraper for influencer marketing, creator vetting, lead generation and research: give it a list of usernames and get each profile's follower count, following, total likes, bio and bio link, verified badge, TikTok Shop seller flag and seller category, avatar and account region, plus the latest posts with full metadata (stats, music, hashtags, mentions, subtitles, CDN URLs). Scrape TikTok profiles by username from the Apify Console or the API, with no login, no cookies and no proxy setup. You pay only per result.

One row per requested handle, up to 1,000 handles per run (measured: 264 profiles in 66 seconds). Restricted accounts are usually recovered into a full profile row.

What data does the TikTok Profile Scraper get?

Every item carries the full author block under authorMeta:

  • Identity: id, name (handle), nickName, profileUrl, avatar, verified, privateAccount, region, account createTime.
  • Bio: signature (bio text) and bioLink.
  • Stats: fans (followers), following, friends, heart (total likes), video (post count), digg.
  • Commerce: ttSeller and commerceUserInfo.category — enough to tell an actual TikTok Shop store from a creator who merely sells something.

With resultsPerPage ≥ 1 you also get the profile's newest posts, one item per post: caption, createTimeISO, play/like/share/comment/collect/repost counts, hashtags, mentions, musicMeta, videoMeta (dimensions, duration, cover URL, subtitle links), isPinned, isSlideshow with slideshowImageLinks, locationMeta when the post is geotagged, and the permanent webVideoUrl.

At a glanceTikTok Profile Scraper
Proxies neededNone, fully built in
Handles that don't resolveExplicit error row per handle (not_found, suspended, …)
Restricted-account recoveryUsually recovered into a full profile row (10 of 10 in a 79-handle production batch)
Batch sizeUp to 1,000 handles per run
  • Drop-in compatible input & output with the popular TikTok profile scrapers: profiles, resultsPerPage, download flags — and the same authorMeta item shape.
  • One item per requested handle — guaranteed. Unresolvable handles produce an explicit {"input": "...", "error": "not_found"} item instead of a missing row.
  • Restricted-account recovery: handles that TikTok withholds profile data for are usually recovered automatically into a full profile row. In one 79-handle production batch, all 10 restricted handles were recovered.
  • Profile-only mode: set resultsPerPage: 0 to skip posts entirely and get one compact item per handle with just the author block — the cheapest and fastest way to bulk-resolve profile metadata.

Who uses TikTok Profile Scraper?

  • Influencer marketing teams vet a shortlist before outreach: 500 handles in profile-only mode (resultsPerPage: 0) return followers, total likes, verified badge and bio link per creator, one billed result per handle.
  • Agencies track client and competitor accounts: a daily schedule with resultsPerPage: 5 records follower growth and how each new post performs (playCount, diggCount, shareCount).
  • TikTok Shop and affiliate teams find creators who already sell: filter on ttSeller and commerceUserInfo.category, then use bioLink to reach them.
  • Data teams enrich creator handles collected elsewhere, for example channel.username from TikTok Search Scraper, with one guaranteed row per handle.

How to scrape TikTok profiles

In the Apify Console

  1. Open the Actor and paste your handles into TikTok profiles — bare handles, @handle and full profile URLs are all accepted, up to 1,000 handles per run.
  2. Set Posts per profile (resultsPerPage): 0 for the cheapest profile-only mode, or 1+ to include the latest posts.
  3. Click Start. When the run finishes, open the Output tab and export the dataset as JSON, CSV, Excel or another format.

TikTok Profile Scraper input form

Via API or CLI

Run synchronously and get the items back in one call:

curl -X POST "https://api.apify.com/v2/acts/xmolodtsov~tiktok-profile-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profiles": ["tiktok", "nasa"], "resultsPerPage": 1}'

Or with the Apify CLI:

$apify call xmolodtsov/tiktok-profile-scraper --input '{"profiles": ["tiktok", "@nike"], "resultsPerPage": 0}'

JavaScript and Python client examples are under "Integrations, API & MCP" below.

Accepted handle formats

All three forms mean the same profile:

{
"profiles": [
"nasa",
"@nasa",
"https://www.tiktok.com/@nasa"
],
"resultsPerPage": 1
}

Duplicates are removed case-insensitively before scraping, so the input above scrapes nasa exactly once — you are never billed twice for the same handle in one run.

Pricing

How much does it cost to scrape TikTok profiles?

The Actor is pay per result: every item pushed to the dataset is one result. The per-result price depends on your Apify subscription plan and already includes platform usage — there is no separate compute charge.

Apify plan (discount tier)Price per 1,000 results
Free$0.75
Starter (Bronze)$0.70
Scale (Silver)$0.65
Business (Gold) and the Platinum and Diamond tiers$0.60

Worked examples:

  • 1,000 profiles in profile-only mode (resultsPerPage: 0) = 1,000 results = $0.75 on Free, $0.60 on Business.
  • 1,000 profiles with resultsPerPage: 5 = up to 5,000 results = $3.75 on Free, $3.00 on Business.

Explicit error rows (not_found, suspended, …) are dataset items too and are billed like any other result — that is the price of guaranteed one-row-per-handle coverage, and it is factored into the per-result rate. A profile whose posts are unavailable (private account, no posts) yields one profile-only item, not zero.

Is scraping TikTok profiles free?

You can try it for free. Apify's Free plan includes free monthly usage credit (currently $5), and no credit card is required; a full free month of this Actor costs at most a few cents of that credit. On the Apify Free plan the Actor:

  • scrapes only the first 10 profiles per run (handles beyond the tenth are dropped),
  • returns at most 1 post per profile (resultsPerPage is capped at 1),
  • allows 5 runs per calendar month, resetting on the 1st (UTC).

This is a limit set by the developer, not by Apify. Any paid Apify plan removes all limits — paid users are never capped, on any tier. When the monthly run quota is used up, the run ends successfully with an explanatory status message and no results; it never fails. Within the quota, each run logs and displays a status message showing how many free runs you have used this month.

Input parameters

ParameterTypeDefaultNotes
profilesarrayrequiredUp to 1,000 unique handles per run — the input form enforces the limit and larger inputs fail validation. Bare handles, @handle, and full profile URLs all accepted; duplicates removed case-insensitively.
resultsPerPageinteger1Latest posts per profile. 0 = profile-only mode (cheapest) — one compact item per handle, no posts fetched. Maximum 3000; out-of-range values are clamped to 0–3000.
excludePinnedPostsbooleanfalseFilter pinned posts out of the results.
oldestPostDatestring—Only return posts created on/after this ISO date (e.g. 2024-01-01). Invalid values are silently ignored (no filter applied).
profileScrapeSectionsarray["videos"]Only ["videos"] is supported; other sections are ignored with a warning.
profileSortingstring"latest"Only "latest" (newest-first) is supported.
shouldDownloadVideos, shouldDownloadCovers, shouldDownloadSlideshowImages, shouldDownloadAvatars, shouldDownloadMusicCovers, downloadSubtitlesOptions—ignoredAccepted for compatibility, not shown in the form. Inputs written for other TikTok profile scrapers work unchanged, but media is never downloaded: cover, slideshow image, music, subtitle and avatar CDN URLs are included, video files are reachable via webVideoUrl (the TikTok post page), and mediaUrls is always []. This is what keeps the per-result price low.
proxyConfigurationobject—Optional override. The Actor uses its own built-in proxy pool by default; leave empty.

Invalid input (no usable handles, or more than 1,000) fails the run immediately without producing any items.

Output examples

The default dataset view shows one row per item with input, authorMeta.name, authorMeta.id, authorMeta.nickName, authorMeta.fans, authorMeta.verified, authorMeta.ttSeller, authorMeta.signature and error; the JSON export contains every field.

TikTok Profile Scraper output table

Post item

One dataset item per post, with the author block nested under authorMeta:

{
"id": "7692161454694206733",
"text": "It was a big week in low Earth orbit at NASA! 🧑‍🚀 Crew-13 reaches the ISS 🛰️ Crew-14 announced 🚀 …",
"createTimeISO": "2026-10-02T19:55:24.000Z",
"authorMeta": {
"id": "7664638705177150477",
"name": "nasa",
"profileUrl": "https://www.tiktok.com/@nasa",
"nickName": "NASA",
"verified": true,
"signature": "Making the seemingly impossible, possible.✨",
"bioLink": null,
"avatar": "https://p16-common-sign.tiktokcdn-us.com/...",
"commerceUserInfo": { "commerceUser": false },
"privateAccount": false,
"region": null,
"ttSeller": false,
"following": 23,
"friends": 17,
"fans": 2000000,
"heart": 10400000,
"video": 52
},
"musicMeta": { "musicName": "original sound - NASA", "musicAuthor": "NASA", "musicId": "7692161536332253965" },
"webVideoUrl": "https://www.tiktok.com/@nasa/video/7692161454694206733",
"videoMeta": { "height": 1280, "width": 720, "duration": 136, "coverUrl": "..." },
"diggCount": 6505,
"shareCount": 136,
"playCount": 105700,
"collectCount": 521,
"commentCount": 196,
"hashtags": [],
"isPinned": false,
"mediaUrls": [],
"input": "nasa",
"fromProfileSection": "videos"
}

Profile-only item

In profile-only mode (resultsPerPage: 0) — and for resolved profiles whose posts are unavailable (private account, zero posts, post fetch failure) — the item carries the full author block with id: null. A profileScrapeNote field is added when there is something worth knowing, e.g. "private account — posts are not accessible", "profile has no posts", "no posts matched the filters", or "recovered via TikTok search — bioLink and commerce fields are unavailable for this profile":

{
"id": null,
"text": null,
"authorMeta": {
"id": "7664638705177150477",
"name": "nasa",
"profileUrl": "https://www.tiktok.com/@nasa",
"fans": 2000000,
"verified": true,
"privateAccount": false
},
"input": "nasa",
"fromProfileSection": null
}

Error items

Handles that cannot be resolved still produce exactly one row:

{
"input": "deleted_user_123",
"error": "not_found",
"errorDescription": "Profile @deleted_user_123 not found — deleted or never existed."
}
errorMeaningShould you retry?
not_foundProfile deleted or never existed.No — terminal.
suspendedProfile suspended or banned by TikTok.No — terminal.
restrictedProfile exists but TikTok withholds its data.Usually recovered automatically into a real profile row before you ever see this; a remaining restricted row may resolve on a later retry.
blockedTemporary fetch block.Yes — transient, retry the run.
errorUnexpected technical failure.Yes — transient, retry the run.

Notes on fields

  • authorMeta.region is currently usually null — TikTok rarely exposes it. All other author fields are populated whenever the profile resolves.
  • authorMeta.heart is corrected for TikTok's 32-bit overflow, so accounts with more than ~2.1 billion likes report a positive total instead of a negative one.
  • Profiles recovered via search carry bioLink: null and default commerce fields, flagged by profileScrapeNote.

Next steps: comments and hashtags

  • webVideoUrl → TikTok Comments Scraper (postURLs): the comments and reply threads under each creator's latest posts.
  • hashtags[].name → TikTok Hashtag Scraper (hashtags): more videos from the hashtags a creator uses.
  • Need creators to start from? TikTok Search Scraper finds them by keyword; feed its channel.username into profiles.

Guarantees and run status

One row per handle

On a SUCCEEDED run you can rely on exactly one row per unique requested handle — a post item (or several, with resultsPerPage > 1), a profile-only item, or an error item. Nothing is silently dropped. The only exception is the Free plan, where handles beyond the first 10 are not processed at all.

not_found, suspended and restricted rows are a normal part of a successful run; they do not count as failures.

When does the run fail?

  • FAILED when hard failures (blocked/error rows) exceed 20% of the requested handles, with a minimum of 3 — precisely, when they exceed max(2, ceil(0.2 × handles)). A 5-handle batch fails on the 3rd hard failure; a 100-handle batch fails on the 21st.
  • FAILED when zero items were produced at all, or when the input is invalid.
  • SUCCEEDED otherwise — including a Free-plan run that hit its monthly quota (no items, explanatory status message).

Automated callers should retry the whole batch on any non-SUCCEEDED status. A STATISTICS record in the run's key-value store summarises the batch: handles requested, resolved, recovered, not found, suspended, restricted and failed, posts pushed, and run duration.

Integrations, API & MCP

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('xmolodtsov/tiktok-profile-scraper').call({
profiles: ['nasa', '@nike', 'https://www.tiktok.com/@tiktok'],
resultsPerPage: 0, // profile-only mode — cheapest
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(token=os.environ["APIFY_TOKEN"])
run = client.actor("xmolodtsov/tiktok-profile-scraper").call(run_input={
"profiles": ["nasa", "@nike"],
"resultsPerPage": 0,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use with AI agents (MCP)

The Actor is available through Apify's MCP server at https://mcp.apify.com under the name xmolodtsov/tiktok-profile-scraper. Connect an MCP-capable agent (Claude, Cursor, or any other MCP client) to https://mcp.apify.com?tools=xmolodtsov/tiktok-profile-scraper and it can call the Actor as a tool with the same input and output described on this page — e.g. "get the follower count and bio for these ten TikTok handles".

Exports, schedules and webhooks

Datasets export to JSON, CSV, Excel, XML, JSONL, RSS and HTML from the Console or API. Use Apify Schedules to re-scrape the same handle list hourly or daily, and webhooks to push finished runs into your pipeline.

More scrapers from this developer

TikTok: TikTok Search Scraper: videos and creators for any keyword, pay per result · TikTok Comments Scraper: comments and full reply threads from any video · TikTok Hashtag Scraper: videos for any hashtag, with views, likes and music · TikTok Sound & Music Scraper: videos that use a sound or song

Social & news: Reddit Search Scraper: posts by keyword, subreddit or author · Google News Scraper: Google News results as clean full-text articles

E-commerce: Prom.ua Product Search Scraper: Prom.ua product search results, no browser needed · Amazon Product Search & Bestsellers Scraper: search results, Best Sellers and product details from Amazon

Maps & leads: Google Maps Scraper: places, leads and emails from Google Maps

Ads: Facebook Ad Library Scraper (Meta Ads Library): ads from the Meta Ad Library, with EU reach and payers

Video: YouTube Transcript Scraper: transcripts, subtitles and captions from YouTube videos

FAQ

Do I need proxies?

No. Everything is built in — leave proxyConfiguration empty.

Where is the follower count?

authorMeta.fans. Following is authorMeta.following, total likes authorMeta.heart, video count authorMeta.video.

What happens with restricted or banned accounts?

Banned/suspended accounts return an explicit suspended row. Restricted accounts (profile exists but TikTok withholds the data) are usually recovered automatically into a full profile row without bioLink and commerce fields, flagged in profileScrapeNote.

Can I download the videos?

Not through this Actor — media is never downloaded, which is what keeps the price low. Every post item carries its permanent webVideoUrl plus cover, music, subtitle and slideshow image CDN URLs.

Yes — avatar and cover URLs are signed and short-lived, so download them promptly. webVideoUrl and profileUrl are permanent tiktok.com links.

How fast is it?

Measured at ~264 profiles in 66 seconds with the default concurrency — roughly 1,000 profiles in under 5 minutes. Profile-only mode is faster still because no post pages are fetched.

Why did I get fewer posts than resultsPerPage?

The Actor returns at most resultsPerPage of the newest posts that pass your filters. A profile with fewer posts, a tight oldestPostDate, or excludePinnedPosts on an account with mostly pinned content will yield fewer items. If no post passes, you still get one profile-only item with a profileScrapeNote.

The Actor only collects publicly available data — it never logs in and never accesses private content. Whether a given use is lawful depends on where you are and what you do with the data: TikTok's terms of service, and personal-data laws such as the GDPR and CCPA, may apply. Usernames, display names, bios and avatars can be personal data — have a lawful basis for processing them, keep only what you need, and honour deletion requests. You are responsible for compliant use; this is not legal advice.

Support

Report bugs or request features through the Issues tab on this Actor's Store page. Include the run ID when reporting a problem so the run's log and STATISTICS can be checked.