Arcade

For developers

Put your web game in front of players

Shipped a browser game? Don't let it sit on a bare domain. Submit it to the Bounty Board Arcade and it comes with players, leaderboards, audience stats, and a marketing layer that puts creators to work on your game. Free, no payment setup required.

  • Free, no payment setup
  • Submit in ~5 minutes
  • You keep ownership

How it works

Live in three steps

  1. 1

    Create a free studio account

    Solo dev or team. No fees, no payment setup, about two minutes.

  2. 2

    Submit your game

    Link a game URL or upload a build (.zip), plus a title and square thumbnail. Two minutes; no SDK required to start.

  3. 3

    Go live

    After a quick review your game is live in the arcade with play tracking and leaderboards. List it on the marketplace anytime to run creator campaigns.

Two paths in

Two ways to bring your game

  • You host it

    Link a URL

    Already hosting your game? Paste an https URL that drops players straight into play. You keep your domain and your build, we just embed it.

    Best when your game already lives on your own site. It just needs to allow iframe embedding (we check before you submit).

  • We host it

    Upload a build

    No host of your own? Drop a host agnostic HTML5 build as a .zip and we host it for you: Godot 3 or single-threaded Godot 4.3+, Unity WebGL, GameMaker HTML5, Construct, Three.js, PlayCanvas, Phaser, or plain HTML5/Canvas.

    index.html at the root, uncompressed, up to 64 MB per file, 250 MB total, and 160 files. Cloud saves and leaderboards come free through the SDK, and you can upload a new build whenever you like. The live one keeps serving while the update clears a quick re-review.

Need help with an unsupported build?

Precompressed Unity, an odd engine, or a submission that won't go through? Reach out and we'll get your game in.

Everything included

What your game gets

  • Players, instantly

    Your game on the arcade wall next to a curated catalog. Daily picks, featured rails, and Jump back in keep people playing.

  • Leaderboards built in

    Three lines of JavaScript give your game real high score boards. Every game gets weekly top player boards automatically, no code at all.

  • Your audience, counted

    Plays, unique players, and playtime per game on your studio dashboard.

  • A marketplace on-ramp

    Once approved, list your game on the marketplace in a couple of clicks. Prefilled from your submission, shown on your studio profile and the community page with a "Play in arcade" tag.

  • The marketing layer

    Start campaigns and creators make content for your game, and the players already on your page see them first. Opt in to page ad share and the display ad on your game's page pays your studio 90% by default, whether you host the URL or we host your build. Approved hosted builds can also join rewarded ad revenue share.

  • WebXR welcome

    VR games get the headset permission, a VR badge, and the /arcade?vr=1 filter, playable straight from a Quest browser.

Make it count

Set your game up to win

  • Start in seconds

    Players decide fast. Skip splash and title screens and drop them straight into gameplay, and keep your build lean (~10 MB is a good target) so it loads quickly on any connection.

  • Play anywhere

    A big share of plays are on phones. Add touch controls and, where you can, support both portrait and landscape. Games that work in portrait reach the most players.

  • One click in

    No installs and no login wall before the fun. The arcade embeds your game and players are in instantly, so a linked URL just needs to allow iframe embedding.

The SDK

Leaderboards in three lines

Optional but worth it: drop the SDK into your game and players compete for real high-score placement, and guests who set a score get nudged into an account to claim it. The same SDK also powers lifecycle events, cloud saves, A/B experiments, WebXR playtime, allowlisted rewarded ad breaks, and separately approved multiplayer. Casual games can use Bounty Board's built-in 2-64 player relay lobby without server code; trusted competition can use a bespoke referee module or a registered mature external authority. Read the full Arcade SDK docs, or grab @bountyboard/arcade-sdk on npm when your game has a build step.

Leaderboards
<script src="https://www.bountyboard.gg/arcade-sdk/v1.js"></script>
<script>
  BBArcade.init();                // returns a Promise; no await needed here
  BBArcade.gameLoadingFinished(); // your game finished loading
  BBArcade.gameplayStart();       // player started a run
  BBArcade.submitScore(1250);     // whenever the score changes
  BBArcade.gameplayStop();        // player died / paused
  BBArcade.gameOver(1250);        // final score
</script>

Rewarded ads

Rewarded ads are allowlisted during review for approved Partner games hosted by Bounty Board. Call BBArcade.prepareRewardedAd() while your own “Watch ad for reward” button is disabled, enable it only when preparation is ready, then call prepared.show() directly inside that click/tap handler. Grant only when the final status is viewed; dismissed or unavailable ads stay non-rewarding and the normal fallback remains available. Bounty Board runs the AdSense account, attributes revenue per game, and pays your studio its share (90% by default) in monthly Stripe settlements once your accumulated balance clears the $50 minimum. Externally hosted embeds can't join rewarded ads yet: their revenue has no payable per game attribution until provider backed reporting lands. Page ad share is separate and works for both hosting modes. The display ad on your game's arcade page is attributed per page URL, so it pays out whether we host your build or you host the URL.

Rewarded ad
const watchAdButton = document.querySelector('#watch-ad');
watchAdButton.disabled = true;

