Free · no account needed
Playable ad validator
Drop an HTML5 playable and see, for nine ad networks, whether it passes the size limit, packaging, MRAID and store-call rules, with what to change when it doesn’t.
Read as text on our server, never run there, and not stored. Play it runs only in your browser.
Checked against the spec of each network
What the validator checks
Each check runs once per network, because the networks disagree: a file that’s right for Meta is wrong for AppLovin. Read more in what a playable ad is.
01
File size
Against each network’s limit: 2 MB for Meta, 5 MB for the rest. A ZIP checked for a single-file network is sized as one HTML file with its assets inlined, which adds about a third to each asset.
02
Packaging
One HTML file for AppLovin, Unity, ironSource, Meta and Moloco. A ZIP with the right entry file for the others: index.html for Google, index.html and config.json for TikTok, ad.html for Liftoff, name/name.html for Mintegral.
03
mraid.js
Present where the network serves MRAID (AppLovin, Unity, ironSource), absent where it’s rejected (Meta, Moloco, TikTok).
04
Start gate
On MRAID networks the game should wait for MRAID’s ready event and for the ad to be viewable. Unity requires the viewable part.
05
Store call
The install button has to use the network’s own call: mraid.open(), dapi.openStoreUrl(), FbPlayableAd.onCTAClick(), ExitApi.exit(), openAppStore(), window.install() or a postMessage.
06
External requests
Scripts, stylesheets, fonts, images or fetch calls to other servers, and libraries loaded from a CDN instead of inlined. Ad web views block them and networks reject the ad.
07
Network extras
Google’s exitapi.js and ad.orientation meta tag, Mintegral’s gameEnd() call, Liftoff’s "complete" message when the game ends.
08
Phone basics
A viewport meta tag, a layout that follows resize and rotation, sound that waits for a tap, no store redirect on a timer and no alert() dialogs.
Playable ad size limits and specs
The table the validator works from. Each network has a page with the full spec: what goes in the file, how the store opens, and what happens when a build is over the limit.
| Network | Max size | Package | mraid.js | Store call |
|---|---|---|---|---|
| AppLovin | 5 MB | Single HTML file | Required | mraid.open(storeUrl) |
| Unity Ads | 5 MB | Single HTML file | Required | mraid.open(storeUrl) |
| ironSource | 5 MB | Single HTML file | Required | dapi.openStoreUrl() |
| Meta | 2 MB | Single HTML file | Leave out | FbPlayableAd.onCTAClick() |
| Google Ads | 5 MB | ZIP · index.html | Leave out | ExitApi.exit() |
| TikTok | 5 MB | ZIP · index.html + config.json | Leave out | window.openAppStore() |
| Mintegral | 5 MB | ZIP · name/name.html | Leave out | window.install() |
| Moloco | 5 MB | Single HTML file | Leave out | FbPlayableAd.onCTAClick() |
| Liftoff | 5 MB | ZIP · ad.html | Leave out | parent.postMessage("download", "*") |
How your file is handled
Nothing runs on our server
The file is read as text and matched against the rules. A ZIP is unpacked in memory, with limits on file count, size and paths.
Nothing is kept
The report goes back to your browser and the file is dropped. We don’t store uploads or log what’s in them.
The rules our export uses
Limits, layouts and store calls come from the code that packages Playbaker exports, last checked 13 October 2026.
Validator questions
Skip the fixing
Get a playable that passes on every network.
Paste your store link. Playbaker builds the game and exports it for each network.