For app developersOne SDK, four formats, one chat

Add one SDK.
Then just ask Zurla.

Tell Zurla what you want, like ads that pay and people who stay, and Zurla runs your ads toward it, with no ad ops team. With one SDK, Zurla serves native, banner and interstitial ads, plus rewarded ads people choose to watch, and replaces your mediation stack with one auction for the buyers connected to it.

Ask Zurla · Brindle Blocks

Brindle Blocks 2.0 is out with your SDK, and our app-ads.txt line went up last week. Start the ads, and keep our players coming back.

On it. Ads start after your consent and tracking prompts, and 21% D7 retention (new players still playing on day 7) is your guardrail: every change I keep holds it.

  • Banner on the level map, clear of the Play button
  • Native card on the results screen, labeled Ad
  • Interstitial (full screen) at the level break, with a close button
  • Extra life for players who choose to watch

Live on 4 placementsD7 guardrail 21%

Ask Zurla about Brindle Blocks

Once you’re live

No ad ops.
No optimization.
Just goals.

After launch, day-to-day changes are one sentence to Zurla. You say what you want in revenue and retention, and Zurla finds the route: buyers, floors (minimum prices), frequency caps (limits on ads per person), pacing and rewarded offers. Your team keeps the placement code and the releases. Zurla, a frontier large language model built for advertising, does the daily ad work.

  • Tune waterfalls and price tiers by handSet a goal in plain words
  • Ship an app update to change ad frequencyAsk Zurla; caps and pacing change with no app update
  • Update a separate SDK for every demand sourceOne SDK, one auction
  • Guess how many ads users will put up withAd load tested against D7 retention (new users still active on day 7)
  • Stitch reports from every demand dashboardRevenue and retention in one report, every change explained
  • Keep someone on call through launches and eventsNo one on call: Zurla works through the night

What Zurla does once you’re live

Illustrative data

Chat

Ask anything about your revenue

Zurla answers from your own data, then does the work.

Ask Zurla · Sorrelby Games

How’s the new extra-life offer doing?

It’s working: ad revenue per daily player is up 9%, and D7 retention is 21.2% for players who got it against 21.0% for those who didn’t. Players choose whether to watch it.

Roll it out?

Rolling it out to half of your players now, with one-click undo. Once D7 holds for two weeks, I’ll roll it out to everyone.

On 50% of players+9% so far

Ask Zurla about your revenue

Northstar

Goals, not settings

Tell Zurla the outcome, such as more ad revenue with D7 retention held. Zurla plans the steps and checks progress every hour.

Radar

Money found before you ask

Every app, placement, format, country and buyer, watched around the clock.

3 opportunitiesAbout $12,000 a month

Foresight

Plan updates and seasons with confidence

Users, demand and prices forecast months ahead.

1.4M daily playersforecast for the holiday update

Forge

Workflows in plain words

Describe a task once. Zurla builds the workflow and runs it on schedule.

  1. Scan every placement
  2. Test a new opt-in rewarded offer on 10% of players
  3. Keep what holds D7
  4. Send the team a summary

Swarm

AI agents in every auction

Thousands of agents, every millisecond, all aimed at your goals.

1,284agents working right now

Zero

No ad ops team needed

Zero people on call tonight. Zurla handles setup, new buyers, tests and reports, day and night, while your team keeps the code and the releases.

Mediation, replaced

One SDK, not a stack.
One auction, run by Zurla.

Mediation decides which demand source fills each ad. Today that means a mediation SDK, an adapter (the connector code) and an SDK for every source, then a waterfall of price tiers someone has to maintain. Ask Zurla what yours costs you. With the Zurla SDK, buyers connected to Zurla bid at the same moment, in one auction on Zurla’s RTB (real-time bidding) infrastructure, and the bid that pays more than the rest wins.

Ask Zurla · Sorrelby Games

Our older game still runs a mediation SDK with eight adapters. What would switching to you change?

Take its level-break interstitial. Today it takes 1.5 s to reach $10.40, and there’s more on offer:

  • Bidding round · 3 sources · 600 ms
  • Waterfall · 2 tiers, no fill (no ad returned) · 900 ms
  • Source E never asked · would have bid $12.60

And with you?

With me, it’s one SDK and one auction, and I run it. All six buyers bid at once, and Source E’s $12.60 wins in 94 ms.

  • 17 ad SDKs → 1, for sources that bid through me
  • 8 adapters and 24 waterfall tiers → none
  • 9 dashboards → 1 report

+21% for this ad$12.60 vs $10.40

Ask Zurla about your mediation

