Reference · 10 min

Playable ad specs, network by network

File size, packaging, entry point, click handler and the one requirement each network fails you on. A working reference rather than a marketing page.

Every network publishes a spec sheet, and every spec sheet omits the thing that actually causes rejection. This is the shape of the requirements as they behave in practice, not as they read.

Google UAC

Delivery: a single self-contained HTML file, or a zip whose root is index.html.

Click handling: the approved ExitApi script, with the CTA calling ExitApi.exit(). A window.open or a bare href will not register.

Copy: no currency symbols or monetary amounts in reward language.

The usual failure: a designer wires the end-card button to a link instead of the exit call, and the unit serves with a dead CTA.

AppLovin

Delivery: single self-contained HTML.

Click handling: mraid.open() where MRAID is present, with a graceful fallback.

The usual failure: assets referenced by relative path rather than inlined, producing a blank frame in the SDK.

Unity Ads

Delivery: zip with index.html at the root, all assets inlined or bundled, no traversal above root.

Runtime: ES5 output, fixed 375×667 stage scaled by transform, MRAID lifecycle respected and viewableChange gating the start.

The usual failure: modern CSS — clamp(), flex gap, aspect-ratio, env() safe-area insets — silently collapsing the layout on older WebViews.

Mintegral

Delivery: zip, index.html at root, everything inlined, no external requests of any kind.

Runtime: PlayTurbo's WebView is the strictest target in the set. ES5, absolute units, no fetch or XHR, no NodeList.forEach.

The usual failure: a font or an image left as a remote URL. It works in every preview and blanks in production.

The portable subset

Build to the intersection and you ship everywhere: one HTML document, every asset inlined as a data URI, ES5 syntax, a fixed logical stage scaled with a transform, touch handlers with a mouse fallback, and a single exit function abstracted behind whichever click API the target expects.

Testing on the constraint rather than the target is the whole discipline. A unit that survives the strictest WebView renders on the rest of them; the reverse is not true, and the failure mode is a black frame no dashboard will explain.