Free bracket maker and tournament widgets
Make a bracket in seconds, put a live tournament on your website, or add the bracket to your stream. Free, with no account and no API key.
The bracket maker makes a bracket from a list of names in seconds, with no account. It is for office pools, game nights, classroom contests or anything where you just need the bracket, not sign ups.
Make one
- Open the free tools page and type the names, one per line, strongest first if you want seeds.
- Pick the format: single elimination, double elimination, round robin or swiss.
- Tap a match and enter its score. The winner moves on and the next round fills in.
- Copy the link to share it, or the embed code to put it on your site.
Everything about the bracket lives in its address, so the link always shows exactly the bracket you made, results included. Nothing is saved on our side and nothing expires.
Need sign ups, check in, players reporting their own scores or a prize? Host a real tournament instead. It is also free.
How the address works
A bracket's address carries everything:
https://roundswon.com/embed/bracket?teams=Alpha,Bravo,Charlie,Delta&format=single&results=r1-0:2-1,r1-1:0-2,r2-0:3-1
teamsare the names in seed order. Seed 1 meets the lowest seed in round one, and byes go to the top seeds when the count is not a power of two.resultsare the finished matches. Each one is<match key>:<score>-<score>, the first score being the top side of the match.
Match keys
Each match has a key that says where it sits in the bracket. Numbers count from 0, top to bottom.
| Format | Keys | Example |
|---|---|---|
| Single elimination | r<round>-<match>, and third for the third place match | r1-0 is the first match of round 1, r3-0 the final of an 8 player bracket |
| Double elimination | w<round>-<match> winners side, l<round>-<match> losers side, gf grand final, gf2 the reset | l2-1 |
| Round robin | <group letter><round>-<match> | A1-0, B3-1 |
| Swiss | s<round>-<match> | s2-3 |
Results can be listed in any order. A result for a later round waits until the matches that feed it have results. Matches decided by a bye take no result.
To see every key for a list of names, ask the API. It answers with every match, its key and who plays in it:
GET https://api.freeaffiliate.co/api/tournaments/bracket?teams=Alpha,Bravo,Charlie,Delta,Echo&format=double
Put it on a site
Swap the address into an iframe, or use the HTML tag:
<script src="https://roundswon.com/embed.js" async></script>
<roundswon-bracket teams="Alpha,Bravo,Charlie,Delta" results="r1-0:2-1,r1-1:0-2" title="Office Cup"></roundswon-bracket>
All the settings are in Embed a bracket on any website.
Every RoundsWon widget is a web page made to sit inside another page. Put it on your website, blog, wiki, Notion page or team site with an iframe or a single HTML tag. Widgets are free, need no account and no API key, and update by themselves while a tournament is live.
Build one by clicking on the free tools page, or write the address yourself with the reference below.
Quick start
A live bracket for a RoundsWon tournament, where abc123 is the code at the end of its page address (https://roundswon.com/t/abc123):
<iframe src="https://roundswon.com/embed/bracket?t=abc123" width="100%" height="520" style="border:0" loading="lazy" title="Tournament bracket"></iframe>
A bracket with no RoundsWon tournament at all, made from a list of names:
<iframe src="https://roundswon.com/embed/bracket?teams=Alpha,Bravo,Charlie,Delta&results=r1-0:2-1&title=Office%20Cup" width="100%" height="420" style="border:0" loading="lazy" title="Office Cup bracket"></iframe>
The widgets
| Address (on https://roundswon.com) | Shows |
|---|---|
/embed/bracket | The bracket tree for elimination formats, or the table and rounds for round robin and swiss |
/embed/standings | The standings table on its own |
/embed/card | A tournament card: poster, status, prize, players and an Enter button (live tournaments only) |
/embed/leaderboard | A ranked leaderboard from rows you give it |
Where the data comes from
Each widget takes one of two sources.
A live RoundsWon tournament: t=<code>. The widget reads the tournament and refreshes every 15 seconds while it is open or live. Works with bracket, standings and card.
Settings in the address: no tournament needed. The bracket is built and played out by the same engine that runs real tournaments, so it always follows the format's rules.
| Setting | Meaning | Example |
|---|---|---|
teams | Names in seed order, separated by commas, 2 to 64 | teams=Alpha,Bravo,Charlie,Delta |
format | single (default), double, groups or swiss | format=double |
results | Finished matches as <match key>:<score>-<score>, separated by commas, in any order | results=r1-0:2-1,r1-1:0-2 |
title | The heading shown above the bracket | title=Office%20Cup |
bestOf | Games per match: 1, 3, 5 or 7 | bestOf=3 |
third | true adds a match for third place (single elimination) | third=true |
reset | false turns off the bracket reset (double elimination) | reset=false |
groups | How many groups (round robin) | groups=2 |
rounds | How many rounds (swiss), 0 for the usual number | rounds=4 |
Settings work with bracket and standings. The free bracket maker explains match keys and writes the results for you as you click winners.
Leaderboard rows
The leaderboard widget takes its rows straight from the address:
| Setting | Meaning | Example |
|---|---|---|
rows | Name:score pairs, separated by commas | rows=Kestrel:24,Juno:19,Tobi:31 |
title | The heading | title=Most%20kills |
metric | What the score is called | metric=Kills |
lower | 1 when lower is better, like times | lower=1 |
<iframe src="https://roundswon.com/embed/leaderboard?rows=Kestrel:24,Juno:19,Tobi:31&title=Most%20kills&metric=Kills" width="100%" height="360" style="border:0" loading="lazy" title="Most kills"></iframe>
Look
These work on every widget:
| Setting | Meaning |
|---|---|
theme=dark | Dark colors. theme=light is the default |
bg=transparent | No background, for stream overlays in OBS and Streamlabs |
One HTML tag instead of an iframe
Add the script once, then use a tag per widget. The tag sizes itself to fit its content, so nothing is cut off and there is no scroll bar. Every setting above works as an attribute, with tournament for t.
<script src="https://roundswon.com/embed.js" async></script>
<roundswon-bracket tournament="abc123"></roundswon-bracket>
<roundswon-standings tournament="abc123" theme="dark"></roundswon-standings>
<roundswon-card tournament="abc123"></roundswon-card>
<roundswon-bracket teams="Alpha,Bravo,Charlie,Delta" format="double" title="Office Cup"></roundswon-bracket>
<roundswon-leaderboard rows="Kestrel:24,Juno:19,Tobi:31" metric="Kills"></roundswon-leaderboard>
The tags work in plain HTML and in React, Vue, Svelte, WordPress, Webflow, Squarespace or anywhere else that allows a script tag.
Free, with a small ad
Widgets are free with no limits. Each one shows a slim bar along its bottom edge with a link to RoundsWon and a one line ad. That bar is what keeps the widgets free.