Your stack today: a mediation SDK with eight adapters runs a bidding round with three demand sources, then a waterfall of price tiers. Source B’s $10.40 bid wins after 1.5 seconds, while Source E, which would have bid $12.60, is never asked. With Zurla: one SDK and one auction. Six buyers connected to Zurla bid at the same moment, and $12.60 wins in 94 milliseconds.

  • Ad SDKs in your build: 17 today, 1 with Zurla
  • Adapters to keep in sync: 8 today, none with Zurla
  • Waterfall tiers to maintain: 24 today, none with Zurla
  • Dashboards to check: 9 today, 1 with Zurla

Prices are eCPM: what you earn per 1,000 ads shown. Times run from the ad request to the winning bid.

Illustrative data

One SDK in your app

It takes the place of your mediation SDK and the separate SDK each demand source needs today, and demand comes from buyers connected to Zurla: one package to add, update and review. Your analytics and attribution SDKs stay as they are.

Every bid at once

Buyers connected to Zurla bid on the same ad at the same moment (in-app bidding), with no waterfall behind them. No source waits in a lower tier while it would have paid more.

Nothing to keep in sync

No waterfall tiers to maintain, no SDK versions to match, no line items (price rules set by hand). New buyers join on Zurla’s side, without an app release. On iOS, install buyers also need their SKAdNetwork ID (Apple’s way for advertisers to measure installs without identifying anyone) in your app, so they join fully with your next release, which carries Zurla’s updated list.

Same rules, one report

In the open auction, every buyer gets the same floor (the minimum price a bid must meet), and no buyer sees the other bids before it bids (no last look). Private deals carry the price agreed in the deal. Revenue, eCPM (what you earn per 1,000 ads shown) and fill rate (the share of ad requests that get an ad) arrive in one report, by placement, format, country and buyer.

Moving from a mediation platform? Zurla takes its place in one app release, and we plan the switch with you, placement by placement. Google Play’s staged rollout and the App Store’s phased release let you ramp it up, and older app versions keep your current setup until people update, so we plan both side by side.

Four formats

Tell Zurla where ads don’t belong.
It finds the right moment.

With one SDK, Zurla serves four formats: native and banner ads sit inside your screens, interstitials (full-screen ads) wait for a natural break, and rewarded ads play when people choose to watch. Every ad is labeled, and Zurla paces each format toward your goals.

Ask Zurla

Brindle Blocks: no ads in the middle of a level. Where can they go?

Between moments, never inside one. Nothing shows from the opening move to the last. These four moments fit; add one call for each, and I’ll handle the pacing:

  • Level map, before Play: a banner
  • Results screen: a native card, labeled Ad
  • Every third level break: an interstitial
  • Out of lives: an extra life, if the player chooses to watch

4 placementsPaced for your D7 goal

Ask Zurla where ads fit
Format
Phone

Illustration: one phone runs three fictional apps, Brindle Blocks (a puzzle game by Sorrelby Games), Fernhop Recipes and Trailmint (a fitness app), and shows four ad formats in each. Native ads carry an Ad or Sponsored label and a small privacy icon, banners hold their space at standard sizes, interstitials show at natural breaks with a close button, and rewarded ads play when people choose to watch.

Swift Add one call:
let nativeAd = ZurlaNative(placement: "results_native")
val nativeAd = ZurlaNative("results_native")
let banner = ZurlaBannerView(placement: "map_banner")
val banner = ZurlaBannerView(this, "map_banner")
let breakAd = ZurlaInterstitial(placement: "level_complete")
val breakAd = ZurlaInterstitial("level_complete")
let rewardAd = ZurlaRewarded(placement: "extra_life")
val rewardAd = ZurlaRewarded("extra_life")
let nativeAd = ZurlaNative(placement: "feed_native")
val nativeAd = ZurlaNative("feed_native")
let banner = ZurlaBannerView(placement: "recipe_mrec")
val banner = ZurlaBannerView(this, "recipe_mrec")
let breakAd = ZurlaInterstitial(placement: "recipe_done")
val breakAd = ZurlaInterstitial("recipe_done")
let rewardAd = ZurlaRewarded(placement: "premium_unlock")
val rewardAd = ZurlaRewarded("premium_unlock")
let nativeAd = ZurlaNative(placement: "summary_native")
val nativeAd = ZurlaNative("summary_native")
let banner = ZurlaBannerView(placement: "history_banner")
val banner = ZurlaBannerView(this, "history_banner")
let breakAd = ZurlaInterstitial(placement: "workout_done")
val breakAd = ZurlaInterstitial("workout_done")
let rewardAd = ZurlaRewarded(placement: "bonus_plan")
val rewardAd = ZurlaRewarded("bonus_plan")
Full install

Same SDK, three apps. Native ads carry an Ad or Sponsored label in every app, banners keep standard sizes, and full-screen ads wait for a break. Ads are chosen from the app and the screen, never from workout or health data.

Illustrative data · fictional apps and brands

One session, paced

Illustrative data