const prepared = await BBArcade.prepareRewardedAd({
  placement: 'revive',
  reward: 'extra_life',
  onStart: () => pauseAudio(),
});

if (prepared.status === 'ready') {
  watchAdButton.disabled = false;
  watchAdButton.addEventListener('click', async () => {
    const resultPromise = prepared.show(); // call directly from this click
    watchAdButton.disabled = true;
    const result = await resultPromise;
    resumeAudio();
    if (result.status === 'viewed') giveExtraLife();
    else showNoReward(result.status); // dismissed/unavailable/error: no reward
  }, { once: true });
} else {
  showAdUnavailable(); // no reward; keep the normal fallback available
}

Multiplayer lobbies

Multiplayer is reviewed and enabled per game; submitting a build does not turn it on automatically. An approved game on Bounty's shared room service gets the built-in relay when it has no bespoke referee module. Players can quick match into the public room or share a generated four-character invite code. The first relay seat chooses joinData.roomSize from 2-64 (default 8), and the oldest retained seat is host. Relay messages are public to every player, including the sender: never send secrets or hidden game state.

Relay payloads are capped at 1 KiB, 15 messages per player and 120 per room each second; byte/rate drops are silent and appear in state.dropped. Relay is endless and client trusted, so it never emits authoritative results or reports a winner to Bounty Board. Competitive or reward bearing play needs a reviewed referee module or a mature external authority. External authorities keep their single simulation and add an isolated signed ticket adapter; they own capacity and matchmaking, so match: true is unavailable there.

Multiplayer lobby
async function enterLobby() {
  if (!BBArcade.multiplayer) return showSoloFallback('unsupported');

  try {
    const room = await BBArcade.multiplayer.joinRoom({
      create: true, // or code: 'ABCD', or match: true for public quick match
      // The first relay seat may choose an integer roomSize from 2-64 (default 8).
      joinData: { roomSize: 8, avatar: 'golem' }, // always untrusted
    });

    // The initial welcome is already reflected in these fields.
    renderLobby(room.code, room.players, room.state);
    room.on('playerJoin', () => renderPlayers(room.players));
    room.on('playerLeave', () => renderPlayers(room.players));
    room.on('snapshot', ({ state }) => renderRoomState(state));
    room.on('event', event => {
      if (event?.type === 'relay') receivePublicMessages(event.messages);
      else if (event?.type === 'relay_host') setHost(event.hostId);
      else handleRefereeEvent(event);
    });
    room.on('connection', ({ reconnecting }) => setReconnecting(reconnecting));
    let ended = false;
    room.on('close', ({ reconnecting }) => {
      setReconnecting(reconnecting);
      if (!reconnecting && !ended) showConnectionClosed();
    });
    room.on('end', ({ results }) => {
      ended = true;
      showResults(results); // relay rooms never emit end
    });
    onGameMessage(data => {
      // Relay sends this to every seat; never put private/hidden data in it.
      if (!room.trySend(data)) {
        if (!room.connected) setReconnecting(true);
        else showSendFailure();
      }
    });
    onExit(() => room.leave());
    return room;
  } catch (error) {
    showSoloFallback(error.code || 'error');
    return null;
  }
}

Cloud saves

Uploaded builds run sandboxed with no localStorage, so player progress saves through the SDK instead, stored per player and synced across devices (about 1 MB each).

Cloud saves
await BBArcade.save(JSON.stringify(state)); // persist progress (logged-in players)
const data = await BBArcade.load();         // your saved blob, or null

WebXR (VR) games

VR games get the headset permission and the arcade's VR filter out of the box. Wire two extra calls to your XRSession so playtime keeps tracking while the headset hides the page, credited as VR time:

WebXR
BBArcade.xrSessionStart();  // after navigator.xr.requestSession(...)
BBArcade.xrSessionEnd();    // in the XRSession 'end' event

Publishing questions, answered

Yes. Submit a hosted URL or an HTML5 build to the Arcade. Submissions are reviewed before going live, and approved games can add leaderboards, cloud saves, and rewarded ads through the Arcade SDK.

Submit your game

Browser playable HTML5 and WebGL games, either linked from a URL you host or uploaded as a build with index.html at the root, up to 64 MB per file, 250 MB and 160 files total. Games go live after a quick review for playability and content. Approval lists the game in the Arcade; it does not guarantee traffic or creator coverage.

Submit your game

You do. Publishing in the Arcade never transfers ownership of your game, code, or IP, and you can delist your game whenever you want. Publishing also does not automatically create a marketplace campaign.

URL linked games update whenever you deploy to your own site. Uploaded builds update by submitting a new build from your dashboard, which replaces the live version.

Eligible Arcade studios keep 90% of finalized ad revenue attributed to their game, settled monthly via Stripe once the 50 dollar minimum is reached. Revenue shown before a month closes is an estimate. Terms apply.

Arcade ad revenue terms

The Arcade SDK adds leaderboards, cloud saves, multiplayer rooms, and rewarded ads to approved HTML5 games with a few lines of code. Integration is optional, games can go live in the Arcade without it.

Arcade SDK docs

Your game deserves players

Most reviews complete within 2 business days. We'll email you either way. Link your own URL and keep your domain, or upload a build and we host it. Either way you keep ownership.