Getting started: your first Braket tournament
This is a hands-on walkthrough. By the end you will have an arena on Braket, branded for your game, connected to your Steam AppID, and you will have run a tournament from registration through to a resolved podium. No game code is required for this chapter; you only need a browser and your Steam account.
1. Create your arena
An arena is your studio's isolated tenant. It has a slug, a Steam AppID, and a name.
- Slug: the subdomain your arena is served from. If your slug is
summergame, your arena lives athttps://summergame.braket.gg. The slug is unique across Braket and becomes part of every URL, invite link, and API base URL, so choose it deliberately. It is stored astenants.slugand cannot collide with another arena. - Steam AppID: the numeric Steam application id of your game. This is what ties tournament matches to "your game running on Steam". It is stored as
tenants.steamAppIdand is required. The demo/reference AppID used throughout these docs is4273350. - Name: the human-readable title shown across the arena, for example "Summer Game".
When an arena is first created its status is sandbox. In this state you can configure everything and run test tournaments with mock personas before you go live. Statuses progress sandbox to active to (if ever) suspended or archived.
2. Branding
Each arena carries its own look, stored as a JSON theme (tenants.themeJson) covering colors, fonts, logo, and links. A null theme falls back to the platform default look. You also control:
- Custom domain (
tenants.customDomain): an extra hostname that serves your arena besides the<slug>.braket.ggsubdomain, for exampleplay.summergame.com. This is the origin used for the OpenID realm, share links, and invite emails when set. - About text (
tenants.aboutText): plain-text prose for your arena's about page. - Directory visibility (
tenants.visibility):listedarenas appear in the public braket.gg arena search;unlisted(the default) do not. - Steam store metadata: Braket caches your game's public Steam store metadata (name, header image, genres) from the public
appdetailsAPI for cards and genre filtering.
These are all set from the arena's Admin area under Site settings.
3. Steam sign-in works immediately (no keys)
Player sign-in uses Steam OpenID, which requires no API keys at all. As soon as your arena exists, players can sign in at /auth/login with their Steam account, and Braket learns their SteamID64. In your arena's local development / sandbox you can sign in as fixture personas without real Steam at all.
To show real persona names and avatars, and to unlock game-verified results and Steam trophies, you add Steam Web API keys. That is the subject of the next section; you can run a full tournament without them (mock personas or basic OpenID identity suffice), so it is fine to skip on your first pass.
4. Add your Steam keys (optional for a first run)
Two tiers of Steam Web API key exist, and they do different things:
- A normal Web API key (
STEAM_WEB_API_KEY, or per-arena the vault secretweb_api_key) unlocks persona names, avatars, and friend lists viaGetPlayerSummariesand friends endpoints. - A publisher Web API key (
STEAM_PUBLISHER_API_KEY, or the vault secretpublisher_api_key) unlocks publisher-only features: Steam Inventory Service trophies, partner leaderboards, and cruciallyAuthenticateUserTicket, which is what verifies game-client result submissions.
You add these in Admin under Steam settings. When you save a key it goes straight into the encrypted vault (see Trust and data); the plaintext is never stored in the arena database. See Steam integration for exactly what each tier can and cannot do.
5. Mint a publisher key and go live
To activate real Steam integration (real personas, trophies, and game-verified results) you enter your publisher Web API key and it is verified against your AppID. Once that is in place, your arena can move from sandbox to active.
6. Run a tournament end to end
From the Admin area, create a tournament. The key settings you choose (all stored on the tournaments row) are:
| Setting | Field | Default | Meaning |
|---|---|---|---|
| Name | name |
(required) | Display title |
| Slug | slug |
(required) | Unique per arena; used in URLs and the API |
| Format | format |
groups_playoffs |
World Cup (groups_playoffs) or straight knockout (playoffs_only) |
| Registration opens | registrationOpensAt |
(required) | When players may register |
| Registration closes | registrationClosesAt |
(required) | Registration cutoff |
| Max players | maxPlayers |
32 | Registration cap |
| Group size | groupSize |
4 | Players per round-robin group |
| Qualifiers per group | qualifiersPerGroup |
2 | How many advance from each group to playoffs |
| Group stage starts | groupStageStartsAt |
(required) | When the group stage begins |
| Round duration | roundDurationHours |
48 | Length of each match window |
| Allow spectators | allowSpectators |
true | Whether third parties may cast the match (from its recording) |
| Min players per side | teamMinPlayers |
1 | 1 for classic 1v1 |
| Max players per side | teamMaxPlayers |
1 | Greater than 1 for NvM team battles |
Then the lifecycle proceeds through these tournament statuses: draft, registration_open, registration_closed, group_stage, playoffs, completed (or cancelled). See Tournament formats and lifecycle for the full state machine.
The end-to-end flow:
- Registration. Players sign in and register while the tournament is
registration_open(subject tomaxPlayers). You can also invite players by link, email, or Steam friend invite. - Group stage. When you generate the group stage, Braket splits registrants into groups of
groupSizeand creates a round-robin schedule. Each match is a scheduled window[opensAt, closesAt]of lengthroundDurationHours. - Ready up and play. Within a match window each player marks themselves ready. When both are ready and fresh, the match goes live, Braket mints a per-match session nonce, and the players play your game on Steam.
- Report the result. Without any game integration, one player reports the winner and score, and the opponent confirms (or disputes). Uncontested reports auto-confirm after a grace period. Admins can override anything. See Result verification: the resultSource model.
- Standings and qualifiers. Group standings rank players by points with tiebreakers; the top
qualifiersPerGroupper group are seeded into the playoff bracket. - Playoffs. Single-elimination bracket resolves down to a final. Semifinal losers meet in a small final (third-place match).
- Podium and trophies. The bracket resolves 1st, 2nd, and 3rd. With a publisher key, the top three receive a Steam-visible tournament trophy (Steam Inventory Service item); in mock mode a mock grant is recorded. The tournament is stamped
completedand anchored to a ladder season.
7. See it over the API
Everything you just produced is immediately readable over the REST API. For example:
curl https://summergame.braket.gg/api/v1/tournaments/summer-cup | jq '.podium'
returns the resolved podium. See Public REST API reference.
8. Mint a public API key
To raise your API rate limit from 60 to 600 requests per minute and to prepare for future write scopes, mint an API key in Admin, Site settings, API keys. The full key (bk_<prefix>_<secret>) is shown once at creation and stored only as a SHA-256 hash. It is bound to your arena and ignored on any other host. Revoke it any time.
Where to go next
- To let your game report results automatically instead of players clicking, read The game-client result protocol (dual attestation) (any engine) or Unreal Engine SDK reference (Unreal).
- To understand exactly what Steam keys unlock, read Steam integration.
- To understand result trust and disputes in depth, read Result verification: the resultSource model.