Zurla’s calls this session

  1. Level 11 clearedInterstitial skipped: every third level, set for your D7 guardrail
  2. Level 12 clearedInterstitial shown, 1 of 2 this session
  3. Out of livesRewarded offered; the player chose to watch
  1. FeedNative card after the fourth recipe, labeled Sponsored
  2. Premium recipeThe cook chose to watch to unlock it
  3. Cooked itInterstitial after the recipe, never in cooking mode
  1. WorkoutNo ads
  2. Workout completeInterstitial after Done, then the summary
  3. Bonus planThe user chose to watch to unlock it

D7 retention: new players still playing on day 7.

  • Native

    Arrives as parts: headline, image, icon, button and advertiser name. You lay them out in your own views, or use a template you approve. Every one carries an Ad or Sponsored label and a small ⓘ privacy icon.

  • Banner

    320×50 on phones, 728×90 on tablets and 300×250 inside feeds and on results screens, plus adaptive banners that span the screen width. Space is held so your layout doesn’t jump, and refresh pauses when the banner is out of view.

  • Interstitial

    Full screen at natural breaks: a level ends, a recipe is done, a workout is saved. Each one has an Ad label, a clear close button and a Report ad option, and Zurla holds it back when a frequency cap (a limit on ads per user per session) or pacing rule says so.

  • Rewarded

    People choose to watch, for a reward you state up front: a life, coins, a hint, an unlocked recipe. The reward lands when the ad finishes, and anything of value can be confirmed to your server.

Revenue and retention

Set the balance.
Zurla tunes the rest.

The right ad load earns more today and keeps players coming back next week, and Zurla finds it for you. You don’t pick an ad load (how many ads players see): you tell Zurla the D7 retention to keep (the share of new players still playing seven days after install), and Zurla tunes interstitial pacing, rewarded offers and new-player rules to grow ad revenue while keeping D7 at or above that line. Each change is tested on a share of players, and the changes that stay all hold the line.

Ask Zurla · Brindle Blocks

Grow ad revenue, but keep D7 at 21% or better.

I’ve set an ad load (how many ads players see) that grows revenue and keeps D7 at 21%. I test each change on a share of players. D7 takes a week to read, so I watch day-1 returns too, and every change I keep holds the line.

  • Guardrail set: D7 at or above 21.0%
  • Interstitials every 3 levels
  • Rewarded offers up to 4 a session, for players who choose to watch
  • New players: no interstitials before level 5
  • Your Remove ads and coin rules kept

D7 guardrail 21.0%Expected $0.105 per daily player

Ask Zurla about revenue and retention

Retention guardrail Brindle Blocks, a puzzle game

Illustrative data
D7 retention Ad ARPDAU (ad revenue per daily player)

Zurla sets this from your chat. Drag to try another value.

Interstitials
Every 3 levels
Rewarded offers
Up to 4 a sessionplayers choose to watch
New players
No interstitials before level 5
Ad ARPDAUTotal ad revenuevs. a usual week
$0.105+18%
D7 retentionup from 21.0%
21.0%
Status
At your guardrail
  • Players who bought Remove ads: no banners, native ads or interstitials; rewarded stays, because they choose it (your rule)

  • Rewarded coins: capped at 3 a day, so the store keeps its value (your rule)

Illustrative data. Every app’s curve is different: Zurla measures yours by testing changes on a share of players against a holdout group, players who keep your current setup.

You stay in charge

Approval mode

Zurla suggests, you decide. Good for launch weeks.

Hard rules

Frequency caps (a limit on ads per player per session), minimum prices, and the advertisers or competing apps you’ve blocked: lines Zurla never crosses. Your retention guardrail decides which tested changes stay.

One-click undo

Return any change to how it was, with the reason logged.

Every kind of app

Your app. Your users.
Your goals.

Pick an app like yours: see what you’d ask Zurla, and how Zurla would run it.

Games

Rewarded ads players choose to watch.
Breaks that fit the game.

Rewarded offers come when players want them, and interstitials wait for level breaks, paced toward your D7 retention goal (new players still playing on day 7).

Ask Zurla

How are we doing since you went live?

Ad revenue per daily player is up 22%, and D7 retention held at 21% the whole way.

Ask Zurla about your app
Typical formats
  • Rewarded
  • Interstitial at level breaks
  • Banner on menus
+22%ad revenue per daily player (ARPDAU)
21%D7 retention, held at your guardrail

Utilities and tools

Earn without getting in the way

Short sessions call for light ads, and nothing interrupts a task.

Ask Zurla

Never interrupt someone mid-task.

That’s how I run it: banners on secondary screens, labeled native cards in lists, and interstitials wait until a task is done. Ad revenue per user is 15% higher than in your holdout group.

Ask Zurla about your app
Typical formats
  • Banner
  • Native in lists
  • Interstitial after a task
+15%ad revenue per user vs the holdout group
0ads in the middle of a task

News and media

Labeled native in the feed.
Spikes that pay.

