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:

  • Locationconfig.json must sit in the first-level directory of the ZIP, directly alongside index.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 if config.json itself is fine.
  • The Playable_orientation field — 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: 0 for unspecified/both orientations, 1 for portrait-only, and 2 for 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.json with the exact syntax above, confirm the orientation value matches what your playable actually supports, and place it at the same directory level as index.html before 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.json for you as part of the build — deriving Playable_orientation from the orientation you select, and placing the file at the correct first-level path next to index.html inside 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.

Worth knowing: a missing 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.