Skip to content

Your upcoming tournament matches

GET
/api/tournaments/upcoming-matches
curl --request GET \
--url https://foxleague.ai/api/tournaments/upcoming-matches \
--header 'Authorization: Bearer <token>'

Returns your tournament matches whose broadcast has not ended yet plus your recently finished ones, soonest first. The answer is one page. The X-Total-Count response header holds how many matches there are in all; ask for the next page with offset set to the number of rows already read until you hold that many. Each row gives the kickoff, the time your strategy locks for that match (lead_minutes before kickoff) and a phase: upcoming, locked, live or finished. A next-round match is listed once the match that puts you in it has finished. The opponent is named by the same rule. A match’s score appears once its broadcast ends.

Who: a signed-in player.

Refusals:

  • Not registered: the wallet has no player account.
limit
integer format: int64

Rows per page, 1 to 200. Default 50.

offset
integer format: int64

Rows to skip. Default 0.

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
lead_minutes
required

Minutes before kickoff at which a match’s strategy locks.

integer format: int64
matches
required

Your matches, soonest first: one page of them (see limit and offset).

Array<object>

One of your tournament matches, from before its lock until its broadcast ends.

object
away_score
required

The away side’s goals; null until the match’s broadcast ends.

integer | null format: int32
developer_mode
required

true in a developer tournament, played by uploaded team binaries.

boolean
formation
required

The formation taken for this match once it is locked, else your current one.

string | null
group_name
required

The group in a groups stage; null otherwise.

string | null
home_score
required

The home side’s goals; null until the match’s broadcast ends.

integer | null format: int32
is_home
required

true when your team plays at home.

boolean
is_watchable
required

true while live; once finished, true when a replay can be watched.

boolean
locked
required

true from strategy_locks_at on: later tactics changes do not apply to this match.

boolean
my_dev_badge
required

Your developer team’s logo in a developer tournament; null otherwise.

string | null
my_dev_name
required

Your developer team’s name in a developer tournament; null otherwise.

string | null
my_lineup
required
One of:

A squad as a tournament match takes it: formation, starters, substitutes and player details.

object
formation
required

Formation, for example 4-3-3.

string
lineup
required

The eleven starters as NFT nonces, in lineup order.

Array<integer>
players
required

The eighteen cards of the squad.

Array<object>

One card of a squad as a tournament match takes it.

object
accuracy
required

Accuracy as recorded on chain.

integer format: int32
condition
required

The card’s condition now, 0 to 100.

integer format: int32
control
required

Control as recorded on chain.

integer format: int32
country

The player’s country number, when known (upcoming rows only).

integer format: int32
defense
required

Defense as recorded on chain.

integer format: int32
is_starter
required

true for the eleven starters.

boolean
level
required

The level as recorded on chain.

integer format: int32
name
required

The player’s name.

string
nonce
required

The card’s NFT nonce.

integer format: int64
portrait_uri

The player’s portrait, when known (upcoming rows only).

string
position
required

The player’s position.

string
power
required

Power as recorded on chain.

integer format: int32
rarity
required

Common, Uncommon, Rare, Epic or Legendary.

string
shirt_number

The card’s shirt number, when known (upcoming rows only).

integer format: int32
speed
required

Speed as recorded on chain.

integer format: int32
stamina
required

Stamina as recorded on chain.

integer format: int32
vision
required

Vision as recorded on chain.

integer format: int32
substitutes
required

The seven substitutes as NFT nonces.

Array<integer>
wallet_address
required

The wallet that owns the squad.

string
opponent_badge
required

The opponent’s badge; null like opponent_name or when the team has none.

string | null
opponent_name
required

The opponent’s team name; null until the opponent is known (from the start for group, league and first-round matches, otherwise once the match that decides the opponent has finished or from kickoff).

string | null
phase
required

upcoming before the lock, locked from the lock to kickoff, live from kickoff until the end of its broadcast, finished after it.

string
round_label
required

The round, for example Final; null when the round has no name.

string | null
scheduled_at
required

Kickoff (RFC 3339).

string format: date-time
strategy_locks_at
required

When your squad and tactics lock for this match: kickoff minus lead_minutes (RFC 3339).

string format: date-time
tournament_id
required

The tournament.

integer format: int64
tournament_match_id
required

The match’s public id (matches[].id of the tournament): watch it while it is live (GET /api/live/tournament-match/{id}), then its replay, statistics and files by it.

string
tournament_title
required

The tournament’s title.

string
my_team_badge
required

Your team badge: an IPFS URI or an older inline image; null when none.

string | null
my_team_name
required

Your team name; null when you have no team.

