TikTok View Count API: Get and Track Video Views in Code
A TikTok view count API returns the number of views on a video as JSON. TikTok's own APIs call the field view_count, but the Display API reads only videos of users who authorize your app, and the Research API is for approved researchers and can lag up to 10 days on statistics. For any public video, a public data API returns the count by URL; ScrapeIO calls it plays and charges 1 credit a call.
A view count is the most quoted TikTok number and the easiest to get wrong. Different tools name it differently, some sources lag by days, and a single reading says little without the time it was taken. This guide covers where to get TikTok video views, what the field names mean, and how to track a video's views over time with a schedule that keeps costs low.
Plays vs views: same number, different names
| Source | Field name |
|---|---|
| TikTok Display API | view_count, "Number of views of the video" |
| TikTok Research API | view_count, the total views a video has received |
| TikTok's web and app data | playCount and play_count |
| yt-dlp | view_count, mapped from TikTok's play count |
| ScrapeIO | plays, the same field on every platform |
yt-dlp's TikTok extractor shows the mapping plainly: its view_count is read from TikTok's playCount on web pages and play_count in app data. So "TikTok plays" and "TikTok views" are one counter. TikTok's developer pages define the field (video object, codebook) but do not publish rules such as a minimum watch time or how replays count, so don't claim them in reports.
Where to get TikTok video views
| Route | Which videos | Freshness | Limits |
|---|---|---|---|
Display API /v2/video/query/ | Videos of users who authorized your app | Live | 20 video ids per request, 600 requests a minute |
| Research API | Public videos, for approved researchers | Stats can take up to 10 days to update | 1,000 requests and 100,000 records a day |
| yt-dlp | Public videos | Live | Your machine, your upkeep |
| Public data API | Public videos | Live or cached | Per call cost |
The Research API's lag comes from its FAQ: "New videos take up to 48 hours" to become searchable, and statistics such as views can take up to 10 days to update. That rules it out for anything that tracks a video in its first week, which is when most views happen.
Official route: the Display API
If creators connect their accounts to your app with the video.list scope, you can read their videos' views in batches of up to 20 (video query docs):
curl -X POST "https://open.tiktokapis.com/v2/video/query/?fields=id,create_time,view_count,like_count,comment_count,share_count" \
-H "Authorization: Bearer USER_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"filters": {"video_ids": ["7300000000000000001", "7300000000000000002"]}}'
The limit is 600 requests a minute per endpoint (rate limits), so 20 x 600 = 12,000 videos a minute in theory. The real limit is consent: every creator must log in to your app.
Public route: one video by URL
curl "https://scrapeio.com/v2/tiktok/video?url=https://www.tiktok.com/@nasa/video/VIDEO_ID" \
-H "x-api-key: YOUR_KEY"
The answer has plays, likes, comments, shares, saves and created_at. For many videos from one creator, the profile videos endpoint is cheaper: one call returns a page of recent videos, each with its plays.
Track a TikTok video's views over time
No API returns a public video's view history. You build it from snapshots. Views grow fastest in the first two days, so poll often early and rarely later:
| Video age | Poll every | Calls |
|---|---|---|
| 0 to 48 hours | 1 hour | 48 |
| Day 3 to day 14 | 1 day | 12 |
| Week 3 to week 6 | 1 week | 4 |
| Total per video | 64 |
Tracking 100 campaign videos this way is 6,400 calls, about $12 at $1.88 per 1,000 credits. Polling all 100 hourly for six weeks would be 100,800 calls; the schedule cuts that by 94%.
import sqlite3, datetime, requests
KEY = "YOUR_KEY"
db = sqlite3.connect("views.db")
db.execute("CREATE TABLE IF NOT EXISTS snap (url TEXT, at TEXT, plays INTEGER, likes INTEGER)")
db.execute("CREATE TABLE IF NOT EXISTS video (url TEXT PRIMARY KEY, posted TEXT)")
def hours(a, b):
return (b - a).total_seconds() / 3600
def due(age_h, since_last_h):
if age_h < 48:
return since_last_h >= 1
if age_h < 24 * 14:
return since_last_h >= 24
return age_h < 24 * 42 and since_last_h >= 24 * 7
now = datetime.datetime.now(datetime.timezone.utc)
for url, posted in db.execute("SELECT url, posted FROM video").fetchall():
last = db.execute("SELECT MAX(at) FROM snap WHERE url = ?", (url,)).fetchone()[0]
since = hours(datetime.datetime.fromisoformat(last), now) if last else 1e9
if not due(hours(datetime.datetime.fromisoformat(posted), now), since):
continue
r = requests.get("https://scrapeio.com/v2/tiktok/video", params={"url": url},
headers={"x-api-key": KEY}, timeout=60).json()
if r.get("success"):
d = r["data"]
db.execute("INSERT INTO snap VALUES (?, ?, ?, ?)", (url, now.isoformat(), d["plays"], d["likes"]))
db.commit()
Run it every hour from cron. Store posted from the first answer's created_at when you add a video.
Turn snapshots into numbers people trust
- Velocity: views per hour = (views now minus views at last check) / hours between checks. A drop in velocity tells you the For You push has ended.
- Views at fixed ages: report views at 24 hours, 72 hours and 7 days. Interpolate between the two snapshots around each mark. This is the only fair way to compare videos posted on different days.
- Engagement rate: (likes + comments + shares) / views. Compute it at the same age for every video.
- Views per follower: views at 7 days / the creator's followers on the day of posting. It shows reach beyond the existing audience.
A worked example with illustrative numbers: a video has 12,000 views at hour 20 and 21,000 at hour 26. Views at 24 hours = 12,000 + (21,000 - 12,000) x (24 - 20) / (26 - 20) = 18,000.
Common mistakes
- Polling faster than counts can change. A cached answer returns the same number with
cached: true, so check that flag before you compute velocity. - Treating
nullas zero. A missing count means the source did not report it, not that nobody watched. - Comparing views from different sources. Pick one and keep it for the whole series.
- Ignoring deleted and private videos. Store the error as an event so a stopped series has a reason.
Doing it with ScrapeIO
The TikTok video API returns plays for one video by URL, and the TikTok profile videos API returns them for a creator's latest videos, each for 1 credit a call. Repeats served from cache and not-found videos are free. For campaign reports built on these snapshots, see the influencer campaign reporting playbook and the TikTok MCP server.
FAQ
Does TikTok have an API for video views?
Yes. The Display API returns view_count for videos of users who authorize your app, and the Research API returns it for approved researchers. Neither reads any public video for a commercial app.
Are TikTok plays the same as views?
Yes. TikTok's own data names the counter playCount or play_count, its developer APIs name it view_count, and many tools call it plays.
How often does the TikTok view count update?
Public counts move as people watch. The Research API is the exception: TikTok says its statistics can take up to 10 days to update.
Can I see the views on someone else's TikTok video?
Yes, if the account is public. The count is shown on the video, and a public data API returns it by URL.
How do I track TikTok views over time?
Save a snapshot on a schedule, hourly for two days, then daily, then weekly, and compute velocity and views at fixed ages from the snapshots.
Sources
Checked on 9 November 2026 from each vendor's own pages. Prices and limits change; follow the links before you decide.
- https://developers.tiktok.com/doc/tiktok-api-v2-video-object
- https://developers.tiktok.com/doc/research-api-codebook
- https://developers.tiktok.com/doc/tiktok-api-v2-video-query
- https://developers.tiktok.com/doc/tiktok-api-v2-rate-limit
- https://developers.tiktok.com/doc/research-api-faq
- https://github.com/yt-dlp/yt-dlp/blob/master/yt_dlp/extractor/tiktok.py
100 free credits, no card. Credits never expire.
Get API key