TikTok Video Stats: Views, Likes & Shares by URL
Pricing
from $1.50 / 1,000 tiktok video returneds
TikTok Video Stats: Views, Likes & Shares by URL
TikTok video scraper without login, for n8n, Make, Clay or the API: paste video links and get one row per video - plays, likes, comments, shares, saves, caption, hashtags, sound, creator, post date. Track a video's views daily and get a Discord, Slack or Telegram alert. Misses are free.
Pricing
from $1.50 / 1,000 tiktok video returneds
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
TikTok Video Lookup: tiktok video scraper by URL
Paste TikTok video links and get one spreadsheet row per video: plays, likes, comments, shares, saves, caption, hashtags, sound, creator and post date. Switch on tracking and the same list tells you which videos took off since yesterday.
Who uses this
- Social media teams reporting the numbers of the videos a campaign ran, without opening each link.
- Agencies and brands watching a creator's sponsored videos: views, likes and shares side by side, once or every day.
- Analysts and n8n or Make builders who already hold a list of video links and need the stats in Google Sheets, Airtable or a workflow.
Try it in 30 seconds
The input box already holds three public videos. Click Start and you get one row per video. No login, no cookies, no app.
What it does
You give it video links; for each one it reads the video's own public page and returns the numbers TikTok shows a logged-out visitor. It takes the full link, a vm.tiktok.com short link, @handle/video/<id>, or just the numeric video id. A deleted, private or age-restricted video comes back as a row that says so and costs nothing.
It is not a profile scraper (use TikTok Profile Lookup for follower counts) and not a downloader: there is no video file and no download link in the output.
Fields
| Field | What it holds |
|---|---|
videoId, url | the video's id and its canonical link |
description | the caption |
createdAt | when it was posted (UTC) |
plays, likes, comments, shares, saves | the counts the page shows. comments is the number, not the comments |
durationSec | length in seconds |
authorHandle, authorVerified | the creator's @handle and verified badge. Nothing else about the creator |
musicTitle, musicAuthor | the sound used |
hashtags | hashtag names from the caption, without the # |
isAd | TikTok's own "ad" flag on the post |
coverUrl | the cover image. It is a signed link that stops working after about two days |
checkedAt | when we read the page |
playsDelta, likesDelta, commentsDelta, sharesDelta (+ ...Pct), moved, previousSnapshotAt, daysSincePrevious | change since the last run, only with tracking on (empty otherwise) |
Track a video's views daily (3 steps)
- Paste the videos you care about, tick Track these videos across runs, and give the watchlist a name. Run it once: that run is the baseline, every change column is empty.
- Save the input as a Task and add a Schedule (daily at the hour you like).
- From the next run on, every row carries
playsDelta,likesDelta,commentsDelta,sharesDeltaandmoved. Tick Only report videos that moved and a quiet video is left out and not billed. Paste a Discord, Slack or Telegram link into Send alerts to and a video that moved by at least the Smallest change to report (10 % by default) posts one message.
Example output
| query | found | status | videoId | url | description | createdAt | plays | likes | comments | shares | saves | durationSec | authorHandle | authorVerified | musicTitle | musicAuthor | hashtags | isAd | coverUrl | checkedAt | playsDelta | likesDelta | commentsDelta | sharesDelta | playsDeltaPct | likesDeltaPct | commentsDeltaPct | sharesDeltaPct | moved | previousSnapshotAt | daysSincePrevious | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| https://www.tiktok.com/@scout2015/video/6718335390845095173 | true | OK | ||||||||||||||||||||||||||||||
| <duration (sec)> | <plays change (%)> | <likes change (%)> | <comments change (%)> | <shares change (%)> | <moved?> | 1970-01-01T00:00:00.000Z |
Example runs
TikTok video stats by URL. Paste any public video links.
{"videos": ["https://www.tiktok.com/@scout2015/video/6718335390845095173", "https://www.tiktok.com/@duolingo/video/7701442022678220045", "https://www.tiktok.com/@duolingo/video/7699890686870506765"]}
TikTok video views tracker, daily. Schedule it daily; only videos whose plays, likes, comments or shares moved by 10 % or more come back, and only those are billed.
{"videos": ["https://www.tiktok.com/@duolingo/video/7701442022678220045", "https://www.tiktok.com/@duolingo/video/7699890686870506765"], "deltaMode": true, "deltaName": "campaign-views", "alertOnChangeOnly": true, "minChangePercent": 10, "notifyUrl": "https://discord.com/api/webhooks/<your webhook>"}
TikTok likes, comments and shares export. Only the engagement columns, ready for a sheet.
{"videos": ["https://www.tiktok.com/@duolingo/video/7701442022678220045", "https://www.tiktok.com/@duolingo/video/7699890686870506765", "https://www.tiktok.com/@duolingo/video/7514320905909194030"], "columns": ["videoId", "url", "authorHandle", "createdAt", "plays", "likes", "comments", "shares", "saves"]}
Limits, stated plainly
- Page data only. Everything comes from the public video page a logged-out visitor sees. There are no comments (only their count), no list of who liked or shared, no audience data, and no media files or download links.
- Counts are what the page shows. TikTok rounds a large count to about four significant digits (a video with 159,600 plays may really have 159,6xx). That is TikTok's figure, not ours: very small percentage changes on a huge video can be rounding noise, which is why tracking has a Smallest change to report setting.
- Videos only. Photo posts (
/photo/links) carry no stats on their logged-out page and come back as a free BAD_FORMAT row. Private, deleted and age-restricted videos come back as a free NOT_FOUND row. - Short links.
vm.tiktok.comandtiktok.com/t/links are followed to the video. A short link that is expired or invalid comes back as NOT_FOUND. Full links are the safest input. - A video is looked up by its id. If TikTok ever answers with a different video than the one you asked for, the row is withheld and nothing is billed.
- A TikTok verification page is free. If TikTok answers with a check instead of the video, the actor tries that video once more on a fresh connection; if the check is still there the row is BLOCKED with the reason and nothing is billed. Run it again later.
- Alerts. At most Most alert messages per run are sent; a video past that limit is still in the dataset and its
notifyErrorssays no message was sent for it. - Cost. It runs on Apify's default datacenter proxy: one page request per video, one measured 5-video run used $0.00054 of platform usage, which works out to roughly $0.06 per 1,000 videos plus about $0.0002 per run on our side.
Pricing
Pay-per-event. A flat per-run fee covers session/proxy warmup; you're billed
per item only when data is actually found and returned — see
.actor/pay_per_event.json for exact prices. A miss is never charged.
How to use
- In the Apify Console. Open the actor page and click Start — the
videosfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~tiktok-video-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"videos":["https://www.tiktok.com/@scout2015/video/6718335390845095173","https://www.tiktok.com/@duolingo/video/7701442022678220045","https://www.tiktok.com/@duolingo/video/7699890686870506765"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"videos": ["https://www.tiktok.com/@scout2015/video/6718335390845095173","https://www.tiktok.com/@duolingo/video/7701442022678220045","https://www.tiktok.com/@duolingo/video/7699890686870506765"]}
One TikTok video per line: the video link, a vm.tiktok.com short link, @handle/video/
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~tiktok-video-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"videos":["https://www.tiktok.com/@scout2015/video/6718335390845095173","https://www.tiktok.com/@duolingo/video/7701442022678220045","https://www.tiktok.com/@duolingo/video/7699890686870506765"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~tiktok-video-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"videos":["https://www.tiktok.com/@scout2015/video/6718335390845095173","https://www.tiktok.com/@duolingo/video/7701442022678220045","https://www.tiktok.com/@duolingo/video/7699890686870506765"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~tiktok-video-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"videos":["{{video}}"]}, mapping the row's video into the videos array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "TikTok Video Scraper API: Views, Likes & Shares by URL" — the agent will find and run this actor.