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.

ActionEndpointCost
Bulk profile checkPOST /v1/user/bulk-check5 cr / item
Visibility checkGET /v1/user/visibility25 cr
Video forensicsGET /v1/video/forensics10 cr
FYP velocityGET /v1/video/fyp-velocity10 cr
Creator auditGET /v1/user/audit25 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%.