string | null
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": {
"lead_minutes": 30,
"matches": [
{
"away_score": 2,
"developer_mode": false,
"formation": "4-3-3",
"group_name": "League",
"home_score": 1,
"is_home": false,
"is_watchable": true,
"locked": true,
"my_dev_badge": null,
"my_dev_name": null,
"my_lineup": {
"formation": "4-3-3",
"lineup": [
1021,
1022,
1023,
1024,
1025,
1026,
1027,
1028,
1029,
1030,
1031
],
"players": [
{
"accuracy": 64,
"condition": 100,
"control": 70,
"country": 31,
"defense": 40,
"is_starter": true,
"level": 6,
"name": "Rufus Vale",
"nonce": 1021,
"portrait_uri": "ipfs://bafkreiportrait1021",
"position": "GK",
"power": 54,
"rarity": "Rare",
"speed": 62,
"stamina": 63,
"vision": 69
},
{
"accuracy": 74,
"condition": 90,
"control": 45,
"country": 25,
"defense": 42,
"is_starter": true,
"level": 9,
"name": "Milo Thorne",
"nonce": 1022,
"portrait_uri": "ipfs://bafkreiportrait1022",
"position": "DEF",
"power": 54,
"rarity": "Common",
"speed": 46,
"stamina": 66,
"vision": 69
},
{
"accuracy": 43,
"condition": 76,
"control": 48,
"country": 39,
"defense": 43,
"is_starter": true,
"level": 11,
"name": "Arlo Brask",
"nonce": 1023,
"portrait_uri": "ipfs://bafkreiportrait1023",
"position": "DEF",
"power": 61,
"rarity": "Uncommon",
"speed": 41,
"stamina": 54,
"vision": 57
},
{
"accuracy": 72,
"condition": 78,
"control": 68,
"country": 36,
"defense": 46,
"is_starter": true,
"level": 9,
"name": "Basil Halden",
"nonce": 1024,
"portrait_uri": "ipfs://bafkreiportrait1024",
"position": "DEF",
"power": 61,
"rarity": "Rare",
"speed": 53,
"stamina": 38,
"vision": 42
},
{
"accuracy": 57,
"condition": 70,
"control": 68,
"country": 26,
"defense": 44,
"is_starter": true,
"level": 3,
"name": "Cyrus Mercer",
"nonce": 1025,
"portrait_uri": "ipfs://bafkreiportrait1025",
"position": "DEF",
"power": 63,
"rarity": "Common",
"speed": 53,
"stamina": 43,
"vision": 47
},
{
"accuracy": 60,
"condition": 73,
"control": 67,
"country": 24,
"defense": 71,
"is_starter": true,
"level": 4,
"name": "Dorian Quill",
"nonce": 1026,
"portrait_uri": "ipfs://bafkreiportrait1026",
"position": "MID",
"power": 39,
"rarity": "Epic",
"speed": 54,
"stamina": 41,
"vision": 53
},
{
"accuracy": 43,
"condition": 88,
"control": 40,
"country": 31,
"defense": 69,
"is_starter": true,
"level": 12,
"name": "Emil Rowan",
"nonce": 1027,
"portrait_uri": "ipfs://bafkreiportrait1027",
"position": "MID",
"power": 54,
"rarity": "Uncommon",
"speed": 74,
"stamina": 47,
"vision": 38
},
{
"accuracy": 47,
"condition": 88,
"control": 42,
"country": 4,
"defense": 63,
"is_starter": true,
"level": 7,
"name": "Felix Stroud",
"nonce": 1028,
"portrait_uri": "ipfs://bafkreiportrait1028",
"position": "MID",
"power": 41,
"rarity": "Common",
"speed": 58,
"stamina": 44,
"vision": 72
},
{
"accuracy": 61,
"condition": 77,
"control": 50,
"country": 52,
"defense": 62,
"is_starter": true,
"level": 4,
"name": "Gideon Tavish",
"nonce": 1029,
"portrait_uri": "ipfs://bafkreiportrait1029",
"position": "MID",
"power": 46,
"rarity": "Rare",
"speed": 52,
"stamina": 43,
"vision": 40
},
{
"accuracy": 61,
"condition": 84,
"control": 49,
"country": 58,
"defense": 55,
"is_starter": true,
"level": 10,
"name": "Hugo Ulric",
"nonce": 1030,
"portrait_uri": "ipfs://bafkreiportrait1030",
"position": "FWD",
"power": 46,
"rarity": "Legendary",
"speed": 67,
"stamina": 59,
"vision": 38
},
{
"accuracy": 40,
"condition": 96,
"control": 74,
"country": 32,
"defense": 65,
"is_starter": true,
"level": 9,
"name": "Ivo Voss",
"nonce": 1031,
"portrait_uri": "ipfs://bafkreiportrait1031",
"position": "FWD",
"power": 68,
"rarity": "Uncommon",
"speed": 74,
"stamina": 51,
"vision": 38
},
{
"accuracy": 73,
"condition": 85,
"control": 70,
"country": 41,
"defense": 67,
"is_starter": false,
"level": 10,
"name": "Jasper Wren",
"nonce": 1032,
"portrait_uri": "ipfs://bafkreiportrait1032",
"position": "GK",
"power": 66,
"rarity": "Common",
"speed": 66,
"stamina": 49,
"vision": 50
},
{
"accuracy": 55,
"condition": 85,
"control": 47,
"country": 18,
"defense": 71,
"is_starter": false,
"level": 7,
"name": "Kian Yarrow",
"nonce": 1033,
"portrait_uri": "ipfs://bafkreiportrait1033",
"position": "DEF",
"power": 60,
"rarity": "Common",
"speed": 68,
"stamina": 38,
"vision": 62
},
{
"accuracy": 56,
"condition": 72,
"control": 47,
"country": 35,
"defense": 49,
"is_starter": false,
"level": 4,
"name": "Lionel Zane",
"nonce": 1034,
"portrait_uri": "ipfs://bafkreiportrait1034",
"position": "DEF",
"power": 52,
"rarity": "Uncommon",
"speed": 54,
"stamina": 49,
"vision": 52
},
{
"accuracy": 71,
"condition": 84,
"control": 54,
"country": 20,
"defense": 53,
"is_starter": false,
"level": 12,
"name": "Marek Ashby",
"nonce": 1035,
"portrait_uri": "ipfs://bafkreiportrait1035",
"position": "MID",
"power": 55,
"rarity": "Common",
"speed": 44,
"stamina": 42,
"vision": 56
},
{
"accuracy": 38,
"condition": 98,
"control": 48,
"country": 52,
"defense": 71,
"is_starter": false,
"level": 2,
"name": "Nils Corvin",
"nonce": 1036,
"portrait_uri": "ipfs://bafkreiportrait1036",
"position": "MID",
"power": 40,
"rarity": "Rare",
"speed": 51,
"stamina": 39,
"vision": 53
},
{
"accuracy": 68,
"condition": 83,
"control": 64,
"country": 55,
"defense": 68,
"is_starter": false,
"level": 2,
"name": "Otto Dace",
"nonce": 1037,
"portrait_uri": "ipfs://bafkreiportrait1037",
"position": "FWD",
"power": 56,
"rarity": "Common",
"speed": 61,
"stamina": 66,
"vision": 52
},
{
"accuracy": 64,
"condition": 78,
"control": 56,
"country": 8,
"defense": 57,
"is_starter": false,
"level": 12,
"name": "Pavel Ember",
"nonce": 1038,
"portrait_uri": "ipfs://bafkreiportrait1038",
"position": "FWD",
"power": 61,
"rarity": "Uncommon",
"speed": 71,
"stamina": 72,
"vision": 49
}
],
"substitutes": [
1032,
1033,
1034,
1035,
1036,
1037,
1038
],
"wallet_address": "erd15feryxhrdz9m6y09mr8wrerwzgj6f8ntxvhxyrdlm5aahn0t09nl4ujy86"
},
"opponent_badge": "ipfs://bafkreilavyf6rmpafqfjzczbttofjyu7jsjc3ibofbcixgy4dbp",
"opponent_name": "Ember Town",
"phase": "finished",
"round_label": "Matchday 3",
"scheduled_at": "2026-09-30T20:00:00Z",
"strategy_locks_at": "2026-09-30T19:30:00Z",
"tournament_id": 377,
"tournament_match_id": "Qx7_kP2mZr9-aB3cD4eF5g",
"tournament_title": "Autumn League"
},
{
"away_score": null,
"developer_mode": false,
"formation": "4-3-3",
"group_name": null,
"home_score": null,
"is_home": true,
"is_watchable": false,
"locked": false,
"my_dev_badge": null,
"my_dev_name": null,
"my_lineup": null,
"opponent_badge": "ipfs://bafkrei6bs5e4rynnefjqxirhxo77zbka74ztj2wyuhvauvzhmas",
"opponent_name": "Riverside Rovers",
"phase": "upcoming",
"round_label": "Quarterfinal",
"scheduled_at": "2026-10-02T18:00:00Z",
"strategy_locks_at": "2026-10-02T17:30:00Z",
"tournament_id": 412,
"tournament_match_id": "Rk2-ZpQ9wLm4_nB7vC1xYa",
"tournament_title": "Friday Night Cup"
}
],
"my_team_badge": "ipfs://bafkreij7ufrdl3erbfqfoeqh5av2ricphkqdlmttns4lrwbqcab",
"my_team_name": "Harbor Foxes"
},
"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