Playable ads
A short playable ad for our parking-lot puzzle Honk Out!, made from the game's own code. One source folder builds the file for five ad networks, and an automated check plays every build to its end card.
- AppLovin · Unity · Google · Meta · ironSource
- Portrait and landscape
- No network requests
- Sound after the first tap
Honk Out!
Parking-lot unjam puzzle · our own free web game
What the ad does
- First frame: the lot dims around one car and a hand taps it.
- Three tiny 4 × 5 lots, thirteen taps. Every car drives out along the loop road and through the barrier, which pays a coin.
- Lot 2 teaches the rule: the hand points at a blocked car, it bumps the car in its way, and that driver honks.
- End card with the Honk Out! logo and a Play free button, when the third lot is clear or 35 s after the first tap.
How it is made
The cars, lot, road, barrier, effects and buttons are the game's own drawing code; the rules and hints are its level code; the sounds and music are its files. They are copied into the ad unchanged, and the ad adds only the tutorial, the three levels and the end card. Everything is inlined in one HTML file.
Honest status
- It has not run in a paid campaign, so there are no CTR or IPM numbers.
- It is checked in headless Chromium with stand-in
mraid,ExitApiandFbPlayableAdobjects, not yet inside the real SDKs or on a phone. - Honk Out! is a browser game, so the buttons open honk-out.pages.dev, not an app store. A client build uses the client's store links.
- Most of each file is the 46 s music loop (about 0.6 MB inlined). Without music the ad would be about 0.24 MB.
One build per network
Network rules as read on the official spec pages on 2026-10-14. Sizes are the files the network receives.
| Network | What we deliver | Limit | Container and click-through | Other rules followed | Our file |
|---|---|---|---|---|---|
| AppLovin | One HTML file, everything inlined | 5 MB | MRAID 2.0: waits for ready, opens the game with mraid.open() | Timer starts at the first tap; that tap never opens the store; muted until then | |
| Unity Ads | One index.html, no links to other files | under 5 MB | MRAID 3.0: starts on the first viewableChange(true), mraid.open() | Both orientations; no XHR; never blocks the close button | |
| Google Ads | ZIP with index.html | 5 MB, 512 files | Google's exitapi.js, ExitApi.exit() | ad.orientation meta for portrait and landscape; no storage; explicit end tags | |
| Meta | One HTML file, everything inlined | 5 MB | FbPlayableAd.onCTAClick(); no MRAID code at all | No external calls; responsive, portrait first | |
| ironSource Exchange | MRAID tag (HTML snippet) | 4 MB | MRAID 2.0, size from mraid.getMaxSize(), mraid.open() | Loading screen; no HTML comments; no top window access; HTTPS only |
Each network name links to the spec page we followed. Not covered: ironSource LevelPlay UA, Mintegral, TikTok/Pangle, Liftoff, Vungle.
What the check proves
For every network, a script reads the built file (size limit, no URLs other than the ones the network requires, no fetch, XHR, sockets or storage, the required API calls and markup) and then plays it in headless Chromium at 320×480, 480×320, 390×844 and 844×390: nothing starts before the container is ready, no audio context and no timer before the first tap, the first tap does not reach the store, the ad plays through on its own hints to the end card, and both buttons call the right network API.
It does not prove behaviour inside the real SDKs, on real phones, or that the sound is heard (the browser runs muted).




