Paste a profile or video. Web Unlocker returns it with no login: a profile's exact followers, likes and 16 latest videos with views, a video's plays, likes, comments, shares and saves. $0.98 per 1,000 pages.
1,000 free requests · Pay only on success · 195+ countries · Claude ready
TikTok pages take 4 to 20 seconds, now and then longer. It is still working, no need to click again.
Ready for your own creators? Get an API key or book a demo.
Tell us a little about your team and get:
Public pages, with no login and no TikTok account. Influencer platforms, agencies, brands and researchers read these two kinds of page, each billed as one page.





Want to try it yourself? Take your API key with 1,000 free requests.
One profile page brings a creator's exact followers and likes and their 16 latest videos with views, billed once at $0.98 per 1,000 pages. TikTok scrapers on Apify and Bright Data bill each of those videos as a result of its own.
Apify bills $48 for 1,000 creators.
Here they cost $0.98.
A page that fails costs nothing. When TikTok sends an error, ask again: you pay only for the page that comes back with data.
What 1,000 TikTok creators cost
1,000 profiles with their 16 latest videos and views, at published prices
Gologin: one profile page per creator, $0.98 per 1,000 pages. Bright Data bills each profile and each video as a record, $1.50 per 1,000. On Apify's free plan, its TikTok Profile Scraper bills each video at $3.00 per 1,000, and the most used TikTok Scraper at $3.70 per 1,000.
Ready to run it on your own creators? Get your API key and free requests.
A profile page brings the creator's exact followers and likes and their 16 latest videos with views. Each video page adds its likes, comments, shares and saves. 17 pages, $0.0167, and you have the creator's real engagement, video by video.
TikTok shows 146.2M followers.
The scraper returns 146,194,232.
TikTok's own APIs are for approved researchers and for each user's own account. Here is what each route asks of you before you start, and what it bills for the same 1,000 creators.
| What it takes | ||||
|---|---|---|---|---|
| Other creators' data | Yes | Researchers only | Yes | Yes |
| You pay for | A page | Free after approval | Each video | Each record |
| 1,000 creators with 16 videos | $0.98 | Not for business | $48 to $59.20 | $25.50 |
| Start without an application | Yes | No, about 4 weeks | Yes | Yes |
| Free to start | 1,000 requests | After approval | $5 a month | 5,000 a month |
| The whole page in HTML | Yes | No | No | No |
Scraping more than TikTok? Web Unlocker returns any page the same way, at the same price.
TikTok keeps a public page's data as JSON inside its HTML. Web Unlocker returns that HTML, and a few lines of code read the profile or the video out of it. The Creators list tab is a small TikTok crawler: a list of accounts in, a CSV out.
Fill in the form above. The key arrives by email within one business day.
A profile for its followers and latest videos, a video for its plays, likes, comments, shares and saves.
Check that the page came with data, and ask again when TikTok sends an error: you pay only for the page that comes back.
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python tiktok_profile.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html
import json
import os
import re
import time
import requests
username = "mrbeast"
def scrape(url, marker):
for attempt in range(3):
address = url if attempt == 0 else f"{url}?fresh={int(time.time())}"
try:
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": address, "geo": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=60,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
except requests.RequestException:
page = ""
if marker in page:
return page
time.sleep(3)
raise RuntimeError("TikTok did not send the page, try again later")
page = scrape(f"https://www.tiktok.com/@{username}", '"followerCount"')
script = re.search(r'<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>(.*?)</script>', page, re.S)
info = json.loads(script.group(1))["__DEFAULT_SCOPE__"]["webapp.user-detail"]["userInfo"]
user, stats = info["user"], info["statsV2"]
videos = []
for item in page.split('data-e2e="user-post-item"')[1:]:
video = re.search(r'/video/(\d+)"', item)
views = re.search(r'data-e2e="video-views"[^>]*>([^<]*)<', item)
caption = re.search(r'<img alt="([^"]*)"', item)
if video:
videos.append({
"url": f"https://www.tiktok.com/@{username}/video/{video.group(1)}",
"views": views.group(1) if views else None,
"caption": html.unescape(caption.group(1)).split(" created by ")[0].strip() if caption else "",
})
profile = {
"username": user["uniqueId"],
"nickname": user["nickname"],
"bio": user["signature"],
"verified": user["verified"],
"followers": int(stats["followerCount"]),
"following": int(stats["followingCount"]),
"likes": int(stats["heartCount"]),
"videos": int(stats["videoCount"]),
"latest_videos": videos,
}
print(json.dumps(profile, indent=2, ensure_ascii=False))
print(f"@{username}: {profile['followers']:,} followers, {len(videos)} latest videos from one page")GOLOGIN_SCRAPING_API_KEY=your_key node tiktok-engagement.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const username = 'mrbeast';
async function scrape(url, marker) {
for (let attempt = 0; attempt < 3; attempt += 1) {
const api = new URL('https://parsing.webunlocker.gologin.com/v1/scrape');
api.search = new URLSearchParams({ url: attempt === 0 ? url : `${url}?fresh=${Date.now()}`, geo: 'us', format: 'json' });
try {
const response = await fetch(api, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
signal: AbortSignal.timeout(60_000),
});
const page = response.ok ? ((await response.json()).data?.html ?? '') : '';
if (page.includes(marker)) return page;
} catch {}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
throw new Error(`TikTok did not send ${url}, try again later`);
}
const data = (page) =>
JSON.parse(page.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>([\s\S]*?)<\/script>/)[1]).__DEFAULT_SCOPE__;
const profile = await scrape(`https://www.tiktok.com/@${username}`, '"followerCount"');
const followers = Number(data(profile)['webapp.user-detail'].userInfo.statsV2.followerCount);
const links = profile
.split('data-e2e="user-post-item"')
.slice(1)
.map((item) => item.match(/\/video\/(\d+)"/)?.[1])
.filter(Boolean)
.map((id) => `https://www.tiktok.com/@${username}/video/${id}`);
const rows = [];
for (const url of links) {
const video = data(await scrape(url, '"playCount"'))['webapp.video-detail'].itemInfo.itemStruct;
const stats = video.statsV2;
rows.push({
url,
date: new Date(video.createTime * 1000).toISOString().slice(0, 10),
plays: Number(stats.playCount),
likes: Number(stats.diggCount),
comments: Number(stats.commentCount),
shares: Number(stats.shareCount),
saves: Number(stats.collectCount),
caption: video.desc,
});
}
const cell = (value) => `"${String(value).replaceAll('"', '""')}"`;
writeFileSync(
`${username}-videos.csv`,
[Object.keys(rows[0]).join(','), ...rows.map((row) => Object.values(row).map(cell).join(','))].join('\n'),
);
const sum = (key) => rows.reduce((total, row) => total + row[key], 0);
const engagement = (sum('likes') + sum('comments') + sum('shares') + sum('saves')) / sum('plays');
console.table(rows.map(({ caption, ...row }) => row));
console.log(
`@${username}: ${followers.toLocaleString('en')} followers, ${rows.length} videos, ${(engagement * 100).toFixed(1)}% engagement, ${rows.length + 1} pages, saved to ${username}-videos.csv`,
);GOLOGIN_SCRAPING_API_KEY=your_key node tiktok-creators.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const creators = ['mrbeast', 'nasa', 'khaby.lame', 'zachking', 'charlidamelio'];
async function scrape(url, marker) {
for (let attempt = 0; attempt < 3; attempt += 1) {
const api = new URL('https://parsing.webunlocker.gologin.com/v1/scrape');
api.search = new URLSearchParams({ url: attempt === 0 ? url : `${url}?fresh=${Date.now()}`, geo: 'us', format: 'json' });
try {
const response = await fetch(api, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
signal: AbortSignal.timeout(60_000),
});
const page = response.ok ? ((await response.json()).data?.html ?? '') : '';
if (page.includes(marker)) return page;
} catch {}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
return null;
}
const UNITS = { K: 1e3, M: 1e6, B: 1e9 };
const number = (text) => Number.parseFloat(text) * (UNITS[text.at(-1)] ?? 1);
const rows = [];
for (const username of creators) {
const page = await scrape(`https://www.tiktok.com/@${username}`, '"followerCount"');
if (!page) {
console.log(`@${username}: no page this time, run it again later`);
continue;
}
const script = page.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>([\s\S]*?)<\/script>/)[1];
const { user, statsV2 } = JSON.parse(script).__DEFAULT_SCOPE__['webapp.user-detail'].userInfo;
const views = [...page.matchAll(/data-e2e="video-views"[^>]*>([^<]+)</g)].map(([, text]) => number(text)).sort((a, b) => a - b);
rows.push({
username: user.uniqueId,
name: user.nickname,
verified: user.verified,
followers: Number(statsV2.followerCount),
likes: Number(statsV2.heartCount),
videos: Number(statsV2.videoCount),
median_views: views.length ? views[Math.floor(views.length / 2)] : '',
});
}
const cell = (value) => `"${String(value).replaceAll('"', '""')}"`;
writeFileSync('creators.csv', [Object.keys(rows[0]).join(','), ...rows.map((row) => Object.values(row).map(cell).join(','))].join('\n'));
console.table(rows);
console.log(`${rows.length} of ${creators.length} creators, one page each, saved to creators.csv`);Ready to run it on your own creators? Get your API key and free requests.
One account, one proxy network, one ecosystem. Pick the product the job needs.
Scraping more sites? See the Instagram, YouTube and Reddit scrapers, or every web scraping tool.
A TikTok scraper, or TikTok crawler, is a tool that reads public TikTok pages and turns them into data: a profile's followers, likes and latest videos, a video's plays, likes, comments, shares and saves. Gologin Web Unlocker is a TikTok scraper API: send it a profile or video address and it returns the page with that data, at $0.98 per 1,000 pages.
TikTok data scraping takes one request per page: send the address of a public profile or video to Web Unlocker. It returns the page as a logged-out visitor sees it, with the data TikTok keeps inside it as JSON. The code above reads it in a few lines. When TikTok sends an error, ask again: you pay only for the page that comes back.
Send the profile address to Web Unlocker with the requests library and read the JSON from the page. The Python tab above is a complete script, tested on the live API: it prints the creator's exact followers, likes and video count, and their 16 latest videos with views.
Exact followers, following, likes and video count, the name, bio and verified mark, and the 16 latest videos with their links, captions and views. TikTok shows rounded counts on the page; the data inside it holds the exact ones.
A TikTok video scraper gets plays, likes, comments, shares and saves, the caption, hashtags, sound, date and length, the cover picture, and the author with their follower count. On large videos TikTok rounds plays and likes, the same way it shows them.
Yes. Public profiles and videos load without a login, and Web Unlocker opens them as a logged-out visitor. You need no TikTok account and put none of yours on the line. Private accounts stay closed.
Only for approved researchers. The Research API is open to academic and not-for-profit research groups in the US, Europe and a few other countries, and the review takes about 4 weeks. The Display API reads only the profile and videos of a user who signs in to your app. Neither covers commercial work on other creators' data.
Add up the likes, comments, shares and saves of the creator's latest videos and divide by their plays. Web Unlocker brings the 16 latest videos from the profile page and each video's numbers from its own page: 17 pages, $0.0167. The Node.js tab above does the sum and writes a CSV; for MrBeast it came to 14.7%.
The comment count, yes: every video page carries it. The comments themselves load as you scroll and need a logged-in session, so Web Unlocker does not return them.
$0.98 per 1,000 pages, the same for every page: a profile with its 16 latest videos is one page, a video with its numbers is one page. A request that fails costs nothing. You start with 1,000 free requests, and plans start at $49 a month for 50,000 requests.
It depends on the job. Apify and Bright Data sell ready rows from profiles, videos, hashtags and comments, and bill each one. Web Unlocker returns the whole public profile or video page at one price per page, on TikTok and on any other site, so vetting creators costs cents.
Yes. Apify's TikTok Scraper bills each video, $3.70 per 1,000 on its free plan, so a creator's 16 latest videos are 16 results. Web Unlocker returns the profile with those 16 videos and their views as one page: $0.98 per 1,000 creators.
Profiles and videos that load without a login are public pages. In Meta v. Bright Data, in January 2024, a US federal court found that a platform's terms do not bar logged-out scraping of public data. What you collect and how you use it is your call, so check it against the rules that apply to your project.
Tell us a little about your team and get: