Reference

Network specs and the checklist we ship by

We keep this table for ourselves — our playables are built against it. Published as is: size, format, the CTA call and what actually gets creatives rejected. Use it even if you build elsewhere.

Verified against network documentation on 2026-07-02 · networks do not announce changes — re-check before you submit
§1

Ad network limits

A star marks the three networks we build for by default: all three take one self-contained HTML, MRAID and a 5 MB ceiling, so a single build covers them all.

NetworkSizeFormatWrapper and CTA callWhat matters
Unity Ads≤ 5 MBsingle HTML MRAID 3.0, injected by the webview
mraid.open(url)
Wait for viewableChange before starting, both orientations, no XHR, links to both stores required. Submit the iOS link in the legacy form itunes.apple.com/…/id<ID>?mt=8 — the validator rejects apps.apple.com as invalid even though it simply redirects.
AppLovin≤ 5 MBsingle HTML MRAID 2.0
mraid.open(url)
External requests and analytics only with their approval. Autoplay is banned in so many words: the ad timer starts after the first interaction, so we do not build an autoplay fallback at all.
ironSource / LevelPlay≤ 5 MBsingle HTML MRAID; legacy playables sometimes use DAPI Review runs through the dashboard and there is no public test tool — which makes the pre-submit checklist matter more.
Meta / Facebook≤ 2 MB single
≤ 5 MB zip
single HTML in base64 or a zip with index.html at the root FbPlayableAd.onCTAClick() No HTTP requests whatsoever. Run it through their Playable Preview.
Google Ads≤ 5 MBzip with HTML Exit API: ExitApi.exit() Uploaded as an App campaigns interactive asset, checked in the HTML5 Validator.
Mintegral≤ 5 MBsingle HTML or zip MRAID, end-of-game signal window.gameEnd() Tested in Mindworks Playable Testing.
TikTok / Pangle≤ 5 MBzip window.openAppStore() A config.json at the root is mandatory: orientation and the language list.
Vungle / Liftoff≤ 5 MBsingle HTML or zip MRAID The main file must be named ad.html; checked by their Creative Verifier.
In practice

The size budget is the limit minus 10%

A network limit is a rejection threshold, not a target. The network wrapper, base64 and version drift all sit between your file and the check, so we aim below the ceiling: ≤ 4.5 MB for Unity, AppLovin and ironSource, ≤ 1.8 MB for Meta single-file.

Separate arithmetic: inlining an asset as base64 adds roughly a third to its weight. Five megabytes of source images will not fit into a 5 MB file — count the final HTML, not the asset folder.
§4

QA checklist: 12 points

Every build of ours is checked against it, and the same list reaches the client as a report. Points 1, 2, 3, 6, 11 and 12 run automatically — not by eye.

#
Check
Criterion
1
File size
≤ the target network limit minus 10%
2
Single-file and offline
Not a single external URL or network request; opens from file:// with no internet
3
Console
Zero errors across a full run: hook → gameplay → end card
4
Hook
What to do is clear within 3 seconds, without a wall of text
5
Autoplay fallback
On idle the creative reaches the end card by itself; skipped where the network forbids it
6
CTA
An in-game button never opens the store before the win; a large CTA on the end card; redirect only through the network adapter
7
No auto-redirect
The store opens only on a user action
8
Touch targets
Interactive elements ≥ 60×60 CSS px, hard minimum 48×48
9
Orientations
The resize handler works; both orientations where the network requires them
10
FPS
30+ on mid-range devices, no stutter in the first seconds
11
MRAID etiquette
Start after ready and viewableChange; closing the ad is never blocked
12
Network wrapper
The right CTA call and packaging: single or zip, config.json, correct file name
§4.0

The external gate: a second pair of eyes

Your own checklist only catches what it was tuned for. So an independent gate runs on top: it takes the finished file apart again and drives it in a browser across three viewports — 390×844, 576×1024 and 844×390 — on the exact bytes that will reach the network. The PASS / FAIL / BLOCKED verdict goes into the report as is, together with the SHA-256 of every file.

What it caught in builds already considered ready: another network’s name in live creative code; an inherited <script src="mraid.js"> — an external dependency where everything must be inside the file; and a foreign package plus a test app identifier hidden inside a packed layer that plain text search never reaches.
§4.1

Extra rules for casino and betting

Six points on top of the main checklist. These are what get a gambling creative rejected when everything technical is fine.

#
Check
Criterion
G1
Age disclaimer
“18+” or the regional equivalent is visible in the creative: a top banner and/or a legal line on the end card
G2
“Play responsibly”
The wording is present in the legal block of the end card
G3
Licence by geo
For a licensed operator — the licence number and issuing authority in the footer or disclaimer
G4
Age of characters
No depictions of people under 25, not even stylised
G5
No guaranteed wins
Not “win X” or “X is yours”, but “up to X” and “a chance at X”; guarantee wording is an instant moderation flag
G6
Targeting and age gate
The advertiser’s responsibility, not the creative’s code — but stated explicitly in the brief
From experience

The most common reasons for rejection

Everything below comes from real rejections and findings on our own batches, not from documentation theory.

Unity AdsA modern-format iOS link

The validator marks apps.apple.com as invalid and blocks the creative. Only the legacy form works: itunes.apple.com/<geo>/app/…/id<ID>?mt=8 — which redirects to the right place anyway.

AppLovinGameplay that starts by itself

Autoplay is banned in so many words: the ad timer begins on the first touch. So the autostart mechanism does not exist in our builds — it is not merely “switched off by a flag”.

Any networkAnother network’s name in the code

FbPlayableAd or another network’s call left in the CTA cascade of the source creative. The branch may be unreachable — to a reviewer it is still a blocker. We reduce the redirect to a single definition.

Any networkA relative resource path

An inherited <script src="mraid.js"> or any relative src: a self-contained file must have no external dependencies, and in a webview that path simply will not resolve.

Any networkA foreign package inside a packed layer

A store address or a test app identifier baked into the source creative’s zip or base64 layer. Text search never sees it — the packed content has to be unpacked and inspected.

GamblingAn inherited regulatory notice

A reused creative keeps a disclaimer from another jurisdiction. In a new geo that is a direct cause of rejection — it gets removed along with the localisation.

Want a creative that passes all this on the first try?

We build it for your network and geos, and the report against this checklist arrives with the file.