TikTok Scraper - Profiles, Videos, Hashtags & Search
Keyless TikTok scraper for profiles, videos, hashtags & search. Get views, likes, comments & video URLs as JSON/CSV. Cheaper, no API key, failed runs free.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
profiles,hashtags,searchQueries(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00025 per result = $0.25 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Result returned | Charged once per profile or video returned in the dataset. Failed or empty runs are not charged. | $0.00025 |
Pay-per-event pricing: you are billed per result, not per subscription — a run that returns nothing costs nothing beyond the start fee. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-06-23, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
profiles | TikTok usernames (with or without @) to scrape. Each one returns a profile row (followers, likes, bio, verified) plus that creator's ~10 newest videos — that is all TikTok publishes for a creator without a login. | array |
hashtags | Hashtags (with or without #) to scrape videos from. | array |
searchQueries | Keywords to search TikTok for. | array |
startUrls | Paste TikTok URLs directly — a profile URL, a /video/ URL (single video), or a /tag/ URL (hashtag). | array |
resultsPerPage | Maximum number of videos/results to collect per profile, hashtag or search. You are charged per result returned. Note: a single profile yields about 11 rows maximum (1 profile + ~10 videos) no matter how high this is set; hashtag and search page much deeper. | integer |
maxRunSeconds | Safety cap on total scrape time. If a slow query (e.g. a search/feed that keeps paginating with few results) hits this, the run stops and returns what it has so far. Prevents runaway cost on pathological queries. | integer |
sessionCookies | Optional. Runs work out of the box using a built-in session, which is shared, so under heavy concurrent load it can be rate-limited. Paste your own TikTok account cookie here to get a private rate limit that no other user shares. In Chrome: F12 → Application → Cookies → tiktok.com, and copy at least `sessionid` (e.g. `sessionid=abc123; sid_tt=abc123`). Only used for TikTok's own pages — it is never sent anywhere else. | array |
notionConnector | Optional. Deliver the results to your connected Notion via Apify MCP connectors. | string |
notionParentId | Optional Notion database/data-source id to create the pages in. | string |
What you get
A structured dataset — each result includes fields like:
typeidwebVideoUrltextcreateTimehashtagsplayCountdiggCountcommentCountshareCountvideomusicauthorExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
5 ready-to-run use cases
Scrape @MrBeast's TikTok Videos
Pull MrBeast's latest TikTok videos with views, likes, comments & shares. No login or API key. Export to JSON, CSV or Excel.
Scrape #fyp Trending TikTok Videos by Hashtag
Collect trending videos from the #fyp hashtag with engagement stats, music & author data. Keyless TikTok scraper, export JSON/CSV.
Search TikTok for Recipe Videos
Scrape TikTok search results for 'easy recipes' with views, likes, comments & video URLs. No login needed. Export to CSV or Excel.
Track Gymshark's TikTok for Competitor Research
Monitor Gymshark's TikTok videos and engagement for competitor research. Views, likes, comments & hashtags. Keyless, export JSON/CSV.
Scrape Charli D'Amelio TikTok by URL
Scrape Charli D'Amelio's TikTok profile by URL — views, likes, shares, music & cover images. No login or API key. Export JSON/CSV/Excel.
Related tools in Social Media Scrapers
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Instagram Scraper - Profiles, Posts & Reels (No Login)
Keyless Instagram scraper: profiles, posts and reels in one run. Likes, comments, views, media, hashtags. No login or API key. From $0.45/1k results.
Tweet Scraper - X / Twitter, No Login, Cheapest
No-login X/Twitter scraper: tweets, profiles, search, likes, retweets, views and media to JSON/CSV. No minimums, no caps, failed runs free. ~$0.14/1k.
Twitter (X) User Scraper - Profiles & Followers, No Login
Keyless X (Twitter) profile scraper: followers, bio, verified status & more by username. No login or API key, pay per profile, failed lookups free.
TikTok User Scraper - Profiles, Followers & Stats (No Login)
Scrape TikTok profiles without login or API key. Get followers, likes, bio, verified status & stats. Export CSV/JSON. Only $0.35 per 1,000 profiles.
Reddit Scraper
Scrape Reddit posts and comments from any subreddit or user profile. Sort by top/hot/new, filter by score, get clean text. No key or login needed.
Reddit Posts Search Scraper
Search Reddit by keyword across the site or one subreddit and export matching posts as JSON. Sort by relevance, top, new or hot. No code needed.
Where this tool sits
- Categories
- Social Media Scrapers
- Platforms
- TikTok
⚡ TikTok Scraper — Profiles, Videos, Hashtags & Search (No Login, No API Key)
Scrape TikTok without a login or API key. Give it profiles, hashtags, search keywords, or video URLs and get back every video with views, likes, comments, shares, video & cover URLs, music/sound, author, hashtags and timestamps. Export to JSON, CSV or Excel, call it from the API, or have results delivered straight to Notion. Just $0.25 per 1,000 results — the cheapest TikTok scraper on the market, built for influencer discovery, trend tracking, lead gen and market research.
> No account. No signing keys. No msToken to paste. Paste a username and run.
Why this scraper wins
- 💸 Cheapest on the market — a flat $0.25 / 1,000 results. Billed per result actually returned, with no volume tiers and no plan gates. Everything you see in a row (stats, music, author, video URLs) is part of that one result — there are no add-on events billed on top.
- 🔓 Keyless, sign-free, proxy-free — no login, no API key, no signing keys, and no proxy needed. It just works from a default run.
- 🛡️ Real numbers, not deflated ones — TikTok serves flagged addresses a decoy version of a profile with wrong follower and view counts. This scraper is built so that never happens, so the stats you get are the stats TikTok shows a normal visitor. Profile counters (
followerCount,heartCount,videoCount) come back exact, not rounded. - 🧹 Clean, flat records — one tidy object per video, ready for sheets, dashboards or LLM pipelines. No nested junk to unwrap.
- 📬 Built-in Notion delivery — push every run into Notion via Apify connectors, zero extra code.
- 🚦 Honest errors — a clear
errorCoderow when something goes wrong, instead of silent emptiness. Diagnostic rows are never charged. - ⏱️ Built-in cost guard — a run-time budget stops pathological queries from grinding on, so a bad keyword can't quietly run up a bill.
What you can scrape
| Mode | Input | Returns |
|---|---|---|
| Profile | profiles or a profile URL | One profile row (followers, likes, bio, verified) + that creator's ~10 newest videos |
| Hashtag | hashtags or a /tag/ URL | Videos published under the hashtag |
| Search | searchQueries | Videos matching the keyword, in TikTok's search order |
| Single video | a /video/ URL in startUrls | That one video with full stats, music and author |
You can mix all four in a single run — a list of profiles, a couple of hashtags and a search keyword all go in the same input and land in the same dataset.
Input
| Field | Type | What it does |
|---|---|---|
profiles | string[] | Usernames, with or without @ (e.g. nasa, @nba). |
hashtags | string[] | Hashtags, with or without #. |
searchQueries | string[] | Keywords to search TikTok for. |
startUrls | string[] | Paste TikTok URLs directly — profile, /video/ or /tag/. They are routed to the right mode automatically. |
resultsPerPage | integer | Max results per input (default 50, max 2000). You pay per result, so this is your cost cap. |
maxRunSeconds | integer | Run-time budget in seconds (default 90, max 180). If a slow query keeps paginating with almost no results, the run stops and returns what it has. |
proxyConfiguration | object | Optional and off by default — this scraper needs no proxy. Only add one if you want to spread requests across addresses at high volume. |
sessionCookies | string[] | Optional and empty by default. Your own TikTok account cookie, if you want a rate limit nobody else shares. See *Rate limits and your own cookie* below. |
notionConnector | string | Optional Apify Notion connector ID for automatic delivery. |
notionParentId | string | Optional Notion database / data-source ID to create the pages in. |
A real input
{
"profiles": ["nasa", "nba"],
"hashtags": ["spacex"],
"searchQueries": ["rocket launch"],
"startUrls": ["https://www.tiktok.com/@nasa/video/7300000000000000000"],
"resultsPerPage": 50,
"maxRunSeconds": 90
}
Input field names follow the conventions used across similar Actors, so switching over is usually a drop-in change — the same profiles / hashtags / searchQueries / startUrls shape you already have will run here without edits.
Output
One record per video:
{
"ok": true,
"type": "video",
"id": "7300000000000000000",
"webVideoUrl": "https://www.tiktok.com/@nasa/video/7300000000000000000",
"text": "Liftoff! 🚀 #space",
"createTime": "2024-06-12T14:00:00.000Z",
"hashtags": ["space"],
"region": "US",
"playCount": 2400000,
"diggCount": 318000,
"commentCount": 4200,
"shareCount": 9100,
"collectCount": 15300,
"downloadCount": 2100,
"isAd": false,
"video": {
"duration": 23,
"cover": "https://...jpg",
"dynamicCover": "https://...webp",
"playAddr": "https://...mp4",
"downloadAddr": "https://...mp4"
},
"music": {
"id": "6800000000000000000",
"title": "original sound",
"authorName": "NASA",
"playUrl": "https://...mp3",
"original": true,
"duration": 23
},
"author": {
"id": "6600000000000000000",
"uniqueId": "nasa",
"nickname": "NASA",
"avatar": "https://...jpeg"
}
}
And one record per profile, whenever you scrape by profile:
{
"ok": true,
"type": "profile",
"id": "6600000000000000000",
"uniqueId": "nasa",
"secUid": "MS4wLjABAAAA...",
"nickname": "NASA",
"signature": "Explore the universe with us.",
"verified": true,
"avatar": "https://...jpeg",
"followerCount": 9800000,
"followingCount": 12,
"heartCount": 210000000,
"videoCount": 640,
"diggCount": 31,
"url": "https://www.tiktok.com/@nasa"
}
playAddr is the no-watermark MP4; downloadAddr is the watermarked one. Both are TikTok CDN links that expire after a while — download or rehost them if you need them long-term.
Filter the dataset by type (video or profile) if you want the two shapes in separate sheets, or use the CSV export, which flattens video.*, music.* and author.* into columns automatically.
Pricing
$0.25 per 1,000 results ($0.00025 each), with no run-start fee. Flat rate — no volume tiers, no plan gates — and you are charged only for results actually returned. The same $0.25 applies on every Apify plan, including the free one.
What is free:
- Diagnostic rows (
ok: falsewith anerrorCode) — you are never charged for a result you did not get. - Runs that return nothing at all.
- Every field inside a result. Video stats, music/sound, author and profile fields are all part of the one result row; there is nothing billed as an extra event.
> Price change on 19 August 2026: the per-result price stays at $0.00025, and a $0.001 run-start fee is added to each run from that date. A 1,000-result run costs $0.25 today and $0.251 from that date — the extra $0.001 is charged once per run, however many results come back.
Because billing is per result, resultsPerPage is a hard cost ceiling: set it to 20 and a profile can never cost you more than $0.005.
Typical uses
- Influencer discovery — scrape a hashtag or keyword, sort by
playCountor engagement rate (diggCount / playCount), then pull theauthor.uniqueIdlist back through theprofilesinput to get follower counts. - Trend tracking — run the same hashtags on a schedule and diff
playCountover time. - Sound/audio research — group results by
music.idto see which sounds are carrying a trend, and whether they areoriginal. - Competitor content audits — scrape a set of profiles weekly and chart posting cadence from
createTime. - Ad/creative sourcing —
isAdflags promoted content, andvideo.covergives you thumbnails for a contact sheet.
Rate limits and your own cookie
You do not need an account. Profiles, videos, hashtags and search are read from pages TikTok serves to any visitor, and that is the path every run takes first — it is the fastest one and it costs you nothing extra.
A handful of items are the exception: age-restricted videos, and pages TikTok occasionally decides to gate. For those the run falls back to a built-in session, which is shared across everyone using the Actor, so during a busy hour it can be rate-limited or temporarily unavailable. When that happens the run does not fail — it returns everything it did collect plus an uncharged diagnostic row for what it could not.
If you would rather not share that limit, paste your own TikTok cookie into sessionCookies:
1. Sign in to TikTok in Chrome. 2. F12 → Application → Cookies → https://www.tiktok.com. 3. Copy the sessionid value and pass it as "sessionid=<value>". Adding sid_tt and ttwid the same way ("sessionid=…; sid_tt=…; ttwid=…") makes it a little more durable.
Your cookie is used on its own — it is never mixed with the built-in session, so the limit you get is genuinely yours. It is sent only to TikTok's own pages, never to any other host, and its value is never written to the log. You can pass several cookies and the run will rotate between them. The run's status line reports sessionState, so you can see at a glance whether a run used the keyless path (keyless), a healthy session (ok), or ran out (exhausted).
Limitations — read these before you buy
Honest list. These are real, and knowing them up front saves you a wasted run.
- Public data only. Private accounts, follower/following lists, DMs and analytics behind a login are not returned by this Actor, whether or not you supply a cookie.
- Profile mode returns roughly the 10 newest videos per creator, plus the profile row. That is the whole of what TikTok publishes for a creator without a signed, logged-in request, so
resultsPerPageabove ~11 will not produce more rows for a single profile — put several handles inprofilesinstead. Hashtag and search modes page much deeper. - No comment scraping in this Actor. Rows are videos and profiles only.
- Search and hashtag feeds can stall. TikTok sometimes keeps signalling "more pages" while returning near-empty ones. The Actor detects that, stops, and returns what it has — so a broad keyword can return fewer results than
resultsPerPageeven though results exist somewhere deeper. - Throughput is paced. Requests are deliberately spaced to stay well inside upstream limits. Budget roughly 3-8 seconds per profile and one page of ~30 videos per second or two for hashtags, and size
maxRunSecondsaccordingly — split very large scrapes into several runs rather than one long one. - Media URLs expire.
playAddr,downloadAddr,coverandavatarare CDN links with a limited lifetime. - Some fields can be null.
region,music,secUidand the rarer counters (collectCount,downloadCount) depend on what TikTok exposes for that item; the Actor emitsnullrather than inventing a value. - Counts are point-in-time.
playCountand friends are whatever TikTok reported at the moment of the scrape. - Video counters are at TikTok's display precision. For videos reached through profile mode or a
/video/URL, large numbers arrive rounded the way TikTok itself renders them (14,000,000 rather than 13,978,752) — that is the precision TikTok publishes on the page. Counters below about 100,000 are exact, and profile-level counters are exact at any size.
Errors and diagnostics
If something fails, the Actor still exits successfully and writes a diagnostic row instead of dying silently:
{ "ok": false, "errorCode": "NO_RESULTS", "error": "The request succeeded but returned no results for this input.", "mode": "search", "query": "..." }
errorCode | Meaning |
|---|---|
NO_RESULTS | The request worked but this input has nothing to return. |
NOT_FOUND | The profile, video or hashtag does not exist, or is private/suspended. |
RATE_LIMITED | Upstream throttling. The Actor backed off and retried; lower the volume or split the run. |
BLOCKED | The request was refused. Usually transient — retry. |
SERVER_ERROR | A 5xx upstream. Transient. |
NETWORK | A network-level failure reaching the source. |
Diagnostic rows carry ok: false — filter on that to separate them from real results in your pipeline. They are not charged.
Calling it from the API
curl -X POST "https://api.apify.com/v2/acts/Dami_Studio~tiktok-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profiles":["nasa"],"resultsPerPage":20}'
That returns the dataset rows directly as JSON. For bigger jobs, start the run asynchronously and read the dataset when it finishes. The Actor also runs fine from Apify Schedules for recurring trend snapshots, and results can be pushed straight into Notion by supplying notionConnector.
FAQ
Do I need a TikTok account? No. Public profiles, videos, hashtags and search all work keyless, and that is what a default run uses. You can optionally paste your own cookie into sessionCookies to get a rate limit nobody else shares — see *Rate limits and your own cookie*.
Do I need a proxy? No. This scraper needs no proxy at all — that's a key advantage. Leave proxyConfiguration empty and it works.
Why do I sometimes see wrong follower counts on other tools? TikTok serves flagged addresses a decoy version of a profile with deflated stats. This Actor is built so that doesn't happen, so you get the same numbers a normal visitor sees.
It returned an errorCode row — why? That's the Actor telling you exactly what happened instead of failing silently. See the table above. You are not charged for it.
Can I get the video files? You get direct MP4 URLs (video.playAddr, no watermark). Downloading the files themselves is up to you — this Actor returns metadata and links, not binaries.
What does a 1,000-result run cost? $0.25 today. From 19 August 2026, $0.251 — the extra $0.001 is the run-start fee, charged once per run.