Labeled native cards sit between stories, a 300×250 sits inside long articles, and readers who choose to watch can unlock a premium story.

Ask Zurla

How did we do when that big story broke?

Very well. As bids climbed, I raised your floors (minimum prices) on a fifth of story traffic. Those ads earned 27% more at the peak, and I eased off as traffic calmed.

Ask Zurla about your app
Typical formats
  • Native in the feed
  • Banner in articles
  • Rewarded unlock
16 msto price each request as a story breaks
+27%earned per ad at the peak

Health and fitness

Ads that wait for the cooldown

No ads during a workout, and ads are chosen from the app and the screen, never from workout or health data.

Ask Zurla

Is going easy on new members working?

Yes. With workouts ad-free and ads light in early weeks, 32% of new members are still active on day 30, against 27% with the same ads from day one.

Ask Zurla about your app
Typical formats
  • Native on summaries
  • Interstitial after a workout
  • Rewarded bonus plan
0ads during a workout
+5 ptsnew members still active on day 30

Social and communities

Revenue that keeps regulars coming back

Labeled native posts appear at a pace that suits your regulars, and Zurla watches D30 retention (members still active a month after joining) next to revenue.

Ask Zurla

Can our regulars see fewer ads while revenue grows?

Yes. I tested it with a fifth of your daily regulars: 20% fewer ads per session, keeping the better-paid ones. Each ad earned 35% more. Shall I roll it out?

Ask Zurla about your app
Typical formats
  • Native in the feed
  • Banner on profile pages
20%fewer ads per session for daily regulars
+35%earned per ad

Illustrative data

For your developers · Install

Zurla writes the setup.
You ship it once.

Ask Zurla for the setup, and Zurla writes it for your engine and your placements: add the SDK, start it once your consent tool has finished, and mark where ads may appear. After that, caps, pacing, floors (minimum prices) and which buyers are asked are Zurla settings, so those changes reach people the next time the app opens, without a new build or another round of app review. A new placement on a new screen takes a little code and ships with your next store release, and Zurla points out which changes need one.

Ask Zurla · Brindle Blocks

We’re adding you to Brindle Blocks. What does our team need to do?

Here’s your setup, written for your app and your engine. Your team adds it once:

  • SDK package, for your engine
  • Start call, after your consent tool and tracking prompt
  • Four placements, one call each
  • Attribution IDs for Info.plist, on iOS
  • Your DIRECT line for app-ads.txt, on the website in your store listing

Setup writtenAdded once

Shipped, with a phased release.

Good. I’m starting in approval mode: I suggest each change, and you decide.

Live in approval mode4 placements

Ask Zurla about your setup

D7 retention: new players still playing on day 7. Holdout group: people who keep your current setup. Attribution IDs: how Apple credits installs that come from ads. app-ads.txt: the public file on your website that lists who may sell your ad space.

Illustrative data

Built with

Written by Zurla · iOS

Using another engine? Ask us
Xcode · Add Package Dependencies
# Illustrative: the URL, library name and version are placeholders.
# In Xcode: File › Add Package Dependencies…
# 1. Paste this package URL into the search field:
https://sdk.zurla.com/ios/zurla-ios-sdk.git
# 2. Dependency rule: Up to Next Major Version, from 1.0.0.
# 3. Add the ZurlaSDK library to your app target.
# Building from a Package.swift instead? Add this to dependencies:
# .package(url: "https://sdk.zurla.com/ios/zurla-ios-sdk.git",
#          from: "1.0.0")
// Illustrative: ZurlaSDK, its API and the app key are
// placeholders until engineering confirms them.
import UIKit
import ZurlaSDK
// 1. Once, after your consent tool has finished (with Google UMP:
//    once canRequestAds is true) and after Apple's tracking prompt
//    (ATT), if your app shows it. Zurla reads both answers.
func startZurla() {
    Zurla.start(appKey: "ZRL-APP-000000") { result in
        if case .failure(let error) = result {
            print("Zurla didn't start: \(error)")
        }
    }
}
final class LevelViewController: UIViewController {
    // 2. One object for each placement in this screen.
    private let mapBanner = ZurlaBannerView(placement: "map_banner")
    private let resultsAd = ZurlaNative(placement: "results_native")
    private let levelBreak = ZurlaInterstitial(placement: "level_complete")
    private let extraLife = ZurlaRewarded(placement: "extra_life")
    private let resultsCard = ResultsCardView()
    private let player = "player-1234"  // your own player ID
    private var lives = 0
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(resultsCard)  // laid out like any of your views
        // Banner: pinned inside the safe area, with its space held.
        mapBanner.rootViewController = self
        mapBanner.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(mapBanner)
        let safe = view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            mapBanner.centerXAnchor.constraint(equalTo: safe.centerXAnchor),
            mapBanner.bottomAnchor.constraint(equalTo: safe.bottomAnchor),
        ])
        // Loads made before Zurla has started wait for it.
        mapBanner.load()   // refreshes on screen, pauses when hidden
        levelBreak.load()  // preload, ready for the break
        extraLife.load()
    }
    // Banner on the map screen, never during play.
    func mapOpened() { mapBanner.isHidden = false }
    func levelStarted() { mapBanner.isHidden = true }
    // Native: Zurla sends the parts. You lay them out, labeled Ad.
    func showResultsAd() {
        resultsAd.load { [weak self] ad in
            guard let card = self?.resultsCard else { return }
            card.headline.text = ad.headline
            card.label.text = "Ad · \(ad.advertiser)"
            ad.register(card)  // adds the ⓘ, counts views and taps
        }
    }
    // A natural break: the level is done. Never mid-level.
    func levelCompleted() {
        if levelBreak.isReady { levelBreak.show(from: self) }
    }
    // The player tapped "Watch an ad for an extra life".
    func playerChoseToWatch() {
        guard extraLife.isReady else { return }
        // playerID comes back in Zurla's signed callback to your server.
        extraLife.show(from: self, playerID: player) { [weak self] reward in
            // For coins or anything of value, grant the reward
            // from that server-side callback instead.
            self?.lives += reward.amount
        }
    }
}
final class ResultsCardView: UIView {
    let headline = UILabel()
    let label = UILabel()
}
<!-- Illustrative: add inside the <dict> of your Info.plist. -->
<!-- Needed if your app shows Apple's tracking prompt (ATT): -->
<key>NSUserTrackingUsageDescription</key>
<string>This lets us show you ads that fit your interests.</string>
<!-- Lets advertisers measure installs without identifying anyone. -->
<!-- Zurla supplies the list for both keys; these IDs are placeholders. -->
<key>SKAdNetworkItems</key>
<array>
  <dict>
    <key>SKAdNetworkIdentifier</key>
    <string>zrlbuyer01.skadnetwork</string>
  </dict>
  <dict>
    <key>SKAdNetworkIdentifier</key>
    <string>zrlbuyer02.skadnetwork</string>
  </dict>
</array>
<!-- AdAttributionKit reads its own key; the same IDs work in both. -->
<key>AdNetworkIdentifiers</key>
<array>
  <string>zrlbuyer01.skadnetwork</string>
  <string>zrlbuyer02.skadnetwork</string>
</array>
# https://sorrelby.example/app-ads.txt
# The developer website listed on your App Store and Google Play pages.
# Paste the exact line from your Zurla account.
# The account ID below is illustrative.
zurla.com, ZRL-000000, DIRECT

The line, field by field

zurla.comZurla’s domain

ZRL-000000Your account ID

DIRECTA direct relationship

Post it on the website in your store listing; buyers’ systems pick it up within a few days.

Zurla’s packagePlain text · 10 lines

Snippets are illustrative. Package names, APIs, versions and minimum OS are placeholders until the SDK ships; your real keys come with your account.

  1. 01

    Add the SDK

    Use Swift Package Manager in Xcode on iOS, Gradle on Android, the Unity Package Manager in Unity, pub.dev for Flutter or npm for React Native. Start Zurla once, after your consent tool has finished and after Apple’s tracking prompt (ATT), if your app shows it; setup runs in the background. Zurla reads both answers and doesn’t replace either.

  2. 02

    Mark your placements

    One call where each ad may appear: a banner on the map screen, a native card on the results screen, an interstitial at the level break, a rewarded offer when a player runs out of lives. Load full-screen ads ahead, and check they’re ready before you show one.

  3. 03

    Declare and publish

    Add Zurla’s line, marked DIRECT, to app-ads.txt (a public file on your developer website that tells buyers who may sell your ad space), on the site listed on your store pages. On iOS, add the attribution IDs Zurla gives you to Info.plist, for SKAdNetwork and AdAttributionKit (Apple’s ways for advertisers to measure installs without identifying anyone); Zurla keeps the list current, so refresh it when you ship. Then declare your data use in your app’s privacy manifest (a file listing what data is collected and why), your App Store privacy details and your Google Play Data safety form. Zurla’s own privacy manifest and data guide list what its SDK collects.

  4. 04

    Set goals, then ship

    Tell Zurla what matters: ad revenue, D7 retention, how many ads a session can hold. Ship with Google Play’s staged rollout or the App Store’s phased release; Zurla starts in approval mode.

For your developers · App performance

Your app keeps its pace.
Zurla keeps ads out of the way.

Ask Zurla how ads behave on any phone and any connection. One package in place of a mediation stack means fewer SDKs to update and test. Downloads, disk work and ad caching run off the main thread (the one that draws your app and handles taps), and full-screen ads load ahead of the break. Your app keeps its flow on every connection, even offline.

Ask Zurla · Brindle Blocks

