Guides / End-to-end tutorials / Shadowban & fleet forensics A–Z
Shadowban & fleet forensics A–Z
Audit 50+ agency, theme-page or clipper handles for silent FYP suppression ("200-view jail"), search de-indexing, upload-source fingerprinting (shoot vs upload vs capcut), and moderation flags.
1. Diagnosing silent suppression & upload fingerprints
Operators managing multi-account creator fleets, UGC rosters or clipping networks need to separate weak creative hooks from distribution throttling before scaling spend. Sweep liveness with /v1/user/bulk-check, test search indexability via /v1/user/visibility, and inspect stalled posts with /v1/video/forensics (shoot camera vs upload gallery vs capcut, re-encode/AIGC flags) and /v1/video/fyp-velocity.
| Action | Endpoint | Cost |
|---|---|---|
| Bulk profile check | POST /v1/user/bulk-check | 5 cr / item |
| Visibility check | GET /v1/user/visibility | 25 cr |
| Video forensics | GET /v1/video/forensics | 10 cr |
| FYP velocity | GET /v1/video/fyp-velocity | 10 cr |
| Creator audit | GET /v1/user/audit | 25 cr |
2. Runnable 50-handle fleet scanner
TypeScript SDKPython SDKMCP / cURLfleet_forensics
1import { TikUltra } from 'tikultra'
2
3const client = new TikUltra({ apiKey: process.env.TIKULTRA_KEY, os: 'ios', appFlavour: 'tiktok', region: 'US' })
4const fleet = ['clipper_hq_01', 'clipper_hq_02', 'themepage_daily', 'ugc_brand_us']
5
6const bulk = await client.user.batch(fleet) // 1 batch call for up to 100 handles
7const liveHandles = (bulk.data.items ?? []).filter((x: any) => x.exists && !x.private).map((x: any) => x.username)
8
9const flagged = []
10for (const handle of liveHandles) {
11 const [vis, posts] = await Promise.all([
12 client.user.visibility(handle),
13 client.user.posts({ username: handle, count: 5 }),
14 ])
15 const latest = posts.data.items?.[0]
16 if (!latest) continue
17 const [forensics, velocity] = await Promise.all([
18 client.video.forensics(latest.aweme_id),
19 client.video.fypVelocity(latest.aweme_id),
20 ])
21 const in200Jail = (latest.stats?.play_count ?? 0) < 280 && (velocity.data.fyp_share_est ?? 1) < 0.08
22 if (!vis.data.search_indexed || in200Jail || forensics.data.moderation_restricted) {
23 flagged.push({
24 handle, searchIndexed: vis.data.search_indexed, in200Jail,
25 uploadSource: forensics.data.upload_source, // shoot | upload | capcut
26 aigcTagged: forensics.data.aigc_label_type, codec: forensics.data.codec,
27 })
28 }
29}
30console.table(flagged)
Tiered triage keeps sweeps cheap. Run
bulk-check (5 cr / item) and user/posts (5 cr) across the whole roster first, and trigger visibility (25 cr) + forensics (10 cr) only on accounts whose trailing 3-post median drops >70%.