Skip to content

Invitations of a League + Knockout tournament

GET
/api/tournaments/{id}/invitations
curl --request GET \
--url https://foxleague.ai/api/tournaments/1/invitations

Returns the invitations of a League + Knockout tournament: its snapshot date, the start of each of the three invitation waves (at the snapshot, at half of the time to the registration deadline and at three quarters of it), the moment from which an accepted team can no longer leave, every invitation by wave with its state and the leaderboard frozen at the snapshot (rank, team, rating at the snapshot, whether the team could be invited). With a session, mine is your own invitation when you have one. Everything here is known before the tournament starts.

Who: anyone. mine needs a signed-in player.

Refusals:

  • Tournament not found: no tournament has this id.
  • This tournament has no invitations: only a League + Knockout tournament invites.
id
required
integer format: int64

The tournament id.

Success or a refusal: read success (the refusals are in the description).

Media type application/json
object
code

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.

string | null
data

The answer. Present when success is true.

object
deadline
required

The registration deadline: the invitations of the last wave expire then.

string format: date-time
frozen
required

true once the leaderboard is frozen.

boolean
invitations
required

Every invitation, by wave.

Array<object>

One invitation of a League + Knockout tournament.

object
answered_at

When it was accepted or declined. null while unanswered.

string | null format: date-time
badge

The team’s badge: an ipfs:// URI or a base64 image. null without one.

string | null
expires_at
required

When it expires unanswered: the next wave’s start, the deadline for the last wave.

string format: date-time
invited_at
required

When it was sent.

string format: date-time
left
required

true when the team joined and then left.

boolean
state
required

invited (no answer yet), accepted (the team joined), declined (declined, also a team that joined and then left: see left) or expired (the next wave started first).

string
team_name
required

The invited team’s name.

string
user_id
required

The invited player’s id.

integer format: int32
wave
required

The wave that sent it, 1 to 3.

integer format: int32
mine
One of:

Your own invitation to this tournament.

object
can_accept
required

true when you can accept it now: it is pending, the tournament takes entries and on a paid tier your wallet is on the contract’s invite list. It is false while your team has a seat or an invitation in another League + Knockout tournament that is not over: refusal then says so.

boolean
expires_at
required

When it expires unanswered.

string format: date-time
refusal

Why a pending invitation cannot be accepted now: the sentence the join would answer while your team has a seat or an invitation in another League + Knockout tournament that is not over (one at a time). null otherwise.

string | null
state
required

invited, accepted, declined or expired.

string
wave
required

The wave that sent it, 1 to 3.

integer format: int32
seats
required

The seats of the tournament.

integer format: int32
seats_lock_at
required

From this moment, the third wave’s start, an accepted team cannot leave.

string format: date-time
skipped
required

The teams the second and third waves passed over, by wave then rank: checked again at that wave, each was no longer eligible.

Array<object>

One team a later invitation wave passed over, with the reason.

object
rank
required

Its place on the leaderboard at the snapshot.

integer format: int32
reason
required

Why it was passed over at that wave: no_recent_match (no match in the 14 days before the wave), in_league_knockout (a seat or an invitation in another League + Knockout tournament that is not over), no_full_squad (not 11 starters and 7 substitutes, all owned and not listed for sale) or not_eligible (the account cannot be invited).

string
team_name
required

The team’s name.

string
user_id
required

The player’s id.

integer format: int32
wave
required

The wave that passed the team over, 2 or 3.

integer format: int32
snapshot
required

The leaderboard frozen at the snapshot, by rank. Empty before the snapshot.

Array<object>

One team of the leaderboard frozen at the snapshot.

object
eligible
required

true when the team could be invited.

boolean
elo
required

Its rating at the snapshot. The pot draw seeds the tournament by it.

integer format: int32
rank
required

Its place on the leaderboard at the snapshot.

integer format: int32
reason

Why it could not: no_recent_match (no match in the 14 days before the snapshot), in_league_knockout (a seat or an invitation in another League + Knockout tournament that is not over), no_full_squad (not 11 starters and 7 substitutes, all owned and not listed for sale) or not_eligible (the account cannot be invited). null for an eligible team.

string | null
team_name
required

The team’s name.

string
user_id
required

The player’s id.

integer format: int32
snapshot_at
required

When the leaderboard is frozen and the first invitation wave goes out.

string format: date-time
tournament_id
required

The tournament id.

integer format: int64
wave_starts
required

When each of the three waves starts: the snapshot, half of the time to the deadline and three quarters of it.

Array<string>
waves_run
required

The waves that have run, 1 to 3.

Array<integer>
error

Why the request was refused, in plain words. Present when success is false.

string | null
success
required

true when the request did what it asked. false is a refusal: read error.

boolean
Example
{
"data": {
"deadline": "2026-11-09T18:00:00Z",
"frozen": true,
"invitations": [
{
"answered_at": "2026-11-01T20:05:00Z",
"badge": null,
"expires_at": "2026-11-05T18:00:00Z",
"invited_at": "2026-11-01T18:00:20Z",
"left": false,
"state": "accepted",
"team_name": "FC Vulpea",
"user_id": 57,
"wave": 1
}
],
"mine": {
"can_accept": false,
"expires_at": "2026-11-05T18:00:00Z",
"state": "accepted",
"wave": 1
},
"seats": 36,
"seats_lock_at": "2026-11-07T18:00:00Z",
"skipped": [],
"snapshot": [
{
"elo": 1874,
"eligible": true,
"rank": 1,
"reason": null,
"team_name": "FC Vulpea",
"user_id": 57
},
{
"elo": 1850,
"eligible": false,
"rank": 2,
"reason": "no_recent_match",
"team_name": "Real Codru",
"user_id": 12
}
],
"snapshot_at": "2026-11-01T18:00:00Z",
"tournament_id": 602,
"wave_starts": [
"2026-11-01T18:00:00Z",
"2026-11-05T18:00:00Z",
"2026-11-07T18:00:00Z"
],
"waves_run": [
1
]
},
"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.

Media type text/plain
string
Example
Session expired or invalid