Lots of our players play Brindle Blocks on the subway. How do the ads keep up?

Smoothly. I checked last week’s weak-signal sessions, and no player waited on an ad:

  • Weak signal: lighter ad files, preloaded 60 s ahead
  • Offline: play carried on, reward offer hidden
  • Weak-signal session report sent to your team

No waits from adsWeak signal to offline

How’s stability looking?

All clear. No crashes started in my SDK this week, and your app’s Android rates are low and steady, from the Play Console data you shared:

  • Crash rate 0.18%
  • ANR rate 0.11%
Ask Zurla about app performance

ANR: Application Not Responding, when Android offers to close a frozen app. Creative: the ad file itself.

Illustrative data

One play session

Illustrative data
Connection

Illustration: one six-minute play session. Your app runs without a pause: Launch, Level 12 at 0:40, a break at 3:00, Level 13 at 3:40 and Out of lives at 4:40. The Zurla SDK starts at launch with 4 ms on the main thread, and settings arrive from Zurla. An interstitial downloads ahead of the break and a rewarded ad ahead of Out of lives, where players choose whether to watch, and each is ready before its moment.

Auction timeout
90ms
Creative size limit
4MB
Preload lead
20s
At the break
Ad ready

  • Starts in the background

    Zurla.start returns at once and setup continues off the main thread. No ad shows before your app’s opening screen.

  • Ready before the break

    Interstitial and rewarded ads download ahead and wait on the device, so people never wait on a spinner. Banners and native ads load when their screen opens.

  • Smooth on any connection

    On a slow connection or offline, your app keeps going, reward offers appear once an ad is ready, and Zurla checks again later, spacing out each check.

  • Safeguards built in

    Zurla handles anything unexpected inside its own SDK, keeps heavy creatives out before they serve, and can turn a feature off remotely. Showing an ad is UI work, which iOS and Android keep on the main thread.

Stability and startup

  • Crash rate

    User-perceived crash rate: the share of daily users who saw the app crash

    0.18%

    Google Play bad-behavior threshold: 1.09%

  • ANR rate

    ANR means Application Not Responding: the share of daily users who saw the app freeze long enough for Android to offer to close it

    0.11%

    Google Play bad-behavior threshold: 0.47%

  • Main-thread time at start

    Time the SDK spends on the thread that draws your app and handles taps, as it starts

    4 ms

    A mid-range phone

Illustrative data: values from an app running Zurla. Zurla tracks crashes and ANRs that start in its own SDK, by SDK version; your app’s overall rates stay in Play Console and Xcode Organizer, and you can share them with Zurla. Exact SDK sizes come with each release.

Thresholds: Google Play’s Android vitals bad-behavior thresholds for a whole app are a 1.09% user-perceived crash rate and a 0.47% user-perceived ANR rate (8% for either on any single phone model), and apps under them keep their full visibility on Google Play. On iOS, Xcode Organizer reports crashes and hangs.

For your developers · Under the hood

Ask about any ad request.
Zurla shows every step.

Each time your app loads an ad, usually well before the break, Zurla reads the choices people made, screens the request, sets a floor (the minimum price a bid must meet) and runs the auction, in under 100 milliseconds on Zurla’s RTB (real-time bidding) infrastructure. Ask, or tap a step to see the standards behind it.

Format

Winning bid back in your app · 94 ms

Illustrative data

Ask Zurla · Brindle Blocks

What happens when Brindle Blocks asks for a level-break ad?

Here’s one, timed from your app’s call. The winner waits on the device for the break:

  • Read the player’s consent and tracking answers · 0 ms
  • Screened for known bots, checked your blocklists · 12 ms
  • Set the floor (minimum price) at $8.50 · 16 ms
  • Ran the auction, every buyer at once · 74 ms
  • Winning bid back in your app · 94 ms

Winning bid back94 ms

Ask Zurla about an ad request

IAB TCF v2.3: the ad industry standards body’s consent framework.

Illustrative data

Step 02

Checks

Before any buyer sees the request, Zurla filters known bots and invalid devices and checks the request against your rules. Deeper checks for emulators, device farms and SDK spoofing run after the ad serves, and traffic they flag is kept out of later auctions.

The standards behind it
Invalid traffic
Known bots and invalid devices filtered before the auction (GIVT, general invalid traffic), with deeper checks after the ad serves (SIVT, sophisticated invalid traffic) for emulators, device farms and SDK spoofing (fake requests that pretend to come from a real app)
App identity
Your bundle ID and store listing, matched to your app-ads.txt (a public file on your developer website that tells buyers who may sell your ad space)
Age rating
Ads held to what suits your app’s age rating
Your blocklists
Advertisers, categories and competing apps you never want to promote
Ad scanning
Creatives scanned for malware and forced redirects, including jumps to an app store without a tap

Step 03

Price

