Normal
Split the field into groups that each play a set number of matches.
64 squads → 4 groups of 16 · 3 matches each
Registration, structure, points, live scoring for your broadcast, casters and analysts, and an API to run it all inside your own app. Built for battle royale, ready for brackets.
Build any round structure
Lobbies, groups, round robin, arena, brackets and Swiss, chained on one canvas
16AI automated scoring
Reads the kill feed live and scores every finish, knock and revive
Instant scoring, always right
Points land as each finish posts; fix a misread and the match replays
Every screen in sync
Broadcast, casters and analysts read the same numbers
Runs inside your app
API with your own user IDs and signed webhooks
Sample match, replayed from the scoring engine · fictional teams
Most events still run on spreadsheets, screenshots and DMs. 16TMS runs the whole tournament in one system.
Run the whole tournament
BetaFrom a blank form to final standings: set the format, fill the groups, connect the rounds and decide what every placement is worth. Standings follow each recorded result, and your whole crew works in the same console.
01New tournament
Basics, format, schedule and artwork, then one page that reviews every answer before you create it.
New tournament
Everything here can be changed later, except the game.
Basics
EditFormat
EditSchedule
EditArtwork
Edit02Match type
Pick how a match is played and who competes. The game decides which match types are on offer, and it is the one answer you cannot change later.
Game
Battlegrounds Mobile IndiaChosen from the tournament engine’s catalog. It decides which match types below are possible, and it cannot be changed later.
Match type
Who competes
TeamsSoloSmallest roster
4Largest roster
5Squads register with a roster.
03Participants
Add competitors by hand or upload them as JSON, with every in-game name exactly as it appears in the game, clan tag included. Then fill the groups with Auto-assign, or Shuffle for a fresh draw.
Participants
64 teamsUpload JSONAdd competitorsAshveil squad
In-game names exactly as the killfeed shows them, clan tag and all. A name that does not match scores nothing.
Players
Round 1 · Qualifiers
64 / 64 teams · 4 groups · 12 matches
Group A
16 of 16
Group B
16 of 16
Group C
16 of 16
Group D
16 of 16
04Structure
Connect the rounds and say how many go through. Qualifier groups feed the semi-finals, and the semi-finals feed the grand final.
Structure
How the rounds of this tournament feed into each other — the shape of the whole bracket, in one screen.
Group A
16 teams
Group B
16 teams
Group C
16 teams
Group D
16 teams
Group A
16 teams
Group B
16 teams
Final
16 teams
05Placement points
Start from the usual 10 · 6 · 5 · 4 · 3 · 2 · 1 · 1 and change any rank. Every finish adds points on top.
Placement points
What each finishing position is worth in a lobby of this tournament. Set once — every live match scores on it, and kill points are added on top.
Rank 9 and below scores no placement points — kills only.
Round 1 · M1 · Ashveil10 + 6 × 1 = 16
06Standings
Each recorded result rolls into the standings: played, points, average place and kills, overall or by round and group. Step through the sample lobby's three matches.
07Roles
Invite people by email and give each one a role. Casters and analysts get Viewer: they see every table and cannot change a score.
Role
ViewerOwner
Everything an admin can do, plus deleting the organisation.
Admin
Runs the organisation: invites, roles, settings.
Member
Runs tournaments — entrants, rounds, results.
Viewer
Reads everything. Changes nothing.
08Registration
Players join from your product. Your backend registers them through the 16TMS API with your own user IDs, so nobody needs a separate 16TMS account, and reads the standings back for your own screens.
X-API-KEY: •••• · your own user ID
The key stays on your server. Never ship it in a browser or an app.
Coming soonA registrations queue in the console, with your own form fields and check-in.
API referenceConsole screens from the 16TMS beta · sample event, fictional teams
16AI · Automated scoring
16AI runs in the capture client. It reads the game's kill feed with computer vision and OCR and posts every finish, knock and revive to the engine. Names are matched to the rosters you registered. A name that matches no roster is held back and flagged Needs a fix, with the screenshot crop it came from.
Watch row 101: the name doesn't match, so it waits for a person.
Animated replay of a sample match. Rows 99 to 104 pass through the four steps below. Row 101 reads ASV|Vlper, which matches no roster, so the row is held back and flagged Needs a fix until the operator corrects it to ASV|Viper and the match is recomputed.
Computer vision finds each new kill-feed line on screen. OCR reads the names.
Killer, Finish, Knock or Revive, victim and weapon type. The screenshot crop is saved with the row.
Both names are checked against the rosters registered for this lobby, clan tag and all.
The engine scores matched rows: points per finish, placement points when a squad is wiped. A row it cannot match waits for a fix.
Replay of a sample match from the engine's own output (Night Circuit — Season 3, Round 1 · M3). Teams and players are fictional; weapons are shown by type.
On row 101 the capture client read “ASV|Vlper”. No roster in this lobby has that name, so the row was held back and flagged Needs a fix, with the screenshot crop it came from. The operator reads the name off the crop and saves. The match is recomputed from that row onward, on every screen.
01Flagged
Needs a fix
That killer is not on any roster in this lobby.
02Corrected
Read the names off the screenshot. Saving recomputes the match from this row onward.
03Recomputed
Row 101 saved
ASV|Viper · Finish · BRN|Sol. Recomputed from row 101 onward.
Drop in the results screen of a finished match. 16AI reads each team's placement and kills and fills the match's Team scores table. You check every row, edit what's wrong, and press Report result. Nothing counts before that.
Drop in the results screen
The screenshot of a finished match.
16AI fills Team scores
Placement and kills for every team, read off the screenshot.
You confirm
Edit any row, then Report result. Scores count from there.
| Place | Team | Kills | Place pts | Total | Edit |
|---|---|---|---|---|---|
| 1 | HKTHollow Kite | 4 | 10 | 14 | |
| 2 | NFDNinefold | 5 | 6 | 11 | |
| 3 | ASVAshveil | 5 | 5 | 10 | |
| 4 | CBWCobalt Ward | 4 | 4 | 8 | |
| 5 | GSWGlasswing | 3 | 3 | 6 | |
| 6 | BRNBrine Wolves | 3 | 2 | 5 | |
| 7 | NVNNorthvane | 2 | 1 | 3 | |
| 8 | IRBIronbark | 2 | 1 | 3 |
Concept preview with sample data from Round 1 · M2. Not available yet; kill-feed scoring above is in beta now.
Live scoring
BetaThe capture client on your production PC watches the game. 16AI turns its kill feed into scored rows, matched to your rosters. Anything it cannot match waits for a person, and one correction replays the whole match.
Step through one match · Night Circuit — Season 3 · Round 1 · M3
Open the match and press Start live scoring. The lobby opens with all 16 teams on zero and an empty kill feed.
The capture client on your production PC watches the game. 16AI reads each kill-feed line, matches the names to your registered rosters and posts the row with its screenshot crop.
“Rows appear here as the capture client reads them from the game.”Kill feed, before the first row
A finish adds a kill point to the team as its row lands. Knocks and revives change who is still up, so every player shows Alive, Knocked or Dead.
When a squad is wiped it is placed, and its placement points land. Glasswing go out 6th for 2 points. The last team alive takes first.
Default table · editable · 9th and below: 0
Row 101 came in as ASV|Vlper, a name on no roster, so it scored nothing and was flagged. The operator checks the saved crop, sets ASV|Viper and saves. The whole match replays and every screen updates.
Before
1HKTHollow Kite10
2ASVAshveil9
After
1ASVAshveil10
2HKTHollow Kite10
With one team left, press End lobby & record result. The final table becomes the match result, and the tournament standings follow.
“Recorded as the match result — 16 teams scored. Standings follow.”ASV 24 · NFD 15 · BRN 12
Kill feed0 rows
Rows appear here as the capture client reads them from the game.
Points tableTop 5 of 16
Lobby open · 16 teams · 64 seats · 0 rows
When the capture needs a hand
If the capture missed a line, add it in its place in the kill feed. The match replays with it in.
Take the kill feed back to an earlier alive count and score on from there.
Switch the match to Manual, enter each team’s result in Team scores and report it. The standings follow the same way.
Live kill-feed scoring is built for battle-royale squad lobbies such as BGMI. 16AI reads the feed; your operators keep the final say on every row.
On air
BetaProducers, casters and analysts read the same live numbers the admin sees, from read-only Viewer seats. Fix a misread row and every screen updates at once, so nobody calls an old table.
The Viewer seat
Read-only“Reads everything.
Changes nothing.”
Seat producers, casters and analysts as Viewers. They see every live number the admin sees; only your scoring crew can change one.
Pick a moment. All three screens move to the same row together, as they do on match day.
Broadcast
+ 6 more teams, all out
+ 6 more teams, all out
+ 6 more teams, all out
+ 6 more teams, all out
+ 6 more teams, all out
Placement points
Plus 1 point per finish. Placement lands when a squad is wiped; the last team standing takes first.
Casters
Analysts
By player
By player
By player
By player
By player
Sample match, replayed from the scoring engine · fictional teams · weapons shown by class
For your graphics team
16TMS feeds the live data; the on-air graphic stays your own. There is no overlay package and no plug-in to install, so your team keeps its look and its tools.
Live scoring engine
Broadcast
Points table
HKT leads · 10 ptsASV leads · 10 ptsASV leads · 10 ptsASV leads · 12 ptsASV leads · 24 pts
Casters
Teams
3 teams up · 9 players3 teams up · 8 players3 teams up · 8 players2 teams up · 6 players1 team up · 4 players
Analysts
Weapons
Assault rifle · 41 finishesAssault rifle · 42 finishesAssault rifle · 42 finishesAssault rifle · 44 finishesAssault rifle · 46 finishes
Your overlayYours
Your design, your tool
8 alive, 1 knocked8 alive, 0 knocked7 alive, 1 knocked6 alive, 0 knocked4 alive, 0 knocked
Formats
BetaFFA puts a whole lobby in every match. Duel puts two sides in every match. Choose how the field is grouped, paired or knocked out, then set best of N per match or round.
A lobby of many. Battle royale and arena formats.
Split the field into groups that each play a set number of matches.
64 squads → 4 groups of 16 · 3 matches each
Every group meets every other group; each lobby is two groups combined.
4 groups of 8 → 6 lobbies of 16
Open play. No groups, no fixtures — you enter the leaderboard.
Arena rounds take standings directly
Two sides per match. Brackets, Swiss, round robin.
A knockout tree. One loss and you are out.
8 teams · Bo1 → Bo3 → Bo5
Two brackets — a loss drops you to the lower one, a second ends it.
Upper · lower · grand final
Groups play every pair inside themselves, then the top finishers meet in a knockout.
2 groups of 4 · top 2 advance
| Team | R1 | R2 | W–L | R3 |
|---|---|---|---|---|
| ASVAshveil | W | W | 2–0 | plays NFD |
| NFDNinefold | W | W | 2–0 | |
| HKTHollow Kite | W | L | 1–1 | plays PHB |
| PHBPale Harbor | W | L | 1–1 | |
| BRNBrine Wolves | L | W | 1–1 | plays GSW |
| GSWGlasswing | L | W | 1–1 | |
| CBWCobalt Ward | L | L | 0–2 | plays KN9 |
| KN9Kestrel Nine | L | L | 0–2 |
Pair from standings each round. One loss does not end it.
Round 3 · paired by record
A battle-royale lobby seats 16 squads of 4 players: 64 seats.
The editor lists 16 ranks from the usual table, plus points per finish. Edit both.
Teams or Solo, chosen when you create the tournament.
Set best of N per match or per round.
Side by side
Brackets, lobbies, points, results, standings and a crew to run them: the core is all here. Then 16TMS scores the lobby while it is still being played, and puts the same numbers on every screen.
BGMI lobbies · capture client
Results arrive after the match: typed in by an admin, or pulled from a game API.
16AI reads the in-game kill feed and scores every finish, knock and revive as it lands. Misread names are flagged “Needs a fix” for a person to correct, and ending the lobby records the result.
Finish · Knock · ReviveOne fix, every screen
Edit the saved result, and the standings recompute.
Correct a row from its saved screenshot, insert a missed one, or rewind to a headcount. The whole match replays, and every screen watching it updates.
Correct row → Save correctionGroups · Round robin · Arena
FFA stages with placement and kill points. Lobby pairings and point tables may need setting up by hand or by request.
Split the field into groups, or let every group meet every other: the A×B, A×C and B×C lobbies are generated for you. Placement points and points per finish are yours to edit.
10 · 6 · 5 · 4 · 3 · 2 · 1 · 1Production · Casters · Analysts
Standings move when a result is saved. No alive or knocked counts during play.
Viewer seats follow the live points table, who is alive or knocked, and teams left, without being able to change a score. Your graphics team builds the on-air look.
Viewer · Reads everything. Changes nothing.Runs inside your app
Often limited to higher-priced plans. Players usually need an account on the platform.
Your backend calls the API with your own user IDs, so players never make a 16TMS account. The key stays on your server.
POST /external/usersMatch day, pushed to your app
Not always offered. Where they are, they come with the API plan.
Signed with HMAC-SHA256 when you set a secret. Subscribe per event, send a test ping and read the delivery log. Assignments, announcements and room credentials reach your app.
X-Webhook-Signature: sha256=••••Screenshot in. Scores out.
Results typed in by hand.
Drop in a match’s results screen. 16AI reads placements and kills, and you review every score before it counts.
Knockouts · Groups · Swiss
Single and double elimination, groups into a bracket and Swiss, with best-of and a third-place play-off.
Best of · Third-place play-offManual mode
Type team scores on the match page and report the result. Arena rounds take a typed standings table.
Team scores → Report resultOverall · By round · By group
Points, average placement and kills, overall or by round or group. They update with every recorded result.
Points · Avg. place · KillsFair draws, on the record
Auto-assign teams to groups, or shuffle with a recorded seed, so a disputed draw can be re-derived exactly.
Auto-assign · ShuffleIn your app
Sign-up pages hosted on the platform.
Players sign up inside your app through the API: solo, with a team invite, or a whole squad at once.
Run it as a crew
Invite your crew by email and give each person a role.
Owner · Admin · Member · ViewerHow to read this
Developers · API and webhooks
Keys stay on your server. Your users keep your IDs. Signed webhooks tell you when anything changes.
01
Client App
02
Your Backend
X-API-KEYexternalId03
16TMS API
api.16tms.com/api/v1X-API-KEY and the player’s externalId.Examples · from the docs
One POST with your externalId creates or updates the player, so your users never make a separate 16TMS account. Later, deliveries such as room credentials arrive at your endpoint.
curl -X POST 'https://api.16tms.com/api/v1/external/users' \ -H 'X-API-KEY: ••••' \ -H 'Content-Type: application/json' \ -d '{ "externalId": "user_123", "displayName": "John Doe" }'Webhooks
JSON POSTs to your endpoint for registrations, assignments, matches, announcements and room credentials. Subscribe per event.
A team registered for the tournament.
A player or team was placed in a group.
Room ID and password for the lobby.
A message for a match, such as “Match starts in 5 minutes.”
A match’s details changed.
X-Webhook-Signature: sha256=…
X-Webhook-Id: …
Check your endpoint with Send Test Ping, shape the body with a custom payload template, and see each delivery in the Delivery Logs.
API reference · live today
Tournaments, registration, assignments, matches and standings, all called from your backend. Players are named by your own ID.
/ external/ users/ external/ user-game-ids?externalId=…/ teams/ teams/ {teamId}/ invite/ teams/ invites/ {token}/ join/ tournaments/ tournaments/ {id}/ tournaments/ {id}/ points-system/ tournaments/ {tournamentId}/ registrations/ by-external-id/ tournaments/ {tournamentId}/ registrations/ teams/ {teamId}/ tournaments/ {tournamentId}/ registrations/ instant-registration/ tournaments/ my-tournaments/ tournaments/ {tournamentId}/ ffa/ assigned-details/ tournaments/ {tournamentId}/ duel/ assigned-details/ matches/ ffa/ matches/ duel/ rounds/ {roundId}/ arena/ standings/ tournaments/ {tournamentId}/ duel/ standingsBracket Viewer
An iframe on the web, a WebView on mobile. Style it in the console with Customize Bracket.
Sample bracket · fictional teams
<iframe
src="https://brackets.16tms.com/ {tournament_id}">
</iframe>Results in your UI
Arena standings per round, Duel standings with wins, losses and draws. The viewer’s own row comes back with isMe.
/ tournaments/ {tournamentId}/ duel/ standings| # | Team | W | L | D |
|---|---|---|---|---|
| 1 | Ashveil | 3 | 0 | 0 |
| 2 | NinefoldisMe | 2 | 1 | 0 |
| 3 | Brine Wolves | 0 | 2 | 1 |
| 4 | Hollow Kite | 0 | 2 | 1 |
Sample standings · fictional teams
Who it is for
Organisers build and score the event in the console. Production follows it live from read-only seats. Platforms run tournaments inside their own product, through the API.
Organisers
BetaEsports organisations, league and cup operators, scrim and community hosts.
Coming soonA registrations queue with your own form fields, check-in, and match reports.
Broadcast and production
BetaProducers, observers, casters and analysts.
Coming soonThe live snapshot and points table by API key, for your graphics system.
Platforms and partners
Game developers and publishers, and apps and communities with their own players.
X-API-KEY: •••• · externalId
X-Webhook-Signature: sha256=••••
"messageContent": "Room ID: 123456, PASS: abcd"
externalId. Your players need no separate 16TMS account.Coming soonOrganisation keys with scopes, and OAuth 2.0 client credentials.
Games
BetaLive kill-feed scoring is built for BGMI-style battle-royale lobbies. The rest of the catalog runs in FFA lobbies and Duel brackets, with results entered by hand.
FFA lobbies · placement and finishes
Live · 16AILive kill-feed scoring with 16AI is built for BGMI-style battle-royale lobbies. Other titles run on results entered by hand.
BGMI-style battle-royale lobbies
The capture client reads the in-game kill feed and 16AI posts every finish, knock and revive. Misread names are flagged “Needs a fix” for a person to correct.
Lobbies and brackets
Type team scores on the match page and report the result. Arena rounds take a standings table directly. Standings follow either way.
Through the API
Post results from your own system with your API key, and the standings update the same way.
Game names are trademarks of their respective owners.
The film · 1:20
The whole product in one story: set up the event, score it with 16AI and the live kill feed, put it on air, and run it inside your own app.
FAQ
Games, formats, live scoring, 16AI and the API. Everything here works in the open beta unless it is marked Coming soon.
A tournament management system for esports. You build the event, score every match, publish standings, and can run all of it inside your own app.
It is in open beta now. Sign up, then set up your first event in the console.
Tournaments for the titles in our catalog, across battle royale, shooters, MOBAs, sports, fighting and more.
Live kill-feed scoring with 16AI is built for BGMI-style battle-royale lobbies. Other titles run on results entered by hand.
Pick the match type first: a battle-royale lobby puts the whole field in every match, and Duel puts two sides in every match. Then build each stage from the formats below.
With your rules. Placement points start from the usual table below, finishes add points on top, and you can edit both. Reset to the usual table puts the defaults back.
| Place | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| Points | 10 | 6 | 5 | 4 | 3 | 2 | 1 | 1 |
| Team | Place | Place + finishes |
|---|---|---|
| Ashveil | 1st | 10 + 14 = 24 |
| Ninefold | 2nd | 6 + 9 = 15 |
| Brine Wolves | 3rd | 5 + 7 = 12 |
Yes. On the match page, choose Manual, fill in Team scores and press Report result. The standings follow. For an Arena round you can type the standings table itself.
Yes. Invite people by email as Owner, Admin, Member or Viewer. A Member Runs tournaments — entrants, rounds, results.
A Viewer reads everything and changes nothing.
Press Start live scoring on a match. The capture client on your production PC watches the game, and 16AI reads the in-game kill feed with computer vision and OCR. Every finish, knock and revive is posted, names are matched to your registered rosters, and the points table updates on every screen watching the match.
Placement points land when a squad is wiped, and the last team alive takes first. End lobby & record result records the match result, and the standings follow.
It is built for BGMI-style battle-royale lobbies, and a person on your crew can check and correct any row.
01
Capture client
Watches the game on your production PC.
02
16AI
Reads each kill-feed row: finish, knock or revive.
03
Rosters
Matches every name to a registered player.
04
Every screen
The points table updates for everyone watching.
The row is flagged Needs a fix and keeps the screenshot crop it was read from. Someone on your crew opens Correct row, reads the names off the screenshot and presses Save correction. The match replays from that row onward, and every screen updates.
Row 101 · Needs a fix
That killer is not on any roster in this lobby.
16AI results-screenshot scoring is coming soon. You drop in a match’s results screen, 16AI reads placements and kills, and you review every score before it counts.
Until then, score live from the kill feed or enter results by hand.
Yes. Give them the Viewer role: it Reads everything. Changes nothing.
They follow the same live points table as the admin, with every player shown alive, knocked or dead.
No. 16TMS feeds the live numbers, and your graphics team builds the on-air look. There is no overlay package or broadcast plug-in to install.
Yes. Your backend calls the 16TMS API with your own user IDs, and signed webhooks tell you when anything changes. Duel brackets can be embedded with the Bracket Viewer.
Read the API referenceNo. One call, POST /external/users, creates or updates a player from your own externalId, so players keep the account they already have with you.
An admin creates it in the console. Send it as the X-API-KEY header from your server, and never ship it in a browser or an app build.
Yes, inside your app through the API: solo, as a team with a join token, or as whole squads in bulk.
Coming soonA registrations queue in the console, with your own form fields and check-in.
Set a secret, and every delivery carries X-Webhook-Signature: an HMAC-SHA256 of the raw body. Check it before you trust the payload, and drop repeats by X-Webhook-Id.
Send a test.ping from the console to try your endpoint first.
Still have questions?
The docs walk through the API, the registration flows and webhooks.
Read the docsSample match, Round 1 · M3: 16 of 64 players alive, 6 of 16 teams.
16TMS is in open beta. Sign up to build your first event, or read the docs to run tournaments inside your own app.
From registration to final standings