If your TikToks get a few hundred views and no conversions, the fix is not 'post more memes', it is studying what already works in your exact niche and copying the structure. A game developer posted in r/gameDevMarketing that 5 meme-style videos over a month pulled about 3,364 views across TikTok, Reels, and Shorts with flat wishlist growth. The honest reply in the thread: view-to-conversion from short-form is brutally low unless you go properly viral, and meme views rarely convert. So stop guessing. The TikTok API lets you pull the top videos for your niche hashtags, read their real play, like, comment, and share counts, and reverse-engineer the hook, length, and format that actually earn engagement. Each Scavio TikTok call is 1 credit ($0.005).
Prerequisites
- A Scavio API key (50 free credits at signup)
- Python 3.9+ or Node 18+
- 3-5 hashtags your target audience actually watches (not just your game's name)
Walkthrough
Step 1: Resolve your niche hashtags
Start with the hashtag endpoint to confirm a tag exists and see its scale (view_count, video_count). A tag with millions of views but few recent breakouts is saturated; a mid-size tag with fresh viral videos is where a small creator can land.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
tag = requests.post("https://api.scavio.dev/api/v1/tiktok/hashtag",
headers=H, json={"hashtag": "indiegame"}).json()
print(tag["data"]) # challenge_id, view_count, video_countStep 2: Pull the top videos under each hashtag
The hashtag/videos endpoint returns videos with author info and full statistics. This is your training set: the videos your audience is actually watching and engaging with.
vids = requests.post("https://api.scavio.dev/api/v1/tiktok/hashtag/videos",
headers=H, json={"hashtag": "indiegame", "count": 30}).json()Step 3: Rank by engagement rate, not raw views
Raw views mislead. Compute engagement rate = (digg + comment + share) / play. A video with 40k views and 5% engagement beats one with 400k views and 0.3%. This ratio is what separates content that converts from content that just gets shown.
def eng_rate(v):
s = v["statistics"]
plays = max(s["play_count"], 1)
return (s["digg_count"] + s["comment_count"] + s["share_count"]) / plays
ranked = sorted(vids["data"]["videos"], key=eng_rate, reverse=True)
for v in ranked[:10]:
print(round(eng_rate(v)*100, 1), "%", v["desc"][:60])Step 4: Read the hooks on the winners
Pull the description and first-comment patterns on the top-engagement videos. Look for the shared structure: a question hook, a before/after, a 3-second payoff. This is the format to copy, adapted to your game.
top = ranked[0]
detail = requests.post("https://api.scavio.dev/api/v1/tiktok/video",
headers=H, json={"video_id": top["id"]}).json()
comments = requests.post("https://api.scavio.dev/api/v1/tiktok/video/comments",
headers=H, json={"video_id": top["id"], "count": 20}).json()Step 5: Find and study the creators, not just the videos
Search creators in your niche, pull their recent posts, and see which formats they repeat. Consistency across a creator's top videos is a stronger signal than any single viral hit.
users = requests.post("https://api.scavio.dev/api/v1/tiktok/search/users",
headers=H, json={"query": "indie game dev", "count": 10}).json()
prof = requests.post("https://api.scavio.dev/api/v1/tiktok/profile",
headers=H, json={"username": users["data"]["users"][0]["unique_id"]}).json()
posts = requests.post("https://api.scavio.dev/api/v1/tiktok/user/posts",
headers=H, json={"sec_user_id": prof["data"]["user"]["sec_uid"], "count": 20}).json()Python Example
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
def top_by_engagement(hashtag, n=10):
vids = requests.post("https://api.scavio.dev/api/v1/tiktok/hashtag/videos",
headers=H, json={"hashtag": hashtag, "count": 50}).json()
def rate(v):
s = v["statistics"]; plays = max(s["play_count"], 1)
return (s["digg_count"] + s["comment_count"] + s["share_count"]) / plays
return sorted(vids["data"]["videos"], key=rate, reverse=True)[:n]
for v in top_by_engagement("indiegame"):
print(v["desc"][:70])JavaScript Example
import { Scavio } from "scavio";
const client = new Scavio({ apiKey: process.env.SCAVIO_API_KEY });
async function topByEngagement(hashtag, n = 10) {
const vids = await client.tiktok.hashtagVideos({ hashtag, count: 50 });
const rate = v => {
const s = v.statistics, plays = Math.max(s.play_count, 1);
return (s.digg_count + s.comment_count + s.share_count) / plays;
};
return vids.data.videos.sort((a, b) => rate(b) - rate(a)).slice(0, n);
}
console.log((await topByEngagement("indiegame")).map(v => v.desc.slice(0, 70)));Expected Output
POV: you shipped your first game and nobody downloaded it...
day 47 of making a game about a sentient toaster...
i spent 2 years on this boss fight, was it worth it?...