Free tool · No sign-up
Playable Ad Spec Checker
Pick the networks you are uploading to, drop in your build, and get a pass or fail against each one’s size cap, packaging, MRAID rule and store-exit call — before a reviewer sends it back.
Pick your ad networks
Choose one or several. Each has its own size cap, packaging, MRAID rule and store-exit call, so the same file can pass on one and fail on another.
Drop your playable ad
A single .html or a .zip — whatever you were about to upload.
Analysed in your browser. The file is never uploaded.
Playable ad specs by network
Every figure below comes from that network’s own documentation, and the last column links to the page it was taken from. Where a network publishes no cap, this says so rather than inventing one.
- Limit
- 2 MB HTML (5 MB ZIP)
- Format
- ZIP
- Exit
FbPlayableAd.onCTAClick()
- Limit
- Not published
- Format
- Single .html
- Exit
FbPlayableAd.onCTAClick()
Two figures here are ours, not the networks’
Verdicts are graded against the published limit above. Separately, Playable Ads Maker holds its own AppLovin exports to 4 MB and its Chartboost exports to 3 MB — AppLovin publishes 5 MB and Chartboost publishes no cap at all, so those two are a safety margin on our side rather than a rule on theirs. A file that sits between the two is flagged as a suggestion, never as a failure.
How to check a playable ad before you upload it
- 1
Export or locate the finished playable ad you are about to upload — a single .html file, or the .zip you would hand to the network dashboard.
- 2
Open the Playable Ad Spec Checker and drop the file onto the page, or use Choose a file. Nothing is uploaded; the analysis runs in your browser.
- 3
Read the network panel. Each card shows that network's size cap, packaging format and store-exit API, with a pass, check or fail verdict and the reason behind it.
- 4
Work through the failures in the detailed findings below the matrix — external asset requests, unresolved local references, a missing viewport tag, and missing store-exit calls are the four that block approval most often.
- 5
Fix the creative, re-export, and drop the new file in again to confirm the failures have cleared before you upload to the network.
Questions about checking playable ads
Is my playable ad uploaded anywhere when I check it?
No. The file is read, unzipped and analysed entirely inside your browser using JavaScript — there is no upload step and no server behind this page. You can confirm it by opening your browser's Network tab while you run a check: no request carries your file. This matters because playable creatives are usually a client's unreleased campaign asset.
What can I drop into the spec checker?
A single .html file or a .zip archive — the two things ad network dashboards accept, from any tool. Inside a ZIP every text file is read wherever it sits, including scripts nested under folders, because the store-exit call usually lives in a separate .js rather than the HTML. The entry document is found by convention where one exists and by structure where it does not, so no particular filename or layout is assumed.
What do the amber suggestion lines mean — do they block a pass?
No. A network shows Pass whenever the upload would be accepted as it stands, and any amber lines underneath are optional improvements: a missing viewport tag, a missing mraid.js on a network that expects one, or a file larger than we would ship even though it is inside the published limit. Only a Fail blocks — that means the upload would be rejected in the shape it is in, because it is over the published size cap, missing that network's store-exit call, packaged in a format the network does not take, or carrying mraid.js where the network forbids it.
Which networks can the checker verify against?
All 13: Unity Ads, IronSource / LevelPlay, AppLovin MAX, Chartboost, InMobi, Vungle (Liftoff), Google Ads / AdMob, Meta (Facebook & Instagram), Moloco, Mintegral, TikTok Ads, Pangle, Liftoff. Pick any one or several. Each figure used is taken from that network's own published documentation, and every result card links to the source page so you can check it yourself.
Why do I have to pick the ad networks first?
Because a playable targets one container at a time, and the rules genuinely differ. A Unity build calls mraid.open(); a Google build calls ExitApi.exit(); Meta and Moloco forbid the mraid.js tag that Unity requires. Grading every file against all thirteen buried the real answer under irrelevant failures, so you tell the checker where this creative is going and it answers that question. Your selection is pre-filled from the store-exit calls found in the file, and you can change it at any time — the report re-grades instantly.
Is a missing mraid.js tag a failure?
No, it is a warning. On Unity, IronSource, AppLovin, Chartboost and Vungle the tag is expected, but it is a hook the container fills with its own SDK at serve time rather than a working dependency, and adding it is a one-line change — a file without it is usually a web-preview build rather than a broken creative. The reverse is a failure: Meta and Moloco both document that the creative must NOT include mraid.js, so shipping it to them is a real defect.
What does 'external asset request' mean in the report?
It means the HTML references an image, font, script or stylesheet by an http(s) URL instead of embedding it. Ad containers run playables in a sandboxed webview that blocks outbound requests, so the asset never loads and the ad renders broken or blank. Every major network rejects this at review; the fix is to inline the asset as a base64 data URI.
Does a clean report mean my ad will be approved?
No. This is static analysis — it reads the file without running the ad, so it catches disqualifying problems visible in the source: size, external requests, a missing store exit, no viewport tag. It cannot judge creative quality, gameplay authenticity or policy compliance, and it is not the network's own validator. Read a clean report as 'nothing disqualifying is visible', not as approval.
The checker says no store exit was found, but my CTA works. Why?
Most likely your CTA opens a store URL directly with window.open, which works in a browser preview but never reports the click to the network. The checker looks for the specific call each container provides — mraid.open(), ExitApi.exit(), FbPlayableAd.onCTAClick(), window.install(), window.openAppStore(), or a postMessage bridge. It also cannot see a call assembled from string fragments at runtime, so a heavily obfuscated build may report a false negative here.
Related guides
Size limits by network
Every published cap side by side, sourced and ranked strictest first.
MRAID validator
Run your ad in a simulated MRAID 3.0 container and watch what it does.
Why playable ads get rejected
The QA checklist that clears the common review failures.
What MRAID is, and when you need it
Which networks require mraid.js, and the two that forbid it.
Getting under the size limit
Compression tactics that keep the creative looking right.