List your tournaments
const url = 'https://foxleague.ai/api/tournaments/my';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
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/my \ --header 'Authorization: Bearer <token>'Returns the tournaments you play in or created, split into active (not completed or cancelled, latest kickoff first) and completed (one page of your completed or cancelled ones, most recently completed first, cancelled ones last). active is never cut. The X-Total-Count response header holds how many completed or cancelled ones there are in all; ask for the next page with offset set to the number of completed rows already read until you hold that many. Use kind to list tournaments and 1v1 challenges separately. Rows have the shape of the public list; participant_count is always null here.
Who: a signed-in player.
Refusals:
Not registered: the wallet has no player account.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”standard lists tournaments of more than two teams; challenge lists 1v1 challenges. Without it both are listed together.
Completed or cancelled rows per page, 1 to 200. Default 20.
Completed or cancelled rows to skip. Default 0.
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
Your tournaments that are not completed or cancelled, latest kickoff first.
A tournament or 1v1 challenge.
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.
Your 20 most recent completed or cancelled tournaments, most recently completed first.
A tournament or 1v1 challenge.
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.
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": { "active": [ { "blocking_window_end": "2026-10-02T19:24:00Z", "blocking_window_start": "2026-10-02T17:00:00Z", "cancelled_at": null, "challenge_deadline_minutes": null, "completed_at": null, "created_at": "2026-09-30T09:12:44Z", "creator_user_id": 57, "deadline": "2026-10-02T17:00:00Z", "description": "Eight teams, straight knockout.", "developer_mode": false, "entry_fee_foxsy": 1000, "featured": false, "format": "knockout", "has_third_place_match": true, "home_and_away": false, "id": 412, "is_private": false, "max_teams": 8, "min_teams": 8, "participant_count": null, "round_interval_minutes": 30, "runner_up_user_id": null, "sc_tournament_id": 412, "started_at": null, "starts_at": "2026-10-02T18:00:00Z", "status": "open", "target_user_id": null, "third_place_user_id": null, "tier": "silver", "title": "Friday Night Cup", "winner_user_id": null } ], "completed": [ { "away_score": 1, "blocking_window_end": null, "blocking_window_start": null, "cancelled_at": null, "challenge_deadline_minutes": 60, "completed_at": "2026-09-29T19:21:37Z", "created_at": "2026-09-29T18:40:00Z", "creator_badge": "ipfs://bafkreij7ufrdl3erbfqfoeqh5av2ricphkqdlmttns4lrwbqcab", "creator_team_name": "Harbor Foxes", "creator_user_id": 57, "deadline": "2026-09-29T19:02:10Z", "decided_by": "regular", "description": null, "developer_mode": false, "distribute_tx_hash": "fc35526f7eaed46725a2a7b860dcd6c8a1f8b46287cced9041dff02cee737443", "entry_fee_foxsy": 500, "featured": false, "format": "knockout", "has_third_place_match": false, "home_and_away": false, "home_score": 3, "id": 405, "is_private": false, "max_teams": 2, "min_teams": 2, "opponent_badge": "ipfs://bafkreim6p4g37ztnovmizwdiaeq3kdfyspsc5lkr4aqxvupctnw", "opponent_team_name": "North Gate", "participant_count": null, "round_interval_minutes": 30, "runner_up_user_id": 61, "sc_tournament_id": 405, "started_at": "2026-09-29T19:02:41Z", "starts_at": "2026-09-29T19:05:10Z", "status": "completed", "target_user_id": null, "third_place_user_id": null, "tier": "silver", "title": "Rematch", "winner_user_id": 57 } ] }, "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