Blog/教程/

TikTok 视频刷量检测:用 API 查假播放量(2026 实测)

TikTok 视频刷量怎么查?从分享链接拿到视频 ID,调一次免费的假播放量检测接口,逐块读懂 fake_score、estimated_fake_views 和各项预警。附 8 个品牌官方账号实测和 57 行 Python 脚本。

TikTok 视频假播放量检测教程封面

我拿 TikTok 官方账号自己的一条视频去跑假播放量检测。这条视频有 1.62 亿播放,结果很干净:fake_score 4.34,is_suspicious 为 false。可同一份报告里又写着 estimated_fake_views: 8102335,还给 TikTok 官方号挂了一条“涨粉过快”的警告。

810 万“假播放”听着像铁证,其实只是 5% 的基线乘以总播放量。投放前想做 TikTok 视频刷量检测,最容易踩的坑就在这里:把一个估算数字当成了查出来的数字。本文用 SandBase 的 tiktok/analytics/detect-fake-views 接口,演示从任意链接拿到视频 ID、调一次接口、把报告每一块读明白。读者是给达人投放前要做核查的品牌和代理商,以及要把这一步写进工具里的开发者。2026-10-04 我用 8 个认证品牌和媒体账号的公开视频做了实测。

先说结论

  • 一条公开链接,两次调用出结果:tiktok/web/aweme-id 把链接(包括 /t/ 短链)转成视频 ID,detect-fake-views 返回报告。两个接口 2026-10-04 在目录里都标 Free,实际扣费 $0。
  • estimated_fake_views 就是 total_views 乘以 fake_view_percentage,而这个百分比在我的测试里只出现过三档:5、约 20、约 30。它是分档估算,不是逐条查出的假播放数。
  • 8 条认证品牌视频,is_suspicious 全是 false,confidence_level 全是 “Minimal”,fake_score 在 4.34 到 31.12 之间。其中 4 个账号被挂了涨粉类警告(出现在 fan_growth 或 creator_credibility 里),TikTok 官方号也在内。
  • content_category 对粉丝超过 1800 万的两个账号完全没影响;对一个 6.28 万粉的账号,分数在 24.51 到 31.71 之间变动,选 entertainment 时估算档位从 20% 跳到 30%。
  • 这是第三方的启发式判断,不是 TikTok 官方数据,也不能当刷量证据。它的用处是帮你决定该找哪些达人要后台数据。

这个接口能做什么,不能做什么

接口拿公开视频的计数(播放、点赞、评论、分享、收藏)和达人的涨粉历史,从 8 个维度打分。它的说明里写的是基于 “TikTok’s Traffic Pool theory”(流量池理论),这是供应方对 TikTok 分发机制的理解,不是 TikTok 公开的规则。SandBase 只是把请求转给第三方服务,自己不跑检测模型。

它能给出风险信号,但判断不了某一次播放是不是假的:它看到的是公开计数器,看不到 TikTok 的播放日志。我手上也没有“已知刷量”的标注样本,所以下文测的是接口的行为,不是准确率。

数据边界

只读公开数据,需要 SandBase API Key。SandBase 不是 TikTok 官方合作方,碰不到私密账号、私信、达人自己的后台数据,也不做任何账号操作。实测只用了认证品牌、媒体和 TikTok 官方账号,本文不会说任何账号刷量。

需求用什么
投放前对任意公开视频做快速风险筛查detect-fake-views(本文)
达人真实的受众、完播和流量来源让达人提供 TikTok Studio 后台截图或导出
自己账号的数据TikTok Studio

第一步:从链接拿到视频 ID

检测接口要的是 item_id,也就是 https://www.tiktok.com/@tiktok/video/7460937381265411370 里那串长数字。完整链接可以自己解析;https://www.tiktok.com/t/... 这种分享短链里没有 ID,就交给 tiktok/web/aweme-id。名字更直观的 tiktok/app-v3/one-video-by-share-url 在 2026-10-04 是下线状态,别用。其他短链域名我没测。

SandBase 上 tiktok/web/aweme-id 的接口参考页,显示 POST /v1/api/tiktok/web/aweme-id 和唯一必填字段 url