Your caps were already checked on the device. Zurla sets a floor (the minimum price a bid must meet) for this placement, format and country, aimed at your goals.

The standards behind it
Floors
Set per request by placement, format and country; in the open auction, the same floor for every buyer, and private deals carry the price agreed in the deal
Caps and pacing
Counted on the device, so they work without an advertising ID. Pacing applies when an ad would show, so a preloaded ad waits if it’s too soon
Retention guardrail
Pacing changes are tested against the D7 retention you set (new users still active seven days after install), and Zurla keeps the ones that hold it
Hard rules
Minimum prices Zurla never goes under

Step 04

Auction

Buyers bid at the same moment: no waterfall, no tiers. Zurla builds each request from the SDK’s call, with its full supply path: a short, direct route to your app, which is what buyers look for.

What Zurla sends buyers · bid-request.json · app, imp, sourceOpenRTB 2.6iOS

Your app calls the SDK; Zurla builds this request for buyers. You never write or send it.

{
  "app": {
    "bundle": "<App Store ID>",
    "storeurl": "<App Store URL>",
    "publisher": { "id": "ZRL-000000" }
  },
  "imp": [{
    "id": "1",
    "tagid": "level_complete",
    "instl": 1,
    "secure": 1,
    "bidfloor": 8.5,
    "bidfloorcur": "USD",
    "banner": { "w": 320, "h": 480, "api": [6, 7] }
  }],
  "source": {
    "schain": {
      "ver": "1.0",
      "complete": 1,
      "nodes": [{ "asi": "zurla.com", "sid": "ZRL-000000", "hp": 1 }]
    }
  }
}
app.bundle names your app (the App Store ID on iOS, the package name on Android). instl marks a full-screen ad, rwdd one where the player earns a reward for watching, bidfloor the floor from the Price step, and schain a direct path to your app.
The standards behind it
OpenRTB 2.6 and Native 1.2
The formats buyers already use, with an app object that names your app. Zurla builds the request; your app never sends one
instl and rwdd
Tell buyers an ad is full screen, or that the player earns a reward for watching it
VAST, MRAID and OM SDK
The IAB standards for video ads, interactive ads and measuring whether ads were seen
app-ads.txt
Your line for Zurla marks a direct relationship
sellers.json and supply chain
Zurla lists you as the seller, and each request carries its supply chain
SKAdNetwork
iOS requests list the attribution IDs your app supports, so advertisers can measure installs without identifying anyone

Step 05

Report

The winning ad waits on the device until its moment. At the next natural break, if your caps allow, it shows full screen with an Ad label, a clear close button and a Report ad option. Each ad is logged with what it earned.

The standards behind it
Impression-level revenue
What each ad earned, sent to your analytics so you can see ad revenue per user and the return on your user-acquisition spend
Reward check
Signed server-side callbacks confirm each reward to your server
Viewability
Measured with the IAB Tech Lab’s OM SDK (Open Measurement), counted to the guidelines of the MRC (Media Rating Council) that buyers use
Retention view
D1, D7 and D30 retention (people still using the app on day 1, 7 and 30) for people who see ads, against a holdout group (people who keep your current setup)
Change log
What Zurla changed, why and what it earned, with one-click undo

Who does what
Your app Zurla
Consent

Runs your consent tool: IAB TCF v2.3 (the ad industry standards body’s consent framework), GPP (the Global Privacy Platform, for US national and state choices) and, if you use it, Google UMP (Google’s User Messaging Platform).

Reads the answers your consent tool saves, before every request, and never replaces the tool.

Tracking prompt (ATT, iOS)

Decides whether and when to show Apple’s prompt, with a purpose line you write.

Reads the answer. Without permission there is no IDFA (Apple’s advertising ID), and ads are chosen from context.

Advertising ID (Android)

Keeps or removes the AD_ID permission (which lets an app read Android’s advertising ID); apps for children remove it.

Uses the ID when it’s available and allowed, and honors resets and deletion.

Install measurement (iOS)

Adds the attribution IDs Zurla supplies to Info.plist.

Supports SKAdNetwork and AdAttributionKit, Apple’s ways for advertisers to see which ads led to installs without identifying anyone, and keeps the ID list current for your next release.

Privacy manifest (iOS)

Declares its own data use in its privacy manifest (a file listing what data is collected and why) and in App Privacy details in App Store Connect. Xcode’s privacy report combines your manifest with Zurla’s.

Ships its own privacy manifest in the SDK, with the approved reason for each required-reason API (system calls Apple asks SDKs to justify) it uses.

Data safety (Google Play)

Submits the Data safety form.

Gives you a guide to what its SDK collects and shares, and why.

Children

Decides and declares its audience, and flags child-directed traffic.

Follows the flag with contextual ads and no advertising ID, under COPPA (the US children’s online privacy law).

Reporting ads

Nothing extra to build.

