Going live & ads.txt
Going live means real brands can buy Bonus Rounds in your game and you start earning 70% of net ad revenue. It takes a few minutes of setup.
Checklist
-
Your game is detected and learned
The game's status should be
ready: the SDK has pinged from your domain and our play agent has finished learning the game. If the game needs an account to play, give the agent a test login (Game → Settings → Agent login). It's stored encrypted and typed by the agent through a secret tool, so the model never sees it. -
Your domains are registered
Ads are only served to pages on your game's domains. The domain of the URL you registered is included automatically, along with its subdomains (
play.mygame.comcounts formygame.com). Add other hosts (an itch.io page, the CDN host that serves your game iframe) in Settings, or via the API withPATCH /api/games/:id { "domains": ["mygame.com", "mygame.itch.io"] }.localhostalways works for development. -
Say whether your game is made for kids
Game → Settings → Is this game made for kids? Answer Yes, Mixed audience or No. You can't go live until you've answered. See Games for kids below for what each answer changes.
-
Add the ads.txt lines
ads.txt (IAB Tech Lab, version 1.1) is the industry standard that tells brands which ad networks are allowed to sell your inventory. Add these lines to
https://yourdomain.com/ads.txt(create the file if you don't have one; it lives at the root of your domain):# Bonus Round (bonusround.io) bonusround.io, pub_XXXXXXXX, DIRECT OWNERDOMAIN=yourdomain.comDIRECTmeans you sell through your own Bonus Round account.OWNERDOMAINis your own business domain. It appears once per file: if your file already has anOWNERDOMAINline, keep yours and skip ours.- Don't add a
MANAGERDOMAINline for us. We're the ad system, not your manager;MANAGERDOMAINis only for a company that runs your whole ad stack for you.
Your exact lines are on your game's Integration tab, and at
GET https://bonusround.io/v1/ads.txt?pub=pub_XXXXXXXX(the record line alone isgame.snippet.adsTxtin the API). We fetch your/ads.txtabout once a day (user agentBonusRoundAdsTxtBot/1.0) and show on the Integration tab whether we found the line; Check now re-checks on demand. Games on shared hosts such as itch.io or GitHub Pages can't host the file at the domain root; that's fine. -
Turn test mode off
Dashboard → your game → Settings → Test mode off. Or
PATCH /api/games/:id { "testMode": false }. From now on requests go to the auction instead of the Fizzpop test ad.break('test')still plays Fizzpop whenever you want. -
Check your settings
Formats and triggers, the hourly frequency cap, floors and blocked categories. The defaults are sensible: every format on, interval every 5 minutes, 4 takeovers per player per hour, floors of $2.00 CPM (takeover) and $0.50 CPM (ambient).
sellers.json
We publish https://bonusround.io/sellers.json (IAB Tech Lab sellers.json 1.0), the public list of everyone we sell inventory for, so brands can check your ads.txt line against it. Your seller ID is your publisher ID (pub_…) and your seller type is PUBLISHER. Games appear once they're live.
Individuals are listed as confidential by default: just the seller ID, no name or domain. Businesses can choose to be named (legal name and business domain, which should match your OWNERDOMAIN). Change it on your game's Integration tab under sellers.json listing.
Games for kids
COPPA (US), GDPR-K (EU) and the UK Children's Code protect players under 13. Bonus Round serves those games contextual ads only, and so does any game where kids may be playing:
| Your game | Ads |
|---|---|
| Made for kids: Yes | Contextual only, and restricted brands (alcohol, gambling, energy drinks and the rest) are blocked |
| Mixed audience (kids are one of your audiences) | Contextual only, restricted brands blocked |
| Not answered yet | Contextual only |
| No, but rated Everyone / Everyone 10+, not rated yet, or our agent sees kid-directed signals | Contextual only |
| No, and rated Teen or above | Standard: an anonymous player id for frequency caps, where the browser allows storage |
Contextual only means: no player IDs, cookies or local storage; no behavioural targeting or cross-game profiles; frequency caps per play session only (the "support for internal operations" COPPA allows); IP addresses never stored. Details in Events & measurement → Privacy. Set it in Game → Settings, or PATCH /api/games/:id { "settings": { "madeForKids": "yes" | "mixed" | "no" } } (the older directedToChildren: true still means Yes).
Portals (Poki, CrazyGames, GameDistribution, Y8)
These portals don't allow third-party ads in the games they host. If your game also runs on one of them, you don't need a separate build: the SDK notices (from the page's hostname, the embedding page's origin or the referrer) and switches itself off there. That's portal mode:
- No ad requests, no SDK code beyond the small loader, nothing drawn.
attach()resolves{ mode: 'off', portal }and everybreak()orrewarded()resolves{ filled: false, reason: 'portal' }, so your game carries on. BonusRound.debug().warningssays which portal was detected and how.- The loader sends one ping marked with the portal, so your game's dashboard can show a notice. It doesn't count as an integration and never starts our agent.
Covered: Poki (including its game CDN), CrazyGames, GameDistribution and Y8, and their subdomains. The list lives in one place in the SDK and we keep it up to date; tell us if you see a portal we missed.
When do real ads start?
Bonus Rounds are generated per game. When your game is ready, it becomes a match for brands whose audience, safety settings and style fit it. Each brand that picks your game has its agents generate a round specifically for it and reviews it in your game before it can run. Expect fill to start low and rise as brands find your game.
Until then, break() resolves immediately with filled: false and reason: 'no_eligible_campaigns', and your game carries on as usual.
Floors and the auction
- Every request runs a second-price auction among brands with an approved round for your game. The winner pays just enough to beat the runner-up, never less than your floor.
- Brands bid in one of three ways: per 1,000 viewable impressions (vCPM), per engaged player (CPE) or per click (CPC). Everything is converted to an effective CPM using predicted rates for your game, so they compete fairly.
- Your floor (
settings.floorCpmMicros) is in micros per 1,000 impressions:2000000= $2.00 CPM. A higher floor means higher prices and lower fill.