截图:aweme-id 参考页只有一个必填字段 url,路由就是脚本调用的 POST /v1/api;示例返回是空对象,实测返回的是一个 ID 字符串(2026-10-04 截取)。

curl -s https://api.sandbase.ai/v1/api/tiktok/web/aweme-id \
  -H "Authorization: Bearer $SANDBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.tiktok.com/t/ZP9DAsd5x3xtR-37cuu/"}'

这条短链是我用 tiktok/app-v3/share-short-link 给 TikTok 那条视频生成的。返回的 outputs[0].data 直接是字符串 "7460937381265411370",耗时 1.8 秒(run fade1bb3-3d8e-4c0e-bd8a-39686c18aab7)。完整链接带不带 ?is_from_webapp=1&sender_device=pc,都在 1 秒内解析出同一个 ID。主页链接会失败:HTTP 503,提示 “upstream error 400”,不扣费。

第二步:调一次检测接口

SandBase 上 tiktok/analytics/detect-fake-views 的接口参考页,显示 POST 路由、必填 item_id 和可选 content_category

截图:detect-fake-views 参考页给出 POST 路由、必填的 item_id 和可选的 content_category,返回只写了信封结构、data 是空对象,所以下文的报告字段都来自实测(2026-10-04 截取)。

curl -s https://api.sandbase.ai/v1/api/tiktok/analytics/detect-fake-views \
  -H "Authorization: Bearer $SANDBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"item_id": "7460937381265411370"}'

用的是参考页上的 Model API 路由,不是目录页的 GET 路由,body 里只放这个接口自己的参数。同步返回,报告就在同一个响应的 outputs[0].data 里,不用轮询。

2026-10-04(UTC)实测

样本:TikTok、Duolingo、National Geographic、Chipotle、NASA、MIT、Figma、Cloudflare 各一条公开视频,8 个账号在数据里都是认证状态。除 TikTok 外,每个品牌用 tiktok/app-v3/user-post-videos 取最近一条非置顶、发布满 3 天的视频;TikTok 用接口示例里那条。ESPN 和 NBA 原本也在名单里,但返回的作品不是置顶就是发布不满 3 天,所以没进样本。一共记录了 23 次成功的检测调用,首次就成功的调用耗时 2.0 到 3.8 秒。

TikTok 那条视频的 fake_view_analysis 完整返回如下(run 397720a1-dee5-4b33-985f-ebc1cd3d8b12):

{"component_scores": {"consistency_score": 0, "content_authenticity_score": 34.0,
  "creator_credibility_score": 0, "distribution_score": 0, "engagement_score": 0.0,
  "fan_growth_score": 45, "follower_correlation_score": 35.0, "racing_mechanism_score": 0},
 "confidence_level": "Minimal", "estimated_fake_views": 8102335, "fake_score": 4.34,
 "fake_view_percentage": 5.0, "is_suspicious": false,
 "main_detection_reason": "Multiple Anomalous Indicators"}

同一个响应里 video_metrics.total_views 是 162046716,乘以 5% 正好是 8102335.8。其余顶层字段还有 detailed_analysis、creator_metrics、mcn_report、traffic_pool、suspicious_features 等,这里省略。所有字段名都是实测观察到的,不是文档保证。

稳定性也要提一句:UTC 01:20 前后约 10 分钟内,23 次检测调用有 20 次重试 3 次后仍返回 HTTP 503(“upstream error 400”,不扣费)。紧接着重跑,20 次全部一次成功。所以下面的脚本对 5xx 做了重试。

第三步:读懂报告