Puts a ⓘ privacy icon and a Report ad option on its native and full-screen ads, so people can flag an ad that seems inappropriate.

Questions

Good to know.

Ask Zurla

Do we still need an ad ops team?

No. I do the daily ad work: buyers, minimum prices, ad caps, pacing, tests and reports. Your team keeps the placement code and the releases.

Ask Zurla a question
What does Zurla replace?

Your mediation SDK and the demand SDKs it relies on. Zurla runs the mediation and the auction itself, so it takes the place of your mediation platform rather than sitting inside it. Buyers connected to Zurla bid on each ad at the same moment, in one auction on Zurla’s RTB (real-time bidding) infrastructure, so there are no waterfalls or price tiers for your team to maintain. Your analytics and attribution SDKs stay as they are.

Do I still need an ad ops team?

No. Once the SDK is live, Zurla does the daily ad work: buyers, floors (minimum prices), frequency caps (a limit on ads per user per session), pacing, tests and reports. Your team keeps the placement code and the releases. Changes that affect revenue or retention are tested on a share of users before they roll out, and any change can be undone in one click. Zurla is a frontier large language model, built for advertising.

Will I keep the demand I have today?

Every buyer that bids through Zurla’s auction carries over. Before you switch, we map which of your current sources bid through Zurla, placement by placement, and plan the move with you. Google Play’s staged rollout and the App Store’s phased release let you ramp it up, and older app versions keep your current setup until people update.

Which formats and platforms does it support?

Four formats: native, banner, interstitial and rewarded (people choose to watch). It runs in iOS and Android apps on phones and tablets, with SDKs for native iOS (Swift Package Manager), Android (Gradle), Unity, Flutter and React Native. Using another engine? Ask us.

How does Zurla keep retention strong?

Zurla works to keep retention at or above the guardrail you set. Tell it the D7 retention to keep (the share of new users still active seven days after install), and Zurla sets interstitial pacing, rewarded offers and new-user rules to match. It tests changes on a share of users against a holdout group, people who keep your current setup, and keeps the changes that hold D7 at or above your guardrail.

Can I change ads without an app update?

Yes, for day-to-day changes. Frequency caps (a limit on ads per user per session), pacing, floors (minimum prices), which buyers are asked, banner refresh and turning an existing placement on or off are Zurla settings, so they reach people without a new build. A new placement on a new screen, a native layout change or an SDK update takes code and ships with your next store release, through App Review and Google Play review as usual. On iOS, new install buyers also need their SKAdNetwork IDs, which ship with your next release. SKAdNetwork is Apple’s way for advertisers to measure installs without identifying anyone.

How does the SDK keep my app fast and stable?

Zurla built it to stay out of your users’ way. It starts in the background, keeps downloads and disk work off the main thread, and loads full-screen ads ahead of the break, so your app keeps its flow on every connection. Zurla tracks crashes and ANRs (when Android reports that an app isn’t responding) that start in its own SDK, by SDK version, and can turn a feature off remotely. Your app’s overall rates stay in Play Console and Xcode Organizer. Exact sizes come with each release.

Does Zurla show Apple’s tracking prompt?

No. Your app decides whether and when to show Apple’s App Tracking Transparency (ATT) prompt, which asks people whether an app may track them across other companies’ apps and websites. Zurla reads the answer. If the person declines or isn’t asked, Zurla uses no IDFA (Apple’s advertising ID) and chooses ads from context: the app, the screen and the country. Advertisers can still measure installs through Apple’s SKAdNetwork and AdAttributionKit, which don’t identify the person.

Does it work with my consent tool?

Yes, if your consent tool supports the standards of the IAB (the ad industry’s standards body), as major consent tools do. Zurla reads the IAB TCF v2.3 and GPP (Global Privacy Platform) answers your tool saves on the device, including those from Google’s User Messaging Platform (UMP) if you use it. Zurla never replaces your consent tool. Without consent for personalized ads, ads are chosen from context: the app, the screen and the country.

Can I use Zurla in an app for children?

You decide and declare your app’s audience. Flag child-directed traffic, and Zurla follows the flag with contextual ads and no advertising ID, under COPPA (the US children’s online privacy law). Before you add ads to an app for children, check the store rules with us: Google Play’s Families policy requires ads shown to children to come from self-certified ads SDKs, and Apple’s Kids Category sets strict limits on third-party ads.

What do I need for App Store and Google Play review?

Zurla ships its own privacy manifest (a file listing what data is collected and why) inside the iOS SDK and gives you a guide to what its SDK collects for Google Play’s Data safety form. You declare your app’s data use in its privacy manifest and App Privacy details, and in your Data safety form. Then add Zurla’s attribution IDs to your Info.plist, and Zurla’s line, marked DIRECT, to app-ads.txt: the public file on the developer website in your store listing that tells buyers who may sell your ad space. Review decisions stay with Apple and Google.