TikTok Profile Scraper (Pay Per Result)
Pricing
$0.75 / 1,000 tiktok profile results
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
Maintained by CommunityActor stats
2
Bookmarked
44
Total users
29
Monthly active users
17 days ago
Last modified
Categories
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 scraper | Typical pay-per-result profile scrapers | |
|---|---|---|
| Price per 1,000 results | $0.75 | $2.00+ |
| Proxies needed | None — fully built in | Varies |
| Handles that don't resolve | Explicit error row per handle | Row silently missing |
| Restricted-account recovery | Yes — usually returned as a full profile row | No — nothing returned |
| Batch size | Up to 1,000 handles per run | Varies |
- 🔁 Drop-in compatible input & output with the popular TikTok profile scrapers:
profiles,resultsPerPage, download flags — and the sameauthorMetaitem shape. - 🛍️ Commerce fields included:
authorMeta.ttSellerandauthorMeta.commerceUserInfo.categorydistinguish 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: 0to 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
- Open the actor in Apify Console and paste your handles into TikTok profiles.
- Set Posts per profile (
resultsPerPage) — use0for the cheapest profile-only mode, or1+ to include the latest posts. - 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
| Parameter | Type | Default | Notes |
|---|---|---|---|
profiles | array | required | Up 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. |
resultsPerPage | integer | 1 | Latest 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. |
excludePinnedPosts | boolean | false | Filter pinned posts out of the results. |
oldestPostDate | string | — | Only return posts created on/after this ISO date (e.g. 2024-01-01). Invalid values are silently ignored (no filter applied). |
profileScrapeSections | array | ["videos"] | Only ["videos"] is supported; other sections are ignored with a warning. |
profileSorting | string | "latest" | Only "latest" (newest-first) is supported. |
shouldDownloadVideos, shouldDownloadCovers, shouldDownloadSlideshowImages, shouldDownloadAvatars, shouldDownloadMusicCovers, downloadSubtitlesOptions | — | no-op | Compatibility 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."}
error | Meaning | Should you retry? |
|---|---|---|
not_found | Profile deleted or never existed. | No — terminal. |
suspended | Profile suspended or banned by TikTok. | No — terminal. |
restricted | Profile 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. |
blocked | Temporary fetch block. | Yes — transient, retry the run. |
error | Unexpected 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).mediaUrlsis always[]. - CDN links expire. Avatar and cover URLs are signed and short-lived — download them
promptly if you need the files.
webVideoUrlandprofileUrlare permanent links. authorMeta.regionis currently usuallynull— 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, andrestrictedrows 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
webVideoUrlare returned instead (mediaUrlsis always[]). - Only the videos profile section is scraped (
profileScrapeSectionsother values are ignored). - Only latest sorting is supported.
authorMeta.regionis currently usuallynull.
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).