The problem: TikTok checks for a file most networks don't require
Every major ad network wants a working index.html (or equivalent) inside your ZIP, with the click-through API wired up correctly. TikTok wants that too — but it also requires a second, separate file sitting next to it: config.json, in the first-level directory of the archive, declaring the playable's orientation. Google Ads, AppLovin, Meta, Unity Ads, and Vungle have no equivalent file requirement at all. Mintegral cares about filename/folder matching, not a metadata file. TikTok is the outlier, and it's exactly why this rejection catches teams who've already shipped successfully to four or five other networks: the checklist that worked everywhere else silently fails here.
When config.json is absent, malformed, or missing the orientation field, TikTok's review pipeline rejects the package before a human ever looks at the creative itself. It's a mechanical, automated rejection — which also means it's entirely avoidable.
What config.json actually needs to contain
TikTok's requirement is narrow but strict:
- Location —
config.jsonmust sit in the first-level directory of the ZIP, directly alongsideindex.html. Nested inside a subfolder, it won't be found. - Entry file name — the HTML file next to it must be named exactly
index.html, also at the first level. A renamed or nested entry file breaks the pairing even ifconfig.jsonitself is fine. - The
Playable_orientationfield — a numeric field TikTok's validator checks explicitly. It's not optional and it's not a string. In PlayableKit's own conversion logic, the accepted values map as:0for unspecified/both orientations,1for portrait-only, and2for landscape-only.
That's the whole file. It's small, but it has to be present, correctly placed, and syntactically valid JSON — a trailing comma or a string where a number is expected will fail validation just as hard as a missing file.
Why Unity Playworks/Luna exports never include this by default
Unity Playworks (formerly Luna) exports a generic, self-contained playable build — an index.html plus whatever assets your scene needs, packaged for a browser to render. That export format predates and has no awareness of any single ad network's packaging rules. config.json isn't a general web standard or a Unity convention; it's a TikTok-specific requirement invented for TikTok's own review pipeline. There's nothing in a stock Playworks/Luna export for it to hook into, so it simply never gets generated. The same is true of clickTag wiring, MRAID calls, and every other per-network convention — Playworks/Luna builds one correct playable, and adapting it to each network's specific rules (including this one) is separate work that has to happen afterward.
A correct config.json example
Here's a minimal, valid file for a portrait playable:
{
"Playable_orientation": 1
}
For a landscape build, that's "Playable_orientation": 2. For a playable that should work in either orientation, use 0. The file sits next to index.html at the top of the ZIP — not inside an assets folder, not inside a folder named after your project.
The fix
There are two ways to resolve this:
- Add it manually. Create
config.jsonwith the exact syntax above, confirm the orientation value matches what your playable actually supports, and place it at the same directory level asindex.htmlbefore zipping. Double-check the JSON is valid — no trailing commas, orientation as a number, not a quoted string. - Let PlayableKit generate it automatically. When you convert a Unity Playworks/Luna export for TikTok, PlayableKit writes
config.jsonfor you as part of the build — derivingPlayable_orientationfrom the orientation you select, and placing the file at the correct first-level path next toindex.htmlinside the packaged ZIP. There's no manual step to remember or get wrong.
Either way, verify the result before resubmitting. Run the ZIP through PlayableKit's free validator — it checks specifically for a present, correctly placed config.json with a valid Playable_orientation, along with the rest of TikTok's packaging rules, so you find out before TikTok's review does.
config.json is usually just one of several TikTok-specific requirements at play — the SDK-based window.openAppStore() click handler and the ban on external requests are two more common failure points on the same submission.