TikTok Video Scraper — Views, Likes, Hashtags & Music
Pricing
from $2.00 / 1,000 video scrapeds
TikTok Video Scraper — Views, Likes, Hashtags & Music
Scrape TikTok video data from video URLs: view, like, comment, share and save counts, description, hashtags, author, publish time, duration, thumbnail and music track. Export JSON, CSV or Excel. No login and no video download. $0.002 per video and $0.002 per run.
Pricing
from $2.00 / 1,000 video scrapeds
Rating
0.0
(0)
Developer
Sergey Andronik
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
13 hours ago
Last modified
Categories
Share
Scrape TikTok video data from video URLs into clean JSON. For each public TikTok video, TikTok Video Scraper returns the view, like, comment, share and save counts, the description and hashtags, the author, the publish time, the duration, the thumbnail and the music track. It reads only the video's public page data: the video itself is never downloaded and no AI is run, so results are fast and cost $0.002 per video. Use the output for spreadsheets, dashboards, trend and campaign tracking, influencer reports or LLM prompts. No TikTok login, cookies or API key are needed.
What TikTok data you get
| Field | Content |
|---|---|
url, video_id | The URL you submitted and TikTok's video ID. |
description, hashtags | The video description and the hashtags parsed from it. |
author_username, author_name, author_id, author_url | The creator. |
author_sec_uid | TikTok's stable secondary ID for the creator; it survives a handle change. |
published_at, upload_date | Publish time (UTC, ISO 8601) and date. |
duration_s, width, height | Video length in seconds, and the size in pixels of the best video stream. |
view_count, like_count, comment_count, share_count, save_count | Engagement counts as TikTok shows them. |
thumbnail_url, cover_url, dynamic_cover_url | Cover image links: the origin cover, the cover, and the animated cover. TikTok signs these links and they expire. |
music_title, music_artist, music_album | The sound used in the video. The album only when TikTok lists one. |
available_caption_languages | The caption tracks TikTok lists for the video, [{ "language", "name" }], with TikTok's language codes such as eng-US. Only when the video has captions; most videos have none. |
billing | Whether this row was charged. |
The Dataset has two views: Videos (description, author, date, duration and counts) and Hashtags and music.
How to scrape TikTok videos
- Paste your video URLs. Full
tiktok.com/@user/video/…links and the shortvm.tiktok.com/…,vt.tiktok.com/…andtiktok.com/t/…share links work, up to 1,000 per run. - Set a run budget in the run options if you want a hard cap on the spend.
- Start the run and open the Dataset. One row per URL. Export it as JSON, CSV or Excel, or read it through the API.
Input
{"urls": ["https://www.tiktok.com/@khaby.lame/video/7420109434153717024"]}
| Field | What it does |
|---|---|
urls | Up to 1,000 public TikTok video URLs. Required unless you set datasetId. |
datasetId | Read URLs from another run's dataset. See Chain from another Actor. |
datasetUrlField, maxItems | The dataset field that holds the URL (detected when empty), and how many rows to read (default 100, at most 1,000). |
Start from a profile
Put public profile URLs in TikTok profiles (profileUrls) to scrape their newest videos:
{"profileUrls": ["https://www.tiktok.com/@bbcnews"],"maxItemsPerSource": 50}
- Profile URLs look like
https://www.tiktok.com/@bbcnews. The newest videos are listed and sorted by date, so pinned videos do not crowd out new ones. - Each row adds
source_url,source_type(tiktok_profile) andsource_title. publishedAfter(YYYY-MM-DD, UTC) uses the exact upload time from the listing.- TikTok's profile listing fails intermittently (in tests from one network on 2026-10-31, 4 of 10 attempts succeeded), so each profile is tried up to 3 times with a pause between tries.
- Every listed video gets the full per-video data, as for a URL you submit.
maxItemsPerSource(default 20, at most 200) limits how many of the newest items each source contributes. A run holds at most 1,000 items in total, countingurlsand dataset rows.- Each listed item is processed and charged exactly like a URL you submit. Listing itself is free.
- The example link in the URL list is processed and charged too: remove it when you want only listed items.
- Listed items run after
urlsand dataset rows, source by source in input order; an item already in the run is skipped. - A source that cannot be listed becomes one error row with
source_urland anerrornaming it (for exampleprofileUrls[1]: …), and it is not charged. The other sources continue. If no source lists anything, the run fails before any charge. - The listing is saved when the run starts, so a restarted run keeps the same items even if the source changed meanwhile.
Scheduled runs: only new items
Turn on Skip items processed by earlier runs (skipPreviouslyProcessed) and run the
Actor on a schedule to get only what is new
since the last run.
- The Actor keeps a key-value store named
polyglot-processed-tiktok-scraperin your Apify account, orpolyglot-processed-tiktok-scraper--<memoryKey>when you set Memory name (memoryKey), so separate schedules can keep separate memories. Other Actors keep their own stores, even with the samememoryKey. It records each item after the item is delivered and charged; failed items are tried again next time. - It applies to every URL in the run: listed ones, dataset rows and the items listed from sources.
- When nothing is new, the run ends without any charge. Only error rows appear then, for sources or dataset rows that could not be used.
- If the store cannot be opened or read, the run stops before any charge, and the next scheduled run tries again. If an item's record cannot be written, the item is still delivered and the log says so; a later run may process and charge it again.
- Delete the store in Apify Console (Storage → Key-value stores) to start over. Do not run two runs with the same memory at the same time: both would process the same new items.
Chain from another Actor
Run a TikTok scraper or search run such as clockworks/tiktok-scraper first, then paste the dataset ID of that run into Dataset ID
(datasetId) to refresh the data of every one of its TikTok videos:
{ "datasetId": "<dataset ID from the other run>", "maxItems": 200 }
- The Actor reads up to
maxItemsrows (default 100) with your own run's Apify token and takes each row's URL fromwebVideoUrl,url,postUrl,videoUrl,inputUrlorlink, or from the field you name indatasetUrlField. - Dataset URLs run after any
urlsyou list, in dataset order; a dataset URL that is already in the run is skipped. A run takes at most 1,000 URLs in total. - A row without a usable URL becomes an error item with its
dataset_rowindex, and it is not charged. Items from the dataset also carrydataset_row, so you can join the results back to the source rows. - The example link in the URL list is processed and charged too: remove it when you want only the dataset's items.
Output example
A real result from an Apify run on 2026-10-30; only the thumbnail link is shortened.
{"url": "https://www.tiktok.com/@khaby.lame/video/7420109434153717024","video_id": "7420109434153717024","description": "I promise it works #learnfromkhaby #comedy","hashtags": ["learnfromkhaby", "comedy"],"author_username": "khaby.lame","author_name": "Khabane lame","author_id": "127905465618821121","author_url": "https://www.tiktok.com/@khaby.lame","published_at": "2024-09-29T16:54:24Z","upload_date": "2024-09-29","duration_s": 50,"view_count": 62300000,"like_count": 3700000,"comment_count": 32400,"share_count": 32700,"save_count": 119910,"thumbnail_url": "https://p16-common-sign.tiktokcdn-us.com/…","music_title": "original sound","music_artist": "Khabane lame","billing": {"status": "paid","events": [{ "event": "video-scraped", "requested_count": 1, "charged_count": 1, "state": "confirmed" }]}}
- A field is left out when TikTok does not show it for that video.
- Large counts can be rounded by TikTok, as
view_countandlike_countare here. music_titleis a generic label such as "original sound" when the creator used their own audio.thumbnail_urlis a signed link that expires, so download the image soon if you need it.- A URL that fails returns a row with
urlanderror.
How much does it cost to scrape TikTok videos?
Pay per event, with no subscription. The Pricing tab shows the current prices.
| Event | Price | When |
|---|---|---|
| Run setup | $0.002 | Once per run. |
| Video scraped | $0.002 | Per video whose data was returned. |
| Videos in one run | Cost |
|---|---|
| 1 | $0.002 + $0.002 = $0.004 |
| 100 | $0.002 + 100 × $0.002 = $0.202 |
| 1,000 | $0.002 + 1,000 × $0.002 = $2.002 |
Video length does not change the price. URLs that fail or are rejected are not charged the per-video fee. Apify's own small run-start event is separate and is shown on the Pricing tab.
Use it from the API
Start a run with the Apify API client for JavaScript and read the results:
import { ApifyClient } from 'apify-client'const client = new ApifyClient({ token: process.env.APIFY_TOKEN })const run = await client.actor('andronixmd/tiktok-scraper').call({ urls: ['https://www.tiktok.com/@khaby.lame/video/7420109434153717024'] },{ maxTotalChargeUsd: 0.1 },)const { items } = await client.dataset(run.defaultDatasetId).listItems()for (const item of items) console.log(item.url, item.error ?? item.view_count)
Or start one run over HTTP:
curl -X POST \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"urls":["https://www.tiktok.com/@khaby.lame/video/7420109434153717024"]}' \'https://api.apify.com/v2/actors/andronixmd~tiktok-scraper/runs?maxTotalChargeUsd=0.1'
The Actor also works from n8n and other automation tools through Apify's integrations. Schedule a run with the same URLs to track how the counts change over time.
Use it from an AI agent (MCP)
Connect your agent to https://mcp.apify.com. It can find this Actor with search-actors, or
call it by name, andronixmd/tiktok-scraper, with call-actor. Use fetch-actor-details first for the
input schema and pricing. Every call starts a new paid run, so always set
callOptions.maxTotalChargeUsd and keep the urls list short:
{ "actor": "andronixmd/tiktok-scraper", "input": { "urls": ["https://www.tiktok.com/@khaby.lame/video/7420109434153717024"] }, "callOptions": { "maxTotalChargeUsd": 0.1 } }
call-actor returns the run status and storage IDs, not the results. Read the rows with
get-dataset-items and the run's dataset ID. The fields to use are description, view_count, like_count and error.
With an Apify account, use your API token or MCP OAuth. Without one, an agent can buy a prepaid token from Apify AGI over x402 or MPP and use it as the Bearer token. It starts at $1, the balance is a hard spending cap, and the token expires after 14 days. This is experimental; see agentic payments.
Limitations
- Public videos only. Private, friends-only, age-restricted, region-blocked and removed videos, and anything that needs a login, are not supported. The Actor uses no accounts or cookies and does not try to get around TikTok's access checks.
- Videos and profiles. Hashtag, search, sound, photo-post and live URLs are not
accepted; profiles go in
profileUrls. Profile listing from Apify's servers has not been tested at scale. One URL in a wrong format rejects the whole input before the run starts. A short link that has expired or leads to something other than a video fails for that item only. - Not every public video returns data. TikTok limits access from some networks and
regions and changes its site often, so some URLs return an error row. Check each
row's
errorfield and retry failed URLs later. - Video data only. No comment text, follower lists or profile statistics, and no video or audio files. No transcript or caption text either: for the spoken words, use TikTok Video Transcript.
FAQ
Can I get the transcript of the video?
Not here. This Actor returns data about the video, not what is said in it. Use
TikTok Video Transcript, which
transcribes the audio with AI speech-to-text. Submit the same URLs to both and join the
results on url.
Are the numbers live? They are what TikTok shows at the moment of the run. Run it again later for new numbers.
Does it scrape profiles, hashtags or search results?
Profiles, yes: put them in profileUrls, and each listed video is scraped in full.
Hashtags and search results, no.
Does it download the video? No. It reads the video's data only, which is why it is cheap and fast. It returns the thumbnail link, not the video file.
Where is my data kept? In your Apify run storage, under your account's access and retention settings. Use the data in line with TikTok's terms and the law that applies to you.
Related Actors
- TikTok Video Transcript: the spoken words of the same videos as text, SRT and VTT.
- Instagram Reel Scraper: the same kind of data for Instagram Reels.
- YouTube Video Scraper: YouTube video data and captions.
- Audio & Video Transcriber: transcripts of podcasts, audio and video files and other sites.