Tiktok Video Scraper
Pricing
from $1.79 / 1,000 results
Tiktok Video Scraper
Pricing
from $1.79 / 1,000 results
Rating
0.0
(0)
Developer
Fertech
Maintained by CommunityActor stats
1
Bookmarked
8
Total users
4
Monthly active users
a day ago
Last modified
Categories
Share
Extract complete data from any TikTok video URL — play counts, likes, shares, comments, author stats, music and video metadata, plus subtitles, TikTok's own content categories, and the search keywords TikTok associates with each video.
One flat rate, whatever Apify plan you are on. No plan ladder — see the pricing section of this listing for the current rate.
Why this one
One flat rate, whatever plan you are on. Most TikTok scrapers advertise a "from $X" headline that applies only on the top subscription tier, and charge Free and Starter customers considerably more. This one charges everyone the same.
A familiar shape. Field names match the widely-used Clockworks TikTok
scrapers — authorMeta.name, diggCount, playCount,
videoMeta.duration, createTimeISO — so pipelines and spreadsheets built
around that output already know what to do with this one.
Fields most scrapers skip. TikTok's own content categories, and the search keywords it associates with each video.
What you get
Feed it a list of TikTok video URLs, get one structured record per video.
- Engagement: plays, likes, shares, comments, saves, reposts
- Author: username, nickname, verification, bio, followers, following, total likes, video count
- Video: duration, dimensions, cover image
- Music: track name, artist, original-sound flag, playable URL
- Content: caption text, hashtags, mentions, language, country of creation
- Subtitles: per-language WebVTT download links
- Discovery data: TikTok's own content categories and the search keywords it associates with the video — fields most scrapers do not return
- Flags: ad, pinned, slideshow, AI-generated
Input
{"postURLs": ["https://www.tiktok.com/@apifytech/video/7398101551744552225"],"maxAttemptsPerUrl": 4}
| Field | Required | Description |
|---|---|---|
postURLs | Yes | TikTok video URLs. Short vm.tiktok.com / vt.tiktok.com / tiktok.com/t/... links work too. |
maxAttemptsPerUrl | No | Total attempts per URL before giving up. Default 4. |
Unrecognised URLs are reported as error records rather than failing the run.
Output
{"id": "7242449293112577323","text": "The struggle man lol","createTimeISO": "2023-06-08T22:42:18.000Z","authorMeta": {"name": "selenagomez","nickName": "Selena Gomez","verified": true,"fans": 58600000,"heart": 715400000,"video": 270},"musicMeta": { "musicName": "original sound", "musicAuthor": "Selena Gomez", "musicOriginal": true },"videoMeta": { "width": 576, "height": 1024, "duration": 13 },"diggCount": 15400000,"playCount": 100200000,"shareCount": 320400,"commentCount": 32400,"collectCount": 465929,"repostCount": 0,"hashtags": [],"mentions": [],"locationCreated": "US","textLanguage": "en","subtitleLinks": [{ "language": "eng-US", "format": "webvtt", "source": "ASR", "downloadLink": "https://..." }],"diversificationLabels": ["Comedy", "Performance"],"suggestedWords": ["Selena Gomez", "selena gomez dress merah"],"isSlideshow": false,"isPinned": false,"isAd": false,"isAigc": false,"webVideoUrl": "https://www.tiktok.com/@selenagomez/video/7242449293112577323","submittedVideoUrl": "https://www.tiktok.com/@selenagomez/video/7242449293112577323"}
Errors
A URL that cannot be scraped still produces a record, carrying error and
errorDescription:
{"submittedVideoUrl": "https://www.tiktok.com/@user/video/123","error": "not-found","errorDescription": "Video is deleted, private or does not exist"}
error | Meaning | Retried |
|---|---|---|
invalid-url | Not a recognised TikTok video URL | no |
not-found | Deleted, private, or never existed | no |
blocked | TikTok's anti-bot challenge was not passed on any attempt | yes, up to maxAttemptsPerUrl; the session rotates once it has failed enough times |
unsupported-page | A page loaded but was not a recognised video layout | no — re-fetching returns the same page |
network | Connection, TLS, DNS or timeout failure, not a TikTok block | yes |
TikTok serves transient anti-bot challenges. The Actor detects them and
retries, so they rarely reach your dataset. If you do see blocked records,
raising maxAttemptsPerUrl gives each URL more attempts.
Pricing: every submitted URL is charged once
See the pricing section of this listing for the current rate.
One URL in, one charge out.
Videos get deleted, accounts go private, and TikTok serves anti-bot challenges. When a URL can't be scraped you get an error record instead of a video record, so you always know what happened to it — and it costs the same as a delivered one.
Retries and duplicates are not charged on top. You pay once per URL you submit, however many attempts it takes.
Requirements
Residential proxies are required. TikTok blocks datacenter IPs at close to 100%, so a run without them cannot work.
That is why there is no proxy picker in the input form — the only thing it could offer you is a configuration that fails. The Actor always uses Apify residential proxies; an API caller can still override that.
Residential proxies are not included in the Apify Free plan. On the Free plan this Actor stops with a clear message rather than spending your credit on requests that cannot succeed.
Limitations
Stated plainly so you can decide before you run it:
- Video URLs only. Profiles, hashtags, keyword search and comments are not supported in this version.
- No watermark-free video downloads.
- No direct video file URLs. TikTok's own links are IP-bound and expire within hours, so returning them would only hand you broken links.
- Subtitle download links carry an expiry — fetch them promptly.
Reading the run summary
Each run writes a summary to the log and to the key-value store, under
RUN_SUMMARY:
requested 200 | delivered 187 (93.5%) | unpaid 0 | waf-retries 148 | notfound 8 | failed 5 | callbackErrors 0
| Field | What it counts |
|---|---|
requested | URLs you submitted |
delivered | URLs that produced a video record |
notfound | Deleted, private or non-existent videos |
failed | URLs that ended in any other error record |
waf-retries | Attempts that hit an anti-bot challenge — not URLs |
unpaid | URLs processed after the charge budget ran out |
callbackErrors | Rows that could not be written. Should always be 0 |
These do not sum to requested, and that is deliberate. Every URL ends
as exactly one of delivered, notfound or failed. waf-retries sits
alongside them: one video challenged twice and then fetched adds 1 to
delivered and 2 to waf-retries.
Using the API
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("YOUR_USERNAME/tiktok-video-scraper").call(run_input={"postURLs": ["https://www.tiktok.com/@apifytech/video/7398101551744552225"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["playCount"], item["authorMeta"]["name"])
Is scraping TikTok legal?
This Actor collects only publicly available data — information anyone can see without logging in. It does not access private accounts or login-walled content. You remain responsible for how you use the data, particularly regarding personal information and the GDPR. If you plan to process personal data, seek your own legal advice first.
Issues and requests
Found a bug, or want profiles, hashtags, search or comments supported? Open an issue on the Actor's Issues tab — feature demand genuinely drives what gets built next.
