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
Create a free studio account
Solo dev or team. No fees, no payment setup, about two minutes.
- 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
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.
<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.
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.
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).
await BBArcade.save(JSON.stringify(state)); // persist progress (logged-in players)
const data = await BBArcade.load(); // your saved blob, or nullWebXR (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:
BBArcade.xrSessionStart(); // after navigator.xr.requestSession(...)
BBArcade.xrSessionEnd(); // in the XRSession 'end' eventPublishing 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.
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.
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.
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.
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.