mraid.open(url) on a real tap.
What ironSource actually requires from a playable
ironSource's ad network is now operated under Unity (Unity acquired ironSource in 2022, and its creative specs are published as part of Unity's "Grow" documentation). Two things are worth separating: the spec for ironSource's direct/owned-and-operated network, and the spec for the ironSource programmatic exchange — they're documented separately and don't fully agree on numbers, which is a real source of confusion for anyone building by hand.
| Requirement | Spec |
|---|---|
| File size | Under 5 MB (ironSource's exchange spec separately caps downloaded assets + code at 4 MB) |
| Package format | Single self-contained index.html — no linked files or folders, all assets inlined |
| MRAID compliance | MRAID required; Unity's Grow spec cites MRAID 3.0, the ironSource exchange doc cites MRAID 2.0 — check which inventory you're targeting |
| Click-through / CTA | mraid.open(url) — the ad should link to the store only on explicit user action, never auto-redirect |
| Close button | ironSource renders its own timer and close button in the container — don't build a custom one, and don't block it |
| Orientation | Support both portrait and landscape |
| Network requests | Avoid XHR/network calls where possible; any external references must use absolute, HTTPS URLs — no relative paths, no HTTP |
| Playback start | Wait for the MRAID viewableChange event (or, per the exchange doc, show a loading screen) before starting playable content — don't assume it's visible on load |
| Platform floor | Android 4.4+, iOS 9.0+ |
The base64/inline-everything requirement is the same category of problem PlayableKit already solves for AppLovin and Meta — but it's not identical. ironSource's own guidance for its exchange inventory notes that Android WebViews can choke on very large inline base64 payloads, and in some setups actually asks for asset URLs hosted externally rather than embedded, which runs opposite to the "single self-contained file" instruction in the general Grow spec. That's the kind of network-specific wrinkle that's easy to get wrong by hand and easy to miss until a creative gets rejected in review.
What this means for a Playworks/Luna export specifically
A stock Playworks/Luna export (typically a ZIP built to something like ProjectRoot\LunaTemp\stage4\create-hub) runs fine in a browser but isn't shaped for any single network's rules. For ironSource specifically, that means manually: stripping the export down to one HTML file with every image, audio clip, and font inlined; adding an mraid.open() call wired to your CTA button instead of whatever click handler Playworks/Luna generated; removing any custom close/X button your build includes (ironSource supplies its own); confirming the whole thing clears the 4–5 MB range; and gating the start of gameplay behind the MRAID viewability event rather than firing on page load.
What PlayableKit does today
PlayableKit automates this per-network adaptation — click-through wiring, asset inlining, package shape, size compliance — from one Playworks/Luna export, ironSource included. What's free regardless of which network you're targeting:
- The free Playable Ad Validator — checks a Playworks/Luna export for structural problems (missing entry file, broken inline script, missing assets) with no signup.
- The free Size Checker — useful for getting a read on where your build sits against the roughly 4–5 MB range ironSource (and most other networks) enforce.