Tournament detail
const url = 'https://foxleague.ai/api/tournaments/1';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://foxleague.ai/api/tournaments/1Returns one tournament with its participants, rounds, matches and standings. A match’s score appears once its broadcast ends. A next-round slot names its team once the match that sends the team there has finished, on air too. Each Swiss round is listed once every match of the round before it has finished. Standings and recent form count finished matches only. The podium appears when the tournament completes.
Who: anyone. With a session:
- the creator and the invitees of a private tournament read its invite list in
whitelist; - the creator and the target of a targeted 1v1 challenge read
target_user_id; - with
wallet_addressset to your own wallet, the per-viewer fieldsuser_is_participant,user_can_join_private,user_can_join_developer,viewer_blocked_active_1v1andviewer_blocked_tournament_windoware filled.
Refusals:
Tournament not found: no tournament has this id.
Authorizations
Section titled “Authorizations ”- None
- session
Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”The tournament id.
Query Parameters
Section titled “Query Parameters ”Your own wallet address, the one of your session. It fills the per-viewer fields of the answer. Any other value is ignored, as is the parameter without a session.
Responses
Section titled “ Responses ”Success or a refusal: read success (the refusals are in the description).
object
A machine-readable reason next to error, set only where the caller must act differently. tx_pending: the payment was not refused but could not be verified yet; keep the transaction hash and confirm again with the same hash, never pay twice.
The answer. Present when success is true.
object
The matches, by round, then by position. A Swiss round’s matches are listed once every match of the round before it has finished.
One match of a tournament as its schedule and bracket show it.
object
Badge of the away team, named by the same rule as away_team_name; null when none.
away_elo_at_match plus this match’s rating change (away_elo_after minus away_elo_at_match is the change the match applied; it is not the player’s current rating), present once the match has finished and its rating change applied. Absent otherwise and for an older match whose away_elo_at_match is null.
The away player’s rating for this match, from the moment the match is on air and the away team is named: the player’s current rating until the result is applied after the broadcast, then the rating the match’s change was computed from; null otherwise. null too for a slot with no match (a bye) and for an older match whose rating was not recorded this way: its change is in away_elo_change.
The away player’s rating change in this match (away_elo_after minus away_elo_at_match, also for an older match that answers neither), present once the match has finished and its rating change applied. Absent otherwise.
A finished match decided on penalties: shootout goals of the away side. null otherwise.
Goals of the away side once the match’s broadcast ends; null before.
League + Knockout: the league place drawn into the away seat, by the same rule as home_seed_place.
Away team name, by the same rule as home_team_name.
Position of the match within its round; null when none.
When the match’s broadcast ended (RFC 3339); null before.
A finished knockout match: regular, extra_time or penalties. null otherwise.
Hash of the prize payout transaction of a paid tournament, set when the tournament completes; null before and for a free tournament.
Why a finished match was decided without being played, for example a team could not field a complete squad; null unless is_forfeit is true.
A, B and so on for a group match, League for a round robin and for the league phase of League + Knockout, 3rd Place for the third place match; null for knockout and Swiss matches.
Badge of the home team, named by the same rule as home_team_name; null when none.
home_elo_at_match plus this match’s rating change (home_elo_after minus home_elo_at_match is the change the match applied; it is not the player’s current rating), present once the match has finished and its rating change applied. Absent otherwise and for an older match whose home_elo_at_match is null.
The home player’s rating for this match, from the moment the match is on air and the home team is named: the player’s current rating until the result is applied after the broadcast, then the rating the match’s change was computed from; null otherwise. null too for a slot with no match (a bye) and for an older match whose rating was not recorded this way: its change is in home_elo_change.
The home player’s rating change in this match (home_elo_after minus home_elo_at_match, also for an older match that answers neither), present once the match has finished and its rating change applied. Absent otherwise.
A finished match decided on penalties: shootout goals of the home side. null otherwise.
Goals of the home side once the match’s broadcast ends; null before.
League + Knockout: the league place drawn into the home seat when the bracket was made (both seats of a play-off match, the top-8 seat of a round of 16 match), for example 24; null on a seat that a tie fills and in every other format.
Home team name. Group, league and first-round matches name it from the start; a later match names it once the match that sends the team here has finished or once this match kicks off. null until then. In a developer tournament, the developer team’s name.
The match’s public id: 22 URL-safe characters with no order. Watch the match, read its statistics and download its files by it: GET /api/public/tournament-match/{id}, GET /api/live/tournament-match/{id}, GET /api/replay/tournament-match/{id}, GET /api/public/tournament-match/{id}/stats, GET /api/public/tournament-match/{id}/log. No answer carries the match’s own id.
true for a seed that goes through without an opponent.
true for a finished match that was decided without being played.
true for the match that settles the prizes: the final and the third place match of a knockout phase; the last match of a round robin or Swiss tournament.
true while the match is on air. After its broadcast, true when its replay can be watched.
League + Knockout: 1 or 2 for the two matches of a two-legged tie (a tie is one round_number with one bracket_position); null for a single match and in every other format. Each leg carries its own score; the aggregate adds both legs up from the seats (the home team of leg 2 is the away team of leg 1).
Label of the round, for example Semifinal, Group A - Matchday 2, Matchday 3 or Round 2; null when none.
Round number, from 1.
Kickoff (RFC 3339).
The match’s state: pending before kickoff, live while it is on air, then its final state once its broadcast ends: forfeit for a match decided without being played and otherwise finished. Read the score only once broadcast_ended_at is set.
The seated teams by seed.
One seated team of a tournament.
object
Team badge: an IPFS URI or an older inline image; null when the team has none. In a developer tournament: the path of the developer team’s logo; null when it has none.
Developer tournament only: the name of the player’s verified developer team. null otherwise.
The player’s current rating.
Formation of the squad the team entered with; 4-4-2 when unknown.
Seat id; standings rows refer to it as participant_id.
Final place, 1, 2 or 3, set when the tournament completes; null otherwise.
Up to five latest results, newest first: W, D or L. A tournament match counts once its broadcast ends.
Seed number from the draw at the deadline; may be null before the draw.
Average rating of the squad the team entered with, as a whole number. 0 for a developer team.
The team name; Team #<user_id> when the player has no team.
User id of the player.
Wallet of the player.
The rounds, by round number. A Swiss round is listed once every match of the round before it has finished.
One round of a tournament.
object
Label of the round, for example Semifinal, Group A - Matchday 2, Matchday 3 or Round 2; null when none.
Round number, from 1.
group (group stage or round robin), knockout or swiss.
Scheduled time of the round (RFC 3339).
pending until the broadcast of every match of the round has ended, then finished.
The tournament id.
The group, league or Swiss table from finished matches, as GET /api/tournaments/{id}/standings answers it. null for a knockout tournament.
One team’s row in a group, league or Swiss table.
object
Matches drawn.
Goals conceded.
Goals scored.
A, B and so on for a group, League for a round robin; null for a Swiss tournament.
Id of the row.
Matches lost.
Seat id of the team: the id of its row in participants.
Finished matches played.
Points: 3 for a win, 1 for a draw, minus 1 for each match neither team could play.
The tournament id.
Matches won.
The tournament.
object
Completed 1v1 challenge rows decided on penalties: shootout goals of the away side. Absent otherwise.
Completed 1v1 challenge rows of the tournament lists: goals of the away side. Absent otherwise.
End of that reserved window (RFC 3339): one hour after the tournament’s booked play time, about 3 minutes per match without the time between games; null when there is none. This is not when the tournament ends: it can keep playing after its window for hours or days.
Start of the time window a standard tournament reserves on the schedule, one hour before kickoff (RFC 3339). No other tournament may reserve an overlapping window. null for 1v1 challenges and developer tournaments.
When the tournament was cancelled (RFC 3339); null when it was not.
1v1 challenge: the minutes it was opened for. null for a standard tournament.
When the tournament completed (RFC 3339); null before.
When the tournament was created (RFC 3339).
1v1 challenge rows of the tournament lists: the creator’s team badge. Absent otherwise.
1v1 challenge rows of the tournament lists: the creator’s team name. Absent otherwise.
User id of the creator (the organizer).
Registration closes at this time (RFC 3339).
Completed 1v1 challenge rows of the tournament lists: regular, extra_time or penalties. Absent otherwise.
Text written by the creator; null when none.
true when only teams with a verified developer binary may join.
Completed 1v1 challenge rows of the tournament lists: hash of the prize payout transaction. Absent otherwise.
Entry fee in whole FOXSY; 0 for Bronze.
true for a tournament the game features: it is listed first and enters the hall of fame when it completes.
knockout, groups_knockout, round_robin, swiss or league_knockout (League + Knockout: 36 teams in one league table drawn from four pots).
true when a match for third place is played.
true for a round robin where every pair of teams meets twice.
Completed 1v1 challenge rows decided on penalties: shootout goals of the home side. Absent otherwise.
Completed 1v1 challenge rows of the tournament lists: goals of the home side. Absent otherwise.
Completed 1v1 challenge rows of GET /api/tournaments: user id of the home side, to match the score to the teams (the creator is not always at home). Absent otherwise.
The tournament id.
true when only invited teams may join.
Seats. 2 for a 1v1 challenge.
Teams needed to start; with fewer at the deadline the tournament is cancelled.
1v1 challenge rows of the tournament lists: the opponent’s team badge once an opponent holds the second seat. Absent otherwise.
1v1 challenge rows of the tournament lists: the opponent’s team name once an opponent holds the second seat. Absent otherwise.
Tournament detail only: true when the creator runs the tournament without a seat. Absent elsewhere.
Seats taken. Filled by GET /api/tournaments; null in other answers.
Minutes between one match’s kickoff and the next.
User id of the runner-up, set when the tournament completes; null before.
Id of the tournament on chain (equal to id) for a paid tournament once it is created there; null for a free tournament.
When registration closed and the draw was made (RFC 3339); null before.
Kickoff of the first match (RFC 3339).
open: registration is open. pending_sc: a paid tournament is being created on chain and cannot be joined yet. active: registration closed and the tournament is under way. completed: finished, podium set. cancelled: too few teams at the deadline or cancelled by its creator.
Targeted 1v1 challenge: user id of the only opponent who may accept. Given to the creator and the target only; null for everyone else and for any other tournament.
true for a 1v1 challenge locked to one opponent. Absent otherwise.
true when you are the opponent a targeted 1v1 challenge is locked to. Absent otherwise.
User id of the third-placed team, set when the tournament completes; null before and when no third place is decided.
bronze (free), silver or gold (paid in FOXSY).
Name of the tournament.
User id of the winner, set when the tournament completes; null before.
With wallet_address: true for a normal tournament; for a developer tournament, true when you have a verified developer binary. null without wallet_address.
With wallet_address: true for a public tournament; for a private one, true when you are invited or are the creator (not an organizer-only creator). null without wallet_address.
With wallet_address: true when you hold a seat. null without wallet_address.
1v1 challenge with wallet_address: true when you already have another open or running 1v1 challenge, so a join would be refused. null otherwise.
1v1 challenge with wallet_address: true when a join would be refused: from an hour before a tournament or challenge match of yours until its result is out; from an hour before your group’s last kickoff until the group’s results are out; from an hour before your Swiss round match until all the round’s results are out. false when you already hold a seat in this challenge. null otherwise.
The teams invited to a private tournament, given to its creator and its invitees. An empty list for everyone else and for a public tournament.
One team invited to a private tournament.
object
The invited team’s badge: an IPFS URI or an older inline image; null when none.
The invited player’s team name; null when the player has no team.
User id of the invited player.
Why the request was refused, in plain words. Present when success is false.
true when the request did what it asked. false is a refusal: read error.
Example
{ "data": { "matches": [ { "away_badge": "ipfs://bafkreim6p4g37ztnovmizwdiaeq3kdfyspsc5lkr4aqxvupctnw", "away_elo_after": 1288, "away_elo_at_match": 1302, "away_elo_change": -14, "away_penalty": null, "away_score": 1, "away_seed_place": null, "away_team_name": "North Gate", "bracket_position": 0, "broadcast_ended_at": "2026-10-02T17:09:12Z", "decided_by": "regular", "distribute_tx_hash": null, "forfeit_reason": null, "group_name": null, "home_badge": "ipfs://bafkreij7ufrdl3erbfqfoeqh5av2ricphkqdlmttns4lrwbqcab", "home_elo_after": 1284, "home_elo_at_match": 1270, "home_elo_change": 14, "home_penalty": null, "home_score": 2, "home_seed_place": null, "home_team_name": "Harbor Foxes", "id": "b8HcT0vW3qLs-Jm6Nd2yUe", "is_bye": false, "is_forfeit": false, "is_prize_deciding": false, "is_watchable": true, "leg": null, "round_label": "Semifinal", "round_number": 1, "scheduled_at": "2026-10-02T17:00:00Z", "status": "finished" }, { "away_badge": "ipfs://bafkrei7qa5efe6qeqpno57ye6scmejvqtia6d7rgn7ss555hmtf", "away_elo_at_match": null, "away_penalty": null, "away_score": null, "away_seed_place": null, "away_team_name": "Copper Valley", "bracket_position": 1, "broadcast_ended_at": null, "decided_by": null, "distribute_tx_hash": null, "forfeit_reason": null, "group_name": null, "home_badge": "ipfs://bafkreilavyf6rmpafqfjzczbttofjyu7jsjc3ibofbcixgy4dbp", "home_elo_at_match": null, "home_penalty": null, "home_score": null, "home_seed_place": null, "home_team_name": "Ember Town", "id": "Lp5zXa9_Gf1Kr7Qw2Ve8Tm", "is_bye": false, "is_forfeit": false, "is_prize_deciding": false, "is_watchable": false, "leg": null, "round_label": "Semifinal", "round_number": 1, "scheduled_at": "2026-10-02T17:30:00Z", "status": "pending" }, { "away_badge": null, "away_elo_at_match": null, "away_penalty": null, "away_score": null, "away_seed_place": null, "away_team_name": null, "bracket_position": 0, "broadcast_ended_at": null, "decided_by": null, "distribute_tx_hash": null, "forfeit_reason": null, "group_name": null, "home_badge": "ipfs://bafkreij7ufrdl3erbfqfoeqh5av2ricphkqdlmttns4lrwbqcab", "home_elo_at_match": null, "home_penalty": null, "home_score": null, "home_seed_place": null, "home_team_name": "Harbor Foxes", "id": "Zt3Mn6Bq-Hy0Wc8Ja4Ls1d", "is_bye": false, "is_forfeit": false, "is_prize_deciding": true, "is_watchable": false, "leg": null, "round_label": "Final", "round_number": 2, "scheduled_at": "2026-10-02T18:00:00Z", "status": "pending" } ], "participants": [ { "badge": "ipfs://bafkreij7ufrdl3erbfqfoeqh5av2ricphkqdlmttns4lrwbqcab", "dev_team_name": null, "elo_rating": 1284, "formation": "4-3-3", "id": 2201, "placement": null, "recent_form": [ "W", "W", "D", "L", "W" ], "seed": 1, "squad_ovr": 61, "team_name": "Harbor Foxes", "user_id": 57, "wallet_address": "erd15feryxhrdz9m6y09mr8wrerwzgj6f8ntxvhxyrdlm5aahn0t09nl4ujy86" }, { "badge": "ipfs://bafkreim6p4g37ztnovmizwdiaeq3kdfyspsc5lkr4aqxvupctnw", "dev_team_name": null, "elo_rating": 1288, "formation": "4-4-2", "id": 2202, "placement": null, "recent_form": [ "L", "W", "W", "W", "D" ], "seed": 2, "squad_ovr": 63, "team_name": "North Gate", "user_id": 61, "wallet_address": "erd124fl6zy54klay937yrnujckpak28lrdjg0eel92ue3gm36kcwf9tfwwqlt" }, { "badge": "ipfs://bafkreilavyf6rmpafqfjzczbttofjyu7jsjc3ibofbcixgy4dbp", "dev_team_name": null, "elo_rating": 1190, "formation": "4-3-3", "id": 2203, "placement": null, "recent_form": [ "D", "L", "W" ], "seed": 3, "squad_ovr": 58, "team_name": "Ember Town", "user_id": 73, "wallet_address": "erd1sjqf6h5graeeeex7ervydu284rxqfxhpydcfskh788la77n9fx4s72pdhf" }, { "badge": "ipfs://bafkrei7qa5efe6qeqpno57ye6scmejvqtia6d7rgn7ss555hmtf", "dev_team_name": null, "elo_rating": 1225, "formation": "3-5-2", "id": 2204, "placement": null, "recent_form": [ "W", "L", "L", "W", "W" ], "seed": 4, "squad_ovr": 60, "team_name": "Copper Valley", "user_id": 88, "wallet_address": "erd1pn9sh2kw4wv0ewvlkpp37svkukh9wxw7v4d7q7k98cv7tm49eae922gpfa" } ], "rounds": [ { "round_label": "Semifinal", "round_number": 1, "round_type": "knockout", "scheduled_at": "2026-10-02T17:00:00Z", "status": "pending", "tournament_id": 398 }, { "round_label": "Final", "round_number": 2, "round_type": "knockout", "scheduled_at": "2026-10-02T18:00:00Z", "status": "pending", "tournament_id": 398 } ], "standings": null, "tournament": { "blocking_window_end": "2026-10-02T18:12:00Z", "blocking_window_start": "2026-10-02T16:00:00Z", "cancelled_at": null, "challenge_deadline_minutes": null, "completed_at": null, "created_at": "2026-09-29T08:03:11Z", "creator_user_id": 73, "deadline": "2026-10-02T16:00:00Z", "description": null, "developer_mode": false, "entry_fee_foxsy": 5000, "featured": true, "format": "knockout", "has_third_place_match": false, "home_and_away": false, "id": 398, "is_private": false, "max_teams": 4, "min_teams": 4, "organizer_only": false, "participant_count": null, "round_interval_minutes": 30, "runner_up_user_id": null, "sc_tournament_id": 398, "started_at": "2026-10-02T16:00:41Z", "starts_at": "2026-10-02T17:00:00Z", "status": "active", "target_user_id": null, "third_place_user_id": null, "tier": "gold", "title": "Autumn Knockout", "winner_user_id": null }, "user_can_join_developer": null, "user_can_join_private": null, "user_is_participant": null, "viewer_blocked_active_1v1": null, "viewer_blocked_tournament_window": null, "whitelist": [] }, "success": true}No valid session. The body is plain text: Missing Authorization header, Invalid Authorization format, Invalid session token or Session expired or invalid. Sign in again.
Example
Session expired or invalid