Tiktok Video Scraper avatar

Tiktok Video Scraper

Pricing

from $1.79 / 1,000 results

Go to Apify Store
Tiktok Video Scraper

Tiktok Video Scraper

Pricing

from $1.79 / 1,000 results

Rating

0.0

(0)

Developer

Fertech

Fertech

Maintained by Community

Actor 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
}
FieldRequiredDescription
postURLsYesTikTok video URLs. Short vm.tiktok.com / vt.tiktok.com / tiktok.com/t/... links work too.
maxAttemptsPerUrlNoTotal 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"
}
errorMeaningRetried
invalid-urlNot a recognised TikTok video URLno
not-foundDeleted, private, or never existedno
blockedTikTok's anti-bot challenge was not passed on any attemptyes, up to maxAttemptsPerUrl; the session rotates once it has failed enough times
unsupported-pageA page loaded but was not a recognised video layoutno — re-fetching returns the same page
networkConnection, TLS, DNS or timeout failure, not a TikTok blockyes

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
FieldWhat it counts
requestedURLs you submitted
deliveredURLs that produced a video record
notfoundDeleted, private or non-existent videos
failedURLs that ended in any other error record
waf-retriesAttempts that hit an anti-bot challenge — not URLs
unpaidURLs processed after the charge budget ran out
callbackErrorsRows 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 ApifyClient
client = 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"])

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.