字段含义可信度
fake_score8 个维度加权的风险分,实测 4.34 到 31.71适合横向比较,没有公开的刻度和阈值
is_suspicious接口给的是否可疑8 条全是 false,唯一像“结论”的字段
confidence_level置信度我的每次调用都是 “Minimal”
fake_view_percentage判定为假的播放占比只出现过 5、约 20、约 30 三档
estimated_fake_viewstotal_views × 上面的百分比档位乘法,别当成实数引用
component_scores8 个分项要配合 detailed_analysis 看,好几项因为缺数据是 0
detailed_analysis.engagement点赞、评论、分享、收藏率和基准对比最透明的一块,每条预警都写明了用的阈值
detailed_analysis.follower_correlation粉丝档位和该档基准自己核查时很好用
fan_growth、creator_credibility涨粉里程碑8 个认证品牌里 4 个被挂了警告
traffic_pool供应方定义的“流量池”层级estimated_organic_views 等于播放 ×(1 − fake_score/100),和 estimated_fake_views 对不上
mcn_report.business_impact.revenue_impact金额影响estimated_fake_views 按固定 $1 CPM 换算,不是实际损失
suspicious_features所有预警汇总要逐条读,别数条数

有几个维度名字很唬人,信息量却不大。racing_mechanism 在 8 条视频上都是 “Insufficient data”;consistency_score 和 creator_credibility_score 8 条全是 0;distribution 在数据够用的 7 条上全报了 “Statistical anomalies detected in view distribution”,分数都是 65。一条在每个认证品牌视频上都会触发的预警,等于没区分度。

TikTok 那条分数最低,原因也很平淡:它的 distribution_score 是 0,因为 “Insufficient view data for distribution analysis”,其他 7 条在这一项都是 65。数据越少,分数反而越低。

8 条品牌视频结果

账号接口判定档位粉丝播放点赞/播放fake_scorefake_view_percentageis_suspicious
TikTokxxlarge9604 万1.62 亿9.83%4.345.0false
Duolingoxxlarge1819 万187,9212.69%20.0920.0false
National Geographicxlarge964 万11,6794.67%20.6019.99false
Chipotlexlarge293 万30,4731.70%21.9320.0false
NASAxlarge196 万125,0495.43%27.3020.0false
Figmamedium6.28 万2,1504.93%26.8320.0false
MITmedium13.3 万55,2216.31%31.1230.0false
Cloudflaresmall2.15 万6316.50%24.6119.97false

均为默认分类、每条一次调用。8 条的 confidence_level 都是 “Minimal”,recommendations.action 都是 “no_action”。播放最少的两条因为分享数是 0 和 1,被打上 “Critical: Share Ratio is extremely low”;几百播放的视频,多一个分享就能改变结论,我更倾向于把它看作样本太小。同一条视频反复调用,分数不变:TikTok 和 Duolingo 各记录 6 次,约 20 分钟内。

content_category 到底改了什么

content_category 可选 default、entertainment、education、product、verified_large,schema 说它“影响互动率基准”。我对 3 条视频把 5 个值都跑了一遍。

视频defaultentertainmenteducationproductverified_large
TikTok(9604 万粉)4.344.344.344.344.34
Duolingo(1819 万粉)20.0920.0920.0920.0920.09
Figma(6.28 万粉)26.8331.7129.1125.5624.51

两个大号不管传什么,benchmark_category 都固定是 verified_large。不传分类时,百万粉以上的 5 个认证账号都被归到 verified_large,更小的归到 default。Figma 这条分类生效了,预警文案能看出原因:entertainment 下点赞率对比的平均值是 0.05,收藏率平均值 0.005,分享率最低值 0.001;default 下收藏率平均值是 0.003,分享率最低值 0.0005。换成 entertainment 后百分比进了 30 档,同样 2,150 播放,estimated_fake_views 从 430 变成 645。

结论:按视频实际内容选分类,比较多个达人时保持同一个分类。选了更严的基准,达人就会“看起来更可疑”。

不靠接口也能自查的信号

点赞/播放、评论/点赞、分享/播放,用公开计数自己就能算。接口返回的 tier_benchmarks 可以拿来当参照,view_ratio 指播放除以粉丝:

档位(我样本里的粉丝数)播放/粉丝:最低、平均、良好点赞/粉丝:最低、平均、良好
small(2.15 万)0.08、0.25、0.60.008、0.025、0.06
medium(6.28 万、13.3 万)0.05、0.15、0.40.005、0.015、0.04
xlarge(196 万到 964 万)0.01、0.05、0.20.001、0.005、0.02
xxlarge(1819 万、9604 万)0.005、0.02、0.10.0005、0.002、0.01

我会按这个顺序看:

  1. 播放远超同档、点赞远低于同档。 如果买的是不带点赞的播放,点赞/播放会掉下去,播放/粉丝会冲上来。单看播放/粉丝高没意义:TikTok 那条是 1.69,远超“良好”。
  2. 和达人自己的其他视频对不上。 拿最近 10 到 20 条比点赞/播放,一条离群值比任何分数都更值得拿去问达人。
  3. 评论和点赞不成比例。 大视频评论/点赞接近 0,或者小视频评论多得离谱。
  4. 涨粉突增。 8 个认证品牌里有 4 个被挂了涨粉警告,单凭这一条说明不了问题。

这些都不是证据。付费推广就可能让播放和点赞拉开差距,这是正常原因之一,而公开数据看不出视频有没有投流。

完整脚本

一个文件,57 行,Python 加 requests。用法:python3 check_views.py <链接> [分类]。下面就是我实际运行的文件。

#!/usr/bin/env python3
"""Screen a public TikTok video for fake-view risk signals. Usage: python3 check_views.py <video or share URL> [category]"""
import os
import sys
import time

import requests

BASE = "https://api.sandbase.ai/v1/api"
HEADERS = {"Authorization": f"Bearer {os.environ['SANDBASE_API_KEY']}"}


def call(model: str, params: dict, tries: int = 3):
    for attempt in range(tries):  # upstream 5xx came in bursts during testing; retry with a pause
        resp = requests.post(f"{BASE}/{model}", headers=HEADERS, json=params, timeout=120)
        body = resp.json()
        if resp.status_code < 500 or attempt == tries - 1:
            break
        time.sleep(10)
    outputs = body.get("outputs") or []
    if resp.status_code != 200 or body.get("status") != "completed" or not outputs:
        raise RuntimeError(f"{model}: HTTP {resp.status_code} {body.get('status')} {body.get('error')}")
    return outputs[0].get("data")


def main(url: str, category: str | None = None):
    item_id = call("tiktok/web/aweme-id", {"url": url})  # observed: a bare id string
    params = {"item_id": str(item_id)}
    if category:
        params["content_category"] = category
    r = call("tiktok/analytics/detect-fake-views", params)
    fv, da = r.get("fake_view_analysis", {}), r.get("detailed_analysis", {})
    vm, cm = r.get("video_metrics", {}), r.get("creator_metrics", {})
    eng = da.get("engagement", {})
    views = vm.get("total_views") or 0
    print(f"video {item_id}: {views:,} views, {cm.get('follower_count', 0):,} followers "
          f"(tier {da.get('follower_correlation', {}).get('follower_tier')}, "
          f"benchmarks {eng.get('benchmark_category')}, verified {cm.get('verified')})")
    for k, v in (eng.get("engagement_metrics") or {}).items():
        print(f"  {k:15} {v:.4f}")
    print(f"fake_score {fv.get('fake_score')}, suspicious {fv.get('is_suspicious')}, "
          f"confidence {fv.get('confidence_level')}")
    print(f"estimated_fake_views {fv.get('estimated_fake_views'):,} = views x {fv.get('fake_view_percentage')}% "
          f"(a bucketed estimate, not a count)")
    no_data = [k for k, v in da.items() if isinstance(v, dict)
               and any("nsufficient" in i for i in v.get("issues") or [])]
    print("components without enough data:", ", ".join(no_data) or "none")
    for flag in r.get("suspicious_features") or []:
        print("  flag:", flag)
    action = (r.get("recommendations") or {}).get("action")
    verdict = "review manually" if fv.get("is_suspicious") else "no strong signal"
    print(f"screening verdict: {verdict} (endpoint action: {action}; heuristic, "
          "ask the creator for TikTok analytics before deciding)")


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2] if len(sys.argv) > 2 else None)

结论行故意写得很克制:只复述接口自己的 is_suspicious,不给 fake_score 拍一个阈值,因为没有标注数据,定不出来。“components without enough data” 那一行和分数一样重要:建立在缺失数据上的低分,不等于没问题。

用短链跑的输出(2026-10-04 01:43 UTC,全程 3.6 秒):

video 7460937381265411370: 162,046,731 views, 96,045,042 followers (tier xxlarge, benchmarks verified_large, verified True)
  comment_ratio   0.0022
  favorite_ratio  0.0068
  like_ratio      0.0983
  share_ratio     0.0081
fake_score 4.34, suspicious False, confidence Minimal
estimated_fake_views 8,102,336 = views x 5.0% (a bucketed estimate, not a count)
components without enough data: consistency, distribution, racing_mechanism
  flag: Suspicious: Reached 100000 followers from 10000 in only 31 days
  flag: Suspicious: Account gaining 22674 followers per day on average
screening verdict: no strong signal (endpoint action: no_action; heuristic, ask the creator for TikTok analytics before deciding)

换成 Figma 那条加 entertainment,输出 fake_score 31.71 和 estimated_fake_views 645 = views x 29.99%。传主页链接,脚本直接抛 RuntimeError: tiktok/web/aweme-id: HTTP 503 停下,不会悄悄给你一份空报告。

费用

SandBase 上 tiktok/analytics/detect-fake-views 的模型页,显示基础价格 Free、同步执行、api 类型和 2 个输入字段,顶部有 API Free Week 横幅

截图:2026-10-04 的 detect-fake-views 模型页显示基础价格 Free、同步执行、2 个输入字段,顶部挂着 “API Free Week” 横幅,价格请以当天为准(2026-10-04 截取)。

2026-10-04 用 GET /v1/models/<model> 查,detect-fake-views、aweme-id、video-metrics、user-post-videos 的 base_price 都是 "0"。这个接口需要同一把 Bearer Key,公开的模型页不登录也能看价格。我用 GET /v1/tasks/<id>/cost(同样要 Key)抽查了 3 次调用,"cost" 都是 "0.000000"。页面有免费周横幅,价格可能会变,大批量跑之前先看一眼模型页。

延伸阅读

想知道这个检测接口在大量视频上表现如何,可以看 TikTok 刷量识别实测:68 个公开视频跑下来,分数主要受哪些因素影响。签约前想一次性筛查达人最近的作品,可以看 TikTok 达人刷量审核 Agent。

局限

范围:8 条认证品牌和媒体账号的公开视频、3 组分类对比、一天。没有个人达人、没有已知刷量样本、没有标注真值,所以本文说明的是接口怎么表现,不是它准不准。三个百分比档位、estimated_fake_views 和 estimated_organic_views 的算法、粉丝档位划分,都是我从返回里观察到的,参考文档没有写。测试脚本和原始返回留在内部;样本规则、输入、run id 和汇总数据都在正文里。

下一步

想自己跑,先看 detect-fake-views 接口参考,或者在模型页直接试,然后申请 SandBase API Key。

常见问题

TikTok 上能看到假播放吗?

直接看不到。公开计数不会标哪些播放是假的。你能做的是自己算比例、用这类启发式工具看风险信号,播放日志只有 TikTok 自己能看。

怎么判断一条 TikTok 视频有没有刷量?

看播放相对粉丝档位是否偏高、点赞评论分享是否偏低,再和达人自己的其他视频对比,最后找达人要后台数据。我的实测里,8 条认证品牌视频没有一条被接口判为可疑,分数在 4.34 到 31.12 之间。

有免费的 TikTok 假播放量检测工具吗?

这个检测接口和链接转 ID 的接口,2026-10-04 在 “API Free Week” 横幅下都标 Free,实际扣费 $0,需要一个 SandBase API Key。价格可能变化,以模型页为准。

TikTok 会删除刷出来的播放吗?

TikTok 的 Countering deceptive behavior 页面(2026-10-04 查阅)写明:不允许用机器人、脚本等手段人为抬高播放、点赞、评论、分享等互动数据,违规的内容或账号会被删除;每年拦截数百亿次虚假互动尝试,并在社区准则执行报告里按季度披露。页面没有说具体某条视频的播放数会怎么调整。

estimated_fake_views 是什么意思?

它等于 total_views 乘以 fake_view_percentage。TikTok 那条视频是 1.62 亿乘 5%,同时分数只有 4.34、也没被判可疑。看分数和判定,别看这个乘出来的数。