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 at a fraction of the usual pay-per-result price: followers, bio, links, verified badge, TikTok Shop seller data, latest posts. Drop-in input/output compatible with popular TikTok profile scrapers. No proxies needed. Guaranteed row per handle, 1000/run.

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

85

Total users

56

Monthly active users

5 days ago

Last modified

Share

TikTok profile scraper that takes a list of usernames and returns, for each profile, the followers, 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.

~1,000 profiles in under 5 minutes, one row per requested handle — including restricted accounts other scrapers return nothing for.

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.

This scraperOther TikTok profile scrapers
Proxies neededNone — fully built inVaries
Handles that don't resolveExplicit error row per handleRow often silently missing
Restricted-account recoveryYes — usually returned as a full profile rowTypically nothing returned
Batch sizeUp to 1,000 handles per runVaries
Media downloadsNo — CDN URLs + webVideoUrl insteadVaries
  • 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 production batch, recovery resolved 10 of 79 otherwise-restricted handles.
  • 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.

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": ["apifyoffice"], "resultsPerPage": 1}'

Or with the Apify CLI:

$apify call xmolodtsov/tiktok-profile-scraper --input '{"profiles": ["apifyoffice", "@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": [
"apifyoffice",
"@apifyoffice",
"https://www.tiktok.com/@apifyoffice"
],
"resultsPerPage": 1
}

Duplicates are removed case-insensitively before scraping, so the input above scrapes apifyoffice 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 planPrice per 1,000 results
Free$0.75
Bronze$0.70
Silver$0.65
Gold, Platinum, Diamond$0.60

Worked examples:

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

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. On the Free plan, however, this Actor runs with the limits described in the next section — 10 profiles per run, 1 post each, 5 runs per month — so a full free month costs at most a few cents of that credit. Any paid Apify plan removes the limits and bills purely per result at the plan rate above.

Free plan limits

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.

Why: pay-per-result revenue only comes from paid Apify accounts, while every run consumes the Actor's own infrastructure. The cap keeps the free tier open for evaluation without subsidising unlimited free scraping.

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.
oldestPostDatestringOnly 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, downloadSubtitlesOptionsignoredAccepted 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.
proxyConfigurationobjectOptional 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.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": "7623273873403809054",
"text": "Post caption ...",
"createTimeISO": "2026-03-31T04:36:16.000Z",
"authorMeta": {
"id": "6809214858661659653",
"name": "lilianalazarin",
"profileUrl": "https://www.tiktok.com/@lilianalazarin",
"nickName": "Liliana Valeria",
"verified": false,
"signature": "dental • fitness • travel ...",
"bioLink": "https://beacons.ai/lilianalazarin",
"avatar": "https://p16-common-sign.tiktokcdn-us.com/...",
"commerceUserInfo": { "commerceUser": false },
"privateAccount": false,
"region": null,
"ttSeller": false,
"following": 630,
"friends": 48,
"fans": 43700,
"heart": 1600000,
"video": 2558
},
"musicMeta": { "musicName": "original sound", "musicId": "..." },
"webVideoUrl": "https://www.tiktok.com/@lilianalazarin/video/7623273873403809054",
"videoMeta": { "height": 1280, "width": 720, "duration": 117, "coverUrl": "..." },
"diggCount": 3156,
"playCount": 37600,
"hashtags": [{ "name": "higienistadental" }],
"isPinned": true,
"mediaUrls": [],
"input": "lilianalazarin",
"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": "6809214858661659653",
"name": "lilianalazarin",
"profileUrl": "https://www.tiktok.com/@lilianalazarin",
"fans": 43700,
"verified": false,
"privateAccount": true
},
"input": "lilianalazarin",
"fromProfileSection": null,
"profileScrapeNote": "private account — posts are not accessible"
}

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 media & fields

  • 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). mediaUrls is always [].
  • CDN links expire. Avatar and cover URLs are signed and short-lived — download them promptly if you need the files. webVideoUrl and profileUrl are permanent links.
  • 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.

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: ['apifyoffice', '@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": ["apifyoffice", "@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 the server 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.

  • TikTok Search Scraper — keyword and hashtag search for creator discovery; feed the handles it finds into this Actor to enrich them with followers, bio and TikTok Shop data.

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 — a tail other scrapers simply drop. Recovered rows lack bioLink and commerce fields and say so 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 and feedback

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.