TikTok Profile Scraper
Pricing
from $2.80 / 1,000 profile - scrapeds
TikTok Profile Scraper
Extract TikTok profile data fast - followers, following, likes, video count, bio, avatar, verification, region. Just add usernames or profile URLs, no login or cookies needed. Export to JSON, CSV, Excel. Fast & cheap, pay only per profile scraped.
Pricing
from $2.80 / 1,000 profile - scrapeds
Rating
0.0
(0)
Developer
Gopalakrishnan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrapes public TikTok profile data from a list of usernames or profile URLs. Built as an Apify actor on Crawlee + CheerioCrawler — no browser required.
Features
- Accepts bare handles,
@handles, or full profile URLs (mixed in one list). - Returns one flat record per profile: followers, following, likes, video count, bio, avatar, verification, region, and more.
- Pay-Per-Event pricing: a flat start fee plus a charge per profile successfully scraped.
- Graceful error rows for not-found / blocked profiles instead of failing the run.
How it works
For each profile, the actor fetches https://www.tiktok.com/@<username>, reads the
__UNIVERSAL_DATA_FOR_REHYDRATION__ script the page embeds, and extracts the
webapp.user-detail payload (profile fields + stats). Plain HTTP through Apify Proxy
(datacenter is sufficient). If the rehydration payload is missing the request is treated
as blocked: the session is rotated and the request retried.
Input
| Field | Type | Description |
|---|---|---|
usernames | array (required) | TikTok profiles to scrape. Each item may be a bare handle (stoolpresidente), an @handle, or a full profile URL (https://www.tiktok.com/@stoolpresidente). |
maxProfiles | integer (optional) | Cap the number of profiles scraped from the list. |
proxyConfiguration | object | Proxy settings. Defaults to { "useApifyProxy": true }. |
Example:
{"usernames": ["stoolpresidente", "@tiktok", "https://www.tiktok.com/@nba"],"maxProfiles": 10,"proxyConfiguration": { "useApifyProxy": true }}
Output
One flat record per profile:
| Field | Description |
|---|---|
username | Handle (uniqueId) |
nickname | Display name |
userId | Numeric user ID |
secUid | TikTok secUid |
verified | Whether the account is verified |
privateAccount | Whether the account is private |
signature | Bio text |
bioLink | Link in bio |
region | Account region code |
language | Account language |
avatar | Avatar image URL |
followerCount | Followers |
followingCount | Following |
heartCount | Total likes |
videoCount | Number of videos |
friendCount | Friends |
profileUrl | Canonical profile URL |
scrapeStatus | success or error |
scrapeError | Error reason when scrapeStatus is error (USER_NOT_FOUND, RETRIES_EXHAUSTED, etc.) |
scrapedAt | ISO timestamp |
Pay-Per-Event billing
| Event | When charged |
|---|---|
actor-start | Once per run (flat start fee). |
profile-scraped | Once per profile successfully scraped. |
Set the prices for these events in the Apify Console. Event names must match the
Actor.charge calls in src/main.js exactly.
Running locally
$apify run --purge
Put a test input in storage/key_value_stores/default/INPUT.json. Local runs store
results only on disk (storage/datasets/default/) — they are not synced to Apify Console.