TikTok Scraper - Videos, Profiles & Hashtags $0.25/1k avatar

TikTok Scraper - Videos, Profiles & Hashtags $0.25/1k

Pricing

$0.25 / 1,000 result returneds

Go to Apify Store
TikTok Scraper - Videos, Profiles & Hashtags $0.25/1k

TikTok Scraper - Videos, Profiles & Hashtags $0.25/1k

A flat $0.25 per 1,000 results on every plan, with no add-on events - everything below is part of the same result row. Covers profiles, videos, hashtags, sounds and keyword search: play, like, comment and share counts, music, author and video URLs. No login.

Pricing

$0.25 / 1,000 result returneds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

11 hours ago

Last modified

Share

⚡ 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.
  • 🧹 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 errorCode row 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

ModeInputReturns
Profileprofiles or a profile URLOne profile row (followers, likes, bio, verified) + its recent videos
Hashtaghashtags or a /tag/ URLVideos published under the hashtag
SearchsearchQueriesVideos matching the keyword, in TikTok's search order
Single videoa /video/ URL in startUrlsThat 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

FieldTypeWhat it does
profilesstring[]Usernames, with or without @ (e.g. nasa, @nba).
hashtagsstring[]Hashtags, with or without #.
searchQueriesstring[]Keywords to search TikTok for.
startUrlsstring[]Paste TikTok URLs directly — profile, /video/ or /tag/. They are routed to the right mode automatically.
resultsPerPageintegerMax results per input (default 50, max 2000). You pay per result, so this is your cost cap.
maxRunSecondsintegerRun-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.
proxyConfigurationobjectOptional and off by default — this scraper needs no proxy. Only add one if you want to spread requests across addresses at high volume.
notionConnectorstringOptional Apify Notion connector ID for automatic delivery.
notionParentIdstringOptional 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: false with an errorCode) — 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 playCount or engagement rate (diggCount / playCount), then pull the author.uniqueId list back through the profiles input to get follower counts.
  • Trend tracking — run the same hashtags on a schedule and diff playCount over time.
  • Sound/audio research — group results by music.id to see which sounds are carrying a trend, and whether they are original.
  • Competitor content audits — scrape a set of profiles weekly and chart posting cadence from createTime.
  • Ad/creative sourcingisAd flags promoted content, and video.cover gives you thumbnails for a contact sheet.

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 available. There is no way to pass an account, by design.
  • Profile videos are the recent feed. You get the profile's recent uploads in TikTok's own order, not a complete lifetime archive of a large account. resultsPerPage caps how deep it pages.
  • 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 resultsPerPage even though results exist somewhere deeper.
  • Throughput is paced. Requests are deliberately spaced to stay well inside upstream limits. Expect roughly one page of ~30 videos per second or two, and size maxRunSeconds accordingly for big jobs — split very large scrapes into several runs rather than one long one.
  • Media URLs expire. playAddr, downloadAddr, cover and avatar are CDN links with a limited lifetime.
  • Some fields can be null. region, music, secUid and the rarer counters (collectCount, downloadCount) depend on what TikTok exposes for that item; the Actor emits null rather than inventing a value.
  • Counts are point-in-time. playCount and friends are whatever TikTok reported at the moment of the scrape.

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": "..." }
errorCodeMeaning
NO_RESULTSThe request worked but this input has nothing to return.
NOT_FOUNDThe profile, video or hashtag does not exist, or is private/suspended.
RATE_LIMITEDUpstream throttling. The Actor backed off and retried; lower the volume or split the run.
BLOCKEDThe request was refused. Usually transient — retry.
SERVER_ERRORA 5xx upstream. Transient.
NETWORKA 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.

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.