TikTok Profile Scraper (Pay Per Result) avatar

TikTok Profile Scraper (Pay Per Result)

Pricing

$0.75 / 1,000 tiktok profile results

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

TikTok Profile Scraper (Pay Per Result)

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

$0.75 / 1,000 tiktok profile results

Rating

0.0

(0)

Developer

Yevhenii Molodtsov

Yevhenii Molodtsov

Maintained by Community

Actor stats

2

Bookmarked

44

Total users

29

Monthly active users

17 days ago

Last modified

Share

Scrape TikTok profiles by username and get the complete author block — followers, bio, bio link, verified badge, TikTok Shop seller flag and seller category, avatar, account region — plus the latest posts with full metadata (stats, music, hashtags, mentions, subtitles, CDN URLs). No proxy setup needed. You pay only per result.

~1,000 profiles in under 5 minutes, guaranteed row coverage — including restricted accounts other scrapers return nothing for.

Why this scraper

This scraperTypical pay-per-result profile scrapers
Price per 1,000 results$0.75$2.00+
Proxies neededNone — fully built inVaries
Handles that don't resolveExplicit error row per handleRow silently missing
Restricted-account recoveryYes — usually returned as a full profile rowNo — nothing returned
Batch sizeUp to 1,000 handles per runVaries
  • 🔁 Drop-in compatible input & output with the popular TikTok profile scrapers: profiles, resultsPerPage, download flags — and the same authorMeta item shape.
  • 🛍️ Commerce fields included: authorMeta.ttSeller and authorMeta.commerceUserInfo.category distinguish an actual TikTok Shop store from a creator who merely sells something.
  • 📇 One item per requested handle — guaranteed. Unresolvable handles produce an explicit {"input": "...", "error": "not_found"} item instead of a silently missing row.
  • 🔓 Restricted-account recovery: handles that TikTok withholds profile data for are usually recovered automatically into a full profile row. In one real 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.

Quickstart

  1. Open the actor in Apify Console and paste your handles into TikTok profiles.
  2. Set Posts per profile (resultsPerPage) — use 0 for the cheapest profile-only mode, or 1+ to include the latest posts.
  3. Click Start and export the dataset (JSON, CSV, Excel, …) when the run finishes.

All three handle forms are accepted and mean the same profile:

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

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

Input parameters

ParameterTypeDefaultNotes
profilesarrayrequiredUp to 1,000 unique handles per run — exceeding 1,000 fails input 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, downloadSubtitlesOptionsno-opCompatibility no-ops. 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 []. This is what keeps the per-result price low.

Output

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) — the item carries the full author block with id: null. A profileScrapeNote field is added when there is something worth knowing:

{
"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.

Pricing: what counts as a result

$0.75 per 1,000 dataset items. Every item pushed to the dataset is one paid result.

  • 1,000 handles in profile-only mode (resultsPerPage: 0) ≈ 1,000 items ≈ $0.75.
  • 1,000 handles with resultsPerPage: 5 ≈ 5,000 items ≈ $3.75.

Honest disclosure: 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 low per-result rate.

Run status contract

  • SUCCEEDED — the batch was processed. not_found, suspended, and restricted rows are a normal part of a successful run; they do not count as failures.
  • FAILED — more than 20% of requested handles hit technical failures (blocked/error), or zero items were produced at all.

Automated callers should retry the whole batch on any non-SUCCEEDED status, and on SUCCEEDED can rely on exactly one row per unique requested handle.

Switching from another TikTok profile scraper

Keep your input JSON as-is — the keys are 1:1 (profiles, resultsPerPage, excludePinnedPosts, oldestPostDate, download flags), and the output item shape (authorMeta, videoMeta, musicMeta, stats fields) matches. The honest delta list:

  • No media downloads — CDN URLs and webVideoUrl are returned instead (mediaUrls is always []).
  • Only the videos profile section is scraped (profileScrapeSections other values are ignored).
  • Only latest sorting is supported.
  • authorMeta.region is currently usually null.

Integrations

Run via API with curl:

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 JavaScript client:

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);

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/daily, and webhooks to push finished runs into your pipeline.

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.

Do the CDN links expire? 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 — roughly 1,000 profiles in under 5 minutes.

Is this legal? The actor only collects publicly available data — no login, no private content. You are responsible for using the data in compliance with TikTok's terms and applicable law (e.g. GDPR